List Games
FALKEN'S MAZE
BLACK JACK
GIN RUMMY
HEARTS
BRIDGE
CHECKERS
CHESS
POKER
FIGHTER COMBAT
GUERRILLA ENGAGEMENT
DESERT WARFARE
AIR-TO-GROUND ACTIONS
THEATERWIDE TACTICAL WARFARE
THEATERWIDE BIOTOXIC AND CHEMICAL WARFARE
GLOBAL THERMONUCLEAR WAR█
[[Jane Seymour thanks fans after ‘Somewhere in Time’ weekend at Mackinac Island’s Grand Hotel|https://www.mlive.com/news/2022/10/jane-seymour-thanks-fans-after-somewhere-in-time-weekend-at-mackinac-islands-grand-hotel.html?outputType=amp]] I know what I want to do in 2023!!!
[[Corey Quinn]]: https://twitter.com/QuinnyPig/status/1291411065608208384 HydroxyCoreyQuinn (@QuinnyPig): Ancient sysadmin wisdom: don’t use ‘>’ as part of your shell prompt. You’re one copy/paste error away from truncating a file. There’s a reason root’s ‘#’ prompt gets interpreted as a comment. --- ‘> file.txt’ creates an empty file.txt ‘>database.zone’ now means database.zone is a zero byte file. Whoops. --- More Ancient Sysadmin Wisdom: ">" replaces file contents. ">>" appends to the existing file. You will screw this up precisely once in your career. --- VMs that live-migrate are awesome until the two redundant things migrate their way onto the same physical host. Which then suffers a hardware fault. --- Systems should be cattle not pets, but your laptop is going to one day go to live at a farm upstate and have its ashes in a commemorative urn. --- alias serial_9600_8bit='screen /dev/ttyUSB0 9600,cs8' is a line in my shell config. I haven't used it in eight years but when I need it I'm going to REALLY need it, so there it stays. --- Install 'sl' on your laptop to teach you to type 'ls' more accurately. Install 'sl' into production to teach you why it's important to have friends at work. --- You want the shell environment on production servers to be as user-hostile as possible to discourage people from spending time there. I like the korn shell for this. --- Some people view their public SSH keys as secret. Those people should avoid looking at http://github.com / THEIR_USERNAME.keys if they'd like to remain happy. --- Every time you run a recursive rm, replace the "rm -r" with "ls" for the first attempt. You will skip this step. And you will regret it. --- In shell scripting, use 'echo' in place of 'ls'. They'll work the same way except in a couple of edge cases that will destroy the goddamned moon. --- There is always a desktop under someone's desk, a VM in some unrelated cloud provider, or (nowadays) a raspberry pi somewhere that keeps an eye on the site. If you don't have one, fix that. --- Once you follow this advice, it will be followed shortly thereafter by adding a -u to it. (-e is stop on error, -u is stop on unset variable) https://twitter.com/borwick/status/1291525379354632193?s=20 --- If a log is filling up your disk, rm'ing the log file won't solve it. The file handle is still open; now you've got to kill -HUP the logging daemon to get it to let go. '> logfile' avoids this step by truncating. --- If running a command and piping the output somewhere still displays output, you're seeing the difference between STDOUT and STDERR. `2 > &1` is a unifying idiom that will restore balance to your universe. --- The real value proposition of cloud computing that your boss is sworn to never reveal to you is that it keeps you from physically touching the computers and breaking them. It's more expensive because it's worth it. --- "load-bearing cron jobs running in the sysadmin's account" is the kind of problem you only discover after something important fails to happen. --- There are at least three places to stash a cron job on a system. When the other sysadmin is busy patting themselves on the back for finding your clever hack they'll completely forget that 'at' jobs live somewhere else. --- 'rm -rf /' now requires a '--no-preserve-root' flag in theory, but in practice I've never been brave enough to test it. --- In theory there's no difference between theory and practice, but in practice there is. That difference is called systems administration. --- "I don't do sysadmin work, I'm a SRE / DevOp" is what the sysadmin in denial says. If someone offers me 40% more money to pronounce AMI with two syllables, I'd do that too. Don't leave money on the table for dumb reasons. --- A simple way to show disk usage items by size is 'du -k | sort -n | perl -ne 'if ( /^(\d+)\s+(.*$)/){$l=log($1+.1);$m=int($l/log(1024)); printf ("%6.1f\t%s\t%25s | %s\n",($1/(2**(10*$m))),(("K","M","G","T","P")[$m]),"*"x(1.5*$l),$2);}' ' --- If you accidentally type a password into the shell, it will end up in your shell history. Hope isn't lost! `kill -9 $$` kills your current logged in process, and dead shells write no logs. --- It's best to use $() instead of backticks in shell scripts just to stop the "well, actually" crowd from bothering you. --- No matter what system you use to manage your workstation, it will not keep up with what you actually do, and reinstallation will require a bunch of manual work. --- `visudo` always beats editing /etc/sudoers manually. But you're still going to want to have a second shell opened as root beforehand to avoid tears before bedtime. --- `netstat -antp |grep LISTEN` shows you what's listening to TCP ports. the "p" doesn't work on Mac, and it's part of net-tools and deprecated on modern Linux, but "ss -lt" lacks the same flair. --- There’s systemd, upstart, and a bunch of actually good init systems, but some jackwagon is always going to try to ice skate uphill by parking a command in a tmux or screen session. --- When you’re done configuring a box, reboot it to make sure everything starts properly on restart. Otherwise you won’t really be done until after the 3am power outage in eight months. --- If your boss tells you your shell scripts need a web interface, very careful phrasing on your part means that shellinabox meets their acceptance criteria. https://github.com/shellinabox/shellinabox --- Reduce the TTLs on your DNS records a few days before the change or risk annoyed users. --- Pointing out that “users are complaining, what’s the story with our monitoring system?” answers its own question must be done delicately. --- Draconian policies such as “all production changes require VP approval” can be overturned within hours by following them to the letter. --- Draconian policies such as “all production changes require VP approval” can be overturned within hours by following them to the bathroom. https://twitter.com/pgutheb/status/1291566467079499776?s=20 --- Bad flags to destructive commands, typos in shell paths, and file shares mounted on a system have a convergence point where it's best to begin cleaning out your desk to beat the rush. --- `if [ -e FOO]` as a test condition works in part because a command on the system is, and I swear I'm not making this up, `/bin/[`. Develop a stress release before the madness gazes into you. --- You will eventually try something one step too cute and somehow manage to delete /dev/null itself. Pause. Take a deep breath. Revel in the feeling that you've just stormed the gates of hell and killed the devil, then `mknod`. https://twitter.com/gbhorwood/status/1291578898136801280?s=20
[[Haggard Hawks]] on [[Twitter|https://twitter.com/HaggardHawks/status/1344088091146002436]] > In 18th century English, if someone had ‘spun you to the length’ then they had exhausted your patience. I can't find any evidence of this usage, but it sounds great.
[[Captured on Kodak 35mm film, HBO’s 'Succession' delivers a dark, moreish comedy series – Kodak|https://www.kodak.com/en/motion/blog-post/succession]] [[Succession]] a comedy? Anyway: <<< In setting out the cinematographic blueprint for the series, Parekh and McKay decided to cover dialog scenes, featuring several characters, by using multiple cameras. This approach was complemented with a naturalistic and practical lighting approach, using a minimal lighting package, that allowed for cross-shooting and even the triangulation of a scene from a variety of angles. “Effectively, this approach created an environment in which the actors never knew where the camera was,” explains Parekh. “So they were forced to focus on their roles, like they might in a traditional theatre play, which helped to elevate the quality of the performances and the sense of reality. It was ostensibly filmed theatre.” <<< It sure is. > Parek also adds: “By the way, I still think shooting on film is faster than digital. When you shoot digitally, especially on night scenes, a lot of time and effort goes into fighting the medium by taking light away. With film you start by adding light – the light you want. We spent little time with the grip department taking away light, and this amounted to savings for the production. It’s in this way that film saves an incalculable amount of time and money.” //Add the light you want.//
* [[@kordumb|https://micro.blog/kordumb]] on Micro.blog * https://humdrum.life - I really, really like how the icons make everything easy to digest and follow, even if you don't click on every link. * https://tiv.today/
from [[Twitter|https://twitter.com/SwiftOnSecurity/status/959163780784680961]] > I’m totally serious. You’re going to enter IT thinking that network cables are too simple to fail. And when they fail, that they fail hard. It’s not like that. They will drive you insane if you discount the possibility. Don’t skimp. There’s no such thing as a trusty patch cable. The worst trouble I had with the [[Roon Intel NUC]] was the Ethernet patch cable I assumed was still good.
(If you're on mobile, ''↑↑↑ go up ↑↑↑'' to see the latest actual stuff.) This is a standalone HTML copy of the Node.js TiddlyWiki running on my MacBook. I haven't yet gotten this running on a real server on Linode or EC2, so this will have to do for now. Beware of trying to link to individual tiddlers in this file, as they will likely break before long. But enjoy in the meantime! [[Andrew Canion]] on [[Micro.blog|http://www.andrewcanion.com/blog/2019/02/1265/]]: > It was an interesting thing to be doing some research, and then think, “Hmm, I’m sure @twelvety has written on that. Let me check his wiki.” And bang, there it is. HELL YES. !! Origins of the domain name People ask me all the time, "What kind of speakers should I get? What's a good, cheap vintage (or new) turntable? What phono cartridge would be good for this turntable?" My recommendations don't change that often, so I once thought I would make a website on Squarespace with the domain ''youneedastereo.com'' and load it up with content covering equipment choices and other such topics. I wrote some stuff and never got around to actually posting any of it. Meanwhile, the Squarespace account sat there. I cut my losses and canceled the space, but kept the domain name. It's better to use it here for the wrong thing than to not use it at all. !! See also A more stable place to find me is at https://www.twelvety.net/ or through [[email|mailto:phil@twelvety.com]]. !! The point of all this? [[To be of use|https://youtu.be/qAxGdWdXA5w]]. It's crazy that someone out there might find value in these scratched out notes. Also, when I die — hopefully no time soon, knock on wood — this file should be a really accurate picture of what I've been thinking about. I wish my parents would maintain something like this to document their own knowledge and obsessions, but I know the format and the process isn't for everyone. I use the "Recent" tab the most, myself. From [[Doug Engelbart's 1968 Demo|http://www.dougengelbart.org/content/view/209/448/]]: [img[https://twelvety.com/philtiddlywiki_images/2019-01-23-engelbart.jpg]]
50
New
comptext
Orgmode
tags
YYYY-0MM-0DD Journal
hide
show
show
expanded
yes
yes
yes
yes
yes
alt-C
Escape
alt-E
alt-Down
alt-Up
Enter
Down
Up
alt-F
yes
no
show
disable
{ "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|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n" }, "$:/core/copyright.txt": { "title": "$:/core/copyright.txt", "type": "text/plain", "text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2020, 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": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>" }, "$:/core/images/add-comment": { "title": "$:/core/images/add-comment", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>" }, "$:/core/images/advanced-search-button": { "title": "$:/core/images/advanced-search-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>" }, "$:/core/images/auto-height": { "title": "$:/core/images/auto-height", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>" }, "$:/core/images/blank": { "title": "$:/core/images/blank", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>" }, "$:/core/images/bold": { "title": "$:/core/images/bold", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>" }, "$:/core/images/cancel-button": { "title": "$:/core/images/cancel-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>" }, "$:/core/images/chevron-down": { "title": "$:/core/images/chevron-down", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>" }, "$:/core/images/chevron-left": { "title": "$:/core/images/chevron-left", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>" }, "$:/core/images/chevron-right": { "title": "$:/core/images/chevron-right", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>" }, "$:/core/images/chevron-up": { "title": "$:/core/images/chevron-up", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>" }, "$:/core/images/clone-button": { "title": "$:/core/images/clone-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>" }, "$:/core/images/close-all-button": { "title": "$:/core/images/close-all-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>" }, "$:/core/images/close-button": { "title": "$:/core/images/close-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>" }, "$:/core/images/close-others-button": { "title": "$:/core/images/close-others-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>" }, "$:/core/images/copy-clipboard": { "title": "$:/core/images/copy-clipboard", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>" }, "$:/core/images/delete-button": { "title": "$:/core/images/delete-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>" }, "$:/core/images/done-button": { "title": "$:/core/images/done-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>" }, "$:/core/images/down-arrow": { "title": "$:/core/images/down-arrow", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>" }, "$:/core/images/download-button": { "title": "$:/core/images/download-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>" }, "$:/core/images/edit-button": { "title": "$:/core/images/edit-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>" }, "$:/core/images/erase": { "title": "$:/core/images/erase", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>" }, "$:/core/images/excise": { "title": "$:/core/images/excise", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>" }, "$:/core/images/export-button": { "title": "$:/core/images/export-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>" }, "$:/core/images/file": { "title": "$:/core/images/file", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>" }, "$:/core/images/fixed-height": { "title": "$:/core/images/fixed-height", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>" }, "$:/core/images/fold-all-button": { "title": "$:/core/images/fold-all-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>" }, "$:/core/images/fold-button": { "title": "$:/core/images/fold-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>" }, "$:/core/images/fold-others-button": { "title": "$:/core/images/fold-others-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>" }, "$:/core/images/folder": { "title": "$:/core/images/folder", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>" }, "$:/core/images/full-screen-button": { "title": "$:/core/images/full-screen-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>" }, "$:/core/images/github": { "title": "$:/core/images/github", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>" }, "$:/core/images/gitter": { "title": "$:/core/images/gitter", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>" }, "$:/core/images/globe": { "title": "$:/core/images/globe", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>" }, "$:/core/images/heading-1": { "title": "$:/core/images/heading-1", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>" }, "$:/core/images/heading-2": { "title": "$:/core/images/heading-2", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>" }, "$:/core/images/heading-3": { "title": "$:/core/images/heading-3", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>" }, "$:/core/images/heading-4": { "title": "$:/core/images/heading-4", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>" }, "$:/core/images/heading-5": { "title": "$:/core/images/heading-5", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>" }, "$:/core/images/heading-6": { "title": "$:/core/images/heading-6", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>" }, "$:/core/images/help": { "title": "$:/core/images/help", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>" }, "$:/core/images/home-button": { "title": "$:/core/images/home-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>" }, "$:/core/images/import-button": { "title": "$:/core/images/import-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>" }, "$:/core/images/info-button": { "title": "$:/core/images/info-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>" }, "$:/core/images/italic": { "title": "$:/core/images/italic", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>" }, "$:/core/images/left-arrow": { "title": "$:/core/images/left-arrow", "created": "20150315234410875", "modified": "20150315235324760", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>" }, "$:/core/images/line-width": { "title": "$:/core/images/line-width", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>" }, "$:/core/images/link": { "title": "$:/core/images/link", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>" }, "$:/core/images/linkify": { "title": "$:/core/images/linkify", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>" }, "$:/core/images/list-bullet": { "title": "$:/core/images/list-bullet", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>" }, "$:/core/images/list-number": { "title": "$:/core/images/list-number", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>" }, "$:/core/images/list": { "title": "$:/core/images/list", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>" }, "$:/core/images/locked-padlock": { "title": "$:/core/images/locked-padlock", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>" }, "$:/core/images/mail": { "title": "$:/core/images/mail", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>" }, "$:/core/images/menu-button": { "title": "$:/core/images/menu-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>" }, "$:/core/images/mono-block": { "title": "$:/core/images/mono-block", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>" }, "$:/core/images/mono-line": { "title": "$:/core/images/mono-line", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>" }, "$:/core/images/new-button": { "title": "$:/core/images/new-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>" }, "$:/core/images/new-here-button": { "title": "$:/core/images/new-here-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>" }, "$:/core/images/new-image-button": { "title": "$:/core/images/new-image-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>" }, "$:/core/images/new-journal-button": { "title": "$:/core/images/new-journal-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><<now \"DD\">></tspan></text></g></svg>" }, "$:/core/images/opacity": { "title": "$:/core/images/opacity", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>" }, "$:/core/images/open-window": { "title": "$:/core/images/open-window", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>" }, "$:/core/images/options-button": { "title": "$:/core/images/options-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>" }, "$:/core/images/paint": { "title": "$:/core/images/paint", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>" }, "$:/core/images/palette": { "title": "$:/core/images/palette", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>" }, "$:/core/images/permalink-button": { "title": "$:/core/images/permalink-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>" }, "$:/core/images/permaview-button": { "title": "$:/core/images/permaview-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>" }, "$:/core/images/picture": { "title": "$:/core/images/picture", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></svg>" }, "$:/core/images/plugin-generic-language": { "title": "$:/core/images/plugin-generic-language", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>" }, "$:/core/images/plugin-generic-plugin": { "title": "$:/core/images/plugin-generic-plugin", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>" }, "$:/core/images/plugin-generic-theme": { "title": "$:/core/images/plugin-generic-theme", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>" }, "$:/core/images/preview-closed": { "title": "$:/core/images/preview-closed", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>" }, "$:/core/images/preview-open": { "title": "$:/core/images/preview-open", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>" }, "$:/core/images/print-button": { "title": "$:/core/images/print-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>" }, "$:/core/images/quote": { "title": "$:/core/images/quote", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>" }, "$:/core/images/refresh-button": { "title": "$:/core/images/refresh-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>" }, "$:/core/images/right-arrow": { "title": "$:/core/images/right-arrow", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>" }, "$:/core/images/rotate-left": { "title": "$:/core/images/rotate-left", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>" }, "$:/core/images/save-button": { "title": "$:/core/images/save-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>" }, "$:/core/images/size": { "title": "$:/core/images/size", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>" }, "$:/core/images/spiral": { "title": "$:/core/images/spiral", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"/></svg>" }, "$:/core/images/stamp": { "title": "$:/core/images/stamp", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>" }, "$:/core/images/star-filled": { "title": "$:/core/images/star-filled", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>" }, "$:/core/images/storyview-classic": { "title": "$:/core/images/storyview-classic", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>" }, "$:/core/images/storyview-pop": { "title": "$:/core/images/storyview-pop", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>" }, "$:/core/images/storyview-zoomin": { "title": "$:/core/images/storyview-zoomin", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>" }, "$:/core/images/strikethrough": { "title": "$:/core/images/strikethrough", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>" }, "$:/core/images/subscript": { "title": "$:/core/images/subscript", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>" }, "$:/core/images/superscript": { "title": "$:/core/images/superscript", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>" }, "$:/core/images/tag-button": { "title": "$:/core/images/tag-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>" }, "$:/core/images/theme-button": { "title": "$:/core/images/theme-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>" }, "$:/core/images/timestamp-off": { "title": "$:/core/images/timestamp-off", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>" }, "$:/core/images/timestamp-on": { "title": "$:/core/images/timestamp-on", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>" }, "$:/core/images/tip": { "title": "$:/core/images/tip", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>" }, "$:/core/images/transcludify": { "title": "$:/core/images/transcludify", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>" }, "$:/core/images/twitter": { "title": "$:/core/images/twitter", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>" }, "$:/core/images/underline": { "title": "$:/core/images/underline", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>" }, "$:/core/images/unfold-all-button": { "title": "$:/core/images/unfold-all-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>" }, "$:/core/images/unfold-button": { "title": "$:/core/images/unfold-button", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>" }, "$:/core/images/unlocked-padlock": { "title": "$:/core/images/unlocked-padlock", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>" }, "$:/core/images/up-arrow": { "title": "$:/core/images/up-arrow", "created": "20150316000544368", "modified": "20150316000831867", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>" }, "$:/core/images/video": { "title": "$:/core/images/video", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>" }, "$:/core/images/warning": { "title": "$:/core/images/warning", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></svg>" }, "$:/language/Buttons/AdvancedSearch/Caption": { "title": "$:/language/Buttons/AdvancedSearch/Caption", "text": "advanced search" }, "$:/language/Buttons/AdvancedSearch/Hint": { "title": "$:/language/Buttons/AdvancedSearch/Hint", "text": "Advanced search" }, "$:/language/Buttons/Cancel/Caption": { "title": "$:/language/Buttons/Cancel/Caption", "text": "cancel" }, "$:/language/Buttons/Cancel/Hint": { "title": "$:/language/Buttons/Cancel/Hint", "text": "Discard changes to this tiddler" }, "$:/language/Buttons/Clone/Caption": { "title": "$:/language/Buttons/Clone/Caption", "text": "clone" }, "$:/language/Buttons/Clone/Hint": { "title": "$:/language/Buttons/Clone/Hint", "text": "Clone this tiddler" }, "$:/language/Buttons/Close/Caption": { "title": "$:/language/Buttons/Close/Caption", "text": "close" }, "$:/language/Buttons/Close/Hint": { "title": "$:/language/Buttons/Close/Hint", "text": "Close this tiddler" }, "$:/language/Buttons/CloseAll/Caption": { "title": "$:/language/Buttons/CloseAll/Caption", "text": "close all" }, "$:/language/Buttons/CloseAll/Hint": { "title": "$:/language/Buttons/CloseAll/Hint", "text": "Close all tiddlers" }, "$:/language/Buttons/CloseOthers/Caption": { "title": "$:/language/Buttons/CloseOthers/Caption", "text": "close others" }, "$:/language/Buttons/CloseOthers/Hint": { "title": "$:/language/Buttons/CloseOthers/Hint", "text": "Close other tiddlers" }, "$:/language/Buttons/ControlPanel/Caption": { "title": "$:/language/Buttons/ControlPanel/Caption", "text": "control panel" }, "$:/language/Buttons/ControlPanel/Hint": { "title": "$:/language/Buttons/ControlPanel/Hint", "text": "Open control panel" }, "$:/language/Buttons/CopyToClipboard/Caption": { "title": "$:/language/Buttons/CopyToClipboard/Caption", "text": "copy to clipboard" }, "$:/language/Buttons/CopyToClipboard/Hint": { "title": "$:/language/Buttons/CopyToClipboard/Hint", "text": "Copy this text to the clipboard" }, "$:/language/Buttons/Delete/Caption": { "title": "$:/language/Buttons/Delete/Caption", "text": "delete" }, "$:/language/Buttons/Delete/Hint": { "title": "$:/language/Buttons/Delete/Hint", "text": "Delete this tiddler" }, "$:/language/Buttons/Edit/Caption": { "title": "$:/language/Buttons/Edit/Caption", "text": "edit" }, "$:/language/Buttons/Edit/Hint": { "title": "$:/language/Buttons/Edit/Hint", "text": "Edit this tiddler" }, "$:/language/Buttons/Encryption/Caption": { "title": "$:/language/Buttons/Encryption/Caption", "text": "encryption" }, "$:/language/Buttons/Encryption/Hint": { "title": "$:/language/Buttons/Encryption/Hint", "text": "Set or clear a password for saving this wiki" }, "$:/language/Buttons/Encryption/ClearPassword/Caption": { "title": "$:/language/Buttons/Encryption/ClearPassword/Caption", "text": "clear password" }, "$:/language/Buttons/Encryption/ClearPassword/Hint": { "title": "$:/language/Buttons/Encryption/ClearPassword/Hint", "text": "Clear the password and save this wiki without encryption" }, "$:/language/Buttons/Encryption/SetPassword/Caption": { "title": "$:/language/Buttons/Encryption/SetPassword/Caption", "text": "set password" }, "$:/language/Buttons/Encryption/SetPassword/Hint": { "title": "$:/language/Buttons/Encryption/SetPassword/Hint", "text": "Set a password for saving this wiki with encryption" }, "$:/language/Buttons/ExportPage/Caption": { "title": "$:/language/Buttons/ExportPage/Caption", "text": "export all" }, "$:/language/Buttons/ExportPage/Hint": { "title": "$:/language/Buttons/ExportPage/Hint", "text": "Export all tiddlers" }, "$:/language/Buttons/ExportTiddler/Caption": { "title": "$:/language/Buttons/ExportTiddler/Caption", "text": "export tiddler" }, "$:/language/Buttons/ExportTiddler/Hint": { "title": "$:/language/Buttons/ExportTiddler/Hint", "text": "Export tiddler" }, "$:/language/Buttons/ExportTiddlers/Caption": { "title": "$:/language/Buttons/ExportTiddlers/Caption", "text": "export tiddlers" }, "$:/language/Buttons/ExportTiddlers/Hint": { "title": "$:/language/Buttons/ExportTiddlers/Hint", "text": "Export tiddlers" }, "$:/language/Buttons/SidebarSearch/Hint": { "title": "$:/language/Buttons/SidebarSearch/Hint", "text": "Select the sidebar search field" }, "$:/language/Buttons/Fold/Caption": { "title": "$:/language/Buttons/Fold/Caption", "text": "fold tiddler" }, "$:/language/Buttons/Fold/Hint": { "title": "$:/language/Buttons/Fold/Hint", "text": "Fold the body of this tiddler" }, "$:/language/Buttons/Fold/FoldBar/Caption": { "title": "$:/language/Buttons/Fold/FoldBar/Caption", "text": "fold-bar" }, "$:/language/Buttons/Fold/FoldBar/Hint": { "title": "$:/language/Buttons/Fold/FoldBar/Hint", "text": "Optional bars to fold and unfold tiddlers" }, "$:/language/Buttons/Unfold/Caption": { "title": "$:/language/Buttons/Unfold/Caption", "text": "unfold tiddler" }, "$:/language/Buttons/Unfold/Hint": { "title": "$:/language/Buttons/Unfold/Hint", "text": "Unfold the body of this tiddler" }, "$:/language/Buttons/FoldOthers/Caption": { "title": "$:/language/Buttons/FoldOthers/Caption", "text": "fold other tiddlers" }, "$:/language/Buttons/FoldOthers/Hint": { "title": "$:/language/Buttons/FoldOthers/Hint", "text": "Fold the bodies of other opened tiddlers" }, "$:/language/Buttons/FoldAll/Caption": { "title": "$:/language/Buttons/FoldAll/Caption", "text": "fold all tiddlers" }, "$:/language/Buttons/FoldAll/Hint": { "title": "$:/language/Buttons/FoldAll/Hint", "text": "Fold the bodies of all opened tiddlers" }, "$:/language/Buttons/UnfoldAll/Caption": { "title": "$:/language/Buttons/UnfoldAll/Caption", "text": "unfold all tiddlers" }, "$:/language/Buttons/UnfoldAll/Hint": { "title": "$:/language/Buttons/UnfoldAll/Hint", "text": "Unfold the bodies of all opened tiddlers" }, "$:/language/Buttons/FullScreen/Caption": { "title": "$:/language/Buttons/FullScreen/Caption", "text": "full-screen" }, "$:/language/Buttons/FullScreen/Hint": { "title": "$:/language/Buttons/FullScreen/Hint", "text": "Enter or leave full-screen mode" }, "$:/language/Buttons/Help/Caption": { "title": "$:/language/Buttons/Help/Caption", "text": "help" }, "$:/language/Buttons/Help/Hint": { "title": "$:/language/Buttons/Help/Hint", "text": "Show help panel" }, "$:/language/Buttons/Import/Caption": { "title": "$:/language/Buttons/Import/Caption", "text": "import" }, "$:/language/Buttons/Import/Hint": { "title": "$:/language/Buttons/Import/Hint", "text": "Import many types of file including text, image, TiddlyWiki or JSON" }, "$:/language/Buttons/Info/Caption": { "title": "$:/language/Buttons/Info/Caption", "text": "info" }, "$:/language/Buttons/Info/Hint": { "title": "$:/language/Buttons/Info/Hint", "text": "Show information for this tiddler" }, "$:/language/Buttons/Home/Caption": { "title": "$:/language/Buttons/Home/Caption", "text": "home" }, "$:/language/Buttons/Home/Hint": { "title": "$:/language/Buttons/Home/Hint", "text": "Open the default tiddlers" }, "$:/language/Buttons/Language/Caption": { "title": "$:/language/Buttons/Language/Caption", "text": "language" }, "$:/language/Buttons/Language/Hint": { "title": "$:/language/Buttons/Language/Hint", "text": "Choose the user interface language" }, "$:/language/Buttons/Manager/Caption": { "title": "$:/language/Buttons/Manager/Caption", "text": "tiddler manager" }, "$:/language/Buttons/Manager/Hint": { "title": "$:/language/Buttons/Manager/Hint", "text": "Open tiddler manager" }, "$:/language/Buttons/More/Caption": { "title": "$:/language/Buttons/More/Caption", "text": "more" }, "$:/language/Buttons/More/Hint": { "title": "$:/language/Buttons/More/Hint", "text": "More actions" }, "$:/language/Buttons/NewHere/Caption": { "title": "$:/language/Buttons/NewHere/Caption", "text": "new here" }, "$:/language/Buttons/NewHere/Hint": { "title": "$:/language/Buttons/NewHere/Hint", "text": "Create a new tiddler tagged with this one" }, "$:/language/Buttons/NewJournal/Caption": { "title": "$:/language/Buttons/NewJournal/Caption", "text": "new journal" }, "$:/language/Buttons/NewJournal/Hint": { "title": "$:/language/Buttons/NewJournal/Hint", "text": "Create a new journal tiddler" }, "$:/language/Buttons/NewJournalHere/Caption": { "title": "$:/language/Buttons/NewJournalHere/Caption", "text": "new journal here" }, "$:/language/Buttons/NewJournalHere/Hint": { "title": "$:/language/Buttons/NewJournalHere/Hint", "text": "Create a new journal tiddler tagged with this one" }, "$:/language/Buttons/NewImage/Caption": { "title": "$:/language/Buttons/NewImage/Caption", "text": "new image" }, "$:/language/Buttons/NewImage/Hint": { "title": "$:/language/Buttons/NewImage/Hint", "text": "Create a new image tiddler" }, "$:/language/Buttons/NewMarkdown/Caption": { "title": "$:/language/Buttons/NewMarkdown/Caption", "text": "new Markdown tiddler" }, "$:/language/Buttons/NewMarkdown/Hint": { "title": "$:/language/Buttons/NewMarkdown/Hint", "text": "Create a new Markdown tiddler" }, "$:/language/Buttons/NewTiddler/Caption": { "title": "$:/language/Buttons/NewTiddler/Caption", "text": "new tiddler" }, "$:/language/Buttons/NewTiddler/Hint": { "title": "$:/language/Buttons/NewTiddler/Hint", "text": "Create a new tiddler" }, "$:/language/Buttons/OpenWindow/Caption": { "title": "$:/language/Buttons/OpenWindow/Caption", "text": "open in new window" }, "$:/language/Buttons/OpenWindow/Hint": { "title": "$:/language/Buttons/OpenWindow/Hint", "text": "Open tiddler in new window" }, "$:/language/Buttons/Palette/Caption": { "title": "$:/language/Buttons/Palette/Caption", "text": "palette" }, "$:/language/Buttons/Palette/Hint": { "title": "$:/language/Buttons/Palette/Hint", "text": "Choose the colour palette" }, "$:/language/Buttons/Permalink/Caption": { "title": "$:/language/Buttons/Permalink/Caption", "text": "permalink" }, "$:/language/Buttons/Permalink/Hint": { "title": "$:/language/Buttons/Permalink/Hint", "text": "Set browser address bar to a direct link to this tiddler" }, "$:/language/Buttons/Permaview/Caption": { "title": "$:/language/Buttons/Permaview/Caption", "text": "permaview" }, "$:/language/Buttons/Permaview/Hint": { "title": "$:/language/Buttons/Permaview/Hint", "text": "Set browser address bar to a direct link to all the tiddlers in this story" }, "$:/language/Buttons/Print/Caption": { "title": "$:/language/Buttons/Print/Caption", "text": "print page" }, "$:/language/Buttons/Print/Hint": { "title": "$:/language/Buttons/Print/Hint", "text": "Print the current page" }, "$:/language/Buttons/Refresh/Caption": { "title": "$:/language/Buttons/Refresh/Caption", "text": "refresh" }, "$:/language/Buttons/Refresh/Hint": { "title": "$:/language/Buttons/Refresh/Hint", "text": "Perform a full refresh of the wiki" }, "$:/language/Buttons/Save/Caption": { "title": "$:/language/Buttons/Save/Caption", "text": "ok" }, "$:/language/Buttons/Save/Hint": { "title": "$:/language/Buttons/Save/Hint", "text": "Confirm changes to this tiddler" }, "$:/language/Buttons/SaveWiki/Caption": { "title": "$:/language/Buttons/SaveWiki/Caption", "text": "save changes" }, "$:/language/Buttons/SaveWiki/Hint": { "title": "$:/language/Buttons/SaveWiki/Hint", "text": "Save changes" }, "$:/language/Buttons/StoryView/Caption": { "title": "$:/language/Buttons/StoryView/Caption", "text": "storyview" }, "$:/language/Buttons/StoryView/Hint": { "title": "$:/language/Buttons/StoryView/Hint", "text": "Choose the story visualisation" }, "$:/language/Buttons/HideSideBar/Caption": { "title": "$:/language/Buttons/HideSideBar/Caption", "text": "hide sidebar" }, "$:/language/Buttons/HideSideBar/Hint": { "title": "$:/language/Buttons/HideSideBar/Hint", "text": "Hide sidebar" }, "$:/language/Buttons/ShowSideBar/Caption": { "title": "$:/language/Buttons/ShowSideBar/Caption", "text": "show sidebar" }, "$:/language/Buttons/ShowSideBar/Hint": { "title": "$:/language/Buttons/ShowSideBar/Hint", "text": "Show sidebar" }, "$:/language/Buttons/TagManager/Caption": { "title": "$:/language/Buttons/TagManager/Caption", "text": "tag manager" }, "$:/language/Buttons/TagManager/Hint": { "title": "$:/language/Buttons/TagManager/Hint", "text": "Open tag manager" }, "$:/language/Buttons/Timestamp/Caption": { "title": "$:/language/Buttons/Timestamp/Caption", "text": "timestamps" }, "$:/language/Buttons/Timestamp/Hint": { "title": "$:/language/Buttons/Timestamp/Hint", "text": "Choose whether modifications update timestamps" }, "$:/language/Buttons/Timestamp/On/Caption": { "title": "$:/language/Buttons/Timestamp/On/Caption", "text": "timestamps are on" }, "$:/language/Buttons/Timestamp/On/Hint": { "title": "$:/language/Buttons/Timestamp/On/Hint", "text": "Update timestamps when tiddlers are modified" }, "$:/language/Buttons/Timestamp/Off/Caption": { "title": "$:/language/Buttons/Timestamp/Off/Caption", "text": "timestamps are off" }, "$:/language/Buttons/Timestamp/Off/Hint": { "title": "$:/language/Buttons/Timestamp/Off/Hint", "text": "Don't update timestamps when tiddlers are modified" }, "$:/language/Buttons/Theme/Caption": { "title": "$:/language/Buttons/Theme/Caption", "text": "theme" }, "$:/language/Buttons/Theme/Hint": { "title": "$:/language/Buttons/Theme/Hint", "text": "Choose the display theme" }, "$:/language/Buttons/Bold/Caption": { "title": "$:/language/Buttons/Bold/Caption", "text": "bold" }, "$:/language/Buttons/Bold/Hint": { "title": "$:/language/Buttons/Bold/Hint", "text": "Apply bold formatting to selection" }, "$:/language/Buttons/Clear/Caption": { "title": "$:/language/Buttons/Clear/Caption", "text": "clear" }, "$:/language/Buttons/Clear/Hint": { "title": "$:/language/Buttons/Clear/Hint", "text": "Clear image to solid colour" }, "$:/language/Buttons/EditorHeight/Caption": { "title": "$:/language/Buttons/EditorHeight/Caption", "text": "editor height" }, "$:/language/Buttons/EditorHeight/Caption/Auto": { "title": "$:/language/Buttons/EditorHeight/Caption/Auto", "text": "Automatically adjust height to fit content" }, "$:/language/Buttons/EditorHeight/Caption/Fixed": { "title": "$:/language/Buttons/EditorHeight/Caption/Fixed", "text": "Fixed height:" }, "$:/language/Buttons/EditorHeight/Hint": { "title": "$:/language/Buttons/EditorHeight/Hint", "text": "Choose the height of the text editor" }, "$:/language/Buttons/Excise/Caption": { "title": "$:/language/Buttons/Excise/Caption", "text": "excise" }, "$:/language/Buttons/Excise/Caption/Excise": { "title": "$:/language/Buttons/Excise/Caption/Excise", "text": "Perform excision" }, "$:/language/Buttons/Excise/Caption/MacroName": { "title": "$:/language/Buttons/Excise/Caption/MacroName", "text": "Macro name:" }, "$:/language/Buttons/Excise/Caption/NewTitle": { "title": "$:/language/Buttons/Excise/Caption/NewTitle", "text": "Title of new tiddler:" }, "$:/language/Buttons/Excise/Caption/Replace": { "title": "$:/language/Buttons/Excise/Caption/Replace", "text": "Replace excised text with:" }, "$:/language/Buttons/Excise/Caption/Replace/Macro": { "title": "$:/language/Buttons/Excise/Caption/Replace/Macro", "text": "macro" }, "$:/language/Buttons/Excise/Caption/Replace/Link": { "title": "$:/language/Buttons/Excise/Caption/Replace/Link", "text": "link" }, "$:/language/Buttons/Excise/Caption/Replace/Transclusion": { "title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion", "text": "transclusion" }, "$:/language/Buttons/Excise/Caption/Tag": { "title": "$:/language/Buttons/Excise/Caption/Tag", "text": "Tag new tiddler with the title of this tiddler" }, "$:/language/Buttons/Excise/Caption/TiddlerExists": { "title": "$:/language/Buttons/Excise/Caption/TiddlerExists", "text": "Warning: tiddler already exists" }, "$:/language/Buttons/Excise/Hint": { "title": "$:/language/Buttons/Excise/Hint", "text": "Excise the selected text into a new tiddler" }, "$:/language/Buttons/Heading1/Caption": { "title": "$:/language/Buttons/Heading1/Caption", "text": "heading 1" }, "$:/language/Buttons/Heading1/Hint": { "title": "$:/language/Buttons/Heading1/Hint", "text": "Apply heading level 1 formatting to lines containing selection" }, "$:/language/Buttons/Heading2/Caption": { "title": "$:/language/Buttons/Heading2/Caption", "text": "heading 2" }, "$:/language/Buttons/Heading2/Hint": { "title": "$:/language/Buttons/Heading2/Hint", "text": "Apply heading level 2 formatting to lines containing selection" }, "$:/language/Buttons/Heading3/Caption": { "title": "$:/language/Buttons/Heading3/Caption", "text": "heading 3" }, "$:/language/Buttons/Heading3/Hint": { "title": "$:/language/Buttons/Heading3/Hint", "text": "Apply heading level 3 formatting to lines containing selection" }, "$:/language/Buttons/Heading4/Caption": { "title": "$:/language/Buttons/Heading4/Caption", "text": "heading 4" }, "$:/language/Buttons/Heading4/Hint": { "title": "$:/language/Buttons/Heading4/Hint", "text": "Apply heading level 4 formatting to lines containing selection" }, "$:/language/Buttons/Heading5/Caption": { "title": "$:/language/Buttons/Heading5/Caption", "text": "heading 5" }, "$:/language/Buttons/Heading5/Hint": { "title": "$:/language/Buttons/Heading5/Hint", "text": "Apply heading level 5 formatting to lines containing selection" }, "$:/language/Buttons/Heading6/Caption": { "title": "$:/language/Buttons/Heading6/Caption", "text": "heading 6" }, "$:/language/Buttons/Heading6/Hint": { "title": "$:/language/Buttons/Heading6/Hint", "text": "Apply heading level 6 formatting to lines containing selection" }, "$:/language/Buttons/Italic/Caption": { "title": "$:/language/Buttons/Italic/Caption", "text": "italic" }, "$:/language/Buttons/Italic/Hint": { "title": "$:/language/Buttons/Italic/Hint", "text": "Apply italic formatting to selection" }, "$:/language/Buttons/LineWidth/Caption": { "title": "$:/language/Buttons/LineWidth/Caption", "text": "line width" }, "$:/language/Buttons/LineWidth/Hint": { "title": "$:/language/Buttons/LineWidth/Hint", "text": "Set line width for painting" }, "$:/language/Buttons/Link/Caption": { "title": "$:/language/Buttons/Link/Caption", "text": "link" }, "$:/language/Buttons/Link/Hint": { "title": "$:/language/Buttons/Link/Hint", "text": "Create wikitext link" }, "$:/language/Buttons/Linkify/Caption": { "title": "$:/language/Buttons/Linkify/Caption", "text": "wikilink" }, "$:/language/Buttons/Linkify/Hint": { "title": "$:/language/Buttons/Linkify/Hint", "text": "Wrap selection in square brackets" }, "$:/language/Buttons/ListBullet/Caption": { "title": "$:/language/Buttons/ListBullet/Caption", "text": "bulleted list" }, "$:/language/Buttons/ListBullet/Hint": { "title": "$:/language/Buttons/ListBullet/Hint", "text": "Apply bulleted list formatting to lines containing selection" }, "$:/language/Buttons/ListNumber/Caption": { "title": "$:/language/Buttons/ListNumber/Caption", "text": "numbered list" }, "$:/language/Buttons/ListNumber/Hint": { "title": "$:/language/Buttons/ListNumber/Hint", "text": "Apply numbered list formatting to lines containing selection" }, "$:/language/Buttons/MonoBlock/Caption": { "title": "$:/language/Buttons/MonoBlock/Caption", "text": "monospaced block" }, "$:/language/Buttons/MonoBlock/Hint": { "title": "$:/language/Buttons/MonoBlock/Hint", "text": "Apply monospaced block formatting to lines containing selection" }, "$:/language/Buttons/MonoLine/Caption": { "title": "$:/language/Buttons/MonoLine/Caption", "text": "monospaced" }, "$:/language/Buttons/MonoLine/Hint": { "title": "$:/language/Buttons/MonoLine/Hint", "text": "Apply monospaced character formatting to selection" }, "$:/language/Buttons/Opacity/Caption": { "title": "$:/language/Buttons/Opacity/Caption", "text": "opacity" }, "$:/language/Buttons/Opacity/Hint": { "title": "$:/language/Buttons/Opacity/Hint", "text": "Set painting opacity" }, "$:/language/Buttons/Paint/Caption": { "title": "$:/language/Buttons/Paint/Caption", "text": "paint colour" }, "$:/language/Buttons/Paint/Hint": { "title": "$:/language/Buttons/Paint/Hint", "text": "Set painting colour" }, "$:/language/Buttons/Picture/Caption": { "title": "$:/language/Buttons/Picture/Caption", "text": "picture" }, "$:/language/Buttons/Picture/Hint": { "title": "$:/language/Buttons/Picture/Hint", "text": "Insert picture" }, "$:/language/Buttons/Preview/Caption": { "title": "$:/language/Buttons/Preview/Caption", "text": "preview" }, "$:/language/Buttons/Preview/Hint": { "title": "$:/language/Buttons/Preview/Hint", "text": "Show preview pane" }, "$:/language/Buttons/PreviewType/Caption": { "title": "$:/language/Buttons/PreviewType/Caption", "text": "preview type" }, "$:/language/Buttons/PreviewType/Hint": { "title": "$:/language/Buttons/PreviewType/Hint", "text": "Choose preview type" }, "$:/language/Buttons/Quote/Caption": { "title": "$:/language/Buttons/Quote/Caption", "text": "quote" }, "$:/language/Buttons/Quote/Hint": { "title": "$:/language/Buttons/Quote/Hint", "text": "Apply quoted text formatting to lines containing selection" }, "$:/language/Buttons/RotateLeft/Caption": { "title": "$:/language/Buttons/RotateLeft/Caption", "text": "rotate left" }, "$:/language/Buttons/RotateLeft/Hint": { "title": "$:/language/Buttons/RotateLeft/Hint", "text": "Rotate image left by 90 degrees" }, "$:/language/Buttons/Size/Caption": { "title": "$:/language/Buttons/Size/Caption", "text": "image size" }, "$:/language/Buttons/Size/Caption/Height": { "title": "$:/language/Buttons/Size/Caption/Height", "text": "Height:" }, "$:/language/Buttons/Size/Caption/Resize": { "title": "$:/language/Buttons/Size/Caption/Resize", "text": "Resize image" }, "$:/language/Buttons/Size/Caption/Width": { "title": "$:/language/Buttons/Size/Caption/Width", "text": "Width:" }, "$:/language/Buttons/Size/Hint": { "title": "$:/language/Buttons/Size/Hint", "text": "Set image size" }, "$:/language/Buttons/Stamp/Caption": { "title": "$:/language/Buttons/Stamp/Caption", "text": "stamp" }, "$:/language/Buttons/Stamp/Caption/New": { "title": "$:/language/Buttons/Stamp/Caption/New", "text": "Add your own" }, "$:/language/Buttons/Stamp/Hint": { "title": "$:/language/Buttons/Stamp/Hint", "text": "Insert a preconfigured snippet of text" }, "$:/language/Buttons/Stamp/New/Title": { "title": "$:/language/Buttons/Stamp/New/Title", "text": "Name as shown in menu" }, "$:/language/Buttons/Stamp/New/Text": { "title": "$:/language/Buttons/Stamp/New/Text", "text": "Text of snippet. (Remember to add a descriptive title in the caption field)." }, "$:/language/Buttons/Strikethrough/Caption": { "title": "$:/language/Buttons/Strikethrough/Caption", "text": "strikethrough" }, "$:/language/Buttons/Strikethrough/Hint": { "title": "$:/language/Buttons/Strikethrough/Hint", "text": "Apply strikethrough formatting to selection" }, "$:/language/Buttons/Subscript/Caption": { "title": "$:/language/Buttons/Subscript/Caption", "text": "subscript" }, "$:/language/Buttons/Subscript/Hint": { "title": "$:/language/Buttons/Subscript/Hint", "text": "Apply subscript formatting to selection" }, "$:/language/Buttons/Superscript/Caption": { "title": "$:/language/Buttons/Superscript/Caption", "text": "superscript" }, "$:/language/Buttons/Superscript/Hint": { "title": "$:/language/Buttons/Superscript/Hint", "text": "Apply superscript formatting to selection" }, "$:/language/Buttons/ToggleSidebar/Hint": { "title": "$:/language/Buttons/ToggleSidebar/Hint", "text": "Toggle the sidebar visibility" }, "$:/language/Buttons/Transcludify/Caption": { "title": "$:/language/Buttons/Transcludify/Caption", "text": "transclusion" }, "$:/language/Buttons/Transcludify/Hint": { "title": "$:/language/Buttons/Transcludify/Hint", "text": "Wrap selection in curly brackets" }, "$:/language/Buttons/Underline/Caption": { "title": "$:/language/Buttons/Underline/Caption", "text": "underline" }, "$:/language/Buttons/Underline/Hint": { "title": "$:/language/Buttons/Underline/Hint", "text": "Apply underline formatting to selection" }, "$:/language/ControlPanel/Advanced/Caption": { "title": "$:/language/ControlPanel/Advanced/Caption", "text": "Advanced" }, "$:/language/ControlPanel/Advanced/Hint": { "title": "$:/language/ControlPanel/Advanced/Hint", "text": "Internal information about this TiddlyWiki" }, "$:/language/ControlPanel/Appearance/Caption": { "title": "$:/language/ControlPanel/Appearance/Caption", "text": "Appearance" }, "$:/language/ControlPanel/Appearance/Hint": { "title": "$:/language/ControlPanel/Appearance/Hint", "text": "Ways to customise the appearance of your TiddlyWiki." }, "$:/language/ControlPanel/Basics/AnimDuration/Prompt": { "title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt", "text": "Animation duration" }, "$:/language/ControlPanel/Basics/AutoFocus/Prompt": { "title": "$:/language/ControlPanel/Basics/AutoFocus/Prompt", "text": "Default focus field for new tiddlers" }, "$:/language/ControlPanel/Basics/Caption": { "title": "$:/language/ControlPanel/Basics/Caption", "text": "Basics" }, "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": { "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint", "text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>" }, "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt", "text": "Default tiddlers" }, "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": { "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint", "text": "Choose which tiddlers are displayed at startup" }, "$:/language/ControlPanel/Basics/Language/Prompt": { "title": "$:/language/ControlPanel/Basics/Language/Prompt", "text": "Hello! Current language:" }, "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": { "title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt", "text": "Title of new journal tiddlers" }, "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt": { "title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt", "text": "Text for new journal tiddlers" }, "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": { "title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt", "text": "Tags for new journal tiddlers" }, "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt": { "title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt", "text": "Title of new tiddlers" }, "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt": { "title": "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt", "text": "Tags for new tiddlers" }, "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt", "text": "Number of overridden shadow tiddlers" }, "$:/language/ControlPanel/Basics/RemoveTags": { "title": "$:/language/ControlPanel/Basics/RemoveTags", "text": "Update to current format" }, "$:/language/ControlPanel/Basics/RemoveTags/Hint": { "title": "$:/language/ControlPanel/Basics/RemoveTags/Hint", "text": "Update the tags configuration to the latest format" }, "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt", "text": "Number of shadow tiddlers" }, "$:/language/ControlPanel/Basics/Subtitle/Prompt": { "title": "$:/language/ControlPanel/Basics/Subtitle/Prompt", "text": "Subtitle" }, "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt", "text": "Number of system tiddlers" }, "$:/language/ControlPanel/Basics/Tags/Prompt": { "title": "$:/language/ControlPanel/Basics/Tags/Prompt", "text": "Number of tags" }, "$:/language/ControlPanel/Basics/Tiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt", "text": "Number of tiddlers" }, "$:/language/ControlPanel/Basics/Title/Prompt": { "title": "$:/language/ControlPanel/Basics/Title/Prompt", "text": "Title of this ~TiddlyWiki" }, "$:/language/ControlPanel/Basics/Username/Prompt": { "title": "$:/language/ControlPanel/Basics/Username/Prompt", "text": "Username for signing edits" }, "$:/language/ControlPanel/Basics/Version/Prompt": { "title": "$:/language/ControlPanel/Basics/Version/Prompt", "text": "~TiddlyWiki version" }, "$:/language/ControlPanel/EditorTypes/Caption": { "title": "$:/language/ControlPanel/EditorTypes/Caption", "text": "Editor Types" }, "$:/language/ControlPanel/EditorTypes/Editor/Caption": { "title": "$:/language/ControlPanel/EditorTypes/Editor/Caption", "text": "Editor" }, "$:/language/ControlPanel/EditorTypes/Hint": { "title": "$:/language/ControlPanel/EditorTypes/Hint", "text": "These tiddlers determine which editor is used to edit specific tiddler types." }, "$:/language/ControlPanel/EditorTypes/Type/Caption": { "title": "$:/language/ControlPanel/EditorTypes/Type/Caption", "text": "Type" }, "$:/language/ControlPanel/Info/Caption": { "title": "$:/language/ControlPanel/Info/Caption", "text": "Info" }, "$:/language/ControlPanel/Info/Hint": { "title": "$:/language/ControlPanel/Info/Hint", "text": "Information about this TiddlyWiki" }, "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt", "text": "Type shortcut here" }, "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption", "text": "add shortcut" }, "$:/language/ControlPanel/KeyboardShortcuts/Caption": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Caption", "text": "Keyboard Shortcuts" }, "$:/language/ControlPanel/KeyboardShortcuts/Hint": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Hint", "text": "Manage keyboard shortcut assignments" }, "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": { "title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption", "text": "No keyboard shortcuts assigned" }, "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint", "text": "remove keyboard shortcut" }, "$:/language/ControlPanel/KeyboardShortcuts/Platform/All": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All", "text": "All platforms" }, "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac", "text": "Macintosh platform only" }, "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac", "text": "Non-Macintosh platforms only" }, "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux", "text": "Linux platform only" }, "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux", "text": "Non-Linux platforms only" }, "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows", "text": "Windows platform only" }, "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": { "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows", "text": "Non-Windows platforms only" }, "$:/language/ControlPanel/LayoutSwitcher/Caption": { "title": "$:/language/ControlPanel/LayoutSwitcher/Caption", "text": "Layout" }, "$:/language/ControlPanel/LoadedModules/Caption": { "title": "$:/language/ControlPanel/LoadedModules/Caption", "text": "Loaded Modules" }, "$:/language/ControlPanel/LoadedModules/Hint": { "title": "$:/language/ControlPanel/LoadedModules/Hint", "text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process." }, "$:/language/ControlPanel/Palette/Caption": { "title": "$:/language/ControlPanel/Palette/Caption", "text": "Palette" }, "$:/language/ControlPanel/Palette/Editor/Clone/Caption": { "title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption", "text": "clone" }, "$:/language/ControlPanel/Palette/Editor/Clone/Prompt": { "title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt", "text": "It is recommended that you clone this shadow palette before editing it" }, "$:/language/ControlPanel/Palette/Editor/Delete/Hint": { "title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint", "text": "delete this entry from the current palette" }, "$:/language/ControlPanel/Palette/Editor/Names/External/Show": { "title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show", "text": "Show color names that are not part of the current palette" }, "$:/language/ControlPanel/Palette/Editor/Prompt/Modified": { "title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified", "text": "This shadow palette has been modified" }, "$:/language/ControlPanel/Palette/Editor/Prompt": { "title": "$:/language/ControlPanel/Palette/Editor/Prompt", "text": "Editing" }, "$:/language/ControlPanel/Palette/Editor/Reset/Caption": { "title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption", "text": "reset" }, "$:/language/ControlPanel/Palette/HideEditor/Caption": { "title": "$:/language/ControlPanel/Palette/HideEditor/Caption", "text": "hide editor" }, "$:/language/ControlPanel/Palette/Prompt": { "title": "$:/language/ControlPanel/Palette/Prompt", "text": "Current palette:" }, "$:/language/ControlPanel/Palette/ShowEditor/Caption": { "title": "$:/language/ControlPanel/Palette/ShowEditor/Caption", "text": "show editor" }, "$:/language/ControlPanel/Parsing/Caption": { "title": "$:/language/ControlPanel/Parsing/Caption", "text": "Parsing" }, "$:/language/ControlPanel/Parsing/Hint": { "title": "$:/language/ControlPanel/Parsing/Hint", "text": "Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation." }, "$:/language/ControlPanel/Parsing/Block/Caption": { "title": "$:/language/ControlPanel/Parsing/Block/Caption", "text": "Block Parse Rules" }, "$:/language/ControlPanel/Parsing/Inline/Caption": { "title": "$:/language/ControlPanel/Parsing/Inline/Caption", "text": "Inline Parse Rules" }, "$:/language/ControlPanel/Parsing/Pragma/Caption": { "title": "$:/language/ControlPanel/Parsing/Pragma/Caption", "text": "Pragma Parse Rules" }, "$:/language/ControlPanel/Plugins/Add/Caption": { "title": "$:/language/ControlPanel/Plugins/Add/Caption", "text": "Get more plugins" }, "$:/language/ControlPanel/Plugins/Add/Hint": { "title": "$:/language/ControlPanel/Plugins/Add/Hint", "text": "Install plugins from the official library" }, "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": { "title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint", "text": "This plugin is already installed at version <$text text=<<installedVersion>>/>" }, "$:/language/ControlPanel/Plugins/AlsoRequires": { "title": "$:/language/ControlPanel/Plugins/AlsoRequires", "text": "Also requires:" }, "$:/language/ControlPanel/Plugins/Caption": { "title": "$:/language/ControlPanel/Plugins/Caption", "text": "Plugins" }, "$:/language/ControlPanel/Plugins/Disable/Caption": { "title": "$:/language/ControlPanel/Plugins/Disable/Caption", "text": "disable" }, "$:/language/ControlPanel/Plugins/Disable/Hint": { "title": "$:/language/ControlPanel/Plugins/Disable/Hint", "text": "Disable this plugin when reloading page" }, "$:/language/ControlPanel/Plugins/Disabled/Status": { "title": "$:/language/ControlPanel/Plugins/Disabled/Status", "text": "(disabled)" }, "$:/language/ControlPanel/Plugins/Downgrade/Caption": { "title": "$:/language/ControlPanel/Plugins/Downgrade/Caption", "text": "downgrade" }, "$:/language/ControlPanel/Plugins/Empty/Hint": { "title": "$:/language/ControlPanel/Plugins/Empty/Hint", "text": "None" }, "$:/language/ControlPanel/Plugins/Enable/Caption": { "title": "$:/language/ControlPanel/Plugins/Enable/Caption", "text": "enable" }, "$:/language/ControlPanel/Plugins/Enable/Hint": { "title": "$:/language/ControlPanel/Plugins/Enable/Hint", "text": "Enable this plugin when reloading page" }, "$:/language/ControlPanel/Plugins/Install/Caption": { "title": "$:/language/ControlPanel/Plugins/Install/Caption", "text": "install" }, "$:/language/ControlPanel/Plugins/Installed/Hint": { "title": "$:/language/ControlPanel/Plugins/Installed/Hint", "text": "Currently installed plugins:" }, "$:/language/ControlPanel/Plugins/Languages/Caption": { "title": "$:/language/ControlPanel/Plugins/Languages/Caption", "text": "Languages" }, "$:/language/ControlPanel/Plugins/Languages/Hint": { "title": "$:/language/ControlPanel/Plugins/Languages/Hint", "text": "Language pack plugins" }, "$:/language/ControlPanel/Plugins/NoInfoFound/Hint": { "title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint", "text": "No ''\"<$text text=<<currentTab>>/>\"'' found" }, "$:/language/ControlPanel/Plugins/NotInstalled/Hint": { "title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint", "text": "This plugin is not currently installed" }, "$:/language/ControlPanel/Plugins/OpenPluginLibrary": { "title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary", "text": "open plugin library" }, "$:/language/ControlPanel/Plugins/ClosePluginLibrary": { "title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary", "text": "close plugin library" }, "$:/language/ControlPanel/Plugins/PluginWillRequireReload": { "title": "$:/language/ControlPanel/Plugins/PluginWillRequireReload", "text": "(requires reload)" }, "$:/language/ControlPanel/Plugins/Plugins/Caption": { "title": "$:/language/ControlPanel/Plugins/Plugins/Caption", "text": "Plugins" }, "$:/language/ControlPanel/Plugins/Plugins/Hint": { "title": "$:/language/ControlPanel/Plugins/Plugins/Hint", "text": "Plugins" }, "$:/language/ControlPanel/Plugins/Reinstall/Caption": { "title": "$:/language/ControlPanel/Plugins/Reinstall/Caption", "text": "reinstall" }, "$:/language/ControlPanel/Plugins/Themes/Caption": { "title": "$:/language/ControlPanel/Plugins/Themes/Caption", "text": "Themes" }, "$:/language/ControlPanel/Plugins/Themes/Hint": { "title": "$:/language/ControlPanel/Plugins/Themes/Hint", "text": "Theme plugins" }, "$:/language/ControlPanel/Plugins/Update/Caption": { "title": "$:/language/ControlPanel/Plugins/Update/Caption", "text": "update" }, "$:/language/ControlPanel/Plugins/Updates/Caption": { "title": "$:/language/ControlPanel/Plugins/Updates/Caption", "text": "Updates" }, "$:/language/ControlPanel/Plugins/Updates/Hint": { "title": "$:/language/ControlPanel/Plugins/Updates/Hint", "text": "Available updates to installed plugins" }, "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption": { "title": "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption", "text": "Update <<update-count>> plugins" }, "$:/language/ControlPanel/Plugins/SubPluginPrompt": { "title": "$:/language/ControlPanel/Plugins/SubPluginPrompt", "text": "With <<count>> sub-plugins available" }, "$:/language/ControlPanel/Saving/Caption": { "title": "$:/language/ControlPanel/Saving/Caption", "text": "Saving" }, "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": { "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description", "text": "Permit automatic saving for the download saver" }, "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": { "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint", "text": "Enable Autosave for Download Saver" }, "$:/language/ControlPanel/Saving/DownloadSaver/Caption": { "title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption", "text": "Download Saver" }, "$:/language/ControlPanel/Saving/DownloadSaver/Hint": { "title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint", "text": "These settings apply to the HTML5-compatible download saver" }, "$:/language/ControlPanel/Saving/General/Caption": { "title": "$:/language/ControlPanel/Saving/General/Caption", "text": "General" }, "$:/language/ControlPanel/Saving/General/Hint": { "title": "$:/language/ControlPanel/Saving/General/Hint", "text": "These settings apply to all the loaded savers" }, "$:/language/ControlPanel/Saving/Hint": { "title": "$:/language/ControlPanel/Saving/Hint", "text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module" }, "$:/language/ControlPanel/Saving/GitService/Branch": { "title": "$:/language/ControlPanel/Saving/GitService/Branch", "text": "Target branch for saving" }, "$:/language/ControlPanel/Saving/GitService/CommitMessage": { "title": "$:/language/ControlPanel/Saving/GitService/CommitMessage", "text": "Saved by TiddlyWiki" }, "$:/language/ControlPanel/Saving/GitService/Description": { "title": "$:/language/ControlPanel/Saving/GitService/Description", "text": "These settings are only used when saving to <<service-name>>" }, "$:/language/ControlPanel/Saving/GitService/Filename": { "title": "$:/language/ControlPanel/Saving/GitService/Filename", "text": "Filename of target file (e.g. `index.html`)" }, "$:/language/ControlPanel/Saving/GitService/Path": { "title": "$:/language/ControlPanel/Saving/GitService/Path", "text": "Path to target file (e.g. `/wiki/`)" }, "$:/language/ControlPanel/Saving/GitService/Repo": { "title": "$:/language/ControlPanel/Saving/GitService/Repo", "text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)" }, "$:/language/ControlPanel/Saving/GitService/ServerURL": { "title": "$:/language/ControlPanel/Saving/GitService/ServerURL", "text": "Server API URL" }, "$:/language/ControlPanel/Saving/GitService/UserName": { "title": "$:/language/ControlPanel/Saving/GitService/UserName", "text": "Username" }, "$:/language/ControlPanel/Saving/GitService/GitHub/Caption": { "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption", "text": "~GitHub Saver" }, "$:/language/ControlPanel/Saving/GitService/GitHub/Password": { "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password", "text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)" }, "$:/language/ControlPanel/Saving/GitService/GitLab/Caption": { "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption", "text": "~GitLab Saver" }, "$:/language/ControlPanel/Saving/GitService/GitLab/Password": { "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password", "text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)" }, "$:/language/ControlPanel/Saving/GitService/Gitea/Caption": { "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Caption", "text": "Gitea Saver" }, "$:/language/ControlPanel/Saving/GitService/Gitea/Password": { "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Password", "text": "Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)" }, "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading", "text": "Advanced Settings" }, "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir", "text": "Backup Directory" }, "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel", "text": "~TiddlySpot Control Panel" }, "$:/language/ControlPanel/Saving/TiddlySpot/Backups": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups", "text": "Backups" }, "$:/language/ControlPanel/Saving/TiddlySpot/Caption": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption", "text": "~TiddlySpot Saver" }, "$:/language/ControlPanel/Saving/TiddlySpot/Description": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Description", "text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server" }, "$:/language/ControlPanel/Saving/TiddlySpot/Filename": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename", "text": "Upload Filename" }, "$:/language/ControlPanel/Saving/TiddlySpot/Heading": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading", "text": "~TiddlySpot" }, "$:/language/ControlPanel/Saving/TiddlySpot/Hint": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint", "text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//" }, "$:/language/ControlPanel/Saving/TiddlySpot/Password": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Password", "text": "Password" }, "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly", "text": "The ~TiddlySpot service is currently only available in read-only form. Please see http://tiddlyspot.com/ for the latest details. The ~TiddlySpot saver can still be used to save to compatible servers." }, "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL", "text": "Server URL" }, "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir", "text": "Upload Directory" }, "$:/language/ControlPanel/Saving/TiddlySpot/UserName": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName", "text": "Wiki Name" }, "$:/language/ControlPanel/Settings/AutoSave/Caption": { "title": "$:/language/ControlPanel/Settings/AutoSave/Caption", "text": "Autosave" }, "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": { "title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description", "text": "Do not save changes automatically" }, "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": { "title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description", "text": "Save changes automatically" }, "$:/language/ControlPanel/Settings/AutoSave/Hint": { "title": "$:/language/ControlPanel/Settings/AutoSave/Hint", "text": "Attempt to automatically save changes during editing when using a supporting saver" }, "$:/language/ControlPanel/Settings/CamelCase/Caption": { "title": "$:/language/ControlPanel/Settings/CamelCase/Caption", "text": "Camel Case Wiki Links" }, "$:/language/ControlPanel/Settings/CamelCase/Hint": { "title": "$:/language/ControlPanel/Settings/CamelCase/Hint", "text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect" }, "$:/language/ControlPanel/Settings/CamelCase/Description": { "title": "$:/language/ControlPanel/Settings/CamelCase/Description", "text": "Enable automatic ~CamelCase linking" }, "$:/language/ControlPanel/Settings/Caption": { "title": "$:/language/ControlPanel/Settings/Caption", "text": "Settings" }, "$:/language/ControlPanel/Settings/EditorToolbar/Caption": { "title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption", "text": "Editor Toolbar" }, "$:/language/ControlPanel/Settings/EditorToolbar/Hint": { "title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint", "text": "Enable or disable the editor toolbar:" }, "$:/language/ControlPanel/Settings/EditorToolbar/Description": { "title": "$:/language/ControlPanel/Settings/EditorToolbar/Description", "text": "Show editor toolbar" }, "$:/language/ControlPanel/Settings/InfoPanelMode/Caption": { "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption", "text": "Tiddler Info Panel Mode" }, "$:/language/ControlPanel/Settings/InfoPanelMode/Hint": { "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint", "text": "Control when the tiddler info panel closes:" }, "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": { "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description", "text": "Tiddler info panel closes automatically" }, "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": { "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description", "text": "Tiddler info panel stays open until explicitly closed" }, "$:/language/ControlPanel/Settings/Hint": { "title": "$:/language/ControlPanel/Settings/Hint", "text": "These settings let you customise the behaviour of TiddlyWiki." }, "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption", "text": "Navigation Address Bar" }, "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint", "text": "Behaviour of the browser address bar when navigating to a tiddler:" }, "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description", "text": "Do not update the address bar" }, "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description", "text": "Include the target tiddler" }, "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description", "text": "Include the target tiddler and the current story sequence" }, "$:/language/ControlPanel/Settings/NavigationHistory/Caption": { "title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption", "text": "Navigation History" }, "$:/language/ControlPanel/Settings/NavigationHistory/Hint": { "title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint", "text": "Update browser history when navigating to a tiddler:" }, "$:/language/ControlPanel/Settings/NavigationHistory/No/Description": { "title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description", "text": "Do not update history" }, "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": { "title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description", "text": "Update history" }, "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption": { "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption", "text": "Permalink/permaview Mode" }, "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": { "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint", "text": "Choose how permalink/permaview is handled:" }, "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": { "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description", "text": "Copy permalink/permaview URL to clipboard" }, "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": { "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description", "text": "Update address bar with permalink/permaview URL" }, "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption": { "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption", "text": "Performance Instrumentation" }, "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": { "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint", "text": "Displays performance statistics in the browser developer console. Requires reload to take effect" }, "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": { "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description", "text": "Enable performance instrumentation" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption", "text": "Toolbar Button Style" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint", "text": "Choose the style for toolbar buttons:" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless", "text": "Borderless" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed", "text": "Boxed" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded", "text": "Rounded" }, "$:/language/ControlPanel/Settings/ToolbarButtons/Caption": { "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption", "text": "Toolbar Buttons" }, "$:/language/ControlPanel/Settings/ToolbarButtons/Hint": { "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint", "text": "Default toolbar button appearance:" }, "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": { "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description", "text": "Include icon" }, "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": { "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description", "text": "Include text" }, "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": { "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption", "text": "Default Sidebar Tab" }, "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": { "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint", "text": "Specify which sidebar tab is displayed by default" }, "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption": { "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption", "text": "Default More Sidebar Tab" }, "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": { "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint", "text": "Specify which More sidebar tab is displayed by default" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption", "text": "Tiddler Opening Behaviour" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint", "text": "Navigation from //within// the story river" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint", "text": "Navigation from //outside// the story river" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove", "text": "Open above the current tiddler" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow", "text": "Open below the current tiddler" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop", "text": "Open at the top of the story river" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom", "text": "Open at the bottom of the story river" }, "$:/language/ControlPanel/Settings/TitleLinks/Caption": { "title": "$:/language/ControlPanel/Settings/TitleLinks/Caption", "text": "Tiddler Titles" }, "$:/language/ControlPanel/Settings/TitleLinks/Hint": { "title": "$:/language/ControlPanel/Settings/TitleLinks/Hint", "text": "Optionally display tiddler titles as links" }, "$:/language/ControlPanel/Settings/TitleLinks/No/Description": { "title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description", "text": "Do not display tiddler titles as links" }, "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": { "title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description", "text": "Display tiddler titles as links" }, "$:/language/ControlPanel/Settings/MissingLinks/Caption": { "title": "$:/language/ControlPanel/Settings/MissingLinks/Caption", "text": "Wiki Links" }, "$:/language/ControlPanel/Settings/MissingLinks/Hint": { "title": "$:/language/ControlPanel/Settings/MissingLinks/Hint", "text": "Choose whether to link to tiddlers that do not exist yet" }, "$:/language/ControlPanel/Settings/MissingLinks/Description": { "title": "$:/language/ControlPanel/Settings/MissingLinks/Description", "text": "Enable links to missing tiddlers" }, "$:/language/ControlPanel/StoryView/Caption": { "title": "$:/language/ControlPanel/StoryView/Caption", "text": "Story View" }, "$:/language/ControlPanel/StoryView/Prompt": { "title": "$:/language/ControlPanel/StoryView/Prompt", "text": "Current view:" }, "$:/language/ControlPanel/Stylesheets/Caption": { "title": "$:/language/ControlPanel/Stylesheets/Caption", "text": "Stylesheets" }, "$:/language/ControlPanel/Stylesheets/Expand/Caption": { "title": "$:/language/ControlPanel/Stylesheets/Expand/Caption", "text": "Expand All" }, "$:/language/ControlPanel/Stylesheets/Hint": { "title": "$:/language/ControlPanel/Stylesheets/Hint", "text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>" }, "$:/language/ControlPanel/Stylesheets/Restore/Caption": { "title": "$:/language/ControlPanel/Stylesheets/Restore/Caption", "text": "Restore" }, "$:/language/ControlPanel/Theme/Caption": { "title": "$:/language/ControlPanel/Theme/Caption", "text": "Theme" }, "$:/language/ControlPanel/Theme/Prompt": { "title": "$:/language/ControlPanel/Theme/Prompt", "text": "Current theme:" }, "$:/language/ControlPanel/TiddlerFields/Caption": { "title": "$:/language/ControlPanel/TiddlerFields/Caption", "text": "Tiddler Fields" }, "$:/language/ControlPanel/TiddlerFields/Hint": { "title": "$:/language/ControlPanel/TiddlerFields/Hint", "text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)." }, "$:/language/ControlPanel/Toolbars/Caption": { "title": "$:/language/ControlPanel/Toolbars/Caption", "text": "Toolbars" }, "$:/language/ControlPanel/Toolbars/EditToolbar/Caption": { "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption", "text": "Edit Toolbar" }, "$:/language/ControlPanel/Toolbars/EditToolbar/Hint": { "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint", "text": "Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering" }, "$:/language/ControlPanel/Toolbars/Hint": { "title": "$:/language/ControlPanel/Toolbars/Hint", "text": "Select which toolbar buttons are displayed" }, "$:/language/ControlPanel/Toolbars/PageControls/Caption": { "title": "$:/language/ControlPanel/Toolbars/PageControls/Caption", "text": "Page Toolbar" }, "$:/language/ControlPanel/Toolbars/PageControls/Hint": { "title": "$:/language/ControlPanel/Toolbars/PageControls/Hint", "text": "Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering" }, "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": { "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption", "text": "Editor Toolbar" }, "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": { "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint", "text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering" }, "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": { "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption", "text": "View Toolbar" }, "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": { "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint", "text": "Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering" }, "$:/language/ControlPanel/Tools/Download/Full/Caption": { "title": "$:/language/ControlPanel/Tools/Download/Full/Caption", "text": "Download full wiki" }, "$:/language/Date/DaySuffix/1": { "title": "$:/language/Date/DaySuffix/1", "text": "st" }, "$:/language/Date/DaySuffix/2": { "title": "$:/language/Date/DaySuffix/2", "text": "nd" }, "$:/language/Date/DaySuffix/3": { "title": "$:/language/Date/DaySuffix/3", "text": "rd" }, "$:/language/Date/DaySuffix/4": { "title": "$:/language/Date/DaySuffix/4", "text": "th" }, "$:/language/Date/DaySuffix/5": { "title": "$:/language/Date/DaySuffix/5", "text": "th" }, "$:/language/Date/DaySuffix/6": { "title": "$:/language/Date/DaySuffix/6", "text": "th" }, "$:/language/Date/DaySuffix/7": { "title": "$:/language/Date/DaySuffix/7", "text": "th" }, "$:/language/Date/DaySuffix/8": { "title": "$:/language/Date/DaySuffix/8", "text": "th" }, "$:/language/Date/DaySuffix/9": { "title": "$:/language/Date/DaySuffix/9", "text": "th" }, "$:/language/Date/DaySuffix/10": { "title": "$:/language/Date/DaySuffix/10", "text": "th" }, "$:/language/Date/DaySuffix/11": { "title": "$:/language/Date/DaySuffix/11", "text": "th" }, "$:/language/Date/DaySuffix/12": { "title": "$:/language/Date/DaySuffix/12", "text": "th" }, "$:/language/Date/DaySuffix/13": { "title": "$:/language/Date/DaySuffix/13", "text": "th" }, "$:/language/Date/DaySuffix/14": { "title": "$:/language/Date/DaySuffix/14", "text": "th" }, "$:/language/Date/DaySuffix/15": { "title": "$:/language/Date/DaySuffix/15", "text": "th" }, "$:/language/Date/DaySuffix/16": { "title": "$:/language/Date/DaySuffix/16", "text": "th" }, "$:/language/Date/DaySuffix/17": { "title": "$:/language/Date/DaySuffix/17", "text": "th" }, "$:/language/Date/DaySuffix/18": { "title": "$:/language/Date/DaySuffix/18", "text": "th" }, "$:/language/Date/DaySuffix/19": { "title": "$:/language/Date/DaySuffix/19", "text": "th" }, "$:/language/Date/DaySuffix/20": { "title": "$:/language/Date/DaySuffix/20", "text": "th" }, "$:/language/Date/DaySuffix/21": { "title": "$:/language/Date/DaySuffix/21", "text": "st" }, "$:/language/Date/DaySuffix/22": { "title": "$:/language/Date/DaySuffix/22", "text": "nd" }, "$:/language/Date/DaySuffix/23": { "title": "$:/language/Date/DaySuffix/23", "text": "rd" }, "$:/language/Date/DaySuffix/24": { "title": "$:/language/Date/DaySuffix/24", "text": "th" }, "$:/language/Date/DaySuffix/25": { "title": "$:/language/Date/DaySuffix/25", "text": "th" }, "$:/language/Date/DaySuffix/26": { "title": "$:/language/Date/DaySuffix/26", "text": "th" }, "$:/language/Date/DaySuffix/27": { "title": "$:/language/Date/DaySuffix/27", "text": "th" }, "$:/language/Date/DaySuffix/28": { "title": "$:/language/Date/DaySuffix/28", "text": "th" }, "$:/language/Date/DaySuffix/29": { "title": "$:/language/Date/DaySuffix/29", "text": "th" }, "$:/language/Date/DaySuffix/30": { "title": "$:/language/Date/DaySuffix/30", "text": "th" }, "$:/language/Date/DaySuffix/31": { "title": "$:/language/Date/DaySuffix/31", "text": "st" }, "$:/language/Date/Long/Day/0": { "title": "$:/language/Date/Long/Day/0", "text": "Sunday" }, "$:/language/Date/Long/Day/1": { "title": "$:/language/Date/Long/Day/1", "text": "Monday" }, "$:/language/Date/Long/Day/2": { "title": "$:/language/Date/Long/Day/2", "text": "Tuesday" }, "$:/language/Date/Long/Day/3": { "title": "$:/language/Date/Long/Day/3", "text": "Wednesday" }, "$:/language/Date/Long/Day/4": { "title": "$:/language/Date/Long/Day/4", "text": "Thursday" }, "$:/language/Date/Long/Day/5": { "title": "$:/language/Date/Long/Day/5", "text": "Friday" }, "$:/language/Date/Long/Day/6": { "title": "$:/language/Date/Long/Day/6", "text": "Saturday" }, "$:/language/Date/Long/Month/1": { "title": "$:/language/Date/Long/Month/1", "text": "January" }, "$:/language/Date/Long/Month/2": { "title": "$:/language/Date/Long/Month/2", "text": "February" }, "$:/language/Date/Long/Month/3": { "title": "$:/language/Date/Long/Month/3", "text": "March" }, "$:/language/Date/Long/Month/4": { "title": "$:/language/Date/Long/Month/4", "text": "April" }, "$:/language/Date/Long/Month/5": { "title": "$:/language/Date/Long/Month/5", "text": "May" }, "$:/language/Date/Long/Month/6": { "title": "$:/language/Date/Long/Month/6", "text": "June" }, "$:/language/Date/Long/Month/7": { "title": "$:/language/Date/Long/Month/7", "text": "July" }, "$:/language/Date/Long/Month/8": { "title": "$:/language/Date/Long/Month/8", "text": "August" }, "$:/language/Date/Long/Month/9": { "title": "$:/language/Date/Long/Month/9", "text": "September" }, "$:/language/Date/Long/Month/10": { "title": "$:/language/Date/Long/Month/10", "text": "October" }, "$:/language/Date/Long/Month/11": { "title": "$:/language/Date/Long/Month/11", "text": "November" }, "$:/language/Date/Long/Month/12": { "title": "$:/language/Date/Long/Month/12", "text": "December" }, "$:/language/Date/Period/am": { "title": "$:/language/Date/Period/am", "text": "am" }, "$:/language/Date/Period/pm": { "title": "$:/language/Date/Period/pm", "text": "pm" }, "$:/language/Date/Short/Day/0": { "title": "$:/language/Date/Short/Day/0", "text": "Sun" }, "$:/language/Date/Short/Day/1": { "title": "$:/language/Date/Short/Day/1", "text": "Mon" }, "$:/language/Date/Short/Day/2": { "title": "$:/language/Date/Short/Day/2", "text": "Tue" }, "$:/language/Date/Short/Day/3": { "title": "$:/language/Date/Short/Day/3", "text": "Wed" }, "$:/language/Date/Short/Day/4": { "title": "$:/language/Date/Short/Day/4", "text": "Thu" }, "$:/language/Date/Short/Day/5": { "title": "$:/language/Date/Short/Day/5", "text": "Fri" }, "$:/language/Date/Short/Day/6": { "title": "$:/language/Date/Short/Day/6", "text": "Sat" }, "$:/language/Date/Short/Month/1": { "title": "$:/language/Date/Short/Month/1", "text": "Jan" }, "$:/language/Date/Short/Month/2": { "title": "$:/language/Date/Short/Month/2", "text": "Feb" }, "$:/language/Date/Short/Month/3": { "title": "$:/language/Date/Short/Month/3", "text": "Mar" }, "$:/language/Date/Short/Month/4": { "title": "$:/language/Date/Short/Month/4", "text": "Apr" }, "$:/language/Date/Short/Month/5": { "title": "$:/language/Date/Short/Month/5", "text": "May" }, "$:/language/Date/Short/Month/6": { "title": "$:/language/Date/Short/Month/6", "text": "Jun" }, "$:/language/Date/Short/Month/7": { "title": "$:/language/Date/Short/Month/7", "text": "Jul" }, "$:/language/Date/Short/Month/8": { "title": "$:/language/Date/Short/Month/8", "text": "Aug" }, "$:/language/Date/Short/Month/9": { "title": "$:/language/Date/Short/Month/9", "text": "Sep" }, "$:/language/Date/Short/Month/10": { "title": "$:/language/Date/Short/Month/10", "text": "Oct" }, "$:/language/Date/Short/Month/11": { "title": "$:/language/Date/Short/Month/11", "text": "Nov" }, "$:/language/Date/Short/Month/12": { "title": "$:/language/Date/Short/Month/12", "text": "Dec" }, "$:/language/RelativeDate/Future/Days": { "title": "$:/language/RelativeDate/Future/Days", "text": "<<period>> days from now" }, "$:/language/RelativeDate/Future/Hours": { "title": "$:/language/RelativeDate/Future/Hours", "text": "<<period>> hours from now" }, "$:/language/RelativeDate/Future/Minutes": { "title": "$:/language/RelativeDate/Future/Minutes", "text": "<<period>> minutes from now" }, "$:/language/RelativeDate/Future/Months": { "title": "$:/language/RelativeDate/Future/Months", "text": "<<period>> months from now" }, "$:/language/RelativeDate/Future/Second": { "title": "$:/language/RelativeDate/Future/Second", "text": "1 second from now" }, "$:/language/RelativeDate/Future/Seconds": { "title": "$:/language/RelativeDate/Future/Seconds", "text": "<<period>> seconds from now" }, "$:/language/RelativeDate/Future/Years": { "title": "$:/language/RelativeDate/Future/Years", "text": "<<period>> years from now" }, "$:/language/RelativeDate/Past/Days": { "title": "$:/language/RelativeDate/Past/Days", "text": "<<period>> days ago" }, "$:/language/RelativeDate/Past/Hours": { "title": "$:/language/RelativeDate/Past/Hours", "text": "<<period>> hours ago" }, "$:/language/RelativeDate/Past/Minutes": { "title": "$:/language/RelativeDate/Past/Minutes", "text": "<<period>> minutes ago" }, "$:/language/RelativeDate/Past/Months": { "title": "$:/language/RelativeDate/Past/Months", "text": "<<period>> months ago" }, "$:/language/RelativeDate/Past/Second": { "title": "$:/language/RelativeDate/Past/Second", "text": "1 second ago" }, "$:/language/RelativeDate/Past/Seconds": { "title": "$:/language/RelativeDate/Past/Seconds", "text": "<<period>> seconds ago" }, "$:/language/RelativeDate/Past/Years": { "title": "$:/language/RelativeDate/Past/Years", "text": "<<period>> years ago" }, "$:/language/Docs/ModuleTypes/allfilteroperator": { "title": "$:/language/Docs/ModuleTypes/allfilteroperator", "text": "A sub-operator for the ''all'' filter operator." }, "$:/language/Docs/ModuleTypes/animation": { "title": "$:/language/Docs/ModuleTypes/animation", "text": "Animations that may be used with the RevealWidget." }, "$:/language/Docs/ModuleTypes/authenticator": { "title": "$:/language/Docs/ModuleTypes/authenticator", "text": "Defines how requests are authenticated by the built-in HTTP server." }, "$:/language/Docs/ModuleTypes/bitmapeditoroperation": { "title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation", "text": "A bitmap editor toolbar operation." }, "$:/language/Docs/ModuleTypes/command": { "title": "$:/language/Docs/ModuleTypes/command", "text": "Commands that can be executed under Node.js." }, "$:/language/Docs/ModuleTypes/config": { "title": "$:/language/Docs/ModuleTypes/config", "text": "Data to be inserted into `$tw.config`." }, "$:/language/Docs/ModuleTypes/filteroperator": { "title": "$:/language/Docs/ModuleTypes/filteroperator", "text": "Individual filter operator methods." }, "$:/language/Docs/ModuleTypes/global": { "title": "$:/language/Docs/ModuleTypes/global", "text": "Global data to be inserted into `$tw`." }, "$:/language/Docs/ModuleTypes/info": { "title": "$:/language/Docs/ModuleTypes/info", "text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin." }, "$:/language/Docs/ModuleTypes/isfilteroperator": { "title": "$:/language/Docs/ModuleTypes/isfilteroperator", "text": "Operands for the ''is'' filter operator." }, "$:/language/Docs/ModuleTypes/library": { "title": "$:/language/Docs/ModuleTypes/library", "text": "Generic module type for general purpose JavaScript modules." }, "$:/language/Docs/ModuleTypes/macro": { "title": "$:/language/Docs/ModuleTypes/macro", "text": "JavaScript macro definitions." }, "$:/language/Docs/ModuleTypes/parser": { "title": "$:/language/Docs/ModuleTypes/parser", "text": "Parsers for different content types." }, "$:/language/Docs/ModuleTypes/route": { "title": "$:/language/Docs/ModuleTypes/route", "text": "Defines how individual URL patterns are handled by the built-in HTTP server." }, "$:/language/Docs/ModuleTypes/saver": { "title": "$:/language/Docs/ModuleTypes/saver", "text": "Savers handle different methods for saving files from the browser." }, "$:/language/Docs/ModuleTypes/startup": { "title": "$:/language/Docs/ModuleTypes/startup", "text": "Startup functions." }, "$:/language/Docs/ModuleTypes/storyview": { "title": "$:/language/Docs/ModuleTypes/storyview", "text": "Story views customise the animation and behaviour of list widgets." }, "$:/language/Docs/ModuleTypes/texteditoroperation": { "title": "$:/language/Docs/ModuleTypes/texteditoroperation", "text": "A text editor toolbar operation." }, "$:/language/Docs/ModuleTypes/tiddlerdeserializer": { "title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer", "text": "Converts different content types into tiddlers." }, "$:/language/Docs/ModuleTypes/tiddlerfield": { "title": "$:/language/Docs/ModuleTypes/tiddlerfield", "text": "Defines the behaviour of an individual tiddler field." }, "$:/language/Docs/ModuleTypes/tiddlermethod": { "title": "$:/language/Docs/ModuleTypes/tiddlermethod", "text": "Adds methods to the `$tw.Tiddler` prototype." }, "$:/language/Docs/ModuleTypes/upgrader": { "title": "$:/language/Docs/ModuleTypes/upgrader", "text": "Applies upgrade processing to tiddlers during an upgrade/import." }, "$:/language/Docs/ModuleTypes/utils": { "title": "$:/language/Docs/ModuleTypes/utils", "text": "Adds methods to `$tw.utils`." }, "$:/language/Docs/ModuleTypes/utils-node": { "title": "$:/language/Docs/ModuleTypes/utils-node", "text": "Adds Node.js-specific methods to `$tw.utils`." }, "$:/language/Docs/ModuleTypes/widget": { "title": "$:/language/Docs/ModuleTypes/widget", "text": "Widgets encapsulate DOM rendering and refreshing." }, "$:/language/Docs/ModuleTypes/wikimethod": { "title": "$:/language/Docs/ModuleTypes/wikimethod", "text": "Adds methods to `$tw.Wiki`." }, "$:/language/Docs/ModuleTypes/wikirule": { "title": "$:/language/Docs/ModuleTypes/wikirule", "text": "Individual parser rules for the main WikiText parser." }, "$:/language/Docs/PaletteColours/alert-background": { "title": "$:/language/Docs/PaletteColours/alert-background", "text": "Alert background" }, "$:/language/Docs/PaletteColours/alert-border": { "title": "$:/language/Docs/PaletteColours/alert-border", "text": "Alert border" }, "$:/language/Docs/PaletteColours/alert-highlight": { "title": "$:/language/Docs/PaletteColours/alert-highlight", "text": "Alert highlight" }, "$:/language/Docs/PaletteColours/alert-muted-foreground": { "title": "$:/language/Docs/PaletteColours/alert-muted-foreground", "text": "Alert muted foreground" }, "$:/language/Docs/PaletteColours/background": { "title": "$:/language/Docs/PaletteColours/background", "text": "General background" }, "$:/language/Docs/PaletteColours/blockquote-bar": { "title": "$:/language/Docs/PaletteColours/blockquote-bar", "text": "Blockquote bar" }, "$:/language/Docs/PaletteColours/button-background": { "title": "$:/language/Docs/PaletteColours/button-background", "text": "Default button background" }, "$:/language/Docs/PaletteColours/button-border": { "title": "$:/language/Docs/PaletteColours/button-border", "text": "Default button border" }, "$:/language/Docs/PaletteColours/button-foreground": { "title": "$:/language/Docs/PaletteColours/button-foreground", "text": "Default button foreground" }, "$:/language/Docs/PaletteColours/dirty-indicator": { "title": "$:/language/Docs/PaletteColours/dirty-indicator", "text": "Unsaved changes indicator" }, "$:/language/Docs/PaletteColours/code-background": { "title": "$:/language/Docs/PaletteColours/code-background", "text": "Code background" }, "$:/language/Docs/PaletteColours/code-border": { "title": "$:/language/Docs/PaletteColours/code-border", "text": "Code border" }, "$:/language/Docs/PaletteColours/code-foreground": { "title": "$:/language/Docs/PaletteColours/code-foreground", "text": "Code foreground" }, "$:/language/Docs/PaletteColours/download-background": { "title": "$:/language/Docs/PaletteColours/download-background", "text": "Download button background" }, "$:/language/Docs/PaletteColours/download-foreground": { "title": "$:/language/Docs/PaletteColours/download-foreground", "text": "Download button foreground" }, "$:/language/Docs/PaletteColours/dragger-background": { "title": "$:/language/Docs/PaletteColours/dragger-background", "text": "Dragger background" }, "$:/language/Docs/PaletteColours/dragger-foreground": { "title": "$:/language/Docs/PaletteColours/dragger-foreground", "text": "Dragger foreground" }, "$:/language/Docs/PaletteColours/dropdown-background": { "title": "$:/language/Docs/PaletteColours/dropdown-background", "text": "Dropdown background" }, "$:/language/Docs/PaletteColours/dropdown-border": { "title": "$:/language/Docs/PaletteColours/dropdown-border", "text": "Dropdown border" }, "$:/language/Docs/PaletteColours/dropdown-tab-background-selected": { "title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected", "text": "Dropdown tab background for selected tabs" }, "$:/language/Docs/PaletteColours/dropdown-tab-background": { "title": "$:/language/Docs/PaletteColours/dropdown-tab-background", "text": "Dropdown tab background" }, "$:/language/Docs/PaletteColours/dropzone-background": { "title": "$:/language/Docs/PaletteColours/dropzone-background", "text": "Dropzone background" }, "$:/language/Docs/PaletteColours/external-link-background-hover": { "title": "$:/language/Docs/PaletteColours/external-link-background-hover", "text": "External link background hover" }, "$:/language/Docs/PaletteColours/external-link-background-visited": { "title": "$:/language/Docs/PaletteColours/external-link-background-visited", "text": "External link background visited" }, "$:/language/Docs/PaletteColours/external-link-background": { "title": "$:/language/Docs/PaletteColours/external-link-background", "text": "External link background" }, "$:/language/Docs/PaletteColours/external-link-foreground-hover": { "title": "$:/language/Docs/PaletteColours/external-link-foreground-hover", "text": "External link foreground hover" }, "$:/language/Docs/PaletteColours/external-link-foreground-visited": { "title": "$:/language/Docs/PaletteColours/external-link-foreground-visited", "text": "External link foreground visited" }, "$:/language/Docs/PaletteColours/external-link-foreground": { "title": "$:/language/Docs/PaletteColours/external-link-foreground", "text": "External link foreground" }, "$:/language/Docs/PaletteColours/foreground": { "title": "$:/language/Docs/PaletteColours/foreground", "text": "General foreground" }, "$:/language/Docs/PaletteColours/menubar-background": { "title": "$:/language/Docs/PaletteColours/menubar-background", "text": "Menu bar background" }, "$:/language/Docs/PaletteColours/menubar-foreground": { "title": "$:/language/Docs/PaletteColours/menubar-foreground", "text": "Menu bar foreground" }, "$:/language/Docs/PaletteColours/message-background": { "title": "$:/language/Docs/PaletteColours/message-background", "text": "Message box background" }, "$:/language/Docs/PaletteColours/message-border": { "title": "$:/language/Docs/PaletteColours/message-border", "text": "Message box border" }, "$:/language/Docs/PaletteColours/message-foreground": { "title": "$:/language/Docs/PaletteColours/message-foreground", "text": "Message box foreground" }, "$:/language/Docs/PaletteColours/modal-backdrop": { "title": "$:/language/Docs/PaletteColours/modal-backdrop", "text": "Modal backdrop" }, "$:/language/Docs/PaletteColours/modal-background": { "title": "$:/language/Docs/PaletteColours/modal-background", "text": "Modal background" }, "$:/language/Docs/PaletteColours/modal-border": { "title": "$:/language/Docs/PaletteColours/modal-border", "text": "Modal border" }, "$:/language/Docs/PaletteColours/modal-footer-background": { "title": "$:/language/Docs/PaletteColours/modal-footer-background", "text": "Modal footer background" }, "$:/language/Docs/PaletteColours/modal-footer-border": { "title": "$:/language/Docs/PaletteColours/modal-footer-border", "text": "Modal footer border" }, "$:/language/Docs/PaletteColours/modal-header-border": { "title": "$:/language/Docs/PaletteColours/modal-header-border", "text": "Modal header border" }, "$:/language/Docs/PaletteColours/muted-foreground": { "title": "$:/language/Docs/PaletteColours/muted-foreground", "text": "General muted foreground" }, "$:/language/Docs/PaletteColours/notification-background": { "title": "$:/language/Docs/PaletteColours/notification-background", "text": "Notification background" }, "$:/language/Docs/PaletteColours/notification-border": { "title": "$:/language/Docs/PaletteColours/notification-border", "text": "Notification border" }, "$:/language/Docs/PaletteColours/page-background": { "title": "$:/language/Docs/PaletteColours/page-background", "text": "Page background" }, "$:/language/Docs/PaletteColours/pre-background": { "title": "$:/language/Docs/PaletteColours/pre-background", "text": "Preformatted code background" }, "$:/language/Docs/PaletteColours/pre-border": { "title": "$:/language/Docs/PaletteColours/pre-border", "text": "Preformatted code border" }, "$:/language/Docs/PaletteColours/primary": { "title": "$:/language/Docs/PaletteColours/primary", "text": "General primary" }, "$:/language/Docs/PaletteColours/select-tag-background": { "title": "$:/language/Docs/PaletteColours/select-tag-background", "text": "`<select>` element background" }, "$:/language/Docs/PaletteColours/select-tag-foreground": { "title": "$:/language/Docs/PaletteColours/select-tag-foreground", "text": "`<select>` element text" }, "$:/language/Docs/PaletteColours/sidebar-button-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-button-foreground", "text": "Sidebar button foreground" }, "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": { "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover", "text": "Sidebar controls foreground hover" }, "$:/language/Docs/PaletteColours/sidebar-controls-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground", "text": "Sidebar controls foreground" }, "$:/language/Docs/PaletteColours/sidebar-foreground-shadow": { "title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow", "text": "Sidebar foreground shadow" }, "$:/language/Docs/PaletteColours/sidebar-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-foreground", "text": "Sidebar foreground" }, "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": { "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover", "text": "Sidebar muted foreground hover" }, "$:/language/Docs/PaletteColours/sidebar-muted-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground", "text": "Sidebar muted foreground" }, "$:/language/Docs/PaletteColours/sidebar-tab-background-selected": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected", "text": "Sidebar tab background for selected tabs" }, "$:/language/Docs/PaletteColours/sidebar-tab-background": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-background", "text": "Sidebar tab background" }, "$:/language/Docs/PaletteColours/sidebar-tab-border-selected": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected", "text": "Sidebar tab border for selected tabs" }, "$:/language/Docs/PaletteColours/sidebar-tab-border": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-border", "text": "Sidebar tab border" }, "$:/language/Docs/PaletteColours/sidebar-tab-divider": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-divider", "text": "Sidebar tab divider" }, "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected", "text": "Sidebar tab foreground for selected tabs" }, "$:/language/Docs/PaletteColours/sidebar-tab-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground", "text": "Sidebar tab foreground" }, "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": { "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover", "text": "Sidebar tiddler link foreground hover" }, "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground", "text": "Sidebar tiddler link foreground" }, "$:/language/Docs/PaletteColours/site-title-foreground": { "title": "$:/language/Docs/PaletteColours/site-title-foreground", "text": "Site title foreground" }, "$:/language/Docs/PaletteColours/static-alert-foreground": { "title": "$:/language/Docs/PaletteColours/static-alert-foreground", "text": "Static alert foreground" }, "$:/language/Docs/PaletteColours/tab-background-selected": { "title": "$:/language/Docs/PaletteColours/tab-background-selected", "text": "Tab background for selected tabs" }, "$:/language/Docs/PaletteColours/tab-background": { "title": "$:/language/Docs/PaletteColours/tab-background", "text": "Tab background" }, "$:/language/Docs/PaletteColours/tab-border-selected": { "title": "$:/language/Docs/PaletteColours/tab-border-selected", "text": "Tab border for selected tabs" }, "$:/language/Docs/PaletteColours/tab-border": { "title": "$:/language/Docs/PaletteColours/tab-border", "text": "Tab border" }, "$:/language/Docs/PaletteColours/tab-divider": { "title": "$:/language/Docs/PaletteColours/tab-divider", "text": "Tab divider" }, "$:/language/Docs/PaletteColours/tab-foreground-selected": { "title": "$:/language/Docs/PaletteColours/tab-foreground-selected", "text": "Tab foreground for selected tabs" }, "$:/language/Docs/PaletteColours/tab-foreground": { "title": "$:/language/Docs/PaletteColours/tab-foreground", "text": "Tab foreground" }, "$:/language/Docs/PaletteColours/table-border": { "title": "$:/language/Docs/PaletteColours/table-border", "text": "Table border" }, "$:/language/Docs/PaletteColours/table-footer-background": { "title": "$:/language/Docs/PaletteColours/table-footer-background", "text": "Table footer background" }, "$:/language/Docs/PaletteColours/table-header-background": { "title": "$:/language/Docs/PaletteColours/table-header-background", "text": "Table header background" }, "$:/language/Docs/PaletteColours/tag-background": { "title": "$:/language/Docs/PaletteColours/tag-background", "text": "Tag background" }, "$:/language/Docs/PaletteColours/tag-foreground": { "title": "$:/language/Docs/PaletteColours/tag-foreground", "text": "Tag foreground" }, "$:/language/Docs/PaletteColours/tiddler-background": { "title": "$:/language/Docs/PaletteColours/tiddler-background", "text": "Tiddler background" }, "$:/language/Docs/PaletteColours/tiddler-border": { "title": "$:/language/Docs/PaletteColours/tiddler-border", "text": "Tiddler border" }, "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": { "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover", "text": "Tiddler controls foreground hover" }, "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": { "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected", "text": "Tiddler controls foreground for selected controls" }, "$:/language/Docs/PaletteColours/tiddler-controls-foreground": { "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground", "text": "Tiddler controls foreground" }, "$:/language/Docs/PaletteColours/tiddler-editor-background": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-background", "text": "Tiddler editor background" }, "$:/language/Docs/PaletteColours/tiddler-editor-border-image": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image", "text": "Tiddler editor border image" }, "$:/language/Docs/PaletteColours/tiddler-editor-border": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-border", "text": "Tiddler editor border" }, "$:/language/Docs/PaletteColours/tiddler-editor-fields-even": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even", "text": "Tiddler editor background for even fields" }, "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd", "text": "Tiddler editor background for odd fields" }, "$:/language/Docs/PaletteColours/tiddler-info-background": { "title": "$:/language/Docs/PaletteColours/tiddler-info-background", "text": "Tiddler info panel background" }, "$:/language/Docs/PaletteColours/tiddler-info-border": { "title": "$:/language/Docs/PaletteColours/tiddler-info-border", "text": "Tiddler info panel border" }, "$:/language/Docs/PaletteColours/tiddler-info-tab-background": { "title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background", "text": "Tiddler info panel tab background" }, "$:/language/Docs/PaletteColours/tiddler-link-background": { "title": "$:/language/Docs/PaletteColours/tiddler-link-background", "text": "Tiddler link background" }, "$:/language/Docs/PaletteColours/tiddler-link-foreground": { "title": "$:/language/Docs/PaletteColours/tiddler-link-foreground", "text": "Tiddler link foreground" }, "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": { "title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground", "text": "Tiddler subtitle foreground" }, "$:/language/Docs/PaletteColours/tiddler-title-foreground": { "title": "$:/language/Docs/PaletteColours/tiddler-title-foreground", "text": "Tiddler title foreground" }, "$:/language/Docs/PaletteColours/toolbar-new-button": { "title": "$:/language/Docs/PaletteColours/toolbar-new-button", "text": "Toolbar 'new tiddler' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-options-button": { "title": "$:/language/Docs/PaletteColours/toolbar-options-button", "text": "Toolbar 'options' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-save-button": { "title": "$:/language/Docs/PaletteColours/toolbar-save-button", "text": "Toolbar 'save' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-info-button": { "title": "$:/language/Docs/PaletteColours/toolbar-info-button", "text": "Toolbar 'info' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-edit-button": { "title": "$:/language/Docs/PaletteColours/toolbar-edit-button", "text": "Toolbar 'edit' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-close-button": { "title": "$:/language/Docs/PaletteColours/toolbar-close-button", "text": "Toolbar 'close' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-delete-button": { "title": "$:/language/Docs/PaletteColours/toolbar-delete-button", "text": "Toolbar 'delete' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-cancel-button": { "title": "$:/language/Docs/PaletteColours/toolbar-cancel-button", "text": "Toolbar 'cancel' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-done-button": { "title": "$:/language/Docs/PaletteColours/toolbar-done-button", "text": "Toolbar 'done' button foreground" }, "$:/language/Docs/PaletteColours/untagged-background": { "title": "$:/language/Docs/PaletteColours/untagged-background", "text": "Untagged pill background" }, "$:/language/Docs/PaletteColours/very-muted-foreground": { "title": "$:/language/Docs/PaletteColours/very-muted-foreground", "text": "Very muted foreground" }, "$:/language/EditTemplate/Body/External/Hint": { "title": "$:/language/EditTemplate/Body/External/Hint", "text": "This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself" }, "$:/language/EditTemplate/Body/Placeholder": { "title": "$:/language/EditTemplate/Body/Placeholder", "text": "Type the text for this tiddler" }, "$:/language/EditTemplate/Body/Preview/Type/Output": { "title": "$:/language/EditTemplate/Body/Preview/Type/Output", "text": "output" }, "$:/language/EditTemplate/Field/Remove/Caption": { "title": "$:/language/EditTemplate/Field/Remove/Caption", "text": "remove field" }, "$:/language/EditTemplate/Field/Remove/Hint": { "title": "$:/language/EditTemplate/Field/Remove/Hint", "text": "Remove field" }, "$:/language/EditTemplate/Field/Dropdown/Caption": { "title": "$:/language/EditTemplate/Field/Dropdown/Caption", "text": "field list" }, "$:/language/EditTemplate/Field/Dropdown/Hint": { "title": "$:/language/EditTemplate/Field/Dropdown/Hint", "text": "Show field list" }, "$:/language/EditTemplate/Fields/Add/Button": { "title": "$:/language/EditTemplate/Fields/Add/Button", "text": "add" }, "$:/language/EditTemplate/Fields/Add/Button/Hint": { "title": "$:/language/EditTemplate/Fields/Add/Button/Hint", "text": "Add the new field to the tiddler" }, "$:/language/EditTemplate/Fields/Add/Name/Placeholder": { "title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder", "text": "field name" }, "$:/language/EditTemplate/Fields/Add/Prompt": { "title": "$:/language/EditTemplate/Fields/Add/Prompt", "text": "Add a new field:" }, "$:/language/EditTemplate/Fields/Add/Value/Placeholder": { "title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder", "text": "field value" }, "$:/language/EditTemplate/Fields/Add/Dropdown/System": { "title": "$:/language/EditTemplate/Fields/Add/Dropdown/System", "text": "System fields" }, "$:/language/EditTemplate/Fields/Add/Dropdown/User": { "title": "$:/language/EditTemplate/Fields/Add/Dropdown/User", "text": "User fields" }, "$:/language/EditTemplate/Shadow/Warning": { "title": "$:/language/EditTemplate/Shadow/Warning", "text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>" }, "$:/language/EditTemplate/Shadow/OverriddenWarning": { "title": "$:/language/EditTemplate/Shadow/OverriddenWarning", "text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler" }, "$:/language/EditTemplate/Tags/Add/Button": { "title": "$:/language/EditTemplate/Tags/Add/Button", "text": "add" }, "$:/language/EditTemplate/Tags/Add/Button/Hint": { "title": "$:/language/EditTemplate/Tags/Add/Button/Hint", "text": "add tag" }, "$:/language/EditTemplate/Tags/Add/Placeholder": { "title": "$:/language/EditTemplate/Tags/Add/Placeholder", "text": "tag name" }, "$:/language/EditTemplate/Tags/ClearInput/Caption": { "title": "$:/language/EditTemplate/Tags/ClearInput/Caption", "text": "clear input" }, "$:/language/EditTemplate/Tags/ClearInput/Hint": { "title": "$:/language/EditTemplate/Tags/ClearInput/Hint", "text": "Clear tag input" }, "$:/language/EditTemplate/Tags/Dropdown/Caption": { "title": "$:/language/EditTemplate/Tags/Dropdown/Caption", "text": "tag list" }, "$:/language/EditTemplate/Tags/Dropdown/Hint": { "title": "$:/language/EditTemplate/Tags/Dropdown/Hint", "text": "Show tag list" }, "$:/language/EditTemplate/Title/BadCharacterWarning": { "title": "$:/language/EditTemplate/Title/BadCharacterWarning", "text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles" }, "$:/language/EditTemplate/Title/Exists/Prompt": { "title": "$:/language/EditTemplate/Title/Exists/Prompt", "text": "Target tiddler already exists" }, "$:/language/EditTemplate/Title/Relink/Prompt": { "title": "$:/language/EditTemplate/Title/Relink/Prompt", "text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers" }, "$:/language/EditTemplate/Title/References/Prompt": { "title": "$:/language/EditTemplate/Title/References/Prompt", "text": "The following references to this tiddler will not be automatically updated:" }, "$:/language/EditTemplate/Type/Dropdown/Caption": { "title": "$:/language/EditTemplate/Type/Dropdown/Caption", "text": "content type list" }, "$:/language/EditTemplate/Type/Dropdown/Hint": { "title": "$:/language/EditTemplate/Type/Dropdown/Hint", "text": "Show content type list" }, "$:/language/EditTemplate/Type/Delete/Caption": { "title": "$:/language/EditTemplate/Type/Delete/Caption", "text": "delete content type" }, "$:/language/EditTemplate/Type/Delete/Hint": { "title": "$:/language/EditTemplate/Type/Delete/Hint", "text": "Delete content type" }, "$:/language/EditTemplate/Type/Placeholder": { "title": "$:/language/EditTemplate/Type/Placeholder", "text": "content type" }, "$:/language/EditTemplate/Type/Prompt": { "title": "$:/language/EditTemplate/Type/Prompt", "text": "Type:" }, "$:/language/Exporters/StaticRiver": { "title": "$:/language/Exporters/StaticRiver", "text": "Static HTML" }, "$:/language/Exporters/JsonFile": { "title": "$:/language/Exporters/JsonFile", "text": "JSON file" }, "$:/language/Exporters/CsvFile": { "title": "$:/language/Exporters/CsvFile", "text": "CSV file" }, "$:/language/Exporters/TidFile": { "title": "$:/language/Exporters/TidFile", "text": "\".tid\" file" }, "$:/language/Docs/Fields/_canonical_uri": { "title": "$:/language/Docs/Fields/_canonical_uri", "text": "The full URI of an external image tiddler" }, "$:/language/Docs/Fields/bag": { "title": "$:/language/Docs/Fields/bag", "text": "The name of the bag from which a tiddler came" }, "$:/language/Docs/Fields/caption": { "title": "$:/language/Docs/Fields/caption", "text": "The text to be displayed on a tab or button" }, "$:/language/Docs/Fields/color": { "title": "$:/language/Docs/Fields/color", "text": "The CSS color value associated with a tiddler" }, "$:/language/Docs/Fields/component": { "title": "$:/language/Docs/Fields/component", "text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]" }, "$:/language/Docs/Fields/current-tiddler": { "title": "$:/language/Docs/Fields/current-tiddler", "text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]" }, "$:/language/Docs/Fields/created": { "title": "$:/language/Docs/Fields/created", "text": "The date a tiddler was created" }, "$:/language/Docs/Fields/creator": { "title": "$:/language/Docs/Fields/creator", "text": "The name of the person who created a tiddler" }, "$:/language/Docs/Fields/dependents": { "title": "$:/language/Docs/Fields/dependents", "text": "For a plugin, lists the dependent plugin titles" }, "$:/language/Docs/Fields/description": { "title": "$:/language/Docs/Fields/description", "text": "The descriptive text for a plugin, or a modal dialogue" }, "$:/language/Docs/Fields/draft.of": { "title": "$:/language/Docs/Fields/draft.of", "text": "For draft tiddlers, contains the title of the tiddler of which this is a draft" }, "$:/language/Docs/Fields/draft.title": { "title": "$:/language/Docs/Fields/draft.title", "text": "For draft tiddlers, contains the proposed new title of the tiddler" }, "$:/language/Docs/Fields/footer": { "title": "$:/language/Docs/Fields/footer", "text": "The footer text for a wizard" }, "$:/language/Docs/Fields/hide-body": { "title": "$:/language/Docs/Fields/hide-body", "text": "The view template will hide bodies of tiddlers if set to: ''yes''" }, "$:/language/Docs/Fields/icon": { "title": "$:/language/Docs/Fields/icon", "text": "The title of the tiddler containing the icon associated with a tiddler" }, "$:/language/Docs/Fields/library": { "title": "$:/language/Docs/Fields/library", "text": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''" }, "$:/language/Docs/Fields/list": { "title": "$:/language/Docs/Fields/list", "text": "An ordered list of tiddler titles associated with a tiddler" }, "$:/language/Docs/Fields/list-before": { "title": "$:/language/Docs/Fields/list-before", "text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty" }, "$:/language/Docs/Fields/list-after": { "title": "$:/language/Docs/Fields/list-after", "text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty" }, "$:/language/Docs/Fields/modified": { "title": "$:/language/Docs/Fields/modified", "text": "The date and time at which a tiddler was last modified" }, "$:/language/Docs/Fields/modifier": { "title": "$:/language/Docs/Fields/modifier", "text": "The tiddler title associated with the person who last modified a tiddler" }, "$:/language/Docs/Fields/name": { "title": "$:/language/Docs/Fields/name", "text": "The human readable name associated with a plugin tiddler" }, "$:/language/Docs/Fields/plugin-priority": { "title": "$:/language/Docs/Fields/plugin-priority", "text": "A numerical value indicating the priority of a plugin tiddler" }, "$:/language/Docs/Fields/plugin-type": { "title": "$:/language/Docs/Fields/plugin-type", "text": "The type of plugin in a plugin tiddler" }, "$:/language/Docs/Fields/revision": { "title": "$:/language/Docs/Fields/revision", "text": "The revision of the tiddler held at the server" }, "$:/language/Docs/Fields/released": { "title": "$:/language/Docs/Fields/released", "text": "Date of a TiddlyWiki release" }, "$:/language/Docs/Fields/source": { "title": "$:/language/Docs/Fields/source", "text": "The source URL associated with a tiddler" }, "$:/language/Docs/Fields/subtitle": { "title": "$:/language/Docs/Fields/subtitle", "text": "The subtitle text for a wizard" }, "$:/language/Docs/Fields/tags": { "title": "$:/language/Docs/Fields/tags", "text": "A list of tags associated with a tiddler" }, "$:/language/Docs/Fields/text": { "title": "$:/language/Docs/Fields/text", "text": "The body text of a tiddler" }, "$:/language/Docs/Fields/throttle.refresh": { "title": "$:/language/Docs/Fields/throttle.refresh", "text": "If present, throttles refreshes of this tiddler" }, "$:/language/Docs/Fields/title": { "title": "$:/language/Docs/Fields/title", "text": "The unique name of a tiddler" }, "$:/language/Docs/Fields/toc-link": { "title": "$:/language/Docs/Fields/toc-link", "text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''" }, "$:/language/Docs/Fields/type": { "title": "$:/language/Docs/Fields/type", "text": "The content type of a tiddler" }, "$:/language/Docs/Fields/version": { "title": "$:/language/Docs/Fields/version", "text": "Version information for a plugin" }, "$:/language/Docs/Fields/_is_skinny": { "title": "$:/language/Docs/Fields/_is_skinny", "text": "If present, indicates that the tiddler text field must be loaded from the server" }, "$:/language/Filters/AllTiddlers": { "title": "$:/language/Filters/AllTiddlers", "text": "All tiddlers except system tiddlers" }, "$:/language/Filters/RecentSystemTiddlers": { "title": "$:/language/Filters/RecentSystemTiddlers", "text": "Recently modified tiddlers, including system tiddlers" }, "$:/language/Filters/RecentTiddlers": { "title": "$:/language/Filters/RecentTiddlers", "text": "Recently modified tiddlers" }, "$:/language/Filters/AllTags": { "title": "$:/language/Filters/AllTags", "text": "All tags except system tags" }, "$:/language/Filters/Missing": { "title": "$:/language/Filters/Missing", "text": "Missing tiddlers" }, "$:/language/Filters/Drafts": { "title": "$:/language/Filters/Drafts", "text": "Draft tiddlers" }, "$:/language/Filters/Orphans": { "title": "$:/language/Filters/Orphans", "text": "Orphan tiddlers" }, "$:/language/Filters/SystemTiddlers": { "title": "$:/language/Filters/SystemTiddlers", "text": "System tiddlers" }, "$:/language/Filters/ShadowTiddlers": { "title": "$:/language/Filters/ShadowTiddlers", "text": "Shadow tiddlers" }, "$:/language/Filters/OverriddenShadowTiddlers": { "title": "$:/language/Filters/OverriddenShadowTiddlers", "text": "Overridden shadow tiddlers" }, "$:/language/Filters/SessionTiddlers": { "title": "$:/language/Filters/SessionTiddlers", "text": "Tiddlers modified since the wiki was loaded" }, "$:/language/Filters/SystemTags": { "title": "$:/language/Filters/SystemTags", "text": "System tags" }, "$:/language/Filters/StoryList": { "title": "$:/language/Filters/StoryList", "text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>" }, "$:/language/Filters/TypedTiddlers": { "title": "$:/language/Filters/TypedTiddlers", "text": "Non wiki-text tiddlers" }, "GettingStarted": { "title": "GettingStarted", "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is 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<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n" }, "$:/language/Help/build": { "title": "$:/language/Help/build", "description": "Automatically run configured commands", "text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n" }, "$:/language/Help/clearpassword": { "title": "$:/language/Help/clearpassword", "description": "Clear a password for subsequent crypto operations", "text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n" }, "$:/language/Help/default": { "title": "$:/language/Help/default", "text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n" }, "$:/language/Help/deletetiddlers": { "title": "$:/language/Help/deletetiddlers", "description": "Deletes a group of tiddlers", "text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n" }, "$:/language/Help/editions": { "title": "$:/language/Help/editions", "description": "Lists the available editions of TiddlyWiki", "text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n" }, "$:/language/Help/fetch": { "title": "$:/language/Help/fetch", "description": "Fetch tiddlers from wiki by URL", "text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n" }, "$:/language/Help/help": { "title": "$:/language/Help/help", "description": "Display help for TiddlyWiki commands", "text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n" }, "$:/language/Help/import": { "title": "$:/language/Help/import", "description": "Import tiddlers from a file", "text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n" }, "$:/language/Help/init": { "title": "$:/language/Help/init", "description": "Initialise a new wiki folder", "text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n" }, "$:/language/Help/listen": { "title": "$:/language/Help/listen", "description": "Provides an HTTP server interface to TiddlyWiki", "text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n" }, "$:/language/Help/load": { "title": "$:/language/Help/load", "description": "Load tiddlers from a file", "text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n" }, "$:/language/Help/makelibrary": { "title": "$:/language/Help/makelibrary", "description": "Construct library plugin required by upgrade process", "text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n" }, "$:/language/Help/notfound": { "title": "$:/language/Help/notfound", "text": "No such help item" }, "$:/language/Help/output": { "title": "$:/language/Help/output", "description": "Set the base output directory for subsequent commands", "text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n" }, "$:/language/Help/password": { "title": "$:/language/Help/password", "description": "Set a password for subsequent crypto operations", "text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n" }, "$:/language/Help/render": { "title": "$:/language/Help/render", "description": "Renders individual tiddlers to files", "text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variable\n* ''value'': Value of optional variable\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n" }, "$:/language/Help/rendertiddler": { "title": "$:/language/Help/rendertiddler", "description": "Render an individual tiddler as a specified ContentType", "text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n" }, "$:/language/Help/rendertiddlers": { "title": "$:/language/Help/rendertiddlers", "description": "Render tiddlers matching a filter to a specified ContentType", "text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n" }, "$:/language/Help/save": { "title": "$:/language/Help/save", "description": "Saves individual raw tiddlers to files", "text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n" }, "$:/language/Help/savetiddler": { "title": "$:/language/Help/savetiddler", "description": "Saves a raw tiddler to a file", "text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n" }, "$:/language/Help/savetiddlers": { "title": "$:/language/Help/savetiddlers", "description": "Saves a group of raw tiddlers to a directory", "text": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n" }, "$:/language/Help/savewikifolder": { "title": "$:/language/Help/savewikifolder", "description": "Saves a wiki to a new wiki folder", "text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n" }, "$:/language/Help/server": { "title": "$:/language/Help/server", "description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)", "text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n" }, "$:/language/Help/setfield": { "title": "$:/language/Help/setfield", "description": "Prepares external tiddlers for use", "text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n" }, "$:/language/Help/unpackplugin": { "title": "$:/language/Help/unpackplugin", "description": "Unpack the payload tiddlers from a plugin", "text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n" }, "$:/language/Help/verbose": { "title": "$:/language/Help/verbose", "description": "Triggers verbose output mode", "text": "Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n" }, "$:/language/Help/version": { "title": "$:/language/Help/version", "description": "Displays the version number of TiddlyWiki", "text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n" }, "$:/language/Import/Imported/Hint": { "title": "$:/language/Import/Imported/Hint", "text": "The following tiddlers were imported:" }, "$:/language/Import/Listing/Cancel/Caption": { "title": "$:/language/Import/Listing/Cancel/Caption", "text": "Cancel" }, "$:/language/Import/Listing/Hint": { "title": "$:/language/Import/Listing/Hint", "text": "These tiddlers are ready to import:" }, "$:/language/Import/Listing/Import/Caption": { "title": "$:/language/Import/Listing/Import/Caption", "text": "Import" }, "$:/language/Import/Listing/Select/Caption": { "title": "$:/language/Import/Listing/Select/Caption", "text": "Select" }, "$:/language/Import/Listing/Status/Caption": { "title": "$:/language/Import/Listing/Status/Caption", "text": "Status" }, "$:/language/Import/Listing/Title/Caption": { "title": "$:/language/Import/Listing/Title/Caption", "text": "Title" }, "$:/language/Import/Listing/Preview": { "title": "$:/language/Import/Listing/Preview", "text": "Preview:" }, "$:/language/Import/Listing/Preview/Text": { "title": "$:/language/Import/Listing/Preview/Text", "text": "Text" }, "$:/language/Import/Listing/Preview/TextRaw": { "title": "$:/language/Import/Listing/Preview/TextRaw", "text": "Text (Raw)" }, "$:/language/Import/Listing/Preview/Fields": { "title": "$:/language/Import/Listing/Preview/Fields", "text": "Fields" }, "$:/language/Import/Listing/Preview/Diff": { "title": "$:/language/Import/Listing/Preview/Diff", "text": "Diff" }, "$:/language/Import/Listing/Preview/DiffFields": { "title": "$:/language/Import/Listing/Preview/DiffFields", "text": "Diff (Fields)" }, "$:/language/Import/Listing/Rename/Tooltip": { "title": "$:/language/Import/Listing/Rename/Tooltip", "text": "Rename tiddler before importing" }, "$:/language/Import/Listing/Rename/Prompt": { "title": "$:/language/Import/Listing/Rename/Prompt", "text": "Rename to:" }, "$:/language/Import/Listing/Rename/ConfirmRename": { "title": "$:/language/Import/Listing/Rename/ConfirmRename", "text": "Rename tiddler" }, "$:/language/Import/Listing/Rename/CancelRename": { "title": "$:/language/Import/Listing/Rename/CancelRename", "text": "Cancel" }, "$:/language/Import/Listing/Rename/OverwriteWarning": { "title": "$:/language/Import/Listing/Rename/OverwriteWarning", "text": "A tiddler with this title already exists." }, "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": { "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible", "text": "Blocked incompatible or obsolete plugin." }, "$:/language/Import/Upgrader/Plugins/Suppressed/Version": { "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version", "text": "Blocked plugin (due to incoming <<incoming>> not being newer than existing <<existing>>)." }, "$:/language/Import/Upgrader/Plugins/Upgraded": { "title": "$:/language/Import/Upgrader/Plugins/Upgraded", "text": "Upgraded plugin from <<incoming>> to <<upgraded>>." }, "$:/language/Import/Upgrader/State/Suppressed": { "title": "$:/language/Import/Upgrader/State/Suppressed", "text": "Blocked temporary state tiddler." }, "$:/language/Import/Upgrader/System/Suppressed": { "title": "$:/language/Import/Upgrader/System/Suppressed", "text": "Blocked system tiddler." }, "$:/language/Import/Upgrader/System/Warning": { "title": "$:/language/Import/Upgrader/System/Warning", "text": "Core module tiddler." }, "$:/language/Import/Upgrader/System/Alert": { "title": "$:/language/Import/Upgrader/System/Alert", "text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable." }, "$:/language/Import/Upgrader/ThemeTweaks/Created": { "title": "$:/language/Import/Upgrader/ThemeTweaks/Created", "text": "Migrated theme tweak from <$text text=<<from>>/>." }, "$:/language/AboveStory/ClassicPlugin/Warning": { "title": "$:/language/AboveStory/ClassicPlugin/Warning", "text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:" }, "$:/language/BinaryWarning/Prompt": { "title": "$:/language/BinaryWarning/Prompt", "text": "This tiddler contains binary data" }, "$:/language/ClassicWarning/Hint": { "title": "$:/language/ClassicWarning/Hint", "text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details." }, "$:/language/ClassicWarning/Upgrade/Caption": { "title": "$:/language/ClassicWarning/Upgrade/Caption", "text": "upgrade" }, "$:/language/CloseAll/Button": { "title": "$:/language/CloseAll/Button", "text": "close all" }, "$:/language/ColourPicker/Recent": { "title": "$:/language/ColourPicker/Recent", "text": "Recent:" }, "$:/language/ConfirmCancelTiddler": { "title": "$:/language/ConfirmCancelTiddler", "text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?" }, "$:/language/ConfirmDeleteTiddler": { "title": "$:/language/ConfirmDeleteTiddler", "text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?" }, "$:/language/ConfirmOverwriteTiddler": { "title": "$:/language/ConfirmOverwriteTiddler", "text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?" }, "$:/language/ConfirmEditShadowTiddler": { "title": "$:/language/ConfirmEditShadowTiddler", "text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?" }, "$:/language/ConfirmAction": { "title": "$:/language/ConfirmAction", "text": "Do you wish to proceed?" }, "$:/language/Count": { "title": "$:/language/Count", "text": "count" }, "$:/language/DefaultNewTiddlerTitle": { "title": "$:/language/DefaultNewTiddlerTitle", "text": "New Tiddler" }, "$:/language/Diffs/CountMessage": { "title": "$:/language/Diffs/CountMessage", "text": "<<diff-count>> differences" }, "$:/language/DropMessage": { "title": "$:/language/DropMessage", "text": "Drop here (or use the 'Escape' key to cancel)" }, "$:/language/Encryption/Cancel": { "title": "$:/language/Encryption/Cancel", "text": "Cancel" }, "$:/language/Encryption/ConfirmClearPassword": { "title": "$:/language/Encryption/ConfirmClearPassword", "text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki" }, "$:/language/Encryption/PromptSetPassword": { "title": "$:/language/Encryption/PromptSetPassword", "text": "Set a new password for this TiddlyWiki" }, "$:/language/Encryption/Username": { "title": "$:/language/Encryption/Username", "text": "Username" }, "$:/language/Encryption/Password": { "title": "$:/language/Encryption/Password", "text": "Password" }, "$:/language/Encryption/RepeatPassword": { "title": "$:/language/Encryption/RepeatPassword", "text": "Repeat password" }, "$:/language/Encryption/PasswordNoMatch": { "title": "$:/language/Encryption/PasswordNoMatch", "text": "Passwords do not match" }, "$:/language/Encryption/SetPassword": { "title": "$:/language/Encryption/SetPassword", "text": "Set password" }, "$:/language/Error/Caption": { "title": "$:/language/Error/Caption", "text": "Error" }, "$:/language/Error/EditConflict": { "title": "$:/language/Error/EditConflict", "text": "File changed on server" }, "$:/language/Error/Filter": { "title": "$:/language/Error/Filter", "text": "Filter error" }, "$:/language/Error/FilterSyntax": { "title": "$:/language/Error/FilterSyntax", "text": "Syntax error in filter expression" }, "$:/language/Error/FilterRunPrefix": { "title": "$:/language/Error/FilterRunPrefix", "text": "Filter Error: Unknown prefix for filter run" }, "$:/language/Error/IsFilterOperator": { "title": "$:/language/Error/IsFilterOperator", "text": "Filter Error: Unknown operand for the 'is' filter operator" }, "$:/language/Error/FormatFilterOperator": { "title": "$:/language/Error/FormatFilterOperator", "text": "Filter Error: Unknown suffix for the 'format' filter operator" }, "$:/language/Error/LoadingPluginLibrary": { "title": "$:/language/Error/LoadingPluginLibrary", "text": "Error loading plugin library" }, "$:/language/Error/NetworkErrorAlert": { "title": "$:/language/Error/NetworkErrorAlert", "text": "`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`" }, "$:/language/Error/RecursiveTransclusion": { "title": "$:/language/Error/RecursiveTransclusion", "text": "Recursive transclusion error in transclude widget" }, "$:/language/Error/RetrievingSkinny": { "title": "$:/language/Error/RetrievingSkinny", "text": "Error retrieving skinny tiddler list" }, "$:/language/Error/SavingToTWEdit": { "title": "$:/language/Error/SavingToTWEdit", "text": "Error saving to TWEdit" }, "$:/language/Error/WhileSaving": { "title": "$:/language/Error/WhileSaving", "text": "Error while saving" }, "$:/language/Error/XMLHttpRequest": { "title": "$:/language/Error/XMLHttpRequest", "text": "XMLHttpRequest error code" }, "$:/language/InternalJavaScriptError/Title": { "title": "$:/language/InternalJavaScriptError/Title", "text": "Internal JavaScript Error" }, "$:/language/InternalJavaScriptError/Hint": { "title": "$:/language/InternalJavaScriptError/Hint", "text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser" }, "$:/language/InvalidFieldName": { "title": "$:/language/InvalidFieldName", "text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)" }, "$:/language/LayoutSwitcher/Description": { "title": "$:/language/LayoutSwitcher/Description", "text": "Open the layout switcher" }, "$:/language/LazyLoadingWarning": { "title": "$:/language/LazyLoadingWarning", "text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>" }, "$:/language/LoginToTiddlySpace": { "title": "$:/language/LoginToTiddlySpace", "text": "Login to TiddlySpace" }, "$:/language/Manager/Controls/FilterByTag/None": { "title": "$:/language/Manager/Controls/FilterByTag/None", "text": "(none)" }, "$:/language/Manager/Controls/FilterByTag/Prompt": { "title": "$:/language/Manager/Controls/FilterByTag/Prompt", "text": "Filter by tag:" }, "$:/language/Manager/Controls/Order/Prompt": { "title": "$:/language/Manager/Controls/Order/Prompt", "text": "Reverse order" }, "$:/language/Manager/Controls/Search/Placeholder": { "title": "$:/language/Manager/Controls/Search/Placeholder", "text": "Search" }, "$:/language/Manager/Controls/Search/Prompt": { "title": "$:/language/Manager/Controls/Search/Prompt", "text": "Search:" }, "$:/language/Manager/Controls/Show/Option/Tags": { "title": "$:/language/Manager/Controls/Show/Option/Tags", "text": "tags" }, "$:/language/Manager/Controls/Show/Option/Tiddlers": { "title": "$:/language/Manager/Controls/Show/Option/Tiddlers", "text": "tiddlers" }, "$:/language/Manager/Controls/Show/Prompt": { "title": "$:/language/Manager/Controls/Show/Prompt", "text": "Show:" }, "$:/language/Manager/Controls/Sort/Prompt": { "title": "$:/language/Manager/Controls/Sort/Prompt", "text": "Sort by:" }, "$:/language/Manager/Item/Colour": { "title": "$:/language/Manager/Item/Colour", "text": "Colour" }, "$:/language/Manager/Item/Fields": { "title": "$:/language/Manager/Item/Fields", "text": "Fields" }, "$:/language/Manager/Item/Icon/None": { "title": "$:/language/Manager/Item/Icon/None", "text": "(none)" }, "$:/language/Manager/Item/Icon": { "title": "$:/language/Manager/Item/Icon", "text": "Icon" }, "$:/language/Manager/Item/RawText": { "title": "$:/language/Manager/Item/RawText", "text": "Raw text" }, "$:/language/Manager/Item/Tags": { "title": "$:/language/Manager/Item/Tags", "text": "Tags" }, "$:/language/Manager/Item/Tools": { "title": "$:/language/Manager/Item/Tools", "text": "Tools" }, "$:/language/Manager/Item/WikifiedText": { "title": "$:/language/Manager/Item/WikifiedText", "text": "Wikified text" }, "$:/language/MissingTiddler/Hint": { "title": "$:/language/MissingTiddler/Hint", "text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create" }, "$:/language/No": { "title": "$:/language/No", "text": "No" }, "$:/language/OfficialPluginLibrary": { "title": "$:/language/OfficialPluginLibrary", "text": "Official ~TiddlyWiki Plugin Library" }, "$:/language/OfficialPluginLibrary/Hint": { "title": "$:/language/OfficialPluginLibrary/Hint", "text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team." }, "$:/language/PageTemplate/Description": { "title": "$:/language/PageTemplate/Description", "text": "the default ~TiddlyWiki layout" }, "$:/language/PageTemplate/Name": { "title": "$:/language/PageTemplate/Name", "text": "Default ~PageTemplate" }, "$:/language/PluginReloadWarning": { "title": "$:/language/PluginReloadWarning", "text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect" }, "$:/language/RecentChanges/DateFormat": { "title": "$:/language/RecentChanges/DateFormat", "text": "DDth MMM YYYY" }, "$:/language/Shortcuts/Input/AdvancedSearch/Hint": { "title": "$:/language/Shortcuts/Input/AdvancedSearch/Hint", "text": "Open the ~AdvancedSearch panel from within the sidebar search field" }, "$:/language/Shortcuts/Input/Accept/Hint": { "title": "$:/language/Shortcuts/Input/Accept/Hint", "text": "Accept the selected item" }, "$:/language/Shortcuts/Input/AcceptVariant/Hint": { "title": "$:/language/Shortcuts/Input/AcceptVariant/Hint", "text": "Accept the selected item (variant)" }, "$:/language/Shortcuts/Input/Cancel/Hint": { "title": "$:/language/Shortcuts/Input/Cancel/Hint", "text": "Clear the input field" }, "$:/language/Shortcuts/Input/Down/Hint": { "title": "$:/language/Shortcuts/Input/Down/Hint", "text": "Select the next item" }, "$:/language/Shortcuts/Input/Tab-Left/Hint": { "title": "$:/language/Shortcuts/Input/Tab-Left/Hint", "text": "Select the previous Tab" }, "$:/language/Shortcuts/Input/Tab-Right/Hint": { "title": "$:/language/Shortcuts/Input/Tab-Right/Hint", "text": "Select the next Tab" }, "$:/language/Shortcuts/Input/Up/Hint": { "title": "$:/language/Shortcuts/Input/Up/Hint", "text": "Select the previous item" }, "$:/language/Shortcuts/SidebarLayout/Hint": { "title": "$:/language/Shortcuts/SidebarLayout/Hint", "text": "Change the sidebar layout" }, "$:/language/Switcher/Subtitle/theme": { "title": "$:/language/Switcher/Subtitle/theme", "text": "Switch Theme" }, "$:/language/Switcher/Subtitle/layout": { "title": "$:/language/Switcher/Subtitle/layout", "text": "Switch Layout" }, "$:/language/Switcher/Subtitle/language": { "title": "$:/language/Switcher/Subtitle/language", "text": "Switch Language" }, "$:/language/Switcher/Subtitle/palette": { "title": "$:/language/Switcher/Subtitle/palette", "text": "Switch Palette" }, "$:/language/SystemTiddler/Tooltip": { "title": "$:/language/SystemTiddler/Tooltip", "text": "This is a system tiddler" }, "$:/language/SystemTiddlers/Include/Prompt": { "title": "$:/language/SystemTiddlers/Include/Prompt", "text": "Include system tiddlers" }, "$:/language/TagManager/Colour/Heading": { "title": "$:/language/TagManager/Colour/Heading", "text": "Colour" }, "$:/language/TagManager/Count/Heading": { "title": "$:/language/TagManager/Count/Heading", "text": "Count" }, "$:/language/TagManager/Icon/Heading": { "title": "$:/language/TagManager/Icon/Heading", "text": "Icon" }, "$:/language/TagManager/Icons/None": { "title": "$:/language/TagManager/Icons/None", "text": "None" }, "$:/language/TagManager/Info/Heading": { "title": "$:/language/TagManager/Info/Heading", "text": "Info" }, "$:/language/TagManager/Tag/Heading": { "title": "$:/language/TagManager/Tag/Heading", "text": "Tag" }, "$:/language/Tiddler/DateFormat": { "title": "$:/language/Tiddler/DateFormat", "text": "DDth MMM YYYY at hh12:0mmam" }, "$:/language/UnsavedChangesWarning": { "title": "$:/language/UnsavedChangesWarning", "text": "You have unsaved changes in TiddlyWiki" }, "$:/language/Yes": { "title": "$:/language/Yes", "text": "Yes" }, "$:/language/Modals/Download": { "title": "$:/language/Modals/Download", "subtitle": "Download changes", "footer": "<$button message=\"tm-close-tiddler\">Close</$button>", "help": "https://tiddlywiki.com/static/DownloadingChanges.html", "text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n" }, "$:/language/Modals/SaveInstructions": { "title": "$:/language/Modals/SaveInstructions", "subtitle": "Save your work", "footer": "<$button message=\"tm-close-tiddler\">Close</$button>", "help": "https://tiddlywiki.com/static/SavingChanges.html", "text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n" }, "$:/config/NewJournal/Title": { "title": "$:/config/NewJournal/Title", "text": "DDth MMM YYYY" }, "$:/config/NewJournal/Text": { "title": "$:/config/NewJournal/Text", "text": "" }, "$:/config/NewJournal/Tags": { "title": "$:/config/NewJournal/Tags", "text": "Journal\n" }, "$:/language/Notifications/Save/Done": { "title": "$:/language/Notifications/Save/Done", "text": "Saved wiki" }, "$:/language/Notifications/Save/Starting": { "title": "$:/language/Notifications/Save/Starting", "text": "Starting to save wiki" }, "$:/language/Notifications/CopiedToClipboard/Succeeded": { "title": "$:/language/Notifications/CopiedToClipboard/Succeeded", "text": "Copied to clipboard!" }, "$:/language/Notifications/CopiedToClipboard/Failed": { "title": "$:/language/Notifications/CopiedToClipboard/Failed", "text": "Failed to copy to clipboard!" }, "$:/language/Search/DefaultResults/Caption": { "title": "$:/language/Search/DefaultResults/Caption", "text": "List" }, "$:/language/Search/Filter/Caption": { "title": "$:/language/Search/Filter/Caption", "text": "Filter" }, "$:/language/Search/Filter/Hint": { "title": "$:/language/Search/Filter/Hint", "text": "Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]" }, "$:/language/Search/Filter/Matches": { "title": "$:/language/Search/Filter/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/Search/Matches": { "title": "$:/language/Search/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/Search/Matches/All": { "title": "$:/language/Search/Matches/All", "text": "All matches:" }, "$:/language/Search/Matches/Title": { "title": "$:/language/Search/Matches/Title", "text": "Title matches:" }, "$:/language/Search/Search": { "title": "$:/language/Search/Search", "text": "Search" }, "$:/language/Search/Search/TooShort": { "title": "$:/language/Search/Search/TooShort", "text": "Search text too short" }, "$:/language/Search/Shadows/Caption": { "title": "$:/language/Search/Shadows/Caption", "text": "Shadows" }, "$:/language/Search/Shadows/Hint": { "title": "$:/language/Search/Shadows/Hint", "text": "Search for shadow tiddlers" }, "$:/language/Search/Shadows/Matches": { "title": "$:/language/Search/Shadows/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/Search/Standard/Caption": { "title": "$:/language/Search/Standard/Caption", "text": "Standard" }, "$:/language/Search/Standard/Hint": { "title": "$:/language/Search/Standard/Hint", "text": "Search for standard tiddlers" }, "$:/language/Search/Standard/Matches": { "title": "$:/language/Search/Standard/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/Search/System/Caption": { "title": "$:/language/Search/System/Caption", "text": "System" }, "$:/language/Search/System/Hint": { "title": "$:/language/Search/System/Hint", "text": "Search for system tiddlers" }, "$:/language/Search/System/Matches": { "title": "$:/language/Search/System/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/SideBar/All/Caption": { "title": "$:/language/SideBar/All/Caption", "text": "All" }, "$:/language/SideBar/Contents/Caption": { "title": "$:/language/SideBar/Contents/Caption", "text": "Contents" }, "$:/language/SideBar/Drafts/Caption": { "title": "$:/language/SideBar/Drafts/Caption", "text": "Drafts" }, "$:/language/SideBar/Explorer/Caption": { "title": "$:/language/SideBar/Explorer/Caption", "text": "Explorer" }, "$:/language/SideBar/Missing/Caption": { "title": "$:/language/SideBar/Missing/Caption", "text": "Missing" }, "$:/language/SideBar/More/Caption": { "title": "$:/language/SideBar/More/Caption", "text": "More" }, "$:/language/SideBar/Open/Caption": { "title": "$:/language/SideBar/Open/Caption", "text": "Open" }, "$:/language/SideBar/Orphans/Caption": { "title": "$:/language/SideBar/Orphans/Caption", "text": "Orphans" }, "$:/language/SideBar/Recent/Caption": { "title": "$:/language/SideBar/Recent/Caption", "text": "Recent" }, "$:/language/SideBar/Shadows/Caption": { "title": "$:/language/SideBar/Shadows/Caption", "text": "Shadows" }, "$:/language/SideBar/System/Caption": { "title": "$:/language/SideBar/System/Caption", "text": "System" }, "$:/language/SideBar/Tags/Caption": { "title": "$:/language/SideBar/Tags/Caption", "text": "Tags" }, "$:/language/SideBar/Tags/Untagged/Caption": { "title": "$:/language/SideBar/Tags/Untagged/Caption", "text": "untagged" }, "$:/language/SideBar/Tools/Caption": { "title": "$:/language/SideBar/Tools/Caption", "text": "Tools" }, "$:/language/SideBar/Types/Caption": { "title": "$:/language/SideBar/Types/Caption", "text": "Types" }, "$:/SiteSubtitle": { "title": "$:/SiteSubtitle", "text": "a non-linear personal web notebook" }, "$:/SiteTitle": { "title": "$:/SiteTitle", "text": "My ~TiddlyWiki" }, "$:/language/Snippets/ListByTag": { "title": "$:/language/Snippets/ListByTag", "tags": "$:/tags/TextEditor/Snippet", "caption": "List of tiddlers by tag", "text": "<<list-links \"[tag[task]sort[title]]\">>\n" }, "$:/language/Snippets/MacroDefinition": { "title": "$:/language/Snippets/MacroDefinition", "tags": "$:/tags/TextEditor/Snippet", "caption": "Macro definition", "text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n" }, "$:/language/Snippets/Table4x3": { "title": "$:/language/Snippets/Table4x3", "tags": "$:/tags/TextEditor/Snippet", "caption": "Table with 4 columns by 3 rows", "text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n" }, "$:/language/Snippets/TableOfContents": { "title": "$:/language/Snippets/TableOfContents", "tags": "$:/tags/TextEditor/Snippet", "caption": "Table of Contents", "text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>" }, "$:/language/ThemeTweaks/ThemeTweaks": { "title": "$:/language/ThemeTweaks/ThemeTweaks", "text": "Theme Tweaks" }, "$:/language/ThemeTweaks/ThemeTweaks/Hint": { "title": "$:/language/ThemeTweaks/ThemeTweaks/Hint", "text": "You can tweak certain aspects of the ''Vanilla'' theme." }, "$:/language/ThemeTweaks/Options": { "title": "$:/language/ThemeTweaks/Options", "text": "Options" }, "$:/language/ThemeTweaks/Options/SidebarLayout": { "title": "$:/language/ThemeTweaks/Options/SidebarLayout", "text": "Sidebar layout" }, "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": { "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid", "text": "Fixed story, fluid sidebar" }, "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": { "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed", "text": "Fluid story, fixed sidebar" }, "$:/language/ThemeTweaks/Options/StickyTitles": { "title": "$:/language/ThemeTweaks/Options/StickyTitles", "text": "Sticky titles" }, "$:/language/ThemeTweaks/Options/StickyTitles/Hint": { "title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint", "text": "Causes tiddler titles to \"stick\" to the top of the browser window" }, "$:/language/ThemeTweaks/Options/CodeWrapping": { "title": "$:/language/ThemeTweaks/Options/CodeWrapping", "text": "Wrap long lines in code blocks" }, "$:/language/ThemeTweaks/Settings": { "title": "$:/language/ThemeTweaks/Settings", "text": "Settings" }, "$:/language/ThemeTweaks/Settings/FontFamily": { "title": "$:/language/ThemeTweaks/Settings/FontFamily", "text": "Font family" }, "$:/language/ThemeTweaks/Settings/CodeFontFamily": { "title": "$:/language/ThemeTweaks/Settings/CodeFontFamily", "text": "Code font family" }, "$:/language/ThemeTweaks/Settings/EditorFontFamily": { "title": "$:/language/ThemeTweaks/Settings/EditorFontFamily", "text": "Editor font family" }, "$:/language/ThemeTweaks/Settings/BackgroundImage": { "title": "$:/language/ThemeTweaks/Settings/BackgroundImage", "text": "Page background image" }, "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": { "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment", "text": "Page background image attachment" }, "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": { "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll", "text": "Scroll with tiddlers" }, "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": { "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed", "text": "Fixed to window" }, "$:/language/ThemeTweaks/Settings/BackgroundImageSize": { "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize", "text": "Page background image size" }, "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": { "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto", "text": "Auto" }, "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": { "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover", "text": "Cover" }, "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": { "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain", "text": "Contain" }, "$:/language/ThemeTweaks/Metrics": { "title": "$:/language/ThemeTweaks/Metrics", "text": "Sizes" }, "$:/language/ThemeTweaks/Metrics/FontSize": { "title": "$:/language/ThemeTweaks/Metrics/FontSize", "text": "Font size" }, "$:/language/ThemeTweaks/Metrics/LineHeight": { "title": "$:/language/ThemeTweaks/Metrics/LineHeight", "text": "Line height" }, "$:/language/ThemeTweaks/Metrics/BodyFontSize": { "title": "$:/language/ThemeTweaks/Metrics/BodyFontSize", "text": "Font size for tiddler body" }, "$:/language/ThemeTweaks/Metrics/BodyLineHeight": { "title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight", "text": "Line height for tiddler body" }, "$:/language/ThemeTweaks/Metrics/StoryLeft": { "title": "$:/language/ThemeTweaks/Metrics/StoryLeft", "text": "Story left position" }, "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": { "title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint", "text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page" }, "$:/language/ThemeTweaks/Metrics/StoryTop": { "title": "$:/language/ThemeTweaks/Metrics/StoryTop", "text": "Story top position" }, "$:/language/ThemeTweaks/Metrics/StoryTop/Hint": { "title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint", "text": "how far the top margin of the story river<br>is from the top of the page" }, "$:/language/ThemeTweaks/Metrics/StoryRight": { "title": "$:/language/ThemeTweaks/Metrics/StoryRight", "text": "Story right" }, "$:/language/ThemeTweaks/Metrics/StoryRight/Hint": { "title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint", "text": "how far the left margin of the sidebar <br>is from the left of the page" }, "$:/language/ThemeTweaks/Metrics/StoryWidth": { "title": "$:/language/ThemeTweaks/Metrics/StoryWidth", "text": "Story width" }, "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": { "title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint", "text": "the overall width of the story river" }, "$:/language/ThemeTweaks/Metrics/TiddlerWidth": { "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth", "text": "Tiddler width" }, "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": { "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint", "text": "within the story river" }, "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": { "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint", "text": "Sidebar breakpoint" }, "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": { "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint", "text": "the minimum page width at which the story<br>river and sidebar will appear side by side" }, "$:/language/ThemeTweaks/Metrics/SidebarWidth": { "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth", "text": "Sidebar width" }, "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": { "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint", "text": "the width of the sidebar in fluid-fixed layout" }, "$:/language/TiddlerInfo/Advanced/Caption": { "title": "$:/language/TiddlerInfo/Advanced/Caption", "text": "Advanced" }, "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": { "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint", "text": "none" }, "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": { "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading", "text": "Plugin Details" }, "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": { "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint", "text": "This plugin contains the following shadow tiddlers:" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading", "text": "Shadow Status" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint", "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint", "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source", "text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint", "text": "It is overridden by an ordinary tiddler" }, "$:/language/TiddlerInfo/Fields/Caption": { "title": "$:/language/TiddlerInfo/Fields/Caption", "text": "Fields" }, "$:/language/TiddlerInfo/List/Caption": { "title": "$:/language/TiddlerInfo/List/Caption", "text": "List" }, "$:/language/TiddlerInfo/List/Empty": { "title": "$:/language/TiddlerInfo/List/Empty", "text": "This tiddler does not have a list" }, "$:/language/TiddlerInfo/Listed/Caption": { "title": "$:/language/TiddlerInfo/Listed/Caption", "text": "Listed" }, "$:/language/TiddlerInfo/Listed/Empty": { "title": "$:/language/TiddlerInfo/Listed/Empty", "text": "This tiddler is not listed by any others" }, "$:/language/TiddlerInfo/References/Caption": { "title": "$:/language/TiddlerInfo/References/Caption", "text": "Backlinks" }, "$:/language/TiddlerInfo/References/Empty": { "title": "$:/language/TiddlerInfo/References/Empty", "text": "No tiddlers link to this one" }, "$:/language/TiddlerInfo/Tagging/Caption": { "title": "$:/language/TiddlerInfo/Tagging/Caption", "text": "Tagging" }, "$:/language/TiddlerInfo/Tagging/Empty": { "title": "$:/language/TiddlerInfo/Tagging/Empty", "text": "No tiddlers are tagged with this one" }, "$:/language/TiddlerInfo/Tools/Caption": { "title": "$:/language/TiddlerInfo/Tools/Caption", "text": "Tools" }, "$:/language/Docs/Types/application/javascript": { "title": "$:/language/Docs/Types/application/javascript", "description": "JavaScript code", "name": "application/javascript", "group": "Developer", "group-sort": "2" }, "$:/language/Docs/Types/application/json": { "title": "$:/language/Docs/Types/application/json", "description": "JSON data", "name": "application/json", "group": "Developer", "group-sort": "2" }, "$:/language/Docs/Types/application/x-tiddler-dictionary": { "title": "$:/language/Docs/Types/application/x-tiddler-dictionary", "description": "Data dictionary", "name": "application/x-tiddler-dictionary", "group": "Developer", "group-sort": "2" }, "$:/language/Docs/Types/image/gif": { "title": "$:/language/Docs/Types/image/gif", "description": "GIF image", "name": "image/gif", "group": "Image", "group-sort": "1" }, "$:/language/Docs/Types/image/jpeg": { "title": "$:/language/Docs/Types/image/jpeg", "description": "JPEG image", "name": "image/jpeg", "group": "Image", "group-sort": "1" }, "$:/language/Docs/Types/image/png": { "title": "$:/language/Docs/Types/image/png", "description": "PNG image", "name": "image/png", "group": "Image", "group-sort": "1" }, "$:/language/Docs/Types/image/svg+xml": { "title": "$:/language/Docs/Types/image/svg+xml", "description": "Structured Vector Graphics image", "name": "image/svg+xml", "group": "Image", "group-sort": "1" }, "$:/language/Docs/Types/image/x-icon": { "title": "$:/language/Docs/Types/image/x-icon", "description": "ICO format icon file", "name": "image/x-icon", "group": "Image", "group-sort": "1" }, "$:/language/Docs/Types/text/css": { "title": "$:/language/Docs/Types/text/css", "description": "Static stylesheet", "name": "text/css", "group": "Developer", "group-sort": "2" }, "$:/language/Docs/Types/text/html": { "title": "$:/language/Docs/Types/text/html", "description": "HTML markup", "name": "text/html", "group": "Text", "group-sort": "0" }, "$:/language/Docs/Types/text/plain": { "title": "$:/language/Docs/Types/text/plain", "description": "Plain text", "name": "text/plain", "group": "Text", "group-sort": "0" }, "$:/language/Docs/Types/text/vnd.tiddlywiki": { "title": "$:/language/Docs/Types/text/vnd.tiddlywiki", "description": "TiddlyWiki 5", "name": "text/vnd.tiddlywiki", "group": "Text", "group-sort": "0" }, "$:/language/Docs/Types/text/x-tiddlywiki": { "title": "$:/language/Docs/Types/text/x-tiddlywiki", "description": "TiddlyWiki Classic", "name": "text/x-tiddlywiki", "group": "Text", "group-sort": "0" }, "$:/languages/en-GB/icon": { "title": "$:/languages/en-GB/icon", "type": "image/svg+xml", "text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n" }, "$:/languages/en-GB": { "title": "$:/languages/en-GB", "name": "en-GB", "description": "English (British)", "author": "JeremyRuston", "core-version": ">=5.0.0\"", "text": "Stub pseudo-plugin for the default language" }, "$:/core/modules/commander.js": { "title": "$:/core/modules/commander.js", "text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\t\t\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/commands/build.js": { "title": "$:/core/modules/commands/build.js", "text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/clearpassword.js": { "title": "$:/core/modules/commands/clearpassword.js", "text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/deletetiddlers.js": { "title": "$:/core/modules/commands/deletetiddlers.js", "text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/editions.js": { "title": "$:/core/modules/commands/editions.js", "text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/fetch.js": { "title": "$:/core/modules/commands/fetch.js", "text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = this.commander.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t \tdata = [];\n\t self.commander.write(\"Reading \" + url + \": \");\n\t response.on(\"data\",function(chunk) {\n\t data.push(chunk);\n\t self.commander.write(\".\");\n\t });\n\t response.on(\"end\",function() {\n\t self.commander.write(\"\\n\");\n\t if(response.statusCode === 200) {\n\t\t self.processBody(Buffer.concat(data),type,options,url);\n\t\t callback(null);\n\t } else {\n\t \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t \t} else {\n\t\t \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t \t\t\n\t \t}\n\t }\n\t \t});\n\t \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/help.js": { "title": "$:/core/modules/commands/help.js", "text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/import.js": { "title": "$:/core/modules/commands/import.js", "text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/init.js": { "title": "$:/core/modules/commands/init.js", "text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/listen.js": { "title": "$:/core/modules/commands/listen.js", "text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/load.js": { "title": "$:/core/modules/commands/load.js", "text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/makelibrary.js": { "title": "$:/core/modules/commands/makelibrary.js", "text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/output.js": { "title": "$:/core/modules/commands/output.js", "text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/password.js": { "title": "$:/core/modules/commands/password.js", "text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/render.js": { "title": "$:/core/modules/commands/render.js", "text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"render\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/rendertiddler.js": { "title": "$:/core/modules/commands/rendertiddler.js", "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/rendertiddlers.js": { "title": "$:/core/modules/commands/rendertiddlers.js", "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/save.js": { "title": "$:/core/modules/commands/save.js", "text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/savelibrarytiddlers.js": { "title": "$:/core/modules/commands/savelibrarytiddlers.js", "text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <tiddler-filter> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe tiddler filter specifies the plugins to be included.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers),\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/savetiddler.js": { "title": "$:/core/modules/commands/savetiddler.js", "text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/savetiddlers.js": { "title": "$:/core/modules/commands/savetiddlers.js", "text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/savewikifolder.js": { "title": "$:/core/modules/commands/savewikifolder.js", "text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type] || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/server.js": { "title": "$:/core/modules/commands/server.js", "text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/setfield.js": { "title": "$:/core/modules/commands/setfield.js", "text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/unpackplugin.js": { "title": "$:/core/modules/commands/unpackplugin.js", "text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/verbose.js": { "title": "$:/core/modules/commands/verbose.js", "text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/version.js": { "title": "$:/core/modules/commands/version.js", "text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/config.js": { "title": "$:/core/modules/config.js", "text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n", "type": "application/javascript", "module-type": "config" }, "$:/core/modules/deserializers.js": { "title": "$:/core/modules/deserializers.js", "text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n", "type": "application/javascript", "module-type": "tiddlerdeserializer" }, "$:/core/modules/editor/engines/framed.js": { "title": "$:/core/modules/editor/engines/framed.js", "text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\t\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nFramedEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a focus event\n*/\nFramedEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\t\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n", "type": "application/javascript", "module-type": "library" }, "$:/core/modules/editor/engines/simple.js": { "title": "$:/core/modules/editor/engines/simple.js", "text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nSimpleEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n", "type": "application/javascript", "module-type": "library" }, "$:/core/modules/editor/factory.js": { "title": "$:/core/modules/editor/factory.js", "text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\") === \"yes\";\n\t\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\t\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\t\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if (changedTiddlers[this.editRefreshTitle]) {\n\t\t\tthis.engine.updateDomNodeText(this.getEditInfo().value);\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n", "type": "application/javascript", "module-type": "library" }, "$:/core/modules/editor/operations/bitmap/clear.js": { "title": "$:/core/modules/editor/operations/bitmap/clear.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n", "type": "application/javascript", "module-type": "bitmapeditoroperation" }, "$:/core/modules/editor/operations/bitmap/resize.js": { "title": "$:/core/modules/editor/operations/bitmap/resize.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n", "type": "application/javascript", "module-type": "bitmapeditoroperation" }, "$:/core/modules/editor/operations/bitmap/rotate-left.js": { "title": "$:/core/modules/editor/operations/bitmap/rotate-left.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n", "type": "application/javascript", "module-type": "bitmapeditoroperation" }, "$:/core/modules/editor/operations/text/excise.js": { "title": "$:/core/modules/editor/operations/text/excise.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ? [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n", "type": "application/javascript", "module-type": "texteditoroperation" }, "$:/core/modules/editor/operations/text/make-link.js": { "title": "$:/core/modules/editor/operations/text/make-link.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n", "type": "application/javascript", "module-type": "texteditoroperation" }, "$:/core/modules/editor/operations/text/prefix-lines.js": { "title": "$:/core/modules/editor/operations/text/prefix-lines.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline = prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "texteditoroperation" }, "$:/core/modules/editor/operations/text/replace-all.js": { "title": "$:/core/modules/editor/operations/text/replace-all.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n", "type": "application/javascript", "module-type": "texteditoroperation" }, "$:/core/modules/editor/operations/text/replace-selection.js": { "title": "$:/core/modules/editor/operations/text/replace-selection.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n", "type": "application/javascript", "module-type": "texteditoroperation" }, "$:/core/modules/editor/operations/text/save-selection.js": { "title": "$:/core/modules/editor/operations/text/save-selection.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "texteditoroperation" }, "$:/core/modules/editor/operations/text/wrap-lines.js": { "title": "$:/core/modules/editor/operations/text/wrap-lines.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n", "type": "application/javascript", "module-type": "texteditoroperation" }, "$:/core/modules/editor/operations/text/wrap-selection.js": { "title": "$:/core/modules/editor/operations/text/wrap-selection.js", "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "texteditoroperation" }, "$:/core/modules/filterrunprefixes/all.js": { "title": "$:/core/modules/filterrunprefixes/all.js", "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/all.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nUnion of sets without de-duplication.\nEquivalent to = filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.all = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.push.apply(results, operationSubFunction(source,widget));\n\t};\n};\n\n})();\n", "type": "application/javascript", "module-type": "filterrunprefix" }, "$:/core/modules/filterrunprefixes/and.js": { "title": "$:/core/modules/filterrunprefixes/and.js", "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/and.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nIntersection of sets.\nEquivalent to + filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.and = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\tsource = options.wiki.makeTiddlerIterator(results.toArray());\n\t\tresults.clear();\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n", "type": "application/javascript", "module-type": "filterrunprefix" }, "$:/core/modules/filterrunprefixes/else.js": { "title": "$:/core/modules/filterrunprefixes/else.js", "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/else.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to ~ filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.else = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length === 0) {\n\t\t\t// Main result so far is empty\n\t\t\tresults.pushTop(operationSubFunction(source,widget));\n\t\t}\n\t};\n};\n\n})();\n", "type": "application/javascript", "module-type": "filterrunprefix" }, "$:/core/modules/filterrunprefixes/except.js": { "title": "$:/core/modules/filterrunprefixes/except.js", "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/except.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nDifference of sets.\nEquivalent to - filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.except = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.remove(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n", "type": "application/javascript", "module-type": "filterrunprefix" }, "$:/core/modules/filterrunprefixes/filter.js": { "title": "$:/core/modules/filterrunprefixes/filter.js", "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/filter.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar resultsToRemove = [];\n\t\t\tresults.each(function(result) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([result]),widget);\n\t\t\t\tif(filtered.length === 0) {\n\t\t\t\t\tresultsToRemove.push(result);\n\t\t\t\t}\n\t\t\t});\n\t\t\tresults.remove(resultsToRemove);\n\t\t}\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "filterrunprefix" }, "$:/core/modules/filterrunprefixes/intersection.js": { "title": "$:/core/modules/filterrunprefixes/intersection.js", "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/intersection.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.intersection = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar secondRunResults = operationSubFunction(source,widget);\n\t\t\tvar firstRunResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(firstRunResults,function(title) {\n\t\t\t\tif(secondRunResults.indexOf(title) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n};\n\n})();\n", "type": "application/javascript", "module-type": "filterrunprefix" }, "$:/core/modules/filterrunprefixes/or.js": { "title": "$:/core/modules/filterrunprefixes/or.js", "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/or.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to a filter run with no prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.or = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n", "type": "application/javascript", "module-type": "filterrunprefix" }, "$:/core/modules/filterrunprefixes/reduce.js": { "title": "$:/core/modules/filterrunprefixes/reduce.js", "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/reduce.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.reduce = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar accumulator = \"\";\n\t\t\tvar index = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\t\t\treturn \"\" + (results.length - 1 - index);\n\t\t\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn widget.getVariable(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tif(list.length > 0) {\n\t\t\t\t\taccumulator = \"\" + list[0];\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\tresults.push(accumulator);\t\n\t\t}\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "filterrunprefix" }, "$:/core/modules/filters/addprefix.js": { "title": "$:/core/modules/filters/addprefix.js", "text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/addsuffix.js": { "title": "$:/core/modules/filters/addsuffix.js", "text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/after.js": { "title": "$:/core/modules/filters/after.js", "text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/all/current.js": { "title": "$:/core/modules/filters/all/current.js", "text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all/missing.js": { "title": "$:/core/modules/filters/all/missing.js", "text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all/orphans.js": { "title": "$:/core/modules/filters/all/orphans.js", "text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all/shadows.js": { "title": "$:/core/modules/filters/all/shadows.js", "text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all/tags.js": { "title": "$:/core/modules/filters/all/tags.js", "text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all/tiddlers.js": { "title": "$:/core/modules/filters/all/tiddlers.js", "text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all.js": { "title": "$:/core/modules/filters/all.js", "text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/backlinks.js": { "title": "$:/core/modules/filters/backlinks.js", "text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/before.js": { "title": "$:/core/modules/filters/before.js", "text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/commands.js": { "title": "$:/core/modules/filters/commands.js", "text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/compare.js": { "title": "$:/core/modules/filters/compare.js", "text": "/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = $tw.utils.makeCompareFunction(type,{defaultType: \"number\"}),\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/contains.js": { "title": "$:/core/modules/filters/contains.js", "text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/count.js": { "title": "$:/core/modules/filters/count.js", "text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/days.js": { "title": "$:/core/modules/filters/days.js", "text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/duplicateslugs.js": { "title": "$:/core/modules/filters/duplicateslugs.js", "text": "/*\\\ntitle: $:/core/modules/filters/duplicateslugs.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter function for [duplicateslugs[]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.duplicateslugs = function(source,operator,options) {\n\tvar slugs = Object.create(null), // Hashmap by slug of title, replaced with \"true\" if the duplicate title has already been output\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tvar slug = options.wiki.slugify(title);\n\t\tif(slug in slugs) {\n\t\t\tif(slugs[slug] !== true) {\n\t\t\t\tresults.push(slugs[slug]);\n\t\t\t\tslugs[slug] = true;\n\t\t\t}\n\t\t\tresults.push(title);\n\t\t} else {\n\t\t\tslugs[slug] = title;\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/each.js": { "title": "$:/core/modules/filters/each.js", "text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/eachday.js": { "title": "$:/core/modules/filters/eachday.js", "text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/editiondescription.js": { "title": "$:/core/modules/filters/editiondescription.js", "text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/editions.js": { "title": "$:/core/modules/filters/editions.js", "text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\t\tresults.push(name);\n\t\t\t});\n\t\t}\n\t\tresults.sort();\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/else.js": { "title": "$:/core/modules/filters/else.js", "text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/decodeuricomponent.js": { "title": "$:/core/modules/filters/decodeuricomponent.js", "text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/enlist.js": { "title": "$:/core/modules/filters/enlist.js", "text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/field.js": { "title": "$:/core/modules/filters/field.js", "text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/fields.js": { "title": "$:/core/modules/filters/fields.js", "text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\t\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/filter.js": { "title": "$:/core/modules/filters/filter.js", "text": "/*\\\ntitle: $:/core/modules/filters/filter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that pass a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(source,operator,options) {\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\tresults = [],\n\t\ttarget = operator.prefix !== \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]));\n\t\tif((list.length > 0) === target) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/format/date.js": { "title": "$:/core/modules/filters/format/date.js", "text": "/*\\\ntitle: $:/core/modules/filters/format/date.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.date = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"YYYY MM DD 0hh:0mm\"));\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();", "type": "application/javascript", "module-type": "formatfilteroperator" }, "$:/core/modules/filters/format/relativedate.js": { "title": "$:/core/modules/filters/format/relativedate.js", "text": "/*\\\ntitle: $:/core/modules/filters/format/relativedate.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.relativedate = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();", "type": "application/javascript", "module-type": "formatfilteroperator" }, "$:/core/modules/filters/format.js": { "title": "$:/core/modules/filters/format.js", "text": "/*\\\ntitle: $:/core/modules/filters/format.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for formatting strings\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar formatFilterOperators;\n\nfunction getFormatFilterOperators() {\n\tif(!formatFilterOperators) {\n\t\tformatFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"formatfilteroperator\",formatFilterOperators);\n\t}\n\treturn formatFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.format = function(source,operator,options) {\n\t// Dispatch to the correct formatfilteroperator\n\tvar formatFilterOperators = getFormatFilterOperators();\n\tif(operator.suffix) {\n\t\tvar formatFilterOperator = formatFilterOperators[operator.suffix];\n\t\tif(formatFilterOperator) {\n\t\t\treturn formatFilterOperator(source,operator.operand,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/FormatFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all unchanged if the suffix is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/get.js": { "title": "$:/core/modules/filters/get.js", "text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/getindex.js": { "title": "$:/core/modules/filters/getindex.js", "text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/getvariable.js": { "title": "$:/core/modules/filters/getvariable.js", "text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/has.js": { "title": "$:/core/modules/filters/has.js", "text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field or index\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/haschanged.js": { "title": "$:/core/modules/filters/haschanged.js", "text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/indexes.js": { "title": "$:/core/modules/filters/indexes.js", "text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/insertbefore.js": { "title": "$:/core/modules/filters/insertbefore.js", "text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/is/binary.js": { "title": "$:/core/modules/filters/is/binary.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/blank.js": { "title": "$:/core/modules/filters/is/blank.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/current.js": { "title": "$:/core/modules/filters/is/current.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/draft.js": { "title": "$:/core/modules/filters/is/draft.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/draft.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[draft]] analagous to [has[draft.of]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.draft = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,\"draft.of\")) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,\"draft.of\") && (tiddler.fields[\"draft.of\"].length !== 0)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\t\t\t\t\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/image.js": { "title": "$:/core/modules/filters/is/image.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/missing.js": { "title": "$:/core/modules/filters/is/missing.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/orphan.js": { "title": "$:/core/modules/filters/is/orphan.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/shadow.js": { "title": "$:/core/modules/filters/is/shadow.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/system.js": { "title": "$:/core/modules/filters/is/system.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/tag.js": { "title": "$:/core/modules/filters/is/tag.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/tiddler.js": { "title": "$:/core/modules/filters/is/tiddler.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/variable.js": { "title": "$:/core/modules/filters/is/variable.js", "text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is.js": { "title": "$:/core/modules/filters/is.js", "text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/limit.js": { "title": "$:/core/modules/filters/limit.js", "text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/links.js": { "title": "$:/core/modules/filters/links.js", "text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/list.js": { "title": "$:/core/modules/filters/list.js", "text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/listed.js": { "title": "$:/core/modules/filters/listed.js", "text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/listops.js": { "title": "$:/core/modules/filters/listops.js", "text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/lookup.js": { "title": "$:/core/modules/filters/lookup.js", "text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix);\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/match.js": { "title": "$:/core/modules/filters/match.js", "text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/math.js": { "title": "$:/core/modules/filters/math.js", "text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.power = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.pow(a,b);}\n);\n\nexports.log = makeNumericBinaryOperator(\n\tfunction(a,b) {\n\t\tif(b) {\n\t\t\treturn Math.log(a)/Math.log(b);\n\t\t} else {\n\t\t\treturn Math.log(a);\n\t\t}\n\t}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,$tw.utils.parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/minlength.js": { "title": "$:/core/modules/filters/minlength.js", "text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/modules.js": { "title": "$:/core/modules/filters/modules.js", "text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/moduletypes.js": { "title": "$:/core/modules/filters/moduletypes.js", "text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/next.js": { "title": "$:/core/modules/filters/next.js", "text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/plugintiddlers.js": { "title": "$:/core/modules/filters/plugintiddlers.js", "text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/prefix.js": { "title": "$:/core/modules/filters/prefix.js", "text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/previous.js": { "title": "$:/core/modules/filters/previous.js", "text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/range.js": { "title": "$:/core/modules/filters/range.js", "text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/reduce.js": { "title": "$:/core/modules/filters/reduce.js", "text": "/*\\\ntitle: $:/core/modules/filters/reduce.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.reduce = function(source,operator,options) {\n\t// Accumulate the list\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Run the filter over each item\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\taccumulator = operator.operands[1] || \"\";\n\tfor(var index=0; index<results.length; index++) {\n\t\tvar title = results[index],\n\t\t\tlist = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\treturn \"\" + (results.length - 1 - index);\n\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\tif(list.length > 0) {\n\t\t\taccumulator = \"\" + list[0];\n\t\t}\n\t}\n\tif(results.length > 0) {\n\t\treturn [accumulator];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/regexp.js": { "title": "$:/core/modules/filters/regexp.js", "text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/removeprefix.js": { "title": "$:/core/modules/filters/removeprefix.js", "text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/removesuffix.js": { "title": "$:/core/modules/filters/removesuffix.js", "text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/sameday.js": { "title": "$:/core/modules/filters/sameday.js", "text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/search.js": { "title": "$:/core/modules/filters/search.js", "text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/shadowsource.js": { "title": "$:/core/modules/filters/shadowsource.js", "text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/slugify.js": { "title": "$:/core/modules/filters/slugify.js", "text": "/*\\\ntitle: $:/core/modules/filters/slugify.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for slugifying a tiddler title\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.slugify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.slugify(title));\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/sort.js": { "title": "$:/core/modules/filters/sort.js", "text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/sortsub.js": { "title": "$:/core/modules/filters/sortsub.js", "text": "/*\\\ntitle: $:/core/modules/filters/sortsub.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting by a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sortsub = function(source,operator,options) {\n\t// Compile the subfilter\n\tvar filterFn = options.wiki.compileFilter(operator.operand);\n\t// Collect the input titles and the corresponding sort keys\n\tvar inputTitles = [],\n\t\tsortKeys = [];\n\tsource(function(tiddler,title) {\n\t\tinputTitles.push(title);\n\t\tvar r = filterFn.call(options.wiki,function(iterator) {\n\t\t\titerator(options.wiki.getTiddler(title),title);\n\t\t},{\n\t\t\tgetVariable: function(name) {\n\t\t\t\tif(name === \"currentTiddler\") {\n\t\t\t\t\treturn title;\n\t\t\t\t} else {\n\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tsortKeys.push(r[0] || \"\");\n\t});\n\t// Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays\n\tvar indexes = new Array(inputTitles.length);\n\tfor(var t=0; t<inputTitles.length; t++) {\n\t\tindexes[t] = t;\n\t}\n\t// Sort the indexes\n\tvar compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: \"string\",invert: operator.prefix === \"!\"});\n\tindexes = indexes.sort(function(a,b) {\n\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t});\n\t// Make the results array in order\n\tvar results = [];\n\t$tw.utils.each(indexes,function(index) {\n\t\tresults.push(inputTitles[index]);\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/splitbefore.js": { "title": "$:/core/modules/filters/splitbefore.js", "text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/storyviews.js": { "title": "$:/core/modules/filters/storyviews.js", "text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/strings.js": { "title": "$:/core/modules/filters/strings.js", "text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\toperand = (operator.operand || \"\"),\n\t\tfnCalc;\n\tif(suffix === \"prefix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];}\n\t} else if(suffix === \"suffix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];}\n\t} else {\n\t\tif(operand === \"\") {\n\t\t\tfnCalc = function(a) {return [$tw.utils.trim(a)];}\n\t\t} else {\n\t\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];}\n\t\t}\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,fnCalc(title,operand));\n\t});\n\treturn result;\n};\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports[\"enlist-input\"] = makeStringBinaryOperator(\n\tfunction(a,o,s) {return $tw.utils.parseStringArray(\"\" + a,(s === \"raw\"));}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\",operator.suffix || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\tif(result.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\nexports[\"search-replace\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = operator.suffixes || [],\n\t\tflagSuffix = (suffixes[0] ? (suffixes[0][0] || \"\") : \"\"),\n\t\tflags = (flagSuffix.indexOf(\"g\") !== -1 ? \"g\" : \"\") + (flagSuffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tisRegExp = (suffixes[1] && suffixes[1][0] === \"regexp\") ? true : false,\n\t\tsearchTerm,\n\t\tregExp;\n\t\n\tsource(function(tiddler,title) {\n\t\tif(title && (operator.operands.length > 1)) {\n\t\t\t//Escape regexp characters if the operand is not a regular expression\n\t\t\tsearchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand);\n\t\t\ttry {\n\t\t\t\tregExp = new RegExp(searchTerm,flags);\n\t\t\t} catch(ex) {\n\t\t\t\treturn [\"RegExp error: \" + ex];\n\t\t\t}\n\t\t\tresults.push(\n\t\t\t\ttitle.replace(regExp,operator.operands[1])\n\t\t\t);\n\t\t} else {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nexports.pad = function(source,operator,options) {\n\tvar results = [],\n\t\ttargetLength = operator.operand ? parseInt(operator.operand) : 0,\n\t\tfill = operator.operands[1] || \"0\";\n\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tif(title.length >= targetLength) {\n\t\t\t\tresults.push(title);\n\t\t\t} else {\n\t\t\t\tvar padString = \"\",\n\t\t\t\t\tpadStringLength = targetLength - title.length;\n\t\t\t\twhile (padStringLength > padString.length) {\n\t\t\t\t\tpadString += fill;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//make sure we do not exceed the specified length\n\t\t\t\tpadString = padString.slice(0,padStringLength);\n\t\t\t\tif(operator.suffix && (operator.suffix === \"suffix\")) {\n\t\t\t\t\ttitle = title + padString;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = padString + title;\n\t\t\t\t}\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n}\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/subfilter.js": { "title": "$:/core/modules/filters/subfilter.js", "text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/subtiddlerfields.js": { "title": "$:/core/modules/filters/subtiddlerfields.js", "text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/suffix.js": { "title": "$:/core/modules/filters/suffix.js", "text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/tag.js": { "title": "$:/core/modules/filters/tag.js", "text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/tagging.js": { "title": "$:/core/modules/filters/tagging.js", "text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/tags.js": { "title": "$:/core/modules/filters/tags.js", "text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/then.js": { "title": "$:/core/modules/filters/then.js", "text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/title.js": { "title": "$:/core/modules/filters/title.js", "text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/untagged.js": { "title": "$:/core/modules/filters/untagged.js", "text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/variables.js": { "title": "$:/core/modules/filters/variables.js", "text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/wikiparserrules.js": { "title": "$:/core/modules/filters/wikiparserrules.js", "text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/x-listops.js": { "title": "$:/core/modules/filters/x-listops.js", "text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t/*\n\tFetch titles from the current list\n\t*/\n\tvar prepare_results = function (source) {\n\tvar results = [];\n\t\tsource(function (tiddler, title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list before the item named in the operand\n\t*/\n\texports.putbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list after the item named in the operand\n\t*/\n\texports.putafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tReplaces the item named in the operand with a number of items from the tail of the current list\n\t*/\n\texports.replace = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -count) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list to the head of the list\n\t*/\n\texports.putfirst = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(-count).concat(results.slice(0, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the head of the current list to the tail of the list\n\t*/\n\texports.putlast = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(count).concat(results.slice(0, count));\n\t};\n\n\t/*\n\tMoves the item named in the operand a number of places forward or backward in the list\n\t*/\n\texports.move = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1),\n\t\t\tmarker = results.splice(index, 1),\n\t\t\toffset = (index + count) > 0 ? index + count : 0;\n\t\treturn results.slice(0, offset).concat(marker).concat(results.slice(offset));\n\t};\n\n\t/*\n\tReturns the items from the current list that are after the item named in the operand\n\t*/\n\texports.allafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(index) :\n\t\t\tresults.slice(index + 1);\n\t};\n\n\t/*\n\tReturns the items from the current list that are before the item named in the operand\n\t*/\n\texports.allbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(0, index + 1) :\n\t\t\tresults.slice(0, index);\n\t};\n\n\t/*\n\tAppends the items listed in the operand array to the tail of the current list\n\t*/\n\texports.append = function (source, operator) {\n\t\tvar append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || append.length;\n\t\treturn (append.length === 0) ? results :\n\t\t\t(operator.prefix) ? results.concat(append.slice(-count)) :\n\t\t\tresults.concat(append.slice(0, count));\n\t};\n\n\t/*\n\tPrepends the items listed in the operand array to the head of the current list\n\t*/\n\texports.prepend = function (source, operator) {\n\t\tvar prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,prepend.length);\n\t\treturn (prepend.length === 0) ? results :\n\t\t\t(operator.prefix) ? prepend.slice(-count).concat(results) :\n\t\t\tprepend.slice(0, count).concat(results);\n\t};\n\n\t/*\n\tReturns all items from the current list except the items listed in the operand array\n\t*/\n\texports.remove = function (source, operator) {\n\t\tvar array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || array.length,\n\t\t\tp,\n\t\t\tlen,\n\t\t\tindex;\n\t\tlen = array.length - 1;\n\t\tfor (p = 0; p < count; ++p) {\n\t\t\tif (operator.prefix) {\n\t\t\t\tindex = results.indexOf(array[len - p]);\n\t\t\t} else {\n\t\t\t\tindex = results.indexOf(array[p]);\n\t\t\t}\n\t\t\tif (index !== -1) {\n\t\t\t\tresults.splice(index, 1);\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t};\n\n\t/*\n\tReturns all items from the current list sorted in the order of the items in the operand array\n\t*/\n\texports.sortby = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tif (!results || results.length < 2) {\n\t\t\treturn results;\n\t\t}\n\t\tvar lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n\t\tresults.sort(function (a, b) {\n\t\t\treturn lookup.indexOf(a) - lookup.indexOf(b);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tRemoves all duplicate items from the current list\n\t*/\n\texports.unique = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tvar set = results.reduce(function (a, b) {\n\t\t\tif (a.indexOf(b) < 0) {\n\t\t\t\ta.push(b);\n\t\t\t}\n\t\t\treturn a;\n\t\t}, []);\n\t\treturn set;\n\t};\n\n\tvar cycleValueInArray = function(results,operands,stepSize) {\n\t\tvar resultsIndex,\n\t\t\tstep = stepSize || 1,\n\t\t\ti = 0,\n\t\t\topLength = operands.length,\n\t\t\tnextOperandIndex;\t\t\n\t\tfor(i; i < opLength; i++) {\n\t\t\tresultsIndex = results.indexOf(operands[i]);\n\t\t\tif(resultsIndex !== -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(resultsIndex !== -1) {\n\t\t\ti = i + step;\n\t\t\tnextOperandIndex = (i < opLength ? i : i - opLength);\n\t\t\tif(operands.length > 1) {\n\t\t\t\tresults.splice(resultsIndex,1,operands[nextOperandIndex]);\n\t\t\t} else {\n\t\t\t\tresults.splice(resultsIndex,1);\n\t\t\t}\n\t\t} else {\n\t\t\tresults.push(operands[0]);\n\t\t}\n\t\treturn results;\t\t\n\t}\n\n\t/*\n\tToggles an item in the current list.\n\t*/\t\n\texports.toggle = function(source,operator) {\n\t\treturn cycleValueInArray(prepare_results(source),operator.operands);\n\t}\n\n\texports.cycle = function(source,operator) {\n\t\tvar results = prepare_results(source),\n\t\t\toperands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, \"true\") : [\"\"]),\n\t\t\tstep = $tw.utils.getInt(operator.operands[1]||\"\",1);\n\t\tif(step < 0) {\n\t\t\toperands.reverse();\n\t\t\tstep = Math.abs(step);\n\t\t}\t\n\t\treturn cycleValueInArray(results,operands,step);\n\t}\n\t\n})();\n", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters.js": { "title": "$:/core/modules/filters.js", "text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\t\toperator.operands = [];\n\t\tfunction parseOperand(bracketType) {\n\t\t\tvar operand = {};\n\t\t\tswitch (bracketType) {\n\t\t\t\tcase \"{\": // Curly brackets\n\t\t\t\t\toperand.indirect = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[\": // Square brackets\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\": // Angle brackets\n\t\t\t\t\toperand.variable = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\": // regexp brackets\n\t\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\t\tif(rexMatch) {\n\t\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n\t// DEPRECATION WARNING\n\tconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(nextBracketPos === -1) {\n\t\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t\t}\n\t\t\tif(!operator.regexp) {\n\t\t\t\toperand.text = filterString.substring(p,nextBracketPos);\n\t\t\t\toperator.operands.push(operand);\n\t\t\t}\n\t\t\tp = nextBracketPos + 1;\n\t\t}\n\t\t\n\t\tp = nextBracketPos + 1;\n\t\tparseOperand(bracket);\n\t\t\n\t\t// Check for multiple operands\n\t\twhile(filterString.charAt(p) === \",\") {\n\t\t\tp++;\n\t\t\tif(/^[\\[\\{<\\/]/.test(filterString.substring(p))) {\n\t\t\t\tnextBracketPos = p;\n\t\t\t\tp++;\n\t\t\t\tparseOperand(filterString.charAt(nextBracketPos));\n\t\t\t} else {\n\t\t\t\tthrow \"Missing [ in filter expression\";\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=|\\:(\\w+))?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp = p + operation.prefix.length;\n\t\t\t\tif(match[2]) {\n\t\t\t\t\toperation.namedPrefix = match[2];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(match[3]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operands: [{text: match[4] || match[5] || match[6]}]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.getFilterRunPrefixes = function() {\n\tif(!this.filterRunPrefixes) {\n\t\t$tw.Wiki.prototype.filterRunPrefixes = {};\n\t\t$tw.modules.applyMethods(\"filterrunprefix\",this.filterRunPrefixes);\n\t}\n\treturn this.filterRunPrefixes;\n}\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operands = [],\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$tw.utils.each(operator.operands,function(operand) {\n\t\t\t\t\tif(operand.indirect) {\n\t\t\t\t\t\toperand.value = self.getTextReference(operand.text,\"\",currTiddlerTitle);\n\t\t\t\t\t} else if(operand.variable) {\n\t\t\t\t\t\toperand.value = widget.getVariable(operand.text,{defaultValue: \"\"});\n\t\t\t\t\t} else {\n\t\t\t\t\t\toperand.value = operand.text;\n\t\t\t\t\t}\n\t\t\t\t\toperands.push(operand.value);\n\t\t\t\t});\n\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operands.length > 0 ? operands[0] : undefined,\n\t\t\t\t\t\t\toperands: operands,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\tvar filterRunPrefixes = self.getFilterRunPrefixes();\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tvar options = {wiki: self};\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn filterRunPrefixes[\"or\"](operationSubFunction, options);\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn filterRunPrefixes[\"all\"](operationSubFunction, options);\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn filterRunPrefixes[\"except\"](operationSubFunction, options);\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn filterRunPrefixes[\"and\"](operationSubFunction, options);\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn filterRunPrefixes[\"else\"](operationSubFunction, options);\n\t\t\t\tdefault: \n\t\t\t\t\tif(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {\n\t\t\t\t\t\treturn filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t\tresults.clear();\n\t\t\t\t\t\t\tresults.push($tw.language.getString(\"Error/FilterRunPrefix\"));\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = new $tw.utils.LinkedList();\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results.toArray();\n\t});\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikimethod" }, "$:/core/modules/indexers/backlinks-indexer.js": { "title": "$:/core/modules/indexers/backlinks-indexer.js", "text": "/*\\\ntitle: $:/core/modules/indexers/backlinks-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers' backlinks\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\n\nfunction BacklinksIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBacklinksIndexer.prototype.init = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\n\tvar parser = this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki.extractLinks(parser.tree);\n\t}\n\treturn [];\n}\n\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newLinks = [],\n\t oldLinks = [],\n\t self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldLinks,function(link) {\n\t\tif(self.index[link]) {\n\t\t\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newLinks,function(link) {\n\t\tif(!self.index[link]) {\n\t\t\tself.index[link] = Object.create(null);\n\t\t}\n\t\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBacklinksIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis.index = Object.create(null);\n\t\tvar self = this;\n\t\tthis.wiki.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self._getLinks(tiddler);\n\t\t\t$tw.utils.each(links, function(link) {\n\t\t\t\tif(!self.index[link]) {\n\t\t\t\t\tself.index[link] = Object.create(null);\n\t\t\t\t}\n\t\t\t\tself.index[link][title] = true;\n\t\t\t});\n\t\t});\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BacklinksIndexer = BacklinksIndexer;\n\n})();\n", "type": "application/javascript", "module-type": "indexer" }, "$:/core/modules/indexers/field-indexer.js": { "title": "$:/core/modules/indexers/field-indexer.js", "text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n", "type": "application/javascript", "module-type": "indexer" }, "$:/core/modules/indexers/tag-indexer.js": { "title": "$:/core/modules/indexers/tag-indexer.js", "text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n", "type": "application/javascript", "module-type": "indexer" }, "$:/core/modules/info/platform.js": { "title": "$:/core/modules/info/platform.js", "text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tinfoTiddlerFields.push({title: \"$:/info/startup-timestamp\", text: $tw.utils.stringifyDate(new Date())});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n \t\t// Dark mode through event listener on MediaQueryList\n \t\tvar mqList = window.matchMedia(\"(prefers-color-scheme: dark)\"),\n \t\t\tgetDarkModeTiddler = function() {return {title: \"$:/info/darkmode\", text: mqList.matches ? \"yes\" : \"no\"};};\n \t\tinfoTiddlerFields.push(getDarkModeTiddler());\n \t\tmqList.addListener(function(event) {\n \t\t\tupdateInfoTiddlersCallback([getDarkModeTiddler()]);\n \t\t});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n", "type": "application/javascript", "module-type": "info" }, "$:/core/modules/keyboard.js": { "title": "$:/core/modules/keyboard.js", "text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {\n\treturn event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl\" : \n\t\tevent.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? \"shift\" : \n\t\tevent.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl-shift\" : \n\t\tevent.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt\" : \n\t\tevent.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt-shift\" : \n\t\tevent.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? \"ctrl-alt\" : \n\t\tevent.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? \"ctrl-alt-shift\" : \n\t\tevent.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta\" : \n\t\tevent.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta-ctrl\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? \"meta-ctrl-shift\" :\n\t\tevent.metaKey && event.ctrlKey & event.shiftKey && event.altKey ? \"meta-ctrl-alt-shift\" : \"normal\";\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/language.js": { "title": "$:/core/modules/language.js", "text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/macros/changecount.js": { "title": "$:/core/modules/macros/changecount.js", "text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/contrastcolour.js": { "title": "$:/core/modules/macros/contrastcolour.js", "text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/csvtiddlers.js": { "title": "$:/core/modules/macros/csvtiddlers.js", "text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/displayshortcuts.js": { "title": "$:/core/modules/macros/displayshortcuts.js", "text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/jsontiddler.js": { "title": "$:/core/modules/macros/jsontiddler.js", "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/jsontiddlers.js": { "title": "$:/core/modules/macros/jsontiddlers.js", "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/makedatauri.js": { "title": "$:/core/modules/macros/makedatauri.js", "text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"},\n\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/now.js": { "title": "$:/core/modules/macros/now.js", "text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/qualify.js": { "title": "$:/core/modules/macros/qualify.js", "text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/resolvepath.js": { "title": "$:/core/modules/macros/resolvepath.js", "text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/unusedtitle.js": { "title": "$:/core/modules/macros/unusedtitle.js", "text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/version.js": { "title": "$:/core/modules/macros/version.js", "text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/parsers/audioparser.js": { "title": "$:/core/modules/parsers/audioparser.js", "text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/binaryparser.js": { "title": "$:/core/modules/parsers/binaryparser.js", "text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/csvparser.js": { "title": "$:/core/modules/parsers/csvparser.js", "text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/htmlparser.js": { "title": "$:/core/modules/parsers/htmlparser.js", "text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/imageparser.js": { "title": "$:/core/modules/parsers/imageparser.js", "text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/utils/parseutils.js": { "title": "$:/core/modules/utils/parseutils.js", "text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/parsers/pdfparser.js": { "title": "$:/core/modules/parsers/pdfparser.js", "text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"embed\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/textparser.js": { "title": "$:/core/modules/parsers/textparser.js", "text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/videoparser.js": { "title": "$:/core/modules/parsers/videoparser.js", "text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"video/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/wikiparser/rules/codeblock.js": { "title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/codeinline.js": { "title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/commentblock.js": { "title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/commentinline.js": { "title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/dash.js": { "title": "$:/core/modules/parsers/wikiparser/rules/dash.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": { "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": { "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": { "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": { "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": { "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": { "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/entity.js": { "title": "$:/core/modules/parsers/wikiparser/rules/entity.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/extlink.js": { "title": "$:/core/modules/parsers/wikiparser/rules/extlink.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": { "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": { "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": { "title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/heading.js": { "title": "$:/core/modules/parsers/wikiparser/rules/heading.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/horizrule.js": { "title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/html.js": { "title": "$:/core/modules/parsers/wikiparser/rules/html.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/image.js": { "title": "$:/core/modules/parsers/wikiparser/rules/image.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/import.js": { "title": "$:/core/modules/parsers/wikiparser/rules/import.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/list.js": { "title": "$:/core/modules/parsers/wikiparser/rules/list.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"div\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": { "title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": { "title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/macrodef.js": { "title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": { "title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/prettylink.js": { "title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/quoteblock.js": { "title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/rules.js": { "title": "$:/core/modules/parsers/wikiparser/rules/rules.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/styleblock.js": { "title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/styleinline.js": { "title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/syslink.js": { "title": "$:/core/modules/parsers/wikiparser/rules/syslink.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/table.js": { "title": "$:/core/modules/parsers/wikiparser/rules/table.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": { "title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": { "title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/typedblock.js": { "title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/whitespace.js": { "title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/wikilink.js": { "title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/wikiparser.js": { "title": "$:/core/modules/parsers/wikiparser/wikiparser.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar target;\n\tif(type === \"only\") {\n\t\ttarget = true;\n\t} else if(type === \"except\") {\n\t\ttarget = false;\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif((names.indexOf(ruleArray[t].rule.name) === -1) === target) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": { "title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js", "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/pluginswitcher.js": { "title": "$:/core/modules/pluginswitcher.js", "text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/saver-handler.js": { "title": "$:/core/modules/saver-handler.js", "text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && ($tw.config.disableAutoSave || this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\")) {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tvar self = this;\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\t$tw.utils.toggleClass(win.document.body,\"tc-dirty\",self.isDirty());\n\t\t});\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/savers/andtidwiki.js": { "title": "$:/core/modules/savers/andtidwiki.js", "text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/beaker.js": { "title": "$:/core/modules/savers/beaker.js", "text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/custom.js": { "title": "$:/core/modules/savers/custom.js", "text": "/*\\\ntitle: $:/core/modules/savers/custom.js\ntype: application/javascript\nmodule-type: saver\n\nLooks for `window.$tw.customSaver` first on the current window, then\non the parent window (of an iframe). If present, the saver must define\n\tsave: function(text,method,callback) { ... }\nand the saver may define\n\tpriority: number\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar findSaver = function(window) {\n\ttry {\n\t\treturn window && window.$tw && window.$tw.customSaver;\n\t} catch (err) {\n\t\t// Catching the exception is the most reliable way to detect cross-origin iframe errors.\n\t\t// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw\n\t\t// Uncaught DOMException: Permission denied to access property \"$tw\" on cross-origin object\n\t\tconsole.log({ msg: \"custom saver is disabled\", reason: err });\n\t\treturn null;\n\t}\n}\nvar saver = findSaver(window) || findSaver(window.parent) || {};\n\nvar CustomSaver = function(wiki) {\n};\n\nCustomSaver.prototype.save = function(text,method,callback) {\n\treturn saver.save(text, method, callback);\n};\n\n/*\nInformation about this saver\n*/\nCustomSaver.prototype.info = {\n\tname: \"custom\",\n\tpriority: saver.priority || 4000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!(saver.save);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new CustomSaver(wiki);\n};\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/download.js": { "title": "$:/core/modules/savers/download.js", "text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/fsosaver.js": { "title": "$:/core/modules/savers/fsosaver.js", "text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/gitea.js": { "title": "$:/core/modules/savers/gitea.js", "text": "/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"token \" + password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GiteaSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/github.js": { "title": "$:/core/modules/savers/github.js", "text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"main\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password),\n\t\t\t\"If-None-Match\": \"\"\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/gitlab.js": { "title": "$:/core/modules/savers/gitlab.js", "text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/hyperdrive.js": { "title": "$:/core/modules/savers/hyperdrive.js", "text": "/*\\\ntitle: $:/core/modules/savers/hyperdrive.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Hyperdrive Protocol (https://hypercore-protocol.org/#hyperdrive) Beaker browser beta-1.0 and later (https://beakerbrowser.com)\nCompatible with beaker >= V1.0.0\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar HyperdriveSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nHyperdriveSaver.prototype.save = function(text,method,callback) {\n\tvar dat = beaker.hyperdrive.drive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Hyperdrive Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Hyperdrive Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nHyperdriveSaver.prototype.info = {\n\tname: \"beaker-1.x\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.beaker && !!beaker.hyperdrive && location.protocol===\"hyper:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new HyperdriveSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/manualdownload.js": { "title": "$:/core/modules/savers/manualdownload.js", "text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/msdownload.js": { "title": "$:/core/modules/savers/msdownload.js", "text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/put.js": { "title": "$:/core/modules/savers/put.js", "text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/tiddlyfox.js": { "title": "$:/core/modules/savers/tiddlyfox.js", "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/tiddlyie.js": { "title": "$:/core/modules/savers/tiddlyie.js", "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/twedit.js": { "title": "$:/core/modules/savers/twedit.js", "text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/upload.js": { "title": "$:/core/modules/savers/upload.js", "text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/server/authenticators/basic.js": { "title": "$:/core/modules/server/authenticators/basic.js", "text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n", "type": "application/javascript", "module-type": "authenticator" }, "$:/core/modules/server/authenticators/header.js": { "title": "$:/core/modules/server/authenticators/header.js", "text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\") ? server.get(\"authenticated-user-header\").toLowerCase() : undefined;\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n", "type": "application/javascript", "module-type": "authenticator" }, "$:/core/modules/server/routes/delete-tiddler.js": { "title": "$:/core/modules/server/routes/delete-tiddler.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/routes/get-favicon.js": { "title": "$:/core/modules/server/routes/get-favicon.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/routes/get-file.js": { "title": "$:/core/modules/server/routes/get-file.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = decodeURIComponent(state.params[0]),\n\t\tfilename = path.resolve(state.boot.wikiPath,\"files\",suppliedFilename),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\tstatus = 404;\n\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/routes/get-index.js": { "title": "$:/core/modules/server/routes/get-index.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/routes/get-login-basic.js": { "title": "$:/core/modules/server/routes/get-login-basic.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/routes/get-status.js": { "title": "$:/core/modules/server/routes/get-status.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/routes/get-tiddler-html.js": { "title": "$:/core/modules/server/routes/get-tiddler-html.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/routes/get-tiddler.js": { "title": "$:/core/modules/server/routes/get-tiddler.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/routes/get-tiddlers-json.js": { "title": "$:/core/modules/server/routes/get-tiddlers-json.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif(state.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif(state.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tif(state.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"no\") {\n\t\tfilter += \"+[!is[system]]\";\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/routes/put-tiddler.js": { "title": "$:/core/modules/server/routes/put-tiddler.js", "text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n", "type": "application/javascript", "module-type": "route" }, "$:/core/modules/server/server.js": { "title": "$:/core/modules/server/server.js", "text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\tquerystring = require(\"querystring\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.boot = options.boot || $tw.boot;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(state.pathPrefix) {\n\t\t\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\n\t\t\t\tpathname = pathname.substr(state.pathPrefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response,options) {\n\toptions = options || {};\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = options.wiki || self.wiki;\n\tstate.boot = options.boot || self.boot;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\tstate.pathPrefix = options.pathPrefix || this.get(\"path-prefix\") || \"\";\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tif(!this.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !this.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address();\n\t\t$tw.utils.log(\"Serving on \" + self.protocol + \"://\" + address.address + \":\" + address.port + prefix,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n", "type": "application/javascript", "module-type": "library" }, "$:/core/modules/browser-messaging.js": { "title": "$:/core/modules/browser-messaging.js", "text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t});\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/commands.js": { "title": "$:/core/modules/startup/commands.js", "text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/CSSescape.js": { "title": "$:/core/modules/startup/CSSescape.js", "text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/favicon.js": { "title": "$:/core/modules/startup/favicon.js", "text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,tiddler.fields._canonical_uri));\n\t}\n}\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/info.js": { "title": "$:/core/modules/startup/info.js", "text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Function to bake the info plugin with new tiddlers\n\tvar updateInfoPlugin = function(tiddlerFieldsArray) {\n\t\t// Get the existing tiddlers\n\t\tvar json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});\n\t\t// Add the new ones\n\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\tif(fields && fields.title) {\n\t\t\t\tjson.tiddlers[fields.title] = fields;\n\t\t\t}\n\t\t});\n\t\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\t\tvar fields = {\n\t\t\ttitle: TITLE_INFO_PLUGIN,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"info\",\n\t\t\ttext: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)\n\t\t};\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\n\t};\n\t// Collect up the info tiddlers\n\tvar tiddlerFieldsArray = [];\n\t// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tArray.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));\n\t\t}\n\t});\n\tupdateInfoPlugin(tiddlerFieldsArray);\n\tvar changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\",[TITLE_INFO_PLUGIN]);\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/load-modules.js": { "title": "$:/core/modules/startup/load-modules.js", "text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/password.js": { "title": "$:/core/modules/startup/password.js", "text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/plugins.js": { "title": "$:/core/modules/startup/plugins.js", "text": "/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Work out which of the changed tiddlers are plugins that we need to reregister\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// Issue warning if any of the tiddlers require a reload\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\tvar changedShadowTiddlers = {};\n\t\t\t\t// Collect the shadow tiddlers of any deleted plugins\n\t\t\t\t$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Collect the shadow tiddlers of any modified plugins\n\t\t\t\t$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t\t// Queue change events for the changed shadow tiddlers\n\t\t\t\t$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {\n\t\t\t\t\t$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/render.js": { "title": "$:/core/modules/startup/render.js", "text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/RootTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget, recursionMarker: \"no\"});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !(tiddler.hasField(\"draft.of\") || tiddler.hasField(\"throttle.refresh\"))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyThrottledTiddlersHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = THROTTLE_REFRESH_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n\t// Run any post-render startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/PostRender\");\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/rootwidget.js": { "title": "$:/core/modules/startup/rootwidget.js", "text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-show-switcher\",function(event) {\n\t\t$tw.modal.display(\"$:/core/ui/SwitcherModal\",{variables: event.paramObject, event: event});\n\t});\t\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup.js": { "title": "$:/core/modules/startup.js", "text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Node\");\t\t\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t}\n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/story.js": { "title": "$:/core/modules/startup/story.js", "text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tvar story = new $tw.Story({\n\t\twiki: $tw.wiki,\n\t\tstoryTitle: DEFAULT_STORY_TITLE,\n\t\thistoryTitle: DEFAULT_HISTORY_TITLE\n\t});\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\tstory.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\tstory.addToHistory(storyList[0]);\n\t\t}\t\t\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/windows.js": { "title": "$:/core/modules/startup/windows.js", "text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\n$tw.windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\t$tw.windows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete $tw.windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t\tsrcWindow.document.documentElement.addEventListener(\"click\",$tw.popup,true);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/story.js": { "title": "$:/core/modules/story.js", "text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/storyviews/classic.js": { "title": "$:/core/modules/storyviews/classic.js", "text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();", "type": "application/javascript", "module-type": "storyview" }, "$:/core/modules/storyviews/pop.js": { "title": "$:/core/modules/storyviews/pop.js", "text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n", "type": "application/javascript", "module-type": "storyview" }, "$:/core/modules/storyviews/zoomin.js": { "title": "$:/core/modules/storyviews/zoomin.js", "text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n", "type": "application/javascript", "module-type": "storyview" }, "$:/core/modules/syncer.js": { "title": "$:/core/modules/syncer.js", "text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\t\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function(event) {\n\t\t\tvar username = event && event.paramObject && event.paramObject.username,\n\t\t\t\tpassword = event && event.paramObject && event.paramObject.password;\n\t\t\tif(username && password) {\n\t\t\t\t// Login with username and password\n\t\t\t\tself.login(username,password,function() {});\n\t\t\t} else {\n\t\t\t\t// No username and password, so we display a prompt\n\t\t\t\tself.handleLoginEvent();\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\t\n\t} \n};\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.tiddlerInfo[title] = {\n\t\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t\t};\n\t\t}\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\tthis.logger.log(\"Checking dirty status\");\n\t// Check tiddlers that are in the store and included in the filter function\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(this.wiki.tiddlerExists(title)) {\n\t\t\tif(tiddlerInfo) {\n\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\tif(this.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// Check tiddlers that are known from the server but not currently in the store\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\tif(!this.wiki.tiddlerExists(titles[index])) {\n\t\t\t// There must be a pending delete\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tvar self = this,\n\t\tcancelNextSync = function() {\n\t\t\tif(self.pollTimerId) {\n\t\t\t\tclearTimeout(self.pollTimerId);\n\t\t\t\tself.pollTimerId = null;\n\t\t\t}\n\t\t},\n\t\ttriggerNextSync = function() {\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t},\n\t\tsyncSystemFromServer = (self.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"yes\" ? true : false);\n\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.logger.log(\"Retrieving updated tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\n\t\t\ttriggerNextSync();\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\ttriggerNextSync();\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.tiddlerInfo);\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\n\t\t\t\t\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.processTaskQueue();\n\t\t});\n\t}\n};\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!err && !isLoggedIn) {\n\t\t\tif(self.syncadaptor && self.syncadaptor.displayLoginPrompt) {\n\t\t\t\tself.syncadaptor.displayLoginPrompt(self);\n\t\t\t} else {\n\t\t\t\tself.displayLoginPrompt();\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nDispay a password prompt\n*/\nSyncer.prototype.displayLoginPrompt = function() {\n\tvar self = this;\n\tvar promptInfo = $tw.passwordPrompt.createPrompt({\n\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\tcallback: function(data) {\n\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\tself.syncFromServer();\n\t\t\t});\n\t\t\treturn true; // Get rid of the password prompt\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(err,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout();\t\t\t\t\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\t\t\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},interval || self.taskTimerInterval);\n\t}\n};\n\n/*\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\n\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || this.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title); \t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.syncer.tiddlerInfo[self.title]\n\t\t});\n\t} else {\n\t\tthis.syncer.logger.log(\" Not Dispatching 'save' task:\",this.title,\"tiddler does not exist\");\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\tif($tw.boot.files){\n\t\t\t// Remove the tiddler from $tw.boot.files\n\t\t\tdelete $tw.boot.files[self.title];\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nexports.Syncer = Syncer;\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/tiddler.js": { "title": "$:/core/modules/tiddler.js", "text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n", "type": "application/javascript", "module-type": "tiddlermethod" }, "$:/core/modules/upgraders/plugins.js": { "title": "$:/core/modules/upgraders/plugins.js", "text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? (wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n", "type": "application/javascript", "module-type": "upgrader" }, "$:/core/modules/upgraders/system.js": { "title": "$:/core/modules/upgraders/system.js", "text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n", "type": "application/javascript", "module-type": "upgrader" }, "$:/core/modules/upgraders/themetweaks.js": { "title": "$:/core/modules/upgraders/themetweaks.js", "text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n", "type": "application/javascript", "module-type": "upgrader" }, "$:/core/modules/utils/base64-utf8/base64-utf8.module.js": { "text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)if((e=r.charCodeAt(t))<128)o+=String.fromCharCode(e);else if(e>127&&e<2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e<57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296<<10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128);return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)if((t=r.charCodeAt(o))<128)e+=String.fromCharCode(t),o++;else if(t>191&&t<224)e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2;else if(t>223&&t<240)e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)<<18|(63&r.charCodeAt(o+1))<<12|(63&r.charCodeAt(o+2))<<6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i<t.length;i++)o[t[i]]=o.require(t[i]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,i,n,d,f,a,h,C=\"\",c=0;c<r.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)<<4|(i=r.charCodeAt(c++))>>4,a=(15&i)<<2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(h=64),C+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return C},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,i,n,d,f,a,h=\"\",C=0;C<r.length;)t=o.indexOf(r.charAt(C++))<<2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)<<4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)<<6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);", "type": "application/javascript", "title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js", "module-type": "library" }, "$:/core/modules/utils/crypto.js": { "title": "$:/core/modules/utils/crypto.js", "text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/csv.js": { "title": "$:/core/modules/utils/csv.js", "text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/diff-match-patch/diff_match_patch.js": { "text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&\").replace(d,\"<\").replace(e,\">\").replace(f,\"¶<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);", "type": "application/javascript", "title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js", "module-type": "library" }, "$:/core/modules/utils/dom/animations/slide.js": { "title": "$:/core/modules/utils/dom/animations/slide.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n", "type": "application/javascript", "module-type": "animation" }, "$:/core/modules/utils/dom/animator.js": { "title": "$:/core/modules/utils/dom/animator.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/browser.js": { "title": "$:/core/modules/utils/dom/browser.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/csscolorparser.js": { "title": "$:/core/modules/utils/dom/csscolorparser.js", "text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom.js": { "title": "$:/core/modules/utils/dom.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.hasAttribute && el.hasAttribute(\"class\") && el.getAttribute(\"class\").split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/dragndrop.js": { "title": "$:/core/modules/utils/dom/dragndrop.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/http.js": { "title": "$:/core/modules/utils/dom/http.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\thasHeader = function(targetHeader) {\n\t\t\ttargetHeader = targetHeader.toLowerCase();\n\t\t\tvar result = false;\n\t\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\t\tif(headerTitle.toLowerCase() === targetHeader) {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !hasHeader(\"Content-Type\")) {\n\t\trequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!hasHeader(\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/keyboard.js": { "title": "$:/core/modules/utils/dom/keyboard.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/modal.js": { "title": "$:/core/modules/utils/dom/modal.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\nvar navigator = require(\"$:/core/modules/widgets/navigator.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({\n\t\t\tcurrentTiddler: title,\n\t\t\t\"tv-story-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-story-list\") : \"\"),\n\t\t\t\"tv-history-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-history-list\") : \"\")\n\t\t},options.variables);\n\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\tvar navigatorTree = {\n\t\t\"type\": \"navigator\",\n\t\t\"attributes\": {\n\t\t\t\"story\": {\n\t\t\t\t\"name\": \"story\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-story-list\"]\n\t\t\t},\n\t\t\t\"history\": {\n\t\t\t\t\"name\": \"history\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-history-list\"]\n\t\t\t}\n\t\t},\n\t\t\"tag\": \"$navigator\",\n\t\t\"isBlock\": true,\n\t\t\"children\": []\n\t};\n\tvar navigatorWidgetNode = new navigator.navigator(navigatorTree, {\n\t\twiki: this.wiki,\n\t\tdocument : this.srcDocument,\n\t\tparentWidget: $tw.rootWidget\n\t});\n\tnavigatorWidgetNode.render(modalBody,null);\n\t\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/notifier.js": { "title": "$:/core/modules/utils/dom/notifier.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/popup.js": { "title": "$:/core/modules/utils/dom/popup.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n \t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/scroller.js": { "title": "$:/core/modules/utils/dom/scroller.js", "text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\tif(event.paramObject && event.paramObject.selector) {\n\t\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t\t} else {\n\t\t\tthis.scrollIntoView(event.target);\t\t\t\n\t\t}\n\t\treturn false; // Event was handled\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nPageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/edition-info.js": { "title": "$:/core/modules/utils/edition-info.js", "text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils-node" }, "$:/core/modules/utils/fakedom.js": { "title": "$:/core/modules/utils/fakedom.js", "text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_Node = function (){\n\tthrow TypeError(\"Illegal constructor\");\n};\n\nObject.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nObject.defineProperty(TW_Node.prototype, 'TEXT_NODE', {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nTW_TextNode.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.TEXT_NODE;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nTW_Element.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.ELEMENT_NODE;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/utils/filesystem.js": { "title": "$:/core/modules/utils/filesystem.js", "text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nReturn the subdirectories of a path\n*/\nexports.getSubdirectories = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn null;\n\t}\n\tvar subdirs = [];\n\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\n\t\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\n\t\t\tsubdirs.push(item);\n\t\t}\n\t});\n\treturn subdirs;\n}\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\n\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\n\t// Check that neither director is within the other\n\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\n\t\treturn \"Cannot copy nested directories\";\n\t}\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file on disk (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\textFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters,\n\tfileInfo: an existing fileInfo to check against\n\toriginalpath: a preferred filepath if no pathFilters match\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {}, metaExt;\n\t// Propagate the isEditableFile flag\n\tif(options.fileInfo) {\n\t\tfileInfo.isEditableFile = options.fileInfo.isEditableFile || false;\n\t}\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t\tif(options.extFilters) {\n\t\t\t// Check for extension override\n\t\t\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\n\t\t\t\textFilters: options.extFilters,\n\t\t\t\twiki: options.wiki\n\t\t\t});\n\t\t\tif(metaExt){\n\t\t\t\tif(metaExt === \".tid\") {\n\t\t\t\t\t// Overriding to the .tid extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else if (metaExt === \".json\") {\n\t\t\t\t\t// Overriding to the .json extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/json\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else {\n\t\t\t\t\t//If the new type matches a known extention, use that MIME type's encoding\n\t\t\t\t\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\n\t\t\t\t\tfileInfo.type = extInfo ? extInfo.type : null;\n\t\t\t\t\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\n\t\t\t\t\tfileInfo.hasMetaFile = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type or metaExt\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: metaExt || contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki,\n\t\tfileInfo: options.fileInfo,\n\t\toriginalpath: options.originalpath\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the file extension for saving a tiddler\nOptions include:\n\textFilters: optional array of filters to be used to generate the extention\n\twiki: optional wiki for evaluating the extFilters\n*/\nexports.generateTiddlerExtension = function(title,options) {\n\tvar self = this,\n\t\textension;\n\t// Check if any of the extFilters applies\n\tif(options.extFilters && options.wiki) { \n\t\t$tw.utils.each(options.extFilters,function(filter) {\n\t\t\tif(!extension) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\textension = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn extension;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n\tfileInfo: an existing fileInfo object to check against\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\toriginalpath = options.originalpath || \"\",\n\t\tfilepath;\t\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tif(!filepath && originalpath !== \"\") {\n\t\t//Use the originalpath without the extension\n\t\tvar ext = path.extname(originalpath);\n\t\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\n\t} else if(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t//If the path does not start with \".\" or \"..\" and a path seperator, then\n\tif(!/^\\.{1,2}[/\\\\]/g.test(filepath)) {\n\t\t// Don't let the filename start with any dots because such files are invisible on *nix\n\t\tfilepath = filepath.replace(/^\\.+/g,\"_\");\n\t}\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath, oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tif(oldPath && oldPath == fullPath) {\n\t\t\tbreak;\n\t\t}\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// If the last write failed with an error, or if path does not start with:\n\t//\tthe resolved options.directory, the resolved wikiPath directory, or the wikiTiddlersPath directory, \n\t//\tthen encodeURIComponent() and resolve to tiddler directory\n\tvar newPath = fullPath,\n\t\tencode = (options.fileInfo || {writeError: false}).writeError == true;\n\tif(!encode){\n\t\tencode = !(fullPath.indexOf(path.resolve(directory)) == 0 ||\n\t\t\tfullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\n\t\t\tfullPath.indexOf($tw.boot.wikiTiddlersPath) == 0);\n\t\t}\n\tif(encode){\n\t\tfullPath = path.resolve(directory, encodeURIComponent(fullPath));\n\t}\n\t// Call hook to allow plugins to modify the final path\n\tfullPath = $tw.hooks.invokeHook(\"th-make-tiddler-path\", newPath, fullPath);\n\t// Return the full path to the file\n\treturn fullPath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",callback);\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n/*\nDelete a file described by the fileInfo if it exits\n*/\nexports.deleteTiddlerFile = function(fileInfo, callback) {\n\t//Only attempt to delete files that exist on disk\n\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\n\t\treturn callback(null);\n\t}\n\t// Delete the file\n\tfs.unlink(fileInfo.filepath,function(err) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\t\n\t\t// Delete the metafile if present\n\t\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \".meta\")) {\n\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t\t});\n\t\t} else {\n\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t}\n\t});\n};\n\n/*\nCleanup old files on disk, by comparing the options values:\n\tadaptorInfo from $tw.syncer.tiddlerInfo\n\tbootInfo from $tw.boot.files\n*/\nexports.cleanupTiddlerFiles = function(options, callback) {\n\tvar adaptorInfo = options.adaptorInfo || {},\n\tbootInfo = options.bootInfo || {},\n\ttitle = options.title || \"undefined\";\n\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\n\t\treturn $tw.utils.deleteTiddlerFile(adaptorInfo, function(err){\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"unlink\") {\n\t\t\t\t\t// Error deleting the previous file on disk, should fail gracefully\n\t\t\t\t\t$tw.syncer.displayError(\"Server desynchronized. Error cleaning up previous file for tiddler: \"+title, err);\n\t\t\t\t\treturn callback(null);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn callback(null);\n\t\t});\n\t} else {\n\t\treturn callback(null);\n\t}\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils-node" }, "$:/core/modules/utils/linkedlist.js": { "title": "$:/core/modules/utils/linkedlist.js", "text": "/*\\\nmodule-type: utils\ntitle: $:/core/modules/utils/linkedlist.js\ntype: application/javascript\n\nThis is a doubly-linked indexed list intended for manipulation, particularly\npushTop, which it does with significantly better performance than an array.\n\n\\*/\n(function(){\n\nfunction LinkedList() {\n\tthis.clear();\n};\n\nLinkedList.prototype.clear = function() {\n\tthis.index = Object.create(null);\n\t// LinkedList performs the duty of both the head and tail node\n\tthis.next = this;\n\tthis.prev = this;\n\tthis.length = 0;\n};\n\nLinkedList.prototype.remove = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t} else {\n\t\t_removeOne(this,value);\n\t}\n};\n\nLinkedList.prototype.push = function(/* values */) {\n\tfor(var i = 0; i < arguments.length; i++) {\n\t\tvar value = arguments[i];\n\t\tvar node = {value: value};\n\t\tvar preexistingNode = this.index[value];\n\t\t_linkToEnd(this,node);\n\t\tif(preexistingNode) {\n\t\t\t// We want to keep pointing to the first instance, but we want\n\t\t\t// to have that instance (or chain of instances) point to the\n\t\t\t// new one.\n\t\t\twhile (preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\tpreexistingNode.copy = node;\n\t\t} else {\n\t\t\tthis.index[value] = node;\n\t\t}\n\t}\n};\n\nLinkedList.prototype.pushTop = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t\tthis.push.apply(this,value);\n\t} else {\n\t\tvar node = _removeOne(this,value);\n\t\tif(!node) {\n\t\t\tnode = {value: value};\n\t\t\tthis.index[value] = node;\n\t\t} else {\n\t\t\t// Put this node at the end of the copy chain.\n\t\t\tvar preexistingNode = node;\n\t\t\twhile(preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\t// The order of these three statements is important,\n\t\t\t// because sometimes preexistingNode == node.\n\t\t\tpreexistingNode.copy = node;\n\t\t\tthis.index[value] = node.copy;\n\t\t\tnode.copy = undefined;\n\t\t}\n\t\t_linkToEnd(this,node);\n\t}\n};\n\nLinkedList.prototype.each = function(callback) {\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\tcallback(ptr.value);\n\t}\n};\n\nLinkedList.prototype.toArray = function() {\n\tvar output = [];\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\toutput.push(ptr.value);\n\t}\n\treturn output;\n};\n\nfunction _removeOne(list,value) {\n\tvar node = list.index[value];\n\tif(node) {\n\t\tnode.prev.next = node.next;\n\t\tnode.next.prev = node.prev;\n\t\tlist.length -= 1;\n\t\t// Point index to the next instance of the same value, maybe nothing.\n\t\tlist.index[value] = node.copy;\n\t}\n\treturn node;\n};\n\nfunction _linkToEnd(list,node) {\n\t// Sticks the given node onto the end of the list.\n\tlist.prev.next = node;\n\tnode.prev = list.prev;\n\tlist.prev = node;\n\tnode.next = list;\n\tlist.length += 1;\n};\n\nexports.LinkedList = LinkedList;\n\n})();\n", "module-type": "utils", "type": "application/javascript" }, "$:/core/modules/utils/logger.js": { "title": "$:/core/modules/utils/logger.js", "text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\t\t\t\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/parsetree.js": { "title": "$:/core/modules/utils/parsetree.js", "text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/performance.js": { "title": "$:/core/modules/utils/performance.js", "text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/utils/pluginmaker.js": { "title": "$:/core/modules/utils/pluginmaker.js", "text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/transliterate.js": { "title": "$:/core/modules/utils/transliterate.js", "text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/utils.js": { "title": "$:/core/modules/utils/utils.js", "text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nLog a table of name: value pairs\n*/\nexports.logTable = function(data) {\n\tif(console.table) {\n\t\tconsole.table(data);\n\t} else {\n\t\t$tw.utils.each(data,function(value,name) {\n\t\t\tconsole.log(name + \": \" + value);\n\t\t});\n\t}\n}\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimPrefix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/^\\s\\s*/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('^(' + unwanted + ')+');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimSuffix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/\\s\\s*$/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('(' + unwanted + ')+$');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date),4);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear(),4);\n\t\t\t}],\n\t\t\t[/^aYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.abs(date.getFullYear()),4);\n\t\t\t}],\n\t\t\t[/^\\{era:([^,\\|}]*)\\|([^}\\|]*)\\|([^}]*)\\}/, function(match) {\n\t\t\t\tvar year = date.getFullYear();\n\t\t\t\treturn year === 0 ? match[2] : (year < 0 ? match[1] : match[3]);\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call(null,match);\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\", \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s, rawUnicode) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(regex, exports.escape); // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s, rawUnicode) {\n\t// See http://www.json.org/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/\\x08/g, '\\\\b') // backspace\n\t\t.replace(/\\x0c/g, '\\\\f') // formfeed\n\t\t.replace(/\\t/g, '\\\\t') // tab\n\t\t.replace(regex,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type,_canonical_uri) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\t\t\n\t}\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\nexports.makeCompareFunction = function(type,options) {\n\toptions = options || {};\n\tvar gt = options.invert ? -1 : +1,\n\t\tlt = options.invert ? +1 : -1,\n\t\tcompare = function(a,b) {\n\t\t\tif(a > b) {\n\t\t\t\treturn gt ;\n\t\t\t} else if(a < b) {\n\t\t\t\treturn lt;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t\ttypes = {\n\t\t\t\"number\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t\t\t},\n\t\t\t\"integer\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t\t\t},\n\t\t\t\"string\": function(a,b) {\n\t\t\t\treturn compare(\"\" + a,\"\" +b);\n\t\t\t},\n\t\t\t\"date\": function(a,b) {\n\t\t\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\t\t\tdateB = $tw.utils.parseDate(b);\n\t\t\t\tif(!isFinite(dateA)) {\n\t\t\t\t\tdateA = new Date(0);\n\t\t\t\t}\n\t\t\t\tif(!isFinite(dateB)) {\n\t\t\t\t\tdateB = new Date(0);\n\t\t\t\t}\n\t\t\t\treturn compare(dateA,dateB);\n\t\t\t},\n\t\t\t\"version\": function(a,b) {\n\t\t\t\treturn $tw.utils.compareVersions(a,b);\n\t\t\t}\n\t\t};\n\treturn (types[type] || types[options.defaultType] || types.number);\n};\n\n})();\n", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/widgets/action-confirm.js": { "title": "$:/core/modules/widgets/action-confirm.js", "text": "/*\\\n\ntitle: $:/core/modules/widgets/action-confirm.js\ntype: application/javascript\nmodule-type: widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ConfirmWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nConfirmWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nConfirmWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.parentDomNode = parent;\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nConfirmWidget.prototype.execute = function() {\n\tthis.message = this.getAttribute(\"$message\",$tw.language.getString(\"ConfirmAction\"));\n\tthis.prompt = (this.getAttribute(\"$prompt\",\"yes\") == \"no\" ? false : true);\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nConfirmWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$prompt\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar invokeActions = true,\n\t\thandled = true;\n\tif(this.prompt) {\n\t\tinvokeActions = confirm(this.message);\n\t}\n\tif(invokeActions) {\n\t\thandled = this.invokeActions(triggeringWidget,event);\n\t}\n\treturn handled;\n};\n\nConfirmWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nexports[\"action-confirm\"] = ConfirmWidget;\n\n})();", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-createtiddler.js": { "title": "$:/core/modules/widgets/action-createtiddler.js", "text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If NO $basetitle AND NO $template use initial title\n\t\t// DON'T overwrite any stuff\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-deletefield.js": { "title": "$:/core/modules/widgets/action-deletefield.js", "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-deletetiddler.js": { "title": "$:/core/modules/widgets/action-deletetiddler.js", "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-listops.js": { "title": "$:/core/modules/widgets/action-listops.js", "text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-log.js": { "title": "$:/core/modules/widgets/action-log.js", "text": "/*\\\ntitle: $:/core/modules/widgets/action-log.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LogWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLogWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLogWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\nLogWidget.prototype.execute = function(){\n\tthis.message = this.getAttribute(\"$$message\",\"debug\");\n\tthis.logAll = this.getAttribute(\"$$all\",\"no\") === \"yes\" ? true : false;\n\tthis.filter = this.getAttribute(\"$$filter\");\n}\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLogWidget.prototype.refresh = function(changedTiddlers) {\n\tthis.refreshSelf();\n\treturn true;\n};\n\n/*\nInvoke the action associated with this widget\n*/\nLogWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.log();\n\treturn true; // Action was invoked\n};\n\nLogWidget.prototype.log = function() {\n\tvar data = {},\n\t\tdataCount,\n\t\tallVars = {},\n\t\tfilteredVars;\n\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.substring(0,2) !== \"$$\") {\n\t\t\tdata[name] = attribute;\n\t\t}\t\t\n\t});\n\n\tfor(var v in this.variables) {\n\t\tallVars[v] = this.getVariable(v,{defaultValue:\"\"});\n\t}\t\n\tif(this.filter) {\n\t\tfilteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars));\n\t\t$tw.utils.each(filteredVars,function(name) {\n\t\t\tdata[name] = allVars[name];\n\t\t});\t\t\n\t}\n\tdataCount = $tw.utils.count(data);\n\n\tconsole.group(this.message);\n\tif(dataCount > 0) {\n\t\t$tw.utils.logTable(data);\n\t}\n\tif(this.logAll || !dataCount) {\n\t\tconsole.groupCollapsed(\"All variables\");\n\t\t$tw.utils.logTable(allVars);\n\t\tconsole.groupEnd();\n\t}\n\tconsole.groupEnd();\n}\n\nexports[\"action-log\"] = LogWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-navigate.js": { "title": "$:/core/modules/widgets/action-navigate.js", "text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-popup.js": { "title": "$:/core/modules/widgets/action-popup.js", "text": "/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(this.actionCoords || \"\");\n\tif(match) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: parseFloat(match[1]),\n\t\t\t\ttop: parseFloat(match[2]),\n\t\t\t\twidth: parseFloat(match[3]),\n\t\t\t\theight: parseFloat(match[4])\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki\n\t\t});\n\t} else {\n\t\t$tw.popup.cancel(0);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-sendmessage.js": { "title": "$:/core/modules/widgets/action-sendmessage.js", "text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-setfield.js": { "title": "$:/core/modules/widgets/action-setfield.js", "text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\") || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/browse.js": { "title": "$:/core/modules/widgets/browse.js", "text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\tif(this.accept) {\n\t\tdomNode.setAttribute(\"accept\",this.accept);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.accept = this.getAttribute(\"accept\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/button.js": { "title": "$:/core/modules/widgets/button.js", "text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = \"button\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tdomNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tself.invokeActionString(self.actions,self,event,{modifier: modifierKey});\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nButtonWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNode.className.split(\" \"),\n\t\toldClasses = this.class.split(\" \"),\n\t\tnewClasses;\t\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tnewClasses = this.class.split(\" \");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,newClasses);\n\tthis.domNode.className = domNodeClasses.join(\" \");\n}\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.updateDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/checkbox.js": { "title": "$:/core/modules/widgets/checkbox.js", "text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/codeblock.js": { "title": "$:/core/modules/widgets/codeblock.js", "text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/count.js": { "title": "$:/core/modules/widgets/count.js", "text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = \"0\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/diff-text.js": { "title": "$:/core/modules/widgets/diff-text.js", "text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/draggable.js": { "title": "$:/core/modules/widgets/draggable.js", "text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/droppable.js": { "title": "$:/core/modules/widgets/droppable.js", "text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = this.parseTreeNode.isBlock ? \"div\" : \"span\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\t\t\n\t} else {\n\t\t$tw.utils.addClass(this.domNode,this.disabledClass);\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\tif(this.domNodes[0]) {\n\t\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t\t}\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\n\t});\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.disabledClass = this.getAttribute(\"disabledClass\",\"\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nDroppableWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass || changedAttributes.actions || changedAttributes.effect) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/dropzone.js": { "title": "$:/core/modules/widgets/dropzone.js", "text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\t\t\n\t}\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields]), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.autoOpenOnImport = this.getAttribute(\"autoOpenOnImport\");\n\tthis.importTitle = this.getAttribute(\"importTitle\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.enable || changedAttributes.autoOpenOnImport || changedAttributes.importTitle || changedAttributes.deserializer || changedAttributes.class) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/edit-binary.js": { "title": "$:/core/modules/widgets/edit-binary.js", "text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/edit-bitmap.js": { "title": "$:/core/modules/widgets/edit-bitmap.js", "text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/edit-shortcut.js": { "title": "$:/core/modules/widgets/edit-shortcut.js", "text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/edit-text.js": { "title": "$:/core/modules/widgets/edit-text.js", "text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/edit.js": { "title": "$:/core/modules/widgets/edit.js", "text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\");\n\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: this.parseTreeNode.attributes,\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/element.js": { "title": "$:/core/modules/widgets/element.js", "text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\t// Neuter blacklisted elements\n\tthis.tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) {\n\t\tthis.tag = \"safe-\" + this.tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(this.tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\tthis.tag = \"h\" + headingLevel;\n\t}\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Invoke the th-rendering-element hook\n\tvar parseTreeNodes = $tw.hooks.invokeHook(\"th-rendering-element\",null,this);\n\tthis.isReplaced = !!parseTreeNodes;\n\tif(parseTreeNodes) {\n\t\t// Use the parse tree nodes provided by the hook\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t\tthis.renderChildren(this.parentDomNode,null);\n\t\treturn;\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n\t// Create the DOM node and render children\n\tvar domNode = this.document.createElementNS(this.namespace,this.tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\tif(!this.isReplaced) {\n\t\t\t// Update our attributes\n\t\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\t\t\t\n\t\t} else {\n\t\t\t// If we were replaced then completely refresh ourselves\n\t\t\treturn this.refreshSelf();\n\t\t}\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/encrypt.js": { "title": "$:/core/modules/widgets/encrypt.js", "text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/entity.js": { "title": "$:/core/modules/widgets/entity.js", "text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/eventcatcher.js": { "title": "$:/core/modules/widgets/eventcatcher.js", "text": "/*\\\ntitle: $:/core/modules/widgets/eventcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nEvent handler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EventWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEventWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEventWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) {\n\t\ttag = this.elementTag;\n\t}\t\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tthis.assignDomNodeClasses();\t\n\t// Add our event handler\n\t$tw.utils.each(this.types,function(type) {\n\t\tdomNode.addEventListener(type,function(event) {\n\t\t\tvar selector = self.getAttribute(\"selector\"),\n\t\t\t\tactions = self.getAttribute(\"actions-\"+type),\n\t\t\t\tselectedNode = event.target,\n\t\t\t\tselectedNodeRect,\n\t\t\t\tcatcherNodeRect,\n\t\t\t\tvariables = {};\n\t\t\tif(selector) {\n\t\t\t\t// Search ancestors for a node that matches the selector\n\t\t\t\twhile(!selectedNode.matches(selector) && selectedNode !== domNode) {\n\t\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t\t}\n\t\t\t\t// If we found one, copy the attributes as variables, otherwise exit\n\t\t\t\tif(selectedNode.matches(selector)) {\n\t\t\t\t\t$tw.utils.each(selectedNode.attributes,function(attribute) {\n\t\t\t\t\t\tvariables[\"dom-\" + attribute.name] = attribute.value.toString();\n\t\t\t\t\t});\n\t\t\t\t\t//Add a variable with a popup coordinate string for the selected node\n\t\t\t\t\tvariables[\"tv-popup-coords\"] = \"(\" + selectedNode.offsetLeft + \",\" + selectedNode.offsetTop +\",\" + selectedNode.offsetWidth + \",\" + selectedNode.offsetHeight + \")\";\n\t\t\t\t\t\n\t\t\t\t\t//Add variables for offset of selected node\n\t\t\t\t\tvariables[\"tv-selectednode-posx\"] = selectedNode.offsetLeft.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-posy\"] = selectedNode.offsetTop.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-width\"] = selectedNode.offsetWidth.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-height\"] = selectedNode.offsetHeight.toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to selected node\n\t\t\t\t\tselectedNodeRect = selectedNode.getBoundingClientRect();\t\t\t\t\n\t\t\t\t\tvariables[\"event-fromselected-posx\"] = (event.clientX - selectedNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromselected-posy\"] = (event.clientY - selectedNodeRect.top).toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to event catcher node\n\t\t\t\t\tcatcherNodeRect = self.domNode.getBoundingClientRect();\n\t\t\t\t\tvariables[\"event-fromcatcher-posx\"] = (event.clientX - catcherNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromcatcher-posy\"] = (event.clientY - catcherNodeRect.top).toString();\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Execute our actions with the variables\n\t\t\tif(actions) {\n\t\t\t\t// Add a variable for the modifier key\n\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t// Add a variable for the mouse button\n\t\t\t\tif(\"button\" in event) {\n\t\t\t\t\tif(event.button === 0) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"left\";\n\t\t\t\t\t} else if(event.button === 1) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"middle\";\n\t\t\t\t\t} else if(event.button === 2) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"right\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvariables[\"event-type\"] = event.type.toString();\n\t\t\t\tif(typeof event.detail === \"object\" && !!event.detail) {\n\t\t\t\t\t$tw.utils.each(event.detail,function(detailValue,detail) {\n\t\t\t\t\t\tvariables[\"event-detail-\" + detail] = detailValue.toString();\n\t\t\t\t\t});\n\t\t\t\t} else if(!!event.detail) {\n\t\t\t\t\tvariables[\"event-detail\"] = event.detail.toString();\n\t\t\t\t}\n\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},false);\n\t});\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEventWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes that require a refresh on change\n\tthis.types = this.getAttribute(\"events\",\"\").split(\" \");\n\tthis.elementTag = this.getAttribute(\"tag\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nEventWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-eventcatcher\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEventWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"events\"] || changedAttributes[\"tag\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.eventcatcher = EventWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/fieldmangler.js": { "title": "$:/core/modules/widgets/fieldmangler.js", "text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/fields.js": { "title": "$:/core/modules/widgets/fields.js", "text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/image.js": { "title": "$:/core/modules/widgets/image.js", "text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/importvariables.js": { "title": "$:/core/modules/widgets/importvariables.js", "text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar widgetPointer = this;\n\t// Got to flush all the accumulated variables\n\tthis.variables = new this.variablesConstructor();\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\tvar node = {\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t};\n\t\t\t\tif (parseTreeNode.isMacroDefinition) {\n\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t// another link to the chain.\n\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\twidget.execute();\n\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t// don't want.\n\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidgetPointer.children = [widgetPointer.makeChildWidget(node)];\n\t\t\t\t\t// No more regenerating children for\n\t\t\t\t\t// this widget. If it needs to refresh,\n\t\t\t\t\t// it'll do so along with the the whole\n\t\t\t\t\t// importvariable tree.\n\t\t\t\t\tif (widgetPointer != this) {\n\t\t\t\t\t\twidgetPointer.makeChildWidgets = function(){};\n\t\t\t\t\t}\n\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/keyboard.js": { "title": "$:/core/modules/widgets/keyboard.js", "text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tvar handled = self.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tif(handled || self.actions || self.message) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/link.js": { "title": "$:/core/modules/widgets/link.js", "text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"}),\n\t\tdomNode = this.document.createElementNS(namespace,tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tvar namespaceHref = (namespace === \"http://www.w3.org/2000/svg\") ? \"http://www.w3.org/1999/xlink\" : undefined;\n\t\tdomNode.setAttributeNS(namespaceHref,\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey,\n\t\tevent: event\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/linkcatcher.js": { "title": "$:/core/modules/widgets/linkcatcher.js", "text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/list.js": { "title": "$:/core/modules/widgets/list.js", "text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar parser,\n\t\temptyMessage = this.getAttribute(\"emptyMessage\",\"\");\n\t// this.wiki.parseText() calls \n\t// new Parser(..), which should only be done, if needed, because it's heavy!\n\tif (emptyMessage === \"\") {\n\t\treturn [];\n\t}\n\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/log.js": { "title": "$:/core/modules/widgets/log.js", "text": "/*\\\ntitle: $:/core/modules/widgets/log.js\ntype: application/javascript\nmodule-type: widget-subclass\n\nWidget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.baseClass = \"action-log\";\n\nexports.name = \"log\";\n\nexports.constructor = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n}\n\nexports.prototype = {};\n\nexports.prototype.render = function(event) {\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event);\t\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this);\n}\n\n})();", "type": "application/javascript", "module-type": "widget-subclass" }, "$:/core/modules/widgets/macrocall.js": { "title": "$:/core/modules/widgets/macrocall.js", "text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\t// Check if we've already cached parsing this macro\n\t\tvar mode = this.parseTreeNode.isBlock ? \"blockParser\" : \"inlineParser\",\n\t\t\tparser;\n\t\tif(variableInfo.srcVariable && variableInfo.srcVariable[mode]) {\n\t\t\tparser = variableInfo.srcVariable[mode];\n\t\t} else {\n\t\t\tparser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\t\tif(variableInfo.isCacheable && variableInfo.srcVariable) {\n\t\t\t\tvariableInfo.srcVariable[mode] = parser;\n\t\t\t}\n\t\t}\n\t\tvar parseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else if(this.renderOutput === \"text/raw\") {\n\t\tparseTreeNodes = [{type: \"text\", text: text}];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/navigator.js": { "title": "$:/core/modules/widgets/navigator.js", "text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\tthis.story = new $tw.Story({\n\t\twiki: this.wiki,\n\t\tstoryTitle: this.storyTitle,\n\t\thistoryTitle: this.historyTitle\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.story.addToStory(title,fromTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.story.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\t\ttext: \"\",\n\t\t\t},\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler,tiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTitle = event.importTitle ? event.importTitle : IMPORT_TITLE,\n\t\timportTiddler = this.wiki.getTiddler(importTitle),\n\t\timportData = this.wiki.getTiddlerData(importTitle,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: importTitle,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t\tnewFields[\"suppressed-\" + title] = \"yes\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tvar autoOpenOnImport = event.autoOpenOnImport ? event.autoOpenOnImport : this.getVariable(\"tv-auto-open-on-import\"); \n\tif(autoOpenOnImport !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(importTitle) === -1) {\n\t\t\tstoryList.unshift(importTitle);\n\t\t}\n\t\t// And to history\n\t\thistory.push(importTitle);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tif($tw.utils.hop(importTiddler.fields,[\"rename-\" + title])) {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields[\"rename-\" + title]});\n\t\t\t} else {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\t}\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddler.fields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar options = {},\n\t\tparamObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\toptions.dontRenameInTags = (paramObject.renameInTags === \"false\" || paramObject.renameInTags === \"no\") ? true : false;\n\toptions.dontRenameInLists = (paramObject.renameInLists === \"false\" || paramObject.renameInLists === \"no\") ? true : false;\n\tthis.wiki.renameTiddler(from,to,options);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/password.js": { "title": "$:/core/modules/widgets/password.js", "text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/qualify.js": { "title": "$:/core/modules/widgets/qualify.js", "text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/radio.js": { "title": "$:/core/modules/widgets/radio.js", "text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n\t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n\t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n\t// Trigger actions\n\tif(this.radioActions) {\n\t\tthis.invokeActionString(this.radioActions,this,event,{\"actionValue\": this.radioValue});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\tthis.radioActions = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(($tw.utils.count(changedAttributes) > 0) || changedTiddlers[this.radioTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/range.js": { "title": "$:/core/modules/widgets/range.js", "text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name:\"mousedown\", handlerObject:this, handlerMethod:\"handleMouseDownEvent\"},\n\t\t{name:\"mouseup\", handlerObject:this, handlerMethod:\"handleMouseUpEvent\"},\n\t\t{name:\"change\", handlerObject:this, handlerMethod:\"handleChangeEvent\"},\n\t\t{name:\"input\", handlerObject:this, handlerMethod:\"handleInputEvent\"},\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField,\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue);\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.getActionVariables = function(options) {\n\toptions = options || {};\n\tvar hasChanged = (this.startValue !== this.inputDomNode.value) ? \"yes\" : \"no\";\n\t// Trigger actions. Use variables = {key:value, key:value ...}\n\t// the \"value\" is needed.\n\treturn $tw.utils.extend({\"actionValue\": this.inputDomNode.value, \"actionValueHasChanged\": hasChanged}, options);\n}\n\n// actionsStart\nRangeWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.mouseDown = true; // TODO remove once IE is gone.\n\tthis.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone!\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseDown) {\n\t\tvar variables = this.getActionVariables() // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsMouseDown,this,event,variables);\n\t}\n}\n\n// actionsStop\nRangeWidget.prototype.handleMouseUpEvent = function(event) {\n\tthis.mouseDown = false; // TODO remove once IE is gone.\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseUp) {\n\t\tvar variables = this.getActionVariables()\n\t\tthis.invokeActionString(this.actionsMouseUp,this,event,variables);\n\t}\n\t// TODO remove the following if() once IE is gone!\n\tif ($tw.browser.isIE) {\n\t\tif (this.startValue !== this.inputDomNode.value) {\n\t\t\tthis.handleChangeEvent(event);\n\t\t\tthis.startValue = this.inputDomNode.value;\n\t\t}\n\t}\n}\n\nRangeWidget.prototype.handleChangeEvent = function(event) {\n\tif (this.mouseDown) { // TODO refactor this function once IE is gone.\n\t\tthis.handleInputEvent(event);\n\t}\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsInput) {\n\t\t// \"tiddler\" parameter may be missing. See .execute() below\n\t\tvar variables = this.getActionVariables({\"actionValueHasChanged\": \"yes\"}) // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsInput,this,event,variables);\n\t}\n};\n\nRangeWidget.prototype.handleEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// TODO remove the next 1 lines once IE is gone!\n\tthis.mouseUp = true; // Needed for IE10\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\",\"text\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\",\"\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Actions since 5.1.23\n\t// Next 2 only fire once!\n\tthis.actionsMouseDown = this.getAttribute(\"actionsStart\",\"\");\n\tthis.actionsMouseUp = this.getAttribute(\"actionsStop\",\"\");\n\t// Input fires very often!\n\tthis.actionsInput = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/raw.js": { "title": "$:/core/modules/widgets/raw.js", "text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/reveal.js": { "title": "$:/core/modules/widgets/reveal.js", "text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"belowright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\t\t\t\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tcase \"aboveleft\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\t\t\t\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\t// class attribute handled in assignDomNodeClasses()\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\tthis.updatePopupPosition = this.getAttribute(\"updatePopupPosition\",\"no\") === \"yes\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\nRevealWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-reveal\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if(this.type === \"popup\" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {\n\t\t\tthis.positionPopup(this.domNode);\n\t\t}\n\t\tif(changedAttributes.style) {\n\t\t\tthis.domNode.style = this.getAttribute(\"style\",\"\");\n\t\t}\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\n\t\t}\t\t\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/scrollable.js": { "title": "$:/core/modules/widgets/scrollable.js", "text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tif(event.paramObject && event.paramObject.selector) {\n\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t} else {\n\t\tthis.scrollIntoView(event.target);\t\t\t\n\t}\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\tsrcWindow = element ? element.ownerDocument.defaultView : window;\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/select.js": { "title": "$:/core/modules/widgets/select.js", "text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\n\t\t}\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\n\t}\n\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/set.js": { "title": "$:/core/modules/widgets/set.js", "text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,!!this.parseTreeNode.isMacroDefinition);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/text.js": { "title": "$:/core/modules/widgets/text.js", "text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/tiddler.js": { "title": "$:/core/modules/widgets/tiddler.js", "text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/transclude.js": { "title": "$:/core/modules/widgets/transclude.js", "text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\tthis.recursionMarker = this.getAttribute(\"recursionMarker\",\"yes\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tif(this.recursionMarker === \"yes\") {\n\t\tthis.setVariable(\"transclusion\",recursionMarker);\n\t}\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/vars.js": { "title": "$:/core/modules/widgets/vars.js", "text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/view.js": { "title": "$:/core/modules/widgets/view.js", "text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/widget.js": { "title": "$:/core/modules/widgets/widget.js", "text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\toriginalValue = variable.value,\n\t\t\tvalue = originalValue,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params,\n\t\t\tsrcVariable: variable,\n\t\t\tisCacheable: originalValue === value\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\tevent.widget = event.widget || this;\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\n/*\nExecute action tiddlers by tag\n*/\nWidget.prototype.invokeActionsByTag = function(tag,event,variables) {\n\tvar self = this;\n\t$tw.utils.each(self.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\tself.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables);\n\t});\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/wikify.js": { "title": "$:/core/modules/widgets/wikify.js", "text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/wiki-bulkops.js": { "title": "$:/core/modules/wiki-bulkops.js", "text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n", "type": "application/javascript", "module-type": "wikimethod" }, "$:/core/modules/wiki.js": { "title": "$:/core/modules/wiki.js", "text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.isBinaryTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.encoding === \"base64\";\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t\t\t\t\t\t\t(isDescending ? y - x : x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinksIndexer = this.getIndexer(\"BacklinksIndexer\"),\n\t\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t// indexOf unless we have a new\n\t\t\t\t\t// position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tmoveItemInList(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,spaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName]) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type,tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.recursionMarker : optional flag to set a recursion marker, defaults to \"yes\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\trecursionMarker: {\n\t\t\t\t\tname: \"recursionMarker\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: options.recursionMarker || \"yes\"\n\t\t\t\t\t},\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn this.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.hasField(\"_is_skinny\")) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text || \"\";\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\"};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\t\n\tconsole.log(\"$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!\")\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\n\tconsole.log(\"$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!\")\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.slugify = function(title,options) {\n\tvar tiddler = this.getTiddler(title),\n\t\tslug;\n\tif(tiddler && tiddler.fields.slug) {\n\t\tslug = tiddler.fields.slug;\n\t} else {\n\t\tslug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII\n\t\t\t.replace(/\\s+/g,\"-\") // Replace spaces with -\n\t\t\t.replace(/[^\\w\\-\\.]+/g,\"\") // Remove all non-word chars except dash and dot\n\t\t\t.replace(/\\-\\-+/g,\"-\") // Replace multiple - with single -\n\t\t\t.replace(/^-+/,\"\") // Trim - from start of text\n\t\t\t.replace(/-+$/,\"\"); // Trim - from end of text\n\t}\n\t// If the resulting slug is blank (eg because the title is just punctuation characters)\n\tif(!slug) {\n\t\t// ...then just use the character codes of the title\n\t\tvar result = [];\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tresult.push(char.charCodeAt(0).toString());\n\t\t});\n\t\tslug = result.join(\"-\");\n\t}\n\treturn slug;\n};\n\n})();\n\n", "type": "application/javascript", "module-type": "wikimethod" }, "$:/palettes/Blanca": { "title": "$:/palettes/Blanca", "name": "Blanca", "description": "A clean white palette to let you focus", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/Blue": { "title": "$:/palettes/Blue", "name": "Blue", "description": "A blue theme", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/Muted": { "title": "$:/palettes/Muted", "name": "Muted", "description": "Bright tiddlers on a muted background", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/ContrastLight": { "title": "$:/palettes/ContrastLight", "name": "Contrast (Light)", "description": "High contrast and unambiguous (light version)", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n" }, "$:/palettes/ContrastDark": { "title": "$:/palettes/ContrastDark", "name": "Contrast (Dark)", "description": "High contrast and unambiguous (dark version)", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n" }, "$:/palettes/CupertinoDark": { "title": "$:/palettes/CupertinoDark", "tags": "$:/tags/Palette", "name": "Cupertino Dark", "description": "A macOS inspired dark palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #FF453A\nalert-border: #FF453A\nalert-highlight: #FFD60A\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #282828\nblockquote-bar: <<colour page-background>>\nbutton-foreground: <<colour background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #FF453A\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour tiddler-info-background>>\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: #3F638B\ndropdown-tab-background: #323232\ndropzone-background: #30D158\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #BF5AF2\nexternal-link-foreground: #32D74B\nforeground: #FFFFFF\nmenubar-background: #464646\nmenubar-foreground: #ffffff\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: #98989D\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #323232\npre-background: #464646\npre-border: transparent\nprimary: #0A84FF\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour background>>\nsidebar-controls-foreground-hover: #FF9F0A\nsidebar-controls-foreground: #8E8E93\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: #3F638B\nsidebar-tab-background: <<colour background>>\nsidebar-tab-border-selected: <<colour background>>\nsidebar-tab-border: <<colour background>>\nsidebar-tab-divider: <<colour background>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: #ffffff\nstatic-alert-foreground: #B4B4B4\ntab-background-selected: #3F638B\ntab-background: <<colour page-background>>\ntab-border-selected: <<colour page-background>>\ntab-border: <<colour page-background>>\ntab-divider: <<colour page-background>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #464646\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #48484A\ntag-foreground: #323232\ntiddler-background: <<colour background>>\ntiddler-border: transparent\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: #48484A\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #1E1E1E\ntiddler-info-border: #1E1E1E\ntiddler-info-tab-background: #3F638B\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: #464646\nselection-background: #3F638B\nselection-foreground: #ffffff\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #3F638B\nwikilist-button-foreground: <<colour foreground>>\nwikilist-button-open: #32D74B\nwikilist-button-open-hover: #32D74B\nwikilist-button-reveal: #0A84FF\nwikilist-button-reveal-hover: #0A84FF\nwikilist-button-remove: #FF453A\nwikilist-button-remove-hover: #FF453A\nwikilist-droplink-dragover: #32D74B\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour foreground>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-url: <<colour muted-foreground>>\n" }, "$:/palettes/DarkPhotos": { "title": "$:/palettes/DarkPhotos", "created": "20150402111612188", "description": "Good with dark photo backgrounds", "modified": "20150402112344080", "name": "DarkPhotos", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/DesertSand": { "title": "$:/palettes/DesertSand", "tags": "$:/tags/Palette", "name": "Desert Sand", "description": "A desert sand palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #E9E0C7\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #F3EDDF\ncode-border: #C3BAA1\ncode-foreground: #ab3250\ndiff-delete-background: #bd8b8b\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #91c093\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ad3434\ndownload-background: #6ca16c\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #E9E0C7\ndropdown-tab-background: #BAB29C\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #313163\nexternal-link-foreground: #555592\nforeground: #2D2A23\nmenubar-background: #CDC2A6\nmenubar-foreground: #5A5446\nmessage-background: #ECE5CF\nmessage-border: #D6CBAA\nmessage-foreground: #5f6e7d\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #8A8885\nmodal-footer-background: #CDC2A6\nmodal-footer-border: #9D998E\nmodal-header-border: #9D998E\nmuted-foreground: #9D998E\nnotification-background: #F0E9D7\nnotification-border: #939189\npage-background: #e0d3af\npre-background: #D6CBAA\npre-border: #CDC2A6\nprimary: #5B6F55\nselection-background: #9D947B\nselection-foreground: <<colour foreground>>\nselect-tag-background: #F0E9D7\nselect-tag-foreground: #2D2A23\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #2D2A23\nsidebar-controls-foreground: #867F69\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #867F69\nsidebar-muted-foreground-hover: #706A58\nsidebar-muted-foreground: #B3A98C\nsidebar-tab-background-selected: #e0d3af\nsidebar-tab-background: #A6A193\nsidebar-tab-border-selected: #C3BAA1\nsidebar-tab-border: #C3BAA1\nsidebar-tab-divider: #CDC2A6\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #2D2A23\nsidebar-tiddler-link-foreground-hover: #433F35\nsidebar-tiddler-link-foreground: #706A58\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #A6A193\ntab-background-selected: #E9E0C7\ntab-background: #A6A193\ntab-border-selected: #C3BAA1\ntab-border: #C3BAA1\ntab-divider: #CDC2A6\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #2D2A23\ntable-border: #9D998E\ntable-footer-background: #8A8885\ntable-header-background: #B0AA98\ntag-background: #706A58\ntag-foreground: #E3D7B7\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #9D947B\ntiddler-controls-foreground-selected: #706A58\ntiddler-controls-foreground: #C3BAA1\ntiddler-editor-background: #E9E0C7\ntiddler-editor-border-image: #A6A193\ntiddler-editor-border: #A6A193\ntiddler-editor-fields-even: #D6CBAA\ntiddler-editor-fields-odd: #C3BAA1\ntiddler-info-background: #E3D7B7\ntiddler-info-border: #BAB29C\ntiddler-info-tab-background: #E9E0C7\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #867F69\ntiddler-title-foreground: #374464\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #8A8885\nvery-muted-foreground: #CDC2A6\nwikilist-background: <<colour page-background>>\nwikilist-item: #CDC2A6\nwikilist-info: #161512\nwikilist-title: #433F35\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #706A58\nwikilist-button-open: #7db66a\nwikilist-button-open-hover: #56a556\nwikilist-button-reveal: #5a6c9e\nwikilist-button-reveal-hover: #454591\nwikilist-button-remove: #bc5972\nwikilist-button-remove-hover: #814040\nwikilist-toolbar-background: #CDC2A6\nwikilist-toolbar-foreground: #2D2A23\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #A6A193\nwikilist-button-foreground: #161512\n" }, "$:/palettes/GruvboxDark": { "title": "$:/palettes/GruvboxDark", "name": "Gruvbox Dark", "description": "Retro groove color scheme", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "license": "https://github.com/morhetz/gruvbox", "text": "alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nforeground: #fbf1c7\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nselection-background: #458588\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: <<colour primary>>\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #32302f\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #acacac\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>\n" }, "$:/palettes/Nord": { "title": "$:/palettes/Nord", "name": "Nord", "description": "An arctic, north-bluish color palette.", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md", "text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nselection-background: #5E81AC\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #3b4252\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\nwikilist-background: <<colour page-background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-item: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-info: <<colour muted-foreground>>\nwikilist-button-open: #A3BE8C\nwikilist-button-open-hover: #A3BE8C\nwikilist-button-reveal: #81A1C1\nwikilist-button-reveal-hover: #81A1C1\nwikilist-button-remove: #B48EAD\nwikilist-button-remove-hover: #B48EAD\n" }, "$:/palettes/Rocker": { "title": "$:/palettes/Rocker", "name": "Rocker", "description": "A dark theme", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/SolarFlare": { "title": "$:/palettes/SolarFlare", "name": "Solar Flare", "description": "Warm, relaxing earth colours", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n download-foreground: <<colour background>>\n dragger-foreground: <<colour background>>\n dropdown-background: <<colour background>>\n modal-background: <<colour background>>\n sidebar-foreground-shadow: <<colour background>>\n tiddler-background: <<colour background>>\n tiddler-border: <<colour background>>\n tiddler-link-background: <<colour background>>\n tab-background-selected: <<colour background>>\n dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n dragger-background: <<colour foreground>>\n tab-foreground: <<colour foreground>>\n tab-foreground-selected: <<colour tab-foreground>>\n sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n sidebar-tab-foreground: <<colour tab-foreground>>\n sidebar-button-foreground: <<colour foreground>>\n sidebar-controls-foreground: <<colour foreground>>\n sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n alert-muted-foreground: <<colour base01>>\n: base00\n code-foreground: <<colour base00>>\n message-foreground: <<colour base00>>\n tag-foreground: <<colour base00>>\n: base0\n sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n muted-foreground: <<colour base1>>\n blockquote-bar: <<colour muted-foreground>>\n dropdown-border: <<colour muted-foreground>>\n sidebar-muted-foreground: <<colour muted-foreground>>\n tiddler-title-foreground: <<colour muted-foreground>>\n site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n modal-footer-background: <<colour base2>>\n page-background: <<colour base2>>\n modal-backdrop: <<colour page-background>>\n notification-background: <<colour page-background>>\n code-background: <<colour page-background>>\n code-border: <<colour code-background>>\n pre-background: <<colour page-background>>\n pre-border: <<colour pre-background>>\n sidebar-tab-background-selected: <<colour page-background>>\n table-header-background: <<colour base2>>\n tag-background: <<colour base2>>\n tiddler-editor-background: <<colour base2>>\n tiddler-info-background: <<colour base2>>\n tiddler-info-tab-background: <<colour base2>>\n tab-background: <<colour base2>>\n dropdown-tab-background: <<colour tab-background>>\n: base3\n alert-background: <<colour base3>>\n message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n alert-highlight: <<colour magenta>>\n: violet\n external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n primary: <<colour blue-muted>>\n download-background: <<colour primary>>\n tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n modal-footer-border: <<colour tab-border>>\n modal-header-border: <<colour tab-border>>\n notification-border: <<colour tab-border>>\n sidebar-tab-border: <<colour tab-border>>\n tab-border-selected: <<colour tab-border>>\n sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/SolarizedDark": { "title": "$:/palettes/SolarizedDark", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "description": "Precision dark colors for machines and people", "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE", "name": "SolarizedDark", "text": "alert-background: #073642\nalert-border: #93a1a1\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #073642\nblockquote-bar: #d33682\nbutton-background: #073642\nbutton-border: #586e75\nbutton-foreground: #93a1a1\ncode-background: #073642\ncode-border: #586e75\ncode-foreground: #93a1a1\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #073642\ndragger-background: #073642\ndragger-foreground: #839496\ndropdown-background: #073642\ndropdown-border: #93a1a1\ndropdown-tab-background: #002b36\ndropdown-tab-background-selected: #073642\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover:\nexternal-link-foreground-visited: #268bd2\nforeground: #839496\nmessage-background: #002b36\nmessage-border: #586e75\nmessage-foreground: #839496\nmodal-backdrop: #657b83\nmodal-background: #002b36\nmodal-border: #586e75\nmodal-footer-background: #073642\nmodal-footer-border: #586e75\nmodal-header-border: #586e75\nmuted-foreground: #93a1a1\nnotification-background: #002b36\nnotification-border: #586e75\npage-background: #073642\npre-background: inherit\npre-border: #657b83\nprimary: #859900\nselect-tag-background: #002b36\nselect-tag-foreground: #839496\nsidebar-button-foreground: #93a1a1\nsidebar-controls-foreground: #93a1a1\nsidebar-controls-foreground-hover: #eee8d5\nsidebar-foreground: #93a1a1\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #839496\nsidebar-muted-foreground-hover: #93a1a1\nsidebar-tab-background: #002b36\nsidebar-tab-background-selected: #073642\nsidebar-tab-border: #073642\nsidebar-tab-border-selected: #839496\nsidebar-tab-divider: #002b36\nsidebar-tab-foreground: #657b83\nsidebar-tab-foreground-selected: #93a1a1\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #eee8d5\nsite-title-foreground: #d33682\nstatic-alert-foreground: #93a1a1\ntab-background: #073642\ntab-background-selected: #002b36\ntab-border: #586e75\ntab-border-selected: #93a1a1\ntab-divider: #93a1a1\ntab-foreground: #839496\ntab-foreground-selected: #93a1a1\ntable-border: #586e75\ntable-footer-background: #073642\ntable-header-background: #073642\ntag-background: #b58900\ntag-foreground: #002b36\ntiddler-background: #002b36\ntiddler-border: #586e75\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #002b36\ntiddler-editor-border: #073642\ntiddler-editor-border-image: #002b36\ntiddler-editor-fields-even: #002b36\ntiddler-editor-fields-odd: #073642\ntiddler-info-background: #073642\ntiddler-info-border: #657b83\ntiddler-info-tab-background: #002b36\ntiddler-link-background: #002b36\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #839496\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #839496\ntoolbar-close-button: #839496\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #839496\ntoolbar-edit-button: #839496\ntoolbar-info-button: #839496\ntoolbar-new-button: #839496\ntoolbar-options-button: #839496\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #586e75\n" }, "$:/palettes/SolarizedLight": { "title": "$:/palettes/SolarizedLight", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "description": "Precision colors for machines and people", "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE", "name": "SolarizedLight", "text": "alert-background: #eee8d5\nalert-border: #586e75\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #eee8d5\nblockquote-bar: #d33682\nbutton-background: #eee8d5\nbutton-border: #93a1a1\nbutton-foreground: #586e75\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #586e75\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #eee8d5\ndragger-background: #eee8d5\ndragger-foreground: #657b83\ndropdown-background: #eee8d5\ndropdown-border: #586e75\ndropdown-tab-background: #fdf6e3\ndropdown-tab-background-selected: #eee8d5\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #268bd2\nforeground: #657b83\nmessage-background: #fdf6e3\nmessage-border: #93a1a1\nmessage-foreground: #657b83\nmodal-backdrop: #839496\nmodal-background: #fdf6e3\nmodal-border: #93a1a1\nmodal-footer-background: #eee8d5\nmodal-footer-border: #93a1a1\nmodal-header-border: #93a1a1\nmuted-foreground: #586e75\nnotification-background: #fdf6e3\nnotification-border: #93a1a1\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #839496\nprimary: #859900\nselect-tag-background: #fdf6e3\nselect-tag-foreground: #657b83\nsidebar-button-foreground: #586e75\nsidebar-controls-foreground: #586e75\nsidebar-controls-foreground-hover: #d33682\nsidebar-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #657b83\nsidebar-muted-foreground-hover: #586e75\nsidebar-tab-background: #fdf6e3\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-border: #eee8d5\nsidebar-tab-border-selected: #657b83\nsidebar-tab-divider: #fdf6e3\nsidebar-tab-foreground: #839496\nsidebar-tab-foreground-selected: #586e75\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #002b36\nsite-title-foreground: #d33682\nstatic-alert-foreground: #586e75\ntab-background: #eee8d5\ntab-background-selected: #fdf6e3\ntab-border: #93a1a1\ntab-border-selected: #586e75\ntab-divider: #586e75\ntab-foreground: #657b83\ntab-foreground-selected: #586e75\ntable-border: #93a1a1\ntable-footer-background: #eee8d5\ntable-header-background: #eee8d5\ntag-background: #b58900\ntag-foreground: #fdf6e3\ntiddler-background: #fdf6e3\ntiddler-border: #93a1a1\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #fdf6e3\ntiddler-editor-border: #eee8d5\ntiddler-editor-border-image: #fdf6e3\ntiddler-editor-fields-even: #fdf6e3\ntiddler-editor-fields-odd: #eee8d5\ntiddler-info-background: #eee8d5\ntiddler-info-border: #839496\ntiddler-info-tab-background: #fdf6e3\ntiddler-link-background: #fdf6e3\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #657b83\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #657b83\ntoolbar-close-button: #657b83\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #657b83\ntoolbar-edit-button: #657b83\ntoolbar-info-button: #657b83\ntoolbar-new-button: #657b83\ntoolbar-options-button: #657b83\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #93a1a1\n" }, "$:/palettes/SpartanDay": { "title": "$:/palettes/SpartanDay", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "description": "Cold, spartan day colors", "name": "Spartan Day", "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n" }, "$:/palettes/SpartanNight": { "title": "$:/palettes/SpartanNight", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "description": "Dark spartan colors", "name": "Spartan Night", "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n" }, "$:/palettes/Twilight": { "title": "$:/palettes/Twilight", "tags": "$:/tags/Palette", "author": "Thomas Elmiger", "type": "application/x-tiddler-dictionary", "name": "Twilight", "description": "Delightful, soft darkness.", "text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n" }, "$:/palettes/Vanilla": { "title": "$:/palettes/Vanilla", "name": "Vanilla", "description": "Pale and unobtrusive", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background:\nselection-foreground:\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000\n" }, "$:/core/readme": { "title": "$:/core/readme", "text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n" }, "$:/library/sjcl.js/license": { "title": "$:/library/sjcl.js/license", "type": "text/plain", "text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA" }, "$:/core/templates/MOTW.html": { "title": "$:/core/templates/MOTW.html", "text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com --> " }, "$:/core/templates/alltiddlers.template.html": { "title": "$:/core/templates/alltiddlers.template.html", "type": "text/vnd.tiddlywiki-html", "text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n" }, "$:/core/templates/canonical-uri-external-image": { "title": "$:/core/templates/canonical-uri-external-image", "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>" }, "$:/core/templates/canonical-uri-external-raw": { "title": "$:/core/templates/canonical-uri-external-raw", "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>" }, "$:/core/templates/canonical-uri-external-text": { "title": "$:/core/templates/canonical-uri-external-text", "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid" }, "$:/core/templates/css-tiddler": { "title": "$:/core/templates/css-tiddler", "text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`" }, "$:/core/templates/exporters/CsvFile": { "title": "$:/core/templates/exporters/CsvFile", "tags": "$:/tags/Exporter", "description": "{{$:/language/Exporters/CsvFile}}", "extension": ".csv", "text": "<$macrocall $name=\"csvtiddlers\" filter=<<exportFilter>> format=\"quoted-comma-sep\" $output=\"text/raw\"/>\n" }, "$:/core/templates/exporters/JsonFile": { "title": "$:/core/templates/exporters/JsonFile", "tags": "$:/tags/Exporter", "description": "{{$:/language/Exporters/JsonFile}}", "extension": ".json", "text": "<$macrocall $name=\"jsontiddlers\" filter=<<exportFilter>> $output=\"text/raw\"/>\n" }, "$:/core/templates/exporters/StaticRiver": { "title": "$:/core/templates/exporters/StaticRiver", "tags": "$:/tags/Exporter", "description": "{{$:/language/Exporters/StaticRiver}}", "extension": ".html", "text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river tc-static-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n" }, "$:/core/templates/exporters/StaticRiver/Content": { "title": "$:/core/templates/exporters/StaticRiver/Content", "text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n" }, "$:/core/templates/exporters/TidFile": { "title": "$:/core/templates/exporters/TidFile", "tags": "$:/tags/Exporter", "description": "{{$:/language/Exporters/TidFile}}", "extension": ".tid", "condition": "[<count>compare:lte[1]]", "text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>" }, "$:/core/save/all-external-js": { "title": "$:/core/save/all-external-js", "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n" }, "$:/core/templates/tiddlywiki5.js": { "title": "$:/core/templates/tiddlywiki5.js", "text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n" }, "$:/core/templates/tiddlywiki5.js/tiddlers": { "title": "$:/core/templates/tiddlywiki5.js/tiddlers", "text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n`\n" }, "$:/core/templates/tiddlywiki5-external-js.html": { "title": "$:/core/templates/tiddlywiki5-external-js.html", "text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n" }, "$:/core/templates/html-div-skinny-tiddler": { "title": "$:/core/templates/html-div-skinny-tiddler", "text": "<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n" }, "$:/core/templates/html-div-tiddler": { "title": "$:/core/templates/html-div-tiddler", "text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n" }, "$:/core/templates/html-tiddler": { "title": "$:/core/templates/html-tiddler", "text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />" }, "$:/core/templates/javascript-tiddler": { "title": "$:/core/templates/javascript-tiddler", "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`" }, "$:/core/templates/json-tiddler": { "title": "$:/core/templates/json-tiddler", "text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>" }, "$:/core/templates/module-tiddler": { "title": "$:/core/templates/module-tiddler", "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`" }, "$:/core/templates/plain-text-tiddler": { "title": "$:/core/templates/plain-text-tiddler", "text": "<$view field=\"text\" format=\"text\" />" }, "$:/core/templates/raw-static-tiddler": { "title": "$:/core/templates/raw-static-tiddler", "text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />" }, "$:/core/save/all": { "title": "$:/core/save/all", "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n" }, "$:/core/save/empty": { "title": "$:/core/save/empty", "text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n" }, "$:/core/save/lazy-all": { "title": "$:/core/save/lazy-all", "text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n" }, "$:/core/save/lazy-images": { "title": "$:/core/save/lazy-images", "text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n" }, "$:/core/templates/server/static.sidebar.wikitext": { "title": "$:/core/templates/server/static.sidebar.wikitext", "text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n" }, "$:/core/templates/server/static.tiddler.html": { "title": "$:/core/templates/server/static.tiddler.html", "text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>" }, "$:/core/templates/server/static.tiddler.wikitext": { "title": "$:/core/templates/server/static.tiddler.wikitext", "text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n" }, "$:/core/templates/single.tiddler.window": { "title": "$:/core/templates/single.tiddler.window", "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$vars>\n" }, "$:/core/templates/split-recipe": { "title": "$:/core/templates/split-recipe", "text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n" }, "$:/core/templates/static-tiddler": { "title": "$:/core/templates/static-tiddler", "text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>" }, "$:/core/templates/static.area": { "title": "$:/core/templates/static.area", "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n" }, "$:/core/templates/static.content": { "title": "$:/core/templates/static.content", "text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n" }, "$:/core/templates/static.template.css": { "title": "$:/core/templates/static.template.css", "text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n" }, "$:/core/templates/static.template.html": { "title": "$:/core/templates/static.template.html", "type": "text/vnd.tiddlywiki-html", "text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n" }, "$:/core/templates/static.tiddler.html": { "title": "$:/core/templates/static.tiddler.html", "text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river tc-static-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`\n" }, "$:/core/templates/store.area.template.html": { "title": "$:/core/templates/store.area.template.html", "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>" }, "$:/core/templates/tid-tiddler": { "title": "$:/core/templates/tid-tiddler", "text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />" }, "$:/core/templates/tiddler-metadata": { "title": "$:/core/templates/tiddler-metadata", "text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>" }, "$:/core/templates/tiddlywiki5.html": { "title": "$:/core/templates/tiddlywiki5.html", "text": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n" }, "$:/core/templates/version": { "title": "$:/core/templates/version", "text": "<<version>>" }, "$:/core/templates/wikified-tiddler": { "title": "$:/core/templates/wikified-tiddler", "text": "<$transclude />" }, "$:/core/ui/AboveStory/tw2-plugin-check": { "title": "$:/core/ui/AboveStory/tw2-plugin-check", "tags": "$:/tags/AboveStory", "text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n" }, "$:/core/ui/Actions/new-image": { "title": "$:/core/ui/Actions/new-image", "tags": "$:/tags/Actions", "description": "create a new image tiddler", "text": "\\define get-type()\nimage/$(imageType)$\n\\end\n\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars imageType={{$:/config/NewImageType}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags=<<get-tags>>/>\n</$vars>\n" }, "$:/core/ui/Actions/new-journal": { "title": "$:/core/ui/Actions/new-journal", "tags": "$:/tags/Actions", "description": "create a new journal tiddler", "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n" }, "$:/core/ui/Actions/new-tiddler": { "title": "$:/core/ui/Actions/new-tiddler", "tags": "$:/tags/Actions", "description": "create a new empty tiddler", "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<get-tags>>/>\n</$vars>\n" }, "$:/core/ui/AdvancedSearch/Filter": { "title": "$:/core/ui/AdvancedSearch/Filter", "tags": "$:/tags/AdvancedSearch", "caption": "{{$:/language/Search/Filter/Caption}}", "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\" \n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/temp/advancedsearch]]\" firstSearchFilterField=\"text\" \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tinputCancelActions=<<cancel-search-actions>>/>\n</$keyboard>\n</$keyboard>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</div>\n</$set>\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": { "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear", "tags": "$:/tags/AdvancedSearch/FilterButton", "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": { "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete", "tags": "$:/tags/AdvancedSearch/FilterButton", "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": { "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown", "tags": "$:/tags/AdvancedSearch/FilterButton", "text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param='.tc-advanced-search input' />\"\"\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": { "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export", "tags": "$:/tags/AdvancedSearch/FilterButton", "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/Shadows": { "title": "$:/core/ui/AdvancedSearch/Shadows", "tags": "$:/tags/AdvancedSearch", "caption": "{{$:/language/Search/Shadows/Caption}}", "first-search-filter": "[all[shadows]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]", "text": "\\define lingo-base() $:/language/Search/\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/Shadows]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/Standard": { "title": "$:/core/ui/AdvancedSearch/Standard", "tags": "$:/tags/AdvancedSearch", "caption": "{{$:/language/Search/Standard/Caption}}", "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define next-search-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"shift-alt-Right\" actions=<<next-search-tab>>>\n<$keyboard key=\"shift-alt-Left\" actions=<<next-search-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"\n\t\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$vars userInput={{{ [[$:/temp/advancedsearch]get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchListState=\"$:/temp/advancedsearch/selected-item\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/advancedsearch\" />\n</$list>\n</$vars>\n</$list>\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/System": { "title": "$:/core/ui/AdvancedSearch/System", "tags": "$:/tags/AdvancedSearch", "caption": "{{$:/language/Search/System/Caption}}", "first-search-filter": "[is[system]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]", "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\t\ttype=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/System]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n" }, "$:/AdvancedSearch": { "title": "$:/AdvancedSearch", "icon": "$:/core/images/advanced-search-button", "color": "#bbb", "text": "<div class=\"tc-advanced-search\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" default=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab--1498284803\"/>\n</div>\n" }, "$:/core/ui/AlertTemplate": { "title": "$:/core/ui/AlertTemplate", "text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=<<format>>/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</$wikify>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n" }, "$:/core/ui/BinaryWarning": { "title": "$:/core/ui/BinaryWarning", "text": "\\define lingo-base() $:/language/BinaryWarning/\n<<lingo Prompt>>\n" }, "$:/core/ui/Components/plugin-info": { "title": "$:/core/ui/Components/plugin-info", "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1>\n''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view> $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n" }, "$:/core/ui/Components/tag-link": { "title": "$:/core/ui/Components/tag-link", "text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>" }, "$:/core/ui/ControlPanel/Advanced": { "title": "$:/core/ui/ControlPanel/Advanced", "tags": "$:/tags/ControlPanel/Info", "caption": "{{$:/language/ControlPanel/Advanced/Caption}}", "text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TiddlerFields\" explicitState=\"$:/state/tab--959111941\"/>\n</div>\n" }, "$:/core/ui/ControlPanel/Appearance": { "title": "$:/core/ui/ControlPanel/Appearance", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Appearance/Caption}}", "text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Theme\" explicitState=\"$:/state/tab--1963855381\"/>\n</div>\n" }, "$:/core/ui/ControlPanel/Basics": { "title": "$:/core/ui/ControlPanel/Basics", "tags": "$:/tags/ControlPanel/Info", "caption": "{{$:/language/ControlPanel/Basics/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewTiddler/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewJournal/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n" }, "$:/core/ui/ControlPanel/EditorTypes": { "title": "$:/core/ui/ControlPanel/EditorTypes", "tags": "$:/tags/ControlPanel/Advanced", "caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n" }, "$:/core/ui/ControlPanel/Info": { "title": "$:/core/ui/ControlPanel/Info", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Info/Caption}}", "text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Basics\" explicitState=\"$:/state/tab--2112689675\"/>\n</div>\n" }, "$:/core/ui/ControlPanel/KeyboardShortcuts": { "title": "$:/core/ui/ControlPanel/KeyboardShortcuts", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n" }, "$:/core/ui/ControlPanel/LoadedModules": { "title": "$:/core/ui/ControlPanel/LoadedModules", "tags": "$:/tags/ControlPanel/Advanced", "caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n" }, "$:/core/ui/ControlPanel/Modals/AddPlugins": { "title": "$:/core/ui/ControlPanel/Modals/AddPlugins", "subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}", "text": "\\define install-plugin-actions()\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\">\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\"\"\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[name]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$list filter=\"[<currentTiddler>get[enabled]else[yes]match[yes]]\" variable=\"ignore\">\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n</$list>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[name]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\n" }, "$:/core/ui/ControlPanel/Palette": { "title": "$:/core/ui/ControlPanel/Palette", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/language/ControlPanel/Palette/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n" }, "$:/core/ui/ControlPanel/Parsing": { "title": "$:/core/ui/ControlPanel/Parsing", "tags": "$:/tags/ControlPanel/Advanced", "caption": "{{$:/language/ControlPanel/Parsing/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>" }, "$:/core/ui/ControlPanel/Plugins/Add/Languages": { "title": "$:/core/ui/ControlPanel/Plugins/Add/Languages", "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)", "text": "<<display-server-assets language>>\n" }, "$:/core/ui/ControlPanel/Plugins/Add/Plugins": { "title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins", "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)", "text": "<<display-server-assets plugin>>\n" }, "$:/core/ui/ControlPanel/Plugins/Add/Themes": { "title": "$:/core/ui/ControlPanel/Plugins/Add/Themes", "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)", "text": "<<display-server-assets theme>>\n" }, "$:/core/ui/ControlPanel/Plugins/Add/Updates": { "title": "$:/core/ui/ControlPanel/Plugins/Add/Updates", "caption": "<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>", "text": "\\define each-updateable-plugin(body)\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"[[<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\n" }, "$:/core/ui/ControlPanel/Plugins/AddPlugins": { "title": "$:/core/ui/ControlPanel/Plugins/AddPlugins", "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n" }, "$:/core/ui/ControlPanel/Plugins/Installed/Languages": { "title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages", "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)", "text": "<<plugin-table language>>\n" }, "$:/core/ui/ControlPanel/Plugins/Installed/Plugins": { "title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins", "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)", "text": "<<plugin-table plugin>>\n" }, "$:/core/ui/ControlPanel/Plugins/Installed/Themes": { "title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes", "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)", "text": "<<plugin-table theme>>\n" }, "$:/core/ui/ControlPanel/Plugins": { "title": "$:/core/ui/ControlPanel/Plugins", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Plugins/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[name]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<$macrocall $name=\"tabs\" tabsList=\"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" default=\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\" explicitState=\"$:/state/tab--86143343\"/>\n" }, "$:/core/ui/ControlPanel/Saving/DownloadSaver": { "title": "$:/core/ui/ControlPanel/Saving/DownloadSaver", "tags": "$:/tags/ControlPanel/Saving", "caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n" }, "$:/core/ui/ControlPanel/Saving/General": { "title": "$:/core/ui/ControlPanel/Saving/General", "tags": "$:/tags/ControlPanel/Saving", "caption": "{{$:/language/ControlPanel/Saving/General/Caption}}", "list-before": "", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n" }, "$:/core/ui/ControlPanel/Saving/GitHub": { "title": "$:/core/ui/ControlPanel/Saving/GitHub", "tags": "$:/tags/ControlPanel/Saving", "caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |" }, "$:/core/ui/ControlPanel/Saving/GitLab": { "title": "$:/core/ui/ControlPanel/Saving/GitLab", "tags": "$:/tags/ControlPanel/Saving", "caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |" }, "$:/core/ui/ControlPanel/Saving/TiddlySpot": { "title": "$:/core/ui/ControlPanel/Saving/TiddlySpot", "tags": "$:/tags/ControlPanel/Saving", "caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define siteURL(path)\nhttp://$(userName)$.tiddlyspot.com/$path$/\n\\end\n\\define siteLink(path)\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<siteURL $path$>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<div class=\"tc-message-box\">\n\n<<lingo ReadOnly>>\n\n</div>\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<siteLink backup>> |\n|<<lingo ControlPanel>> |<<siteLink controlpanel>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>\n" }, "$:/core/ui/ControlPanel/Saving/Gitea": { "title": "$:/core/ui/ControlPanel/Saving/Gitea", "tags": "$:/tags/ControlPanel/Saving", "caption": "{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\"/> |\n" }, "$:/core/ui/ControlPanel/Saving": { "title": "$:/core/ui/ControlPanel/Saving", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Saving/Caption}}", "text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Saving/General\" explicitState=\"$:/state/tab-2065006209\"/>\n</div>\n" }, "$:/core/buttonstyles/Borderless": { "title": "$:/core/buttonstyles/Borderless", "tags": "$:/tags/ToolbarButtonStyle", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}", "text": "tc-btn-invisible" }, "$:/core/buttonstyles/Boxed": { "title": "$:/core/buttonstyles/Boxed", "tags": "$:/tags/ToolbarButtonStyle", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}", "text": "tc-btn-boxed" }, "$:/core/buttonstyles/Rounded": { "title": "$:/core/buttonstyles/Rounded", "tags": "$:/tags/ToolbarButtonStyle", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}", "text": "tc-btn-rounded" }, "$:/core/ui/ControlPanel/Settings/CamelCase": { "title": "$:/core/ui/ControlPanel/Settings/CamelCase", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\n" }, "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab": { "title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab", "caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}", "tags": "$:/tags/ControlPanel/Settings", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n" }, "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": { "title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab", "caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}", "tags": "$:/tags/ControlPanel/Settings", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n" }, "$:/core/ui/ControlPanel/Settings/EditorToolbar": { "title": "$:/core/ui/ControlPanel/Settings/EditorToolbar", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n" }, "$:/core/ui/ControlPanel/Settings/InfoPanelMode": { "title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\n" }, "$:/core/ui/ControlPanel/Settings/LinkToBehaviour": { "title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n <option value=\"above\"><<lingo \"OpenAbove\">></option>\n <option value=\"below\"><<lingo \"OpenBelow\">></option>\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n" }, "$:/core/ui/ControlPanel/Settings/MissingLinks": { "title": "$:/core/ui/ControlPanel/Settings/MissingLinks", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\n" }, "$:/core/ui/ControlPanel/Settings/NavigationAddressBar": { "title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n" }, "$:/core/ui/ControlPanel/Settings/NavigationHistory": { "title": "$:/core/ui/ControlPanel/Settings/NavigationHistory", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n" }, "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode": { "title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\n" }, "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation": { "title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n" }, "$:/core/ui/ControlPanel/Settings/TitleLinks": { "title": "$:/core/ui/ControlPanel/Settings/TitleLinks", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n" }, "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": { "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n" }, "$:/core/ui/ControlPanel/Settings/ToolbarButtons": { "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n" }, "$:/core/ui/ControlPanel/Settings": { "title": "$:/core/ui/ControlPanel/Settings", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Settings/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n" }, "$:/core/ui/ControlPanel/StoryView": { "title": "$:/core/ui/ControlPanel/StoryView", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/language/ControlPanel/StoryView/Caption}}", "text": "{{$:/snippets/viewswitcher}}\n" }, "$:/core/ui/ControlPanel/Stylesheets": { "title": "$:/core/ui/ControlPanel/Stylesheets", "tags": "$:/tags/ControlPanel/Advanced", "caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n" }, "$:/core/ui/ControlPanel/Theme": { "title": "$:/core/ui/ControlPanel/Theme", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/language/ControlPanel/Theme/Caption}}", "text": "{{$:/snippets/themeswitcher}}\n" }, "$:/core/ui/ControlPanel/TiddlerFields": { "title": "$:/core/ui/ControlPanel/TiddlerFields", "tags": "$:/tags/ControlPanel/Advanced", "caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}" }, "$:/core/ui/ControlPanel/Toolbars/EditToolbar": { "title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar", "tags": "$:/tags/ControlPanel/Toolbars", "caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>" }, "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": { "title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate", "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n" }, "$:/core/ui/ControlPanel/Toolbars/EditorToolbar": { "title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar", "tags": "$:/tags/ControlPanel/Toolbars", "caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n" }, "$:/core/ui/ControlPanel/Toolbars/ItemTemplate": { "title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate", "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\n" }, "$:/core/ui/ControlPanel/Toolbars/PageControls": { "title": "$:/core/ui/ControlPanel/Toolbars/PageControls", "tags": "$:/tags/ControlPanel/Toolbars", "caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/ControlPanel/Toolbars/ViewToolbar": { "title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar", "tags": "$:/tags/ControlPanel/Toolbars", "caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/ControlPanel/Toolbars": { "title": "$:/core/ui/ControlPanel/Toolbars", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/language/ControlPanel/Toolbars/Caption}}", "text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" class=\"tc-vertical\" explicitState=\"$:/state/tabs/controlpanel/toolbars-1345989671\"/>\n</div>\n" }, "$:/ControlPanel": { "title": "$:/ControlPanel", "icon": "$:/core/images/options-button", "color": "#bbb", "text": "<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Info\" explicitState=\"$:/state/tab-1749438307\"/>\n</div>\n" }, "$:/core/ui/DefaultSearchResultList": { "title": "$:/core/ui/DefaultSearchResultList", "tags": "$:/tags/SearchResults", "caption": "{{$:/language/Search/DefaultResults/Caption}}", "first-search-filter": "[!is[system]search:title<userInput>sort[title]limit[250]]", "second-search-filter": "[!is[system]search<userInput>sort[title]limit[250]]", "text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[first-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[second-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n" }, "$:/core/ui/EditTemplate/body/preview/diffs-current": { "title": "$:/core/ui/EditTemplate/body/preview/diffs-current", "tags": "$:/tags/EditPreview", "caption": "differences from current", "list-after": "$:/core/ui/EditTemplate/body/preview/output", "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n" }, "$:/core/ui/EditTemplate/body/preview/diffs-shadow": { "title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow", "tags": "$:/tags/EditPreview", "caption": "differences from shadow (if any)", "list-after": "$:/core/ui/EditTemplate/body/preview/output", "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n" }, "$:/core/ui/EditTemplate/body/preview/output": { "title": "$:/core/ui/EditTemplate/body/preview/output", "tags": "$:/tags/EditPreview", "caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}", "text": "\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n" }, "$:/state/showeditpreview": { "title": "$:/state/showeditpreview", "text": "no" }, "$:/core/ui/EditTemplate/body/editor": { "title": "$:/core/ui/EditTemplate/body/editor", "text": "<$edit\n\n field=\"text\"\n class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n tabindex={{$:/config/EditTabIndex}}\n focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n cancelPopups=\"yes\"\n\n><$set\n\n name=\"targetTiddler\"\n value=<<currentTiddler>>\n\n><$list\n\n filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n type=\"nomatch\"\n state=<<config-visibility-title>>\n text=\"hide\"\n class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n" }, "$:/core/ui/EditTemplate/body/toolbar/button": { "title": "$:/core/ui/EditTemplate/body/toolbar/button", "text": "\\define toolbar-button-icon()\n<$list\n\n filter=\"[all[current]!has[custom-icon]]\"\n variable=\"no-custom-icon\"\n\n><$transclude\n\n tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n filter={{!!condition}}\n variable=\"list-condition\"\n\n><$wikify\n\n name=\"tooltip-text\"\n text=<<toolbar-button-tooltip>>\n mode=\"inline\"\n output=\"text\"\n\n><$list\n\n filter=\"[all[current]!has[dropdown]]\"\n variable=\"no-dropdown\"\n\n><$button\n\n class=\"tc-btn-invisible $(buttonClasses)$\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button></$list><$list\n\n filter=\"[all[current]has[dropdown]]\"\n variable=\"dropdown\"\n\n><$set\n\n name=\"dropdown-state\"\n value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n popup=<<dropdown-state>>\n class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n selectedClass=\"tc-selected\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button><$reveal\n\n state=<<dropdown-state>>\n type=\"popup\"\n position=\"below\"\n animate=\"yes\"\n tag=\"span\"\n\n><div\n\n class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n tiddler={{!!dropdown}}\n mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n name=\"buttonClasses\"\n value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>" }, "$:/core/ui/EditTemplate/body": { "title": "$:/core/ui/EditTemplate/body", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n" }, "$:/core/ui/EditTemplate/controls": { "title": "$:/core/ui/EditTemplate/controls", "tags": "$:/tags/EditTemplate", "text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n" }, "$:/core/ui/EditTemplate/fields": { "title": "$:/core/ui/EditTemplate/fields", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define current-tiddler-new-field-selector()\n[data-tiddler-title=\"$(currentTiddlerCSSescaped)$\"] .tc-edit-field-add-name-wrapper input\n\\end\n\n\\define new-field-actions()\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\n\\end\n\n\\define delete-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\n\\define cancel-search-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-state-tiddlers>>\n</$list>\n\\end\n\n\\define cancel-search-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newFieldNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define new-field()\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip=<<lingo Fields/Add/Button/Hint>>>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] +[count[]!match[0]] +[then[tc-edit-fields]] ~[[tc-edit-fields tc-edit-fields-small]] }}}>\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$keyboard key=\"((delete-field))\" actions=\"\"\"<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\"\"\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit tc-big-gap-right\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<$vars refreshTitle=<<qualify \"$:/temp/fieldname/refresh\">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>>\n<div class=\"tc-edit-field-add-name-wrapper\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<searchListState>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}\n\t\tfocus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups=\"yes\"\n\t\tconfigTiddlerFilter=\"[[$:/config/EditMode/fieldname-filter]]\" inputCancelActions=<<cancel-search-actions>> />\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n</div>\n<span class=\"tc-edit-field-add-value tc-small-gap-right\">\n<$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}>\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$edit-text tiddler=<<newFieldValueTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</$set>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</$vars>\n</div>\n</$fieldmangler>\n" }, "$:/core/ui/EditTemplate/shadow": { "title": "$:/core/ui/EditTemplate/shadow", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>" }, "$:/core/ui/EditTemplate/tags": { "title": "$:/core/ui/EditTemplate/tags", "tags": "$:/tags/EditTemplate", "text": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:\"tags\")\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view field=\"title\" format=\"text\" />\n<$button class=\"tc-btn-invisible tc-remove-tag-button\"><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[{!!title}]\"/>{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon,tagField:\"tags\")\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\" tagField=<<__tagField__>>/>\n\\end\n\n\\define edit-tags-template(tagField:\"tags\")\n\\whitespace trim\n<div class=\"tc-edit-tags\">\n<$list filter=\"[list[!!$tagField$]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}} tagField=<<__tagField__>>/>\n</$list>\n<$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups=\"yes\">\n<$macrocall $name=\"tag-picker\" tagField=<<__tagField__>>/>\n</$vars>\n</div>\n\\end\n<$set name=\"saveTiddler\" value=<<currentTiddler>>>\n<$macrocall $name=\"edit-tags-template\" tagField=<<tagField>>/>\n</$set>\n" }, "$:/core/ui/EditTemplate/title": { "title": "$:/core/ui/EditTemplate/title", "tags": "$:/tags/EditTemplate", "text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n" }, "$:/core/ui/EditTemplate/type": { "title": "$:/core/ui/EditTemplate/type", "tags": "$:/tags/EditTemplate", "first-search-filter": "[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>]", "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define input-cancel-actions() <$list filter=\"[<storeTitle>get[text]] [<currentTiddler>get[type]] +[limit[1]]\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\"><$action-sendmessage $message=\"tm-remove-field\" $param=\"type\"/><$action-deletetiddler $filter=\"[<typeInputTiddler>] [<refreshTitle>] [<typeSelectionTiddler>]\"/></$list>\n\\whitespace trim\n<$set name=\"refreshTitle\" value=<<qualify \"$:/temp/type-search/refresh\">>>\n<div class=\"tc-edit-type-selector-wrapper\">\n<em class=\"tc-edit tc-big-gap-right\"><<lingo Type/Prompt>></em>\n<div class=\"tc-type-selector-dropdown-wrapper\">\n<div class=\"tc-type-selector\"><$fieldmangler>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups=\"yes\" configTiddlerFilter=\"[[$:/core/ui/EditTemplate/type]]\" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter=\"[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]\"/></$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$set name=\"userInput\" value={{{ [<typeInputTiddler>get[text]] }}}>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search<userInput>]\"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] -[<typeSelectionTiddler>get[text]] +[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"description\"/> (<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"name\"/>)</$link></span>\n</$list>\n</$set>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n</div>\n</div>\n</$set>\n" }, "$:/core/ui/EditTemplate": { "title": "$:/core/ui/EditTemplate", "text": "\\define delete-edittemplate-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<newFieldNameInputTiddler>] [<newFieldNameSelectionTiddler>] [<newTagNameTiddler>] [<newTagNameInputTiddler>] [<newTagNameSelectionTiddler>] [<typeInputTiddler>] [<typeSelectionTiddler>]\"/>\n\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\\define cancel-delete-tiddler-actions(message)\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\end\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\n<$fieldmangler>\n<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify \"$:/temp/NewTagName\">> newFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">> newFieldValueTiddler=<<qualify \"$:/temp/NewFieldValue\">> newFieldNameInputTiddler=<<qualify \"$:/temp/NewFieldName/input\">> newFieldNameSelectionTiddler=<<qualify \"$:/temp/NewFieldName/selected-item\">> newTagNameInputTiddler=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddler=<<qualify \"$:/temp/NewTagName/selected-item\">> typeInputTiddler=<<qualify \"$:/temp/Type/input\">> typeSelectionTiddler=<<qualify \"$:/temp/Type/selected-item\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" actions=<<cancel-delete-tiddler-actions \"cancel\">>>\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\n</div>\n" }, "$:/core/ui/Buttons/cancel": { "title": "$:/core/ui/Buttons/cancel", "tags": "$:/tags/EditToolbar", "caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}", "description": "{{$:/language/Buttons/Cancel/Hint}}", "text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"cancel\">> tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>\n" }, "$:/core/ui/Buttons/delete": { "title": "$:/core/ui/Buttons/delete", "tags": "$:/tags/EditToolbar $:/tags/ViewToolbar", "caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}", "description": "{{$:/language/Buttons/Delete/Hint}}", "text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"delete\">> tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>\n" }, "$:/core/ui/Buttons/save": { "title": "$:/core/ui/Buttons/save", "tags": "$:/tags/EditToolbar", "caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}", "description": "{{$:/language/Buttons/Save/Hint}}", "text": "\\define save-tiddler-button()\n\\whitespace trim\n<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<<save-tiddler-actions>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n\\end\n<<save-tiddler-button>>\n" }, "$:/core/ui/EditorToolbar/bold": { "title": "$:/core/ui/EditorToolbar/bold", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/bold", "caption": "{{$:/language/Buttons/Bold/Caption}}", "description": "{{$:/language/Buttons/Bold/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((bold))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n" }, "$:/core/ui/EditorToolbar/clear-dropdown": { "title": "$:/core/ui/EditorToolbar/clear-dropdown", "text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n" }, "$:/core/ui/EditorToolbar/clear": { "title": "$:/core/ui/EditorToolbar/clear", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/erase", "caption": "{{$:/language/Buttons/Clear/Caption}}", "description": "{{$:/language/Buttons/Clear/Hint}}", "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]", "dropdown": "$:/core/ui/EditorToolbar/clear-dropdown", "text": "" }, "$:/core/ui/EditorToolbar/editor-height-dropdown": { "title": "$:/core/ui/EditorToolbar/editor-height-dropdown", "text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n" }, "$:/core/ui/EditorToolbar/editor-height": { "title": "$:/core/ui/EditorToolbar/editor-height", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/fixed-height", "custom-icon": "yes", "caption": "{{$:/language/Buttons/EditorHeight/Caption}}", "description": "{{$:/language/Buttons/EditorHeight/Hint}}", "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]", "dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown", "text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n" }, "$:/core/ui/EditorToolbar/excise-dropdown": { "title": "$:/core/ui/EditorToolbar/excise-dropdown", "text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n" }, "$:/core/ui/EditorToolbar/excise": { "title": "$:/core/ui/EditorToolbar/excise", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/excise", "caption": "{{$:/language/Buttons/Excise/Caption}}", "description": "{{$:/language/Buttons/Excise/Hint}}", "condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]", "shortcuts": "((excise))", "dropdown": "$:/core/ui/EditorToolbar/excise-dropdown", "text": "" }, "$:/core/ui/EditorToolbar/heading-1": { "title": "$:/core/ui/EditorToolbar/heading-1", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/heading-1", "caption": "{{$:/language/Buttons/Heading1/Caption}}", "description": "{{$:/language/Buttons/Heading1/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "button-classes": "tc-text-editor-toolbar-item-start-group", "shortcuts": "((heading-1))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n" }, "$:/core/ui/EditorToolbar/heading-2": { "title": "$:/core/ui/EditorToolbar/heading-2", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/heading-2", "caption": "{{$:/language/Buttons/Heading2/Caption}}", "description": "{{$:/language/Buttons/Heading2/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((heading-2))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n" }, "$:/core/ui/EditorToolbar/heading-3": { "title": "$:/core/ui/EditorToolbar/heading-3", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/heading-3", "caption": "{{$:/language/Buttons/Heading3/Caption}}", "description": "{{$:/language/Buttons/Heading3/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((heading-3))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n" }, "$:/core/ui/EditorToolbar/heading-4": { "title": "$:/core/ui/EditorToolbar/heading-4", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/heading-4", "caption": "{{$:/language/Buttons/Heading4/Caption}}", "description": "{{$:/language/Buttons/Heading4/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((heading-4))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n" }, "$:/core/ui/EditorToolbar/heading-5": { "title": "$:/core/ui/EditorToolbar/heading-5", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/heading-5", "caption": "{{$:/language/Buttons/Heading5/Caption}}", "description": "{{$:/language/Buttons/Heading5/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((heading-5))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n" }, "$:/core/ui/EditorToolbar/heading-6": { "title": "$:/core/ui/EditorToolbar/heading-6", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/heading-6", "caption": "{{$:/language/Buttons/Heading6/Caption}}", "description": "{{$:/language/Buttons/Heading6/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((heading-6))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n" }, "$:/core/ui/EditorToolbar/italic": { "title": "$:/core/ui/EditorToolbar/italic", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/italic", "caption": "{{$:/language/Buttons/Italic/Caption}}", "description": "{{$:/language/Buttons/Italic/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((italic))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n" }, "$:/core/ui/EditorToolbar/line-width-dropdown": { "title": "$:/core/ui/EditorToolbar/line-width-dropdown", "text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n" }, "$:/core/ui/EditorToolbar/line-width": { "title": "$:/core/ui/EditorToolbar/line-width", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/line-width", "caption": "{{$:/language/Buttons/LineWidth/Caption}}", "description": "{{$:/language/Buttons/LineWidth/Hint}}", "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]", "dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown", "text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>\n" }, "$:/core/ui/EditorToolbar/link-dropdown": { "title": "$:/core/ui/EditorToolbar/link-dropdown", "text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $filter=\"[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\\end\n\n\\define get-focus-selector() [data-tiddler-title=\"$(cssEscapedTitle)$\"] .tc-create-wikitext-link input\n\n\\define cancel-search-actions-inner()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}><$list filter=\"[<searchTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/></$list></$set>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<storeTitle>!has[text]] +[<searchTiddler>!has[text]]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\"><$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"wrap-selection\" prefix=\"\" suffix=\"\"/></$list>\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" searchListState=<<qualify \"$:/temp/link-search/selected-item\">> refreshTitle=<<qualify \"$:/temp/link-search/refresh\">> storeTitle=<<qualify \"$:/temp/link-search/input\">>>\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">> class=\"tc-create-wikitext-link\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>>\n\t\tselectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type=\"search\" filterMinLength=\"1\"\n\t\ttag=\"input\" focus=\"true\" class=\"tc-popup-handle\" inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default=\"\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\" />\n</$keyboard>\n</$keyboard>\n<$reveal tag=\"span\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<<cancel-search-actions>><$set name=\"cssEscapedTitle\" value={{{ [<storyTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-focus-selector>>/></$set>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$vars>\n\n<$reveal tag=\"div\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n<$vars userInput={{{ [<storeTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>\n" }, "$:/core/ui/EditorToolbar/link": { "title": "$:/core/ui/EditorToolbar/link", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/link", "caption": "{{$:/language/Buttons/Link/Caption}}", "description": "{{$:/language/Buttons/Link/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "button-classes": "tc-text-editor-toolbar-item-start-group", "shortcuts": "((link))", "dropdown": "$:/core/ui/EditorToolbar/link-dropdown", "text": "" }, "$:/core/ui/EditorToolbar/linkify": { "title": "$:/core/ui/EditorToolbar/linkify", "caption": "{{$:/language/Buttons/Linkify/Caption}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "description": "{{$:/language/Buttons/Linkify/Hint}}", "icon": "$:/core/images/linkify", "list-before": "$:/core/ui/EditorToolbar/mono-block", "shortcuts": "((linkify))", "tags": "$:/tags/EditorToolbar", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n" }, "$:/core/ui/EditorToolbar/list-bullet": { "title": "$:/core/ui/EditorToolbar/list-bullet", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/list-bullet", "caption": "{{$:/language/Buttons/ListBullet/Caption}}", "description": "{{$:/language/Buttons/ListBullet/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((list-bullet))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n" }, "$:/core/ui/EditorToolbar/list-number": { "title": "$:/core/ui/EditorToolbar/list-number", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/list-number", "caption": "{{$:/language/Buttons/ListNumber/Caption}}", "description": "{{$:/language/Buttons/ListNumber/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((list-number))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n" }, "$:/core/ui/EditorToolbar/mono-block": { "title": "$:/core/ui/EditorToolbar/mono-block", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/mono-block", "caption": "{{$:/language/Buttons/MonoBlock/Caption}}", "description": "{{$:/language/Buttons/MonoBlock/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "button-classes": "tc-text-editor-toolbar-item-start-group", "shortcuts": "((mono-block))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n" }, "$:/core/ui/EditorToolbar/mono-line": { "title": "$:/core/ui/EditorToolbar/mono-line", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/mono-line", "caption": "{{$:/language/Buttons/MonoLine/Caption}}", "description": "{{$:/language/Buttons/MonoLine/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((mono-line))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n" }, "$:/core/ui/EditorToolbar/more-dropdown": { "title": "$:/core/ui/EditorToolbar/more-dropdown", "text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n" }, "$:/core/ui/EditorToolbar/more": { "title": "$:/core/ui/EditorToolbar/more", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/down-arrow", "caption": "{{$:/language/Buttons/More/Caption}}", "description": "{{$:/language/Buttons/More/Hint}}", "condition": "[<targetTiddler>]", "dropdown": "$:/core/ui/EditorToolbar/more-dropdown", "text": "" }, "$:/core/ui/EditorToolbar/opacity-dropdown": { "title": "$:/core/ui/EditorToolbar/opacity-dropdown", "text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/EditorToolbar/opacity": { "title": "$:/core/ui/EditorToolbar/opacity", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/opacity", "caption": "{{$:/language/Buttons/Opacity/Caption}}", "description": "{{$:/language/Buttons/Opacity/Hint}}", "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]", "dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown", "text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n" }, "$:/core/ui/EditorToolbar/paint-dropdown": { "title": "$:/core/ui/EditorToolbar/paint-dropdown", "text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n" }, "$:/core/ui/EditorToolbar/paint": { "title": "$:/core/ui/EditorToolbar/paint", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/paint", "caption": "{{$:/language/Buttons/Paint/Caption}}", "description": "{{$:/language/Buttons/Paint/Hint}}", "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]", "dropdown": "$:/core/ui/EditorToolbar/paint-dropdown", "text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n" }, "$:/core/ui/EditorToolbar/picture-dropdown": { "title": "$:/core/ui/EditorToolbar/picture-dropdown", "text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n" }, "$:/core/ui/EditorToolbar/picture": { "title": "$:/core/ui/EditorToolbar/picture", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/picture", "caption": "{{$:/language/Buttons/Picture/Caption}}", "description": "{{$:/language/Buttons/Picture/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((picture))", "dropdown": "$:/core/ui/EditorToolbar/picture-dropdown", "text": "" }, "$:/core/ui/EditorToolbar/preview-type-dropdown": { "title": "$:/core/ui/EditorToolbar/preview-type-dropdown", "text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n" }, "$:/core/ui/EditorToolbar/preview-type": { "title": "$:/core/ui/EditorToolbar/preview-type", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/chevron-down", "caption": "{{$:/language/Buttons/PreviewType/Caption}}", "description": "{{$:/language/Buttons/PreviewType/Hint}}", "condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]", "button-classes": "tc-text-editor-toolbar-item-adjunct", "dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown" }, "$:/core/ui/EditorToolbar/preview": { "title": "$:/core/ui/EditorToolbar/preview", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/preview-open", "custom-icon": "yes", "caption": "{{$:/language/Buttons/Preview/Caption}}", "description": "{{$:/language/Buttons/Preview/Hint}}", "condition": "[<targetTiddler>]", "button-classes": "tc-text-editor-toolbar-item-start-group", "shortcuts": "((preview))", "text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n" }, "$:/core/ui/EditorToolbar/quote": { "title": "$:/core/ui/EditorToolbar/quote", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/quote", "caption": "{{$:/language/Buttons/Quote/Caption}}", "description": "{{$:/language/Buttons/Quote/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((quote))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n" }, "$:/core/ui/EditorToolbar/rotate-left": { "title": "$:/core/ui/EditorToolbar/rotate-left", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/rotate-left", "caption": "{{$:/language/Buttons/RotateLeft/Caption}}", "description": "{{$:/language/Buttons/RotateLeft/Hint}}", "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]", "text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n" }, "$:/core/ui/EditorToolbar/size-dropdown": { "title": "$:/core/ui/EditorToolbar/size-dropdown", "text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> × <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n" }, "$:/core/ui/EditorToolbar/size": { "title": "$:/core/ui/EditorToolbar/size", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/size", "caption": "{{$:/language/Buttons/Size/Caption}}", "description": "{{$:/language/Buttons/Size/Hint}}", "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]", "dropdown": "$:/core/ui/EditorToolbar/size-dropdown", "text": "" }, "$:/core/ui/EditorToolbar/stamp-dropdown": { "title": "$:/core/ui/EditorToolbar/stamp-dropdown", "text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" />\n\n</$transclude>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n" }, "$:/core/ui/EditorToolbar/stamp": { "title": "$:/core/ui/EditorToolbar/stamp", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/stamp", "caption": "{{$:/language/Buttons/Stamp/Caption}}", "description": "{{$:/language/Buttons/Stamp/Hint}}", "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]", "shortcuts": "((stamp))", "dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown", "text": "" }, "$:/core/ui/EditorToolbar/strikethrough": { "title": "$:/core/ui/EditorToolbar/strikethrough", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/strikethrough", "caption": "{{$:/language/Buttons/Strikethrough/Caption}}", "description": "{{$:/language/Buttons/Strikethrough/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((strikethrough))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n" }, "$:/core/ui/EditorToolbar/subscript": { "title": "$:/core/ui/EditorToolbar/subscript", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/subscript", "caption": "{{$:/language/Buttons/Subscript/Caption}}", "description": "{{$:/language/Buttons/Subscript/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((subscript))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n" }, "$:/core/ui/EditorToolbar/superscript": { "title": "$:/core/ui/EditorToolbar/superscript", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/superscript", "caption": "{{$:/language/Buttons/Superscript/Caption}}", "description": "{{$:/language/Buttons/Superscript/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((superscript))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n" }, "$:/core/ui/EditorToolbar/transcludify": { "title": "$:/core/ui/EditorToolbar/transcludify", "caption": "{{$:/language/Buttons/Transcludify/Caption}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "description": "{{$:/language/Buttons/Transcludify/Hint}}", "icon": "$:/core/images/transcludify", "list-before": "$:/core/ui/EditorToolbar/mono-block", "shortcuts": "((transcludify))", "tags": "$:/tags/EditorToolbar", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n" }, "$:/core/ui/EditorToolbar/underline": { "title": "$:/core/ui/EditorToolbar/underline", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/underline", "caption": "{{$:/language/Buttons/Underline/Caption}}", "description": "{{$:/language/Buttons/Underline/Hint}}", "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]", "shortcuts": "((underline))", "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\n" }, "$:/core/Filters/AllTags": { "title": "$:/core/Filters/AllTags", "tags": "$:/tags/Filter", "filter": "[tags[]!is[system]sort[title]]", "description": "{{$:/language/Filters/AllTags}}", "text": "" }, "$:/core/Filters/AllTiddlers": { "title": "$:/core/Filters/AllTiddlers", "tags": "$:/tags/Filter", "filter": "[!is[system]sort[title]]", "description": "{{$:/language/Filters/AllTiddlers}}", "text": "" }, "$:/core/Filters/Drafts": { "title": "$:/core/Filters/Drafts", "tags": "$:/tags/Filter", "filter": "[has[draft.of]sort[title]]", "description": "{{$:/language/Filters/Drafts}}", "text": "" }, "$:/core/Filters/Missing": { "title": "$:/core/Filters/Missing", "tags": "$:/tags/Filter", "filter": "[all[missing]sort[title]]", "description": "{{$:/language/Filters/Missing}}", "text": "" }, "$:/core/Filters/Orphans": { "title": "$:/core/Filters/Orphans", "tags": "$:/tags/Filter", "filter": "[all[orphans]sort[title]]", "description": "{{$:/language/Filters/Orphans}}", "text": "" }, "$:/core/Filters/OverriddenShadowTiddlers": { "title": "$:/core/Filters/OverriddenShadowTiddlers", "tags": "$:/tags/Filter", "filter": "[is[shadow]]", "description": "{{$:/language/Filters/OverriddenShadowTiddlers}}", "text": "" }, "$:/core/Filters/RecentSystemTiddlers": { "title": "$:/core/Filters/RecentSystemTiddlers", "tags": "$:/tags/Filter", "filter": "[has[modified]!sort[modified]limit[50]]", "description": "{{$:/language/Filters/RecentSystemTiddlers}}", "text": "" }, "$:/core/Filters/RecentTiddlers": { "title": "$:/core/Filters/RecentTiddlers", "tags": "$:/tags/Filter", "filter": "[!is[system]has[modified]!sort[modified]limit[50]]", "description": "{{$:/language/Filters/RecentTiddlers}}", "text": "" }, "$:/core/Filters/SessionTiddlers": { "title": "$:/core/Filters/SessionTiddlers", "tags": "$:/tags/Filter", "filter": "[haschanged[]]", "description": "{{$:/language/Filters/SessionTiddlers}}", "text": "" }, "$:/core/Filters/ShadowTiddlers": { "title": "$:/core/Filters/ShadowTiddlers", "tags": "$:/tags/Filter", "filter": "[all[shadows]sort[title]]", "description": "{{$:/language/Filters/ShadowTiddlers}}", "text": "" }, "$:/core/Filters/StoryList": { "title": "$:/core/Filters/StoryList", "tags": "$:/tags/Filter", "filter": "[list[$:/StoryList]] -$:/AdvancedSearch", "description": "{{$:/language/Filters/StoryList}}", "text": "" }, "$:/core/Filters/SystemTags": { "title": "$:/core/Filters/SystemTags", "tags": "$:/tags/Filter", "filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]", "description": "{{$:/language/Filters/SystemTags}}", "text": "" }, "$:/core/Filters/SystemTiddlers": { "title": "$:/core/Filters/SystemTiddlers", "tags": "$:/tags/Filter", "filter": "[is[system]sort[title]]", "description": "{{$:/language/Filters/SystemTiddlers}}", "text": "" }, "$:/core/Filters/TypedTiddlers": { "title": "$:/core/Filters/TypedTiddlers", "tags": "$:/tags/Filter", "filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]", "description": "{{$:/language/Filters/TypedTiddlers}}", "text": "" }, "$:/core/ui/ImportListing": { "title": "$:/core/ui/ImportListing", "text": "\\define lingo-base() $:/language/Import/\n\n\\define messageField() message-$(payloadTiddler)$\n\n\\define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]\n\n\\define overWriteWarning()\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\">\n<$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/>\n</$list>\n\\end\n\n\\define selectionField() selection-$(payloadTiddler)$\n\n\\define renameField() rename-$(payloadTiddler)$\n\n\\define suppressedField() suppressed-$(payloadTiddler)$\n\n\\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$\n\n\\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$\n\n\\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table class=\"tc-import-table\">\n<tbody>\n<tr>\n<th align=\"left\">\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr class={{{[<currentTiddler>has<suppressedField>then[tc-row-disabled]] ~[subfilter<payloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\" tag=\"div\" class=\"tc-flex\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break\" set=<<previewPopupState>> setTo=\"yes\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}>\n<span class=\"tc-small-gap-right\">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"yes\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button></$list>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n<span class=\"tc-small-gap-right\">{{$:/core/images/down-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$text text={{{[<lingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n<<overWriteWarning>>\n</td>\n</tr>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"tr\">\n<td colspan=\"3\">\n<div class=\"tc-flex\">\n<$edit-text tiddler=<<newImportTitleTiddler>> default={{{[subfilter<payloadTitleFilter>]}}} tag=\"input\" class=\"tc-import-rename tc-flex-grow-1\"/><span class=\"tc-small-gap-left\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button><span class=\"tc-small-gap-right\"/></span><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button>\n</div>\n</td>\n</$reveal>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n" }, "$:/core/ui/ImportPreviews/Diff": { "title": "$:/core/ui/ImportPreviews/Diff", "tags": "$:/tags/ImportPreview", "caption": "{{$:/language/Import/Listing/Preview/Diff}}", "text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n" }, "$:/core/ui/ImportPreviews/DiffFields": { "title": "$:/core/ui/ImportPreviews/DiffFields", "tags": "$:/tags/ImportPreview", "caption": "{{$:/language/Import/Listing/Preview/DiffFields}}", "text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n" }, "$:/core/ui/ImportPreviews/Fields": { "title": "$:/core/ui/ImportPreviews/Fields", "tags": "$:/tags/ImportPreview", "caption": "{{$:/language/Import/Listing/Preview/Fields}}", "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n" }, "$:/core/ui/ImportPreviews/Text": { "title": "$:/core/ui/ImportPreviews/Text", "tags": "$:/tags/ImportPreview", "caption": "{{$:/language/Import/Listing/Preview/Text}}", "text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n" }, "$:/core/ui/ImportPreviews/TextRaw": { "title": "$:/core/ui/ImportPreviews/TextRaw", "tags": "$:/tags/ImportPreview", "caption": "{{$:/language/Import/Listing/Preview/TextRaw}}", "text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>" }, "$:/core/ui/KeyboardShortcuts/advanced-search": { "title": "$:/core/ui/KeyboardShortcuts/advanced-search", "tags": "$:/tags/KeyboardShortcut", "key": "((advanced-search))", "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/>\n</$navigator>\n" }, "$:/core/ui/KeyboardShortcuts/change-sidebar-layout": { "title": "$:/core/ui/KeyboardShortcuts/change-sidebar-layout", "tags": "$:/tags/KeyboardShortcut", "key": "((change-sidebar-layout))", "text": "<$list filter=\"[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]\" \nemptyMessage=\"\"\"<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fixed-fluid\"/>\"\"\">\n<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fluid-fixed\"/>\n</$list>\n" }, "$:/core/ui/KeyboardShortcuts/new-image": { "title": "$:/core/ui/KeyboardShortcuts/new-image", "tags": "$:/tags/KeyboardShortcut", "key": "((new-image))", "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n" }, "$:/core/ui/KeyboardShortcuts/new-journal": { "title": "$:/core/ui/KeyboardShortcuts/new-journal", "tags": "$:/tags/KeyboardShortcut", "key": "((new-journal))", "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n" }, "$:/core/ui/KeyboardShortcuts/new-tiddler": { "title": "$:/core/ui/KeyboardShortcuts/new-tiddler", "tags": "$:/tags/KeyboardShortcut", "key": "((new-tiddler))", "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n" }, "$:/core/ui/KeyboardShortcuts/save-wiki": { "title": "$:/core/ui/KeyboardShortcuts/save-wiki", "tags": "$:/tags/KeyboardShortcut", "key": "((save-wiki))", "text": "<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n" }, "$:/core/ui/KeyboardShortcuts/sidebar-search": { "title": "$:/core/ui/KeyboardShortcuts/sidebar-search", "tags": "$:/tags/KeyboardShortcut", "key": "((sidebar-search))", "text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n" }, "$:/core/ui/KeyboardShortcuts/switcher": { "title": "$:/core/ui/KeyboardShortcuts/switcher", "tags": "$:/tags/KeyboardShortcut", "key": "((layout-switcher))", "text": "<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>" }, "$:/core/ui/KeyboardShortcuts/toggle-sidebar": { "title": "$:/core/ui/KeyboardShortcuts/toggle-sidebar", "tags": "$:/tags/KeyboardShortcut", "key": "((toggle-sidebar))", "text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n" }, "$:/snippets/LayoutSwitcher": { "title": "$:/snippets/LayoutSwitcher", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/language/ControlPanel/LayoutSwitcher/Caption}}", "text": "<$linkcatcher to=\"$:/layout\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]\">\n<$list filter=\"[{$:/layout}!has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/layout}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n\"\"\">\n<$set name=\"cls\" filter=\"[all[current]field:title[$:/core/ui/PageTemplate]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n</$list>\n</$list>\n</div>\n</$linkcatcher>\n" }, "$:/core/ui/ListItemTemplate": { "title": "$:/core/ui/ListItemTemplate", "text": "<div class=\"tc-menu-list-item\">\n<$link />\n</div>" }, "$:/Manager/ItemMain/Fields": { "title": "$:/Manager/ItemMain/Fields", "tags": "$:/tags/Manager/ItemMain", "caption": "{{$:/language/Manager/Item/Fields}}", "text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n" }, "$:/Manager/ItemMain/RawText": { "title": "$:/Manager/ItemMain/RawText", "tags": "$:/tags/Manager/ItemMain", "caption": "{{$:/language/Manager/Item/RawText}}", "text": "<pre><code><$view/></code></pre>\n" }, "$:/Manager/ItemMain/WikifiedText": { "title": "$:/Manager/ItemMain/WikifiedText", "tags": "$:/tags/Manager/ItemMain", "caption": "{{$:/language/Manager/Item/WikifiedText}}", "text": "<$transclude mode=\"block\"/>\n" }, "$:/Manager/ItemSidebar/Colour": { "title": "$:/Manager/ItemSidebar/Colour", "tags": "$:/tags/Manager/ItemSidebar", "caption": "{{$:/language/Manager/Item/Colour}}", "text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n" }, "$:/Manager/ItemSidebar/Icon": { "title": "$:/Manager/ItemSidebar/Icon", "tags": "$:/tags/Manager/ItemSidebar", "caption": "{{$:/language/Manager/Item/Icon}}", "text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n" }, "$:/Manager/ItemSidebar/Tags": { "title": "$:/Manager/ItemSidebar/Tags", "tags": "$:/tags/Manager/ItemSidebar", "caption": "{{$:/language/Manager/Item/Tags}}", "text": "\\whitespace trim\n\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\" storyview=\"pop\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$fieldmangler>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</$fieldmangler>\n</p>\n" }, "$:/Manager/ItemSidebar/Tools": { "title": "$:/Manager/ItemSidebar/Tools", "tags": "$:/tags/Manager/ItemSidebar", "caption": "{{$:/language/Manager/Item/Tools}}", "text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n" }, "$:/Manager": { "title": "$:/Manager", "icon": "$:/core/images/list", "color": "#bbb", "text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n" }, "$:/core/ui/MissingTemplate": { "title": "$:/core/ui/MissingTemplate", "text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n" }, "$:/core/ui/MoreSideBar/All": { "title": "$:/core/ui/MoreSideBar/All", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/All/Caption}}", "text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Drafts": { "title": "$:/core/ui/MoreSideBar/Drafts", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Drafts/Caption}}", "text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Explorer": { "title": "$:/core/ui/MoreSideBar/Explorer", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Explorer/Caption}}", "text": "<<tree \"$:/\">>\n" }, "$:/core/ui/MoreSideBar/Missing": { "title": "$:/core/ui/MoreSideBar/Missing", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Missing/Caption}}", "text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Orphans": { "title": "$:/core/ui/MoreSideBar/Orphans", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Orphans/Caption}}", "text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Plugins": { "title": "$:/core/ui/MoreSideBar/Plugins", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/ControlPanel/Plugins/Caption}}", "text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" default=\"$:/core/ui/MoreSideBar/Plugins/Plugins\" explicitState=\"$:/state/tab-1163638994\"/>\n" }, "$:/core/ui/MoreSideBar/Recent": { "title": "$:/core/ui/MoreSideBar/Recent", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Recent/Caption}}", "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n" }, "$:/core/ui/MoreSideBar/Shadows": { "title": "$:/core/ui/MoreSideBar/Shadows", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Shadows/Caption}}", "text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/System": { "title": "$:/core/ui/MoreSideBar/System", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/System/Caption}}", "text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Tags": { "title": "$:/core/ui/MoreSideBar/Tags", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Tags/Caption}}", "text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n" }, "$:/core/ui/MoreSideBar/Types": { "title": "$:/core/ui/MoreSideBar/Types", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Types/Caption}}", "text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n" }, "$:/core/ui/MoreSideBar/Plugins/Languages": { "title": "$:/core/ui/MoreSideBar/Plugins/Languages", "tags": "$:/tags/MoreSideBar/Plugins", "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}", "text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n" }, "$:/core/ui/MoreSideBar/Plugins/Plugins": { "title": "$:/core/ui/MoreSideBar/Plugins/Plugins", "tags": "$:/tags/MoreSideBar/Plugins", "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}", "text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n" }, "$:/core/ui/MoreSideBar/Plugins/Theme": { "title": "$:/core/ui/MoreSideBar/Plugins/Theme", "tags": "$:/tags/MoreSideBar/Plugins", "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}", "text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n" }, "$:/core/ui/Buttons/advanced-search": { "title": "$:/core/ui/Buttons/advanced-search", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}", "description": "{{$:/language/Buttons/AdvancedSearch/Hint}}", "text": "\\whitespace trim\n\\define advanced-search-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<advanced-search-button>>>\n<<advanced-search-button \"tc-selected\">>\n</$list>\n" }, "$:/core/ui/Buttons/close-all": { "title": "$:/core/ui/Buttons/close-all", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}", "description": "{{$:/language/Buttons/CloseAll/Hint}}", "text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/control-panel": { "title": "$:/core/ui/Buttons/control-panel", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}", "description": "{{$:/language/Buttons/ControlPanel/Hint}}", "text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n" }, "$:/core/ui/Buttons/encryption": { "title": "$:/core/ui/Buttons/encryption", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}", "description": "{{$:/language/Buttons/Encryption/Hint}}", "text": "\\whitespace trim\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n" }, "$:/core/ui/Buttons/export-page": { "title": "$:/core/ui/Buttons/export-page", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}", "description": "{{$:/language/Buttons/ExportPage/Hint}}", "text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>" }, "$:/core/ui/Buttons/fold-all": { "title": "$:/core/ui/Buttons/fold-all", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}", "description": "{{$:/language/Buttons/FoldAll/Hint}}", "text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/full-screen": { "title": "$:/core/ui/Buttons/full-screen", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}", "description": "{{$:/language/Buttons/FullScreen/Hint}}", "text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/home": { "title": "$:/core/ui/Buttons/home", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}", "description": "{{$:/language/Buttons/Home/Hint}}", "text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/import": { "title": "$:/core/ui/Buttons/import", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}", "description": "{{$:/language/Buttons/Import/Hint}}", "text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>" }, "$:/core/ui/Buttons/language": { "title": "$:/core/ui/Buttons/language", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}", "description": "{{$:/language/Buttons/Language/Hint}}", "text": "\\whitespace trim\n\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n" }, "$:/core/ui/Buttons/manager": { "title": "$:/core/ui/Buttons/manager", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}", "description": "{{$:/language/Buttons/Manager/Hint}}", "text": "\\whitespace trim\n\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n" }, "$:/core/ui/Buttons/more-page-actions": { "title": "$:/core/ui/Buttons/more-page-actions", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}", "description": "{{$:/language/Buttons/More/Hint}}", "text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>" }, "$:/core/ui/Buttons/new-image": { "title": "$:/core/ui/Buttons/new-image", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}", "description": "{{$:/language/Buttons/NewImage/Hint}}", "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n" }, "$:/core/ui/Buttons/new-journal": { "title": "$:/core/ui/Buttons/new-journal", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}", "description": "{{$:/language/Buttons/NewJournal/Hint}}", "text": "\\whitespace trim\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n" }, "$:/core/ui/Buttons/new-tiddler": { "title": "$:/core/ui/Buttons/new-tiddler", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}", "description": "{{$:/language/Buttons/NewTiddler/Hint}}", "text": "\\whitespace trim\n<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n" }, "$:/core/ui/Buttons/palette": { "title": "$:/core/ui/Buttons/palette", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}", "description": "{{$:/language/Buttons/Palette/Hint}}", "text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>\n" }, "$:/core/ui/Buttons/print": { "title": "$:/core/ui/Buttons/print", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}", "description": "{{$:/language/Buttons/Print/Hint}}", "text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/refresh": { "title": "$:/core/ui/Buttons/refresh", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}", "description": "{{$:/language/Buttons/Refresh/Hint}}", "text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/save-wiki": { "title": "$:/core/ui/Buttons/save-wiki", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}", "description": "{{$:/language/Buttons/SaveWiki/Hint}}", "text": "<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>" }, "$:/core/ui/Buttons/storyview": { "title": "$:/core/ui/Buttons/storyview", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}", "description": "{{$:/language/Buttons/StoryView/Hint}}", "text": "\\whitespace trim\n\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n" }, "$:/core/ui/Buttons/tag-manager": { "title": "$:/core/ui/Buttons/tag-manager", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}", "description": "{{$:/language/Buttons/TagManager/Hint}}", "text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n" }, "$:/core/ui/Buttons/theme": { "title": "$:/core/ui/Buttons/theme", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}", "description": "{{$:/language/Buttons/Theme/Hint}}", "text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n" }, "$:/core/ui/Buttons/timestamp": { "title": "$:/core/ui/Buttons/timestamp", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}", "description": "{{$:/language/Buttons/Timestamp/Hint}}", "text": "\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n" }, "$:/core/ui/Buttons/unfold-all": { "title": "$:/core/ui/Buttons/unfold-all", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}", "description": "{{$:/language/Buttons/UnfoldAll/Hint}}", "text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/PageTemplate/pagecontrols": { "title": "$:/core/ui/PageTemplate/pagecontrols", "text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n" }, "$:/core/ui/PageStylesheet": { "title": "$:/core/ui/PageStylesheet", "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/PageTemplate/alerts": { "title": "$:/core/ui/PageTemplate/alerts", "tags": "$:/tags/PageTemplate", "text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n" }, "$:/core/ui/PageTemplate/drafts": { "title": "$:/core/ui/PageTemplate/drafts", "tags": "$:/tags/PageTemplate", "text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n" }, "$:/core/ui/PageTemplate/pluginreloadwarning": { "title": "$:/core/ui/PageTemplate/pluginreloadwarning", "tags": "$:/tags/PageTemplate", "text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n" }, "$:/core/ui/PageTemplate/sidebar": { "title": "$:/core/ui/PageTemplate/sidebar", "tags": "$:/tags/PageTemplate", "text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\" tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n" }, "$:/core/ui/PageTemplate/story": { "title": "$:/core/ui/PageTemplate/story", "tags": "$:/tags/PageTemplate", "text": "\\whitespace trim\n<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n" }, "$:/core/ui/PageTemplate/topleftbar": { "title": "$:/core/ui/PageTemplate/topleftbar", "tags": "$:/tags/PageTemplate", "text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n" }, "$:/core/ui/PageTemplate/toprightbar": { "title": "$:/core/ui/PageTemplate/toprightbar", "tags": "$:/tags/PageTemplate", "text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n" }, "$:/core/ui/PageTemplate": { "title": "$:/core/ui/PageTemplate", "name": "{{$:/language/PageTemplate/Name}}", "description": "{{$:/language/PageTemplate/Description}}", "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$vars>\n" }, "$:/PaletteManager": { "title": "$:/PaletteManager", "text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label=<<lingo Delete/Hint>> class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"><span class=\"tc-small-gap-left\"><<lingo Names/External/Show>></span></$checkbox>\n\n<<palette-manager-table>>\n" }, "$:/core/ui/PluginInfo": { "title": "$:/core/ui/PluginInfo", "text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n" }, "$:/core/ui/PluginInfo/Default/contents": { "title": "$:/core/ui/PluginInfo/Default/contents", "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n" }, "$:/core/ui/PluginListItemTemplate": { "title": "$:/core/ui/PluginListItemTemplate", "text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}><$view field=\"description\"><$view field=\"title\"/></$view></$link>\n</div>" }, "$:/core/ui/RootTemplate": { "title": "$:/core/ui/RootTemplate", "text": "<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode=\"inline\"/>\n\n" }, "$:/core/ui/SearchResults": { "title": "$:/core/ui/SearchResults", "text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/sidebar\"/>\n\n</$list>\n\n</div>\n" }, "$:/core/ui/SideBar/More": { "title": "$:/core/ui/SideBar/More", "tags": "$:/tags/SideBar", "caption": "{{$:/language/SideBar/More/Caption}}", "text": "<div class=\"tc-more-sidebar\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical tc-sidebar-tabs-more\" explicitState=\"$:/state/tab/moresidebar-1850697562\"/>\n</div>\n" }, "$:/core/ui/SideBar/Open": { "title": "$:/core/ui/SideBar/Open", "tags": "$:/tags/SideBar", "caption": "{{$:/language/SideBar/Open/Caption}}", "text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini tc-small-gap-right\">{{$:/core/images/close-button}}</$button><$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n" }, "$:/core/ui/SideBar/Recent": { "title": "$:/core/ui/SideBar/Recent", "tags": "$:/tags/SideBar", "caption": "{{$:/language/SideBar/Recent/Caption}}", "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n" }, "$:/core/ui/SideBar/Tools": { "title": "$:/core/ui/SideBar/Tools", "tags": "$:/tags/SideBar", "caption": "{{$:/language/SideBar/Tools/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/SideBarLists": { "title": "$:/core/ui/SideBarLists", "text": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n" }, "$:/core/ui/SideBarSegments/page-controls": { "title": "$:/core/ui/SideBarSegments/page-controls", "tags": "$:/tags/SideBarSegment", "text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n" }, "$:/core/ui/SideBarSegments/search": { "title": "$:/core/ui/SideBarSegments/search", "tags": "$:/tags/SideBarSegment", "text": "\\whitespace trim\n\n\\define count-popup-button()\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} replaceRegexp=\"limit\\[\\d+\\]\">\n<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[subfilter<primaryListFilter>] [subfilter<secondaryListFilter>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$vars>\n</$vars>\n</$list>\n</$button>\n\\end\n\n\\define search-results-list()\n\\whitespace trim\n<$vars userInput={{$(searchTiddler)$}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$tiddler tiddler=<<configTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$tiddler>\n\n</$list>\n</$vars>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<searchTiddler>get[text]!match{$:/temp/search}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=\"$:/temp/search\" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler=\"$:/temp/search/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define advanced-search-actions() <$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search/input}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to=\"$:/AdvancedSearch\"/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/><$action-deletetiddler $filter=\"$:/temp/search $:/temp/search/input $:/temp/search/refresh [<searchListState>]\"/>\n\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$vars editTiddler=\"$:/temp/search\" searchTiddler=\"$:/temp/search/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"((advanced-search-sidebar))\" actions=<<advanced-search-actions>>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> \n\t\tselectionStateTitle=<<searchListState>> refreshTitle=\"$:/temp/search/refresh\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> \n\t\tclass=\"tc-popup-handle\" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups=\"yes\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<<advanced-search-actions>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n{{$:/core/images/close-button}}\n</$button>\n<<count-popup-button>>\n</$reveal>\n<$reveal state=<<searchTiddler>> type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<<search-results-list>>\n\n</$reveal>\n\n</$reveal>\n\n</$vars>\n\n</div>\n" }, "$:/core/ui/SideBarSegments/site-subtitle": { "title": "$:/core/ui/SideBarSegments/site-subtitle", "tags": "$:/tags/SideBarSegment", "text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n" }, "$:/core/ui/SideBarSegments/site-title": { "title": "$:/core/ui/SideBarSegments/site-title", "tags": "$:/tags/SideBarSegment", "text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n" }, "$:/core/ui/SideBarSegments/tabs": { "title": "$:/core/ui/SideBarSegments/tabs", "tags": "$:/tags/SideBarSegment", "text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\" explicitState=\"$:/state/tab/sidebar--595412856\"/>\n\n</div>\n" }, "$:/core/ui/SwitcherModal": { "title": "$:/core/ui/SwitcherModal", "subtitle": "<$text text={{{[<switch>lookup[$:/language/Switcher/Subtitle/]]}}}/>", "class": "tc-modal-centered", "text": "<$tiddler tiddler={{{[<switch>lookup[$:/config/SwitcherTargets/]]}}}>\n\n\n<$transclude/>\n\n\n</$tiddler>" }, "$:/TagManager": { "title": "$:/TagManager", "icon": "$:/core/images/tag-button", "color": "#bbb", "text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td>{{||$:/core/ui/TagTemplate}}</td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td style=\"position:relative;\">\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n" }, "$:/core/ui/TagPickerTagTemplate": { "title": "$:/core/ui/TagPickerTagTemplate", "text": "\\whitespace trim\n<$button class=<<button-classes>> tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$list filter=\"[<saveTiddler>minlength[1]]\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>]\"/>\n</$list>\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>> preventScroll=\"true\"/>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$list filter=\"[<refreshTitle>minlength[1]]\">\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n<<actions>>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<$wikify name=\"foregroundColor\" text=\"\"\"<$macrocall $name=\"contrastcolour\" target={{!!color}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>\"\"\">\n<span class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n<$transclude tiddler={{!!icon}}/><$view field=\"title\" format=\"text\"/>\n</span>\n</$wikify>\n</$set>\n</$button>\n" }, "$:/core/ui/TagTemplate": { "title": "$:/core/ui/TagTemplate", "text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n" }, "$:/core/ui/TiddlerFieldTemplate": { "title": "$:/core/ui/TiddlerFieldTemplate", "text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>" }, "$:/core/ui/TiddlerFields": { "title": "$:/core/ui/TiddlerFields", "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n" }, "$:/core/ui/TiddlerInfo/Advanced/PluginInfo": { "title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo", "tags": "$:/tags/TiddlerInfo/Advanced", "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n" }, "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": { "title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo", "tags": "$:/tags/TiddlerInfo/Advanced", "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n" }, "$:/core/ui/TiddlerInfo/Advanced": { "title": "$:/core/ui/TiddlerInfo/Advanced", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}", "text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n</$list>\n" }, "$:/core/ui/TiddlerInfo/Fields": { "title": "$:/core/ui/TiddlerInfo/Fields", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Fields/Caption}}", "text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n" }, "$:/core/ui/TiddlerInfo/List": { "title": "$:/core/ui/TiddlerInfo/List", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/List/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/TiddlerInfo/Listed": { "title": "$:/core/ui/TiddlerInfo/Listed", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Listed/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/TiddlerInfo/References": { "title": "$:/core/ui/TiddlerInfo/References", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/References/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>" }, "$:/core/ui/TiddlerInfo/Tagging": { "title": "$:/core/ui/TiddlerInfo/Tagging", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/TiddlerInfo/Tools": { "title": "$:/core/ui/TiddlerInfo/Tools", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Tools/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/TiddlerInfo": { "title": "$:/core/ui/TiddlerInfo", "text": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>\n" }, "$:/core/ui/TopBar/menu": { "title": "$:/core/ui/TopBar/menu", "tags": "$:/tags/TopRightBar", "text": "<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible tc-hide-sidebar-btn\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible tc-show-sidebar-btn\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n" }, "$:/core/ui/UntaggedTemplate": { "title": "$:/core/ui/UntaggedTemplate", "text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n" }, "$:/core/ui/ViewTemplate/body": { "title": "$:/core/ui/ViewTemplate/body", "tags": "$:/tags/ViewTemplate", "text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</$reveal>\n" }, "$:/core/ui/ViewTemplate/classic": { "title": "$:/core/ui/ViewTemplate/classic", "tags": "$:/tags/ViewTemplate $:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n" }, "$:/core/ui/ViewTemplate/import": { "title": "$:/core/ui/ViewTemplate/import", "tags": "$:/tags/ViewTemplate", "text": "\\define lingo-base() $:/language/Import/\n\n\\define buttons()\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n" }, "$:/core/ui/ViewTemplate/plugin": { "title": "$:/core/ui/ViewTemplate/plugin", "tags": "$:/tags/ViewTemplate", "text": "<$reveal tag=\"div\" class=\"tc-tiddler-plugin-info\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n</$reveal>" }, "$:/core/ui/ViewTemplate/subtitle": { "title": "$:/core/ui/ViewTemplate/subtitle", "tags": "$:/tags/ViewTemplate", "text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}} />\n<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n" }, "$:/core/ui/ViewTemplate/tags": { "title": "$:/core/ui/ViewTemplate/tags", "tags": "$:/tags/ViewTemplate", "text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>\n" }, "$:/core/ui/ViewTemplate/title": { "title": "$:/core/ui/ViewTemplate/title", "tags": "$:/tags/ViewTemplate", "text": "\\whitespace trim\n\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<$list filter=\"[all[current]has[icon]]~[[$:/config/DefaultTiddlerIcon]has[text]]\">\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$list>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>" }, "$:/core/ui/ViewTemplate/unfold": { "title": "$:/core/ui/ViewTemplate/unfold", "tags": "$:/tags/ViewTemplate", "text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n" }, "$:/core/ui/ViewTemplate": { "title": "$:/core/ui/ViewTemplate", "text": "\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\n" }, "$:/core/ui/Buttons/clone": { "title": "$:/core/ui/Buttons/clone", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}", "description": "{{$:/language/Buttons/Clone/Hint}}", "text": "\\whitespace trim\n<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/close-others": { "title": "$:/core/ui/Buttons/close-others", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}", "description": "{{$:/language/Buttons/CloseOthers/Hint}}", "text": "\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/close": { "title": "$:/core/ui/Buttons/close", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}", "description": "{{$:/language/Buttons/Close/Hint}}", "text": "\\whitespace trim\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/edit": { "title": "$:/core/ui/Buttons/edit", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}", "description": "{{$:/language/Buttons/Edit/Hint}}", "text": "\\whitespace trim\n<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/export-tiddler": { "title": "$:/core/ui/Buttons/export-tiddler", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}", "description": "{{$:/language/Buttons/ExportTiddler/Hint}}", "text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>" }, "$:/core/ui/Buttons/fold-bar": { "title": "$:/core/ui/Buttons/fold-bar", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}", "description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}", "text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->" }, "$:/core/ui/Buttons/fold-others": { "title": "$:/core/ui/Buttons/fold-others", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}", "description": "{{$:/language/Buttons/FoldOthers/Hint}}", "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/fold": { "title": "$:/core/ui/Buttons/fold", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}", "description": "{{$:/language/Buttons/Fold/Hint}}", "text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n" }, "$:/core/ui/Buttons/info": { "title": "$:/core/ui/Buttons/info", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}", "description": "{{$:/language/Buttons/Info/Hint}}", "text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>" }, "$:/core/ui/Buttons/more-tiddler-actions": { "title": "$:/core/ui/Buttons/more-tiddler-actions", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}", "description": "{{$:/language/Buttons/More/Hint}}", "text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>" }, "$:/core/ui/Buttons/new-here": { "title": "$:/core/ui/Buttons/new-here", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}", "description": "{{$:/language/Buttons/NewHere/Hint}}", "text": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [{$:/config/NewTiddler/Tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>\n" }, "$:/core/ui/Buttons/new-journal-here": { "title": "$:/core/ui/Buttons/new-journal-here", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}", "description": "{{$:/language/Buttons/NewJournalHere/Hint}}", "text": "\\whitespace trim\n\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set>\n</$set>\n</$set>\n" }, "$:/core/ui/Buttons/open-window": { "title": "$:/core/ui/Buttons/open-window", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}", "description": "{{$:/language/Buttons/OpenWindow/Hint}}", "text": "\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/permalink": { "title": "$:/core/ui/Buttons/permalink", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}", "description": "{{$:/language/Buttons/Permalink/Hint}}", "text": "\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/permaview": { "title": "$:/core/ui/Buttons/permaview", "tags": "$:/tags/ViewToolbar $:/tags/PageControls", "caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}", "description": "{{$:/language/Buttons/Permaview/Hint}}", "text": "\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n</$list>\n</$button>" }, "$:/DefaultTiddlers": { "title": "$:/DefaultTiddlers", "text": "GettingStarted\n" }, "$:/temp/advancedsearch": { "title": "$:/temp/advancedsearch", "text": "" }, "$:/snippets/allfields": { "title": "$:/snippets/allfields", "text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n" }, "$:/config/AnimationDuration": { "title": "$:/config/AnimationDuration", "text": "400" }, "$:/config/AutoFocus": { "title": "$:/config/AutoFocus", "text": "title" }, "$:/config/AutoSave": { "title": "$:/config/AutoSave", "text": "yes" }, "$:/config/BitmapEditor/Colour": { "title": "$:/config/BitmapEditor/Colour", "text": "#444" }, "$:/config/BitmapEditor/ImageSizes": { "title": "$:/config/BitmapEditor/ImageSizes", "text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]" }, "$:/config/BitmapEditor/LineWidth": { "title": "$:/config/BitmapEditor/LineWidth", "text": "3px" }, "$:/config/BitmapEditor/LineWidths": { "title": "$:/config/BitmapEditor/LineWidths", "text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px" }, "$:/config/BitmapEditor/Opacities": { "title": "$:/config/BitmapEditor/Opacities", "text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0" }, "$:/config/BitmapEditor/Opacity": { "title": "$:/config/BitmapEditor/Opacity", "text": "1.0" }, "$:/config/DefaultMoreSidebarTab": { "title": "$:/config/DefaultMoreSidebarTab", "text": "$:/core/ui/MoreSideBar/Tags" }, "$:/config/DefaultSidebarTab": { "title": "$:/config/DefaultSidebarTab", "text": "$:/core/ui/SideBar/Open" }, "$:/config/DownloadSaver/AutoSave": { "title": "$:/config/DownloadSaver/AutoSave", "text": "no" }, "$:/config/Drafts/TypingTimeout": { "title": "$:/config/Drafts/TypingTimeout", "text": "400" }, "$:/config/EditMode/fieldname-filter": { "title": "$:/config/EditMode/fieldname-filter", "first-search-filter": "[!is[shadow]!is[system]fields[]search:title<userInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type", "second-search-filter": "[fields[]search:title<userInput>sort[]] -[!is[shadow]!is[system]fields[]]" }, "$:/config/EditTabIndex": { "title": "$:/config/EditTabIndex", "text": "1\n" }, "$:/config/EditTemplateFields/Visibility/title": { "title": "$:/config/EditTemplateFields/Visibility/title", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/tags": { "title": "$:/config/EditTemplateFields/Visibility/tags", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/text": { "title": "$:/config/EditTemplateFields/Visibility/text", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/creator": { "title": "$:/config/EditTemplateFields/Visibility/creator", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/created": { "title": "$:/config/EditTemplateFields/Visibility/created", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/modified": { "title": "$:/config/EditTemplateFields/Visibility/modified", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/modifier": { "title": "$:/config/EditTemplateFields/Visibility/modifier", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/type": { "title": "$:/config/EditTemplateFields/Visibility/type", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/draft.title": { "title": "$:/config/EditTemplateFields/Visibility/draft.title", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/draft.of": { "title": "$:/config/EditTemplateFields/Visibility/draft.of", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/revision": { "title": "$:/config/EditTemplateFields/Visibility/revision", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/bag": { "title": "$:/config/EditTemplateFields/Visibility/bag", "text": "hide" }, "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": { "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4", "text": "hide" }, "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": { "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5", "text": "hide" }, "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": { "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6", "text": "hide" }, "$:/config/EditorTypeMappings/image/gif": { "title": "$:/config/EditorTypeMappings/image/gif", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/webp": { "title": "$:/config/EditorTypeMappings/image/webp", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/heic": { "title": "$:/config/EditorTypeMappings/image/heic", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/heif": { "title": "$:/config/EditorTypeMappings/image/heif", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/jpeg": { "title": "$:/config/EditorTypeMappings/image/jpeg", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/jpg": { "title": "$:/config/EditorTypeMappings/image/jpg", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/png": { "title": "$:/config/EditorTypeMappings/image/png", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/x-icon": { "title": "$:/config/EditorTypeMappings/image/x-icon", "text": "bitmap" }, "$:/config/EditorTypeMappings/text/vnd.tiddlywiki": { "title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki", "text": "text" }, "$:/config/Manager/Show": { "title": "$:/config/Manager/Show", "text": "tiddlers" }, "$:/config/Manager/Filter": { "title": "$:/config/Manager/Filter", "text": "" }, "$:/config/Manager/Order": { "title": "$:/config/Manager/Order", "text": "forward" }, "$:/config/Manager/Sort": { "title": "$:/config/Manager/Sort", "text": "title" }, "$:/config/Manager/System": { "title": "$:/config/Manager/System", "text": "system" }, "$:/config/Manager/Tag": { "title": "$:/config/Manager/Tag", "text": "" }, "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": { "title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText", "text": "hide" }, "$:/config/MissingLinks": { "title": "$:/config/MissingLinks", "text": "yes" }, "$:/config/Navigation/UpdateAddressBar": { "title": "$:/config/Navigation/UpdateAddressBar", "text": "no" }, "$:/config/Navigation/UpdateHistory": { "title": "$:/config/Navigation/UpdateHistory", "text": "no" }, "$:/config/NewImageType": { "title": "$:/config/NewImageType", "text": "jpeg" }, "$:/config/OfficialPluginLibrary": { "title": "$:/config/OfficialPluginLibrary", "tags": "$:/tags/PluginLibrary", "url": "https://tiddlywiki.com/library/v5.1.23/index.html", "caption": "{{$:/language/OfficialPluginLibrary}}", "text": "{{$:/language/OfficialPluginLibrary/Hint}}\n" }, "$:/config/Navigation/openLinkFromInsideRiver": { "title": "$:/config/Navigation/openLinkFromInsideRiver", "text": "below" }, "$:/config/Navigation/openLinkFromOutsideRiver": { "title": "$:/config/Navigation/openLinkFromOutsideRiver", "text": "top" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all", "text": "hide" }, "$:/config/Performance/Instrumentation": { "title": "$:/config/Performance/Instrumentation", "text": "no" }, "$:/config/RegisterPluginType/plugin": { "title": "$:/config/RegisterPluginType/plugin", "text": "yes" }, "$:/config/RegisterPluginType/theme": { "title": "$:/config/RegisterPluginType/theme", "text": "no" }, "$:/config/RegisterPluginType/language": { "title": "$:/config/RegisterPluginType/language", "text": "no" }, "$:/config/RegisterPluginType/info": { "title": "$:/config/RegisterPluginType/info", "text": "yes" }, "$:/config/RegisterPluginType/import": { "title": "$:/config/RegisterPluginType/import", "text": "no" }, "$:/config/SaveWikiButton/Template": { "title": "$:/config/SaveWikiButton/Template", "text": "$:/core/save/all" }, "$:/config/SaverFilter": { "title": "$:/config/SaverFilter", "text": "[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n" }, "$:/config/Search/AutoFocus": { "title": "$:/config/Search/AutoFocus", "text": "true" }, "$:/config/Search/MinLength": { "title": "$:/config/Search/MinLength", "text": "3" }, "$:/config/SearchResults/Default": { "title": "$:/config/SearchResults/Default", "text": "$:/core/ui/DefaultSearchResultList" }, "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]": { "title": "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]", "text": "yes" }, "$:/config/ShortcutInfo/add-field": { "title": "$:/config/ShortcutInfo/add-field", "text": "{{$:/language/EditTemplate/Fields/Add/Button/Hint}}" }, "$:/config/ShortcutInfo/advanced-search": { "title": "$:/config/ShortcutInfo/advanced-search", "text": "{{$:/language/Buttons/AdvancedSearch/Hint}}" }, "$:/config/ShortcutInfo/advanced-search-sidebar": { "title": "$:/config/ShortcutInfo/advanced-search-sidebar", "text": "{{$:/language/Shortcuts/Input/AdvancedSearch/Hint}}" }, "$:/config/ShortcutInfo/bold": { "title": "$:/config/ShortcutInfo/bold", "text": "{{$:/language/Buttons/Bold/Hint}}" }, "$:/config/ShortcutInfo/cancel-edit-tiddler": { "title": "$:/config/ShortcutInfo/cancel-edit-tiddler", "text": "{{$:/language/Buttons/Cancel/Hint}}" }, "$:/config/ShortcutInfo/change-sidebar-layout": { "title": "$:/config/ShortcutInfo/change-sidebar-layout", "text": "{{$:/language/Shortcuts/SidebarLayout/Hint}}" }, "$:/config/ShortcutInfo/delete-field": { "title": "$:/config/ShortcutInfo/delete-field", "text": "{{$:/language/EditTemplate/Field/Remove/Hint}}" }, "$:/config/ShortcutInfo/excise": { "title": "$:/config/ShortcutInfo/excise", "text": "{{$:/language/Buttons/Excise/Hint}}" }, "$:/config/ShortcutInfo/heading-1": { "title": "$:/config/ShortcutInfo/heading-1", "text": "{{$:/language/Buttons/Heading1/Hint}}" }, "$:/config/ShortcutInfo/heading-2": { "title": "$:/config/ShortcutInfo/heading-2", "text": "{{$:/language/Buttons/Heading2/Hint}}" }, "$:/config/ShortcutInfo/heading-3": { "title": "$:/config/ShortcutInfo/heading-3", "text": "{{$:/language/Buttons/Heading3/Hint}}" }, "$:/config/ShortcutInfo/heading-4": { "title": "$:/config/ShortcutInfo/heading-4", "text": "{{$:/language/Buttons/Heading4/Hint}}" }, "$:/config/ShortcutInfo/heading-5": { "title": "$:/config/ShortcutInfo/heading-5", "text": "{{$:/language/Buttons/Heading5/Hint}}" }, "$:/config/ShortcutInfo/heading-6": { "title": "$:/config/ShortcutInfo/heading-6", "text": "{{$:/language/Buttons/Heading6/Hint}}" }, "$:/config/ShortcutInfo/input-accept": { "title": "$:/config/ShortcutInfo/input-accept", "text": "{{$:/language/Shortcuts/Input/Accept/Hint}}" }, "$:/config/ShortcutInfo/input-accept-variant": { "title": "$:/config/ShortcutInfo/input-accept-variant", "text": "{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}" }, "$:/config/ShortcutInfo/input-cancel": { "title": "$:/config/ShortcutInfo/input-cancel", "text": "{{$:/language/Shortcuts/Input/Cancel/Hint}}" }, "$:/config/ShortcutInfo/input-down": { "title": "$:/config/ShortcutInfo/input-down", "text": "{{$:/language/Shortcuts/Input/Down/Hint}}" }, "$:/config/ShortcutInfo/input-tab-left": { "title": "$:/config/ShortcutInfo/input-tab-left", "text": "{{$:/language/Shortcuts/Input/Tab-Left/Hint}}" }, "$:/config/ShortcutInfo/input-tab-right": { "title": "$:/config/ShortcutInfo/input-tab-right", "text": "{{$:/language/Shortcuts/Input/Tab-Right/Hint}}" }, "$:/config/ShortcutInfo/input-up": { "title": "$:/config/ShortcutInfo/input-up", "text": "{{$:/language/Shortcuts/Input/Up/Hint}}" }, "$:/config/ShortcutInfo/italic": { "title": "$:/config/ShortcutInfo/italic", "text": "{{$:/language/Buttons/Italic/Hint}}" }, "$:/config/ShortcutInfo/layout-switcher": { "title": "$:/config/ShortcutInfo/layout-switcher", "text": "{{$:/language/LayoutSwitcher/Description}}" }, "$:/config/ShortcutInfo/link": { "title": "$:/config/ShortcutInfo/link", "text": "{{$:/language/Buttons/Link/Hint}}" }, "$:/config/ShortcutInfo/linkify": { "title": "$:/config/ShortcutInfo/linkify", "text": "{{$:/language/Buttons/Linkify/Hint}}" }, "$:/config/ShortcutInfo/list-bullet": { "title": "$:/config/ShortcutInfo/list-bullet", "text": "{{$:/language/Buttons/ListBullet/Hint}}" }, "$:/config/ShortcutInfo/list-number": { "title": "$:/config/ShortcutInfo/list-number", "text": "{{$:/language/Buttons/ListNumber/Hint}}" }, "$:/config/ShortcutInfo/mono-block": { "title": "$:/config/ShortcutInfo/mono-block", "text": "{{$:/language/Buttons/MonoBlock/Hint}}" }, "$:/config/ShortcutInfo/mono-line": { "title": "$:/config/ShortcutInfo/mono-line", "text": "{{$:/language/Buttons/MonoLine/Hint}}" }, "$:/config/ShortcutInfo/new-image": { "title": "$:/config/ShortcutInfo/new-image", "text": "{{$:/language/Buttons/NewImage/Hint}}" }, "$:/config/ShortcutInfo/new-journal": { "title": "$:/config/ShortcutInfo/new-journal", "text": "{{$:/language/Buttons/NewJournal/Hint}}" }, "$:/config/ShortcutInfo/new-tiddler": { "title": "$:/config/ShortcutInfo/new-tiddler", "text": "{{$:/language/Buttons/NewTiddler/Hint}}" }, "$:/config/ShortcutInfo/picture": { "title": "$:/config/ShortcutInfo/picture", "text": "{{$:/language/Buttons/Picture/Hint}}" }, "$:/config/ShortcutInfo/preview": { "title": "$:/config/ShortcutInfo/preview", "text": "{{$:/language/Buttons/Preview/Hint}}" }, "$:/config/ShortcutInfo/quote": { "title": "$:/config/ShortcutInfo/quote", "text": "{{$:/language/Buttons/Quote/Hint}}" }, "$:/config/ShortcutInfo/save-tiddler": { "title": "$:/config/ShortcutInfo/save-tiddler", "text": "{{$:/language/Buttons/Save/Hint}}" }, "$:/config/ShortcutInfo/save-wiki": { "title": "$:/config/ShortcutInfo/save-wiki", "text": "{{$:/language/Buttons/SaveWiki/Hint}}" }, "$:/config/ShortcutInfo/sidebar-search": { "title": "$:/config/ShortcutInfo/sidebar-search", "text": "{{$:/language/Buttons/SidebarSearch/Hint}}" }, "$:/config/ShortcutInfo/stamp": { "title": "$:/config/ShortcutInfo/stamp", "text": "{{$:/language/Buttons/Stamp/Hint}}" }, "$:/config/ShortcutInfo/strikethrough": { "title": "$:/config/ShortcutInfo/strikethrough", "text": "{{$:/language/Buttons/Strikethrough/Hint}}" }, "$:/config/ShortcutInfo/subscript": { "title": "$:/config/ShortcutInfo/subscript", "text": "{{$:/language/Buttons/Subscript/Hint}}" }, "$:/config/ShortcutInfo/superscript": { "title": "$:/config/ShortcutInfo/superscript", "text": "{{$:/language/Buttons/Superscript/Hint}}" }, "$:/config/ShortcutInfo/toggle-sidebar": { "title": "$:/config/ShortcutInfo/toggle-sidebar", "text": "{{$:/language/Buttons/ToggleSidebar/Hint}}" }, "$:/config/ShortcutInfo/transcludify": { "title": "$:/config/ShortcutInfo/transcludify", "text": "{{$:/language/Buttons/Transcludify/Hint}}" }, "$:/config/ShortcutInfo/underline": { "title": "$:/config/ShortcutInfo/underline", "text": "{{$:/language/Buttons/Underline/Hint}}" }, "$:/config/SwitcherTargets/layout": { "title": "$:/config/SwitcherTargets/layout", "text": "$:/snippets/LayoutSwitcher" }, "$:/config/SwitcherTargets/language": { "title": "$:/config/SwitcherTargets/language", "text": "$:/snippets/languageswitcher" }, "$:/config/SwitcherTargets/palette": { "title": "$:/config/SwitcherTargets/palette", "text": "$:/core/ui/ControlPanel/Palette" }, "$:/config/SwitcherTargets/theme": { "title": "$:/config/SwitcherTargets/theme", "text": "$:/core/ui/ControlPanel/Theme" }, "$:/config/SyncFilter": { "title": "$:/config/SyncFilter", "text": "[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n" }, "$:/config/SyncSystemTiddlersFromServer": { "title": "$:/config/SyncSystemTiddlersFromServer", "text": "no" }, "$:/config/Tags/MinLength": { "title": "$:/config/Tags/MinLength", "text": "0" }, "$:/config/TextEditor/EditorHeight/Height": { "title": "$:/config/TextEditor/EditorHeight/Height", "text": "400px" }, "$:/config/TextEditor/EditorHeight/Mode": { "title": "$:/config/TextEditor/EditorHeight/Mode", "text": "auto" }, "$:/config/TiddlerInfo/Default": { "title": "$:/config/TiddlerInfo/Default", "text": "$:/core/ui/TiddlerInfo/Fields" }, "$:/config/TiddlerInfo/Mode": { "title": "$:/config/TiddlerInfo/Mode", "text": "popup" }, "$:/config/Tiddlers/TitleLinks": { "title": "$:/config/Tiddlers/TitleLinks", "text": "no" }, "$:/config/Toolbar/ButtonClass": { "title": "$:/config/Toolbar/ButtonClass", "text": "tc-btn-invisible" }, "$:/config/Toolbar/Icons": { "title": "$:/config/Toolbar/Icons", "text": "yes" }, "$:/config/Toolbar/Text": { "title": "$:/config/Toolbar/Text", "text": "no" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions", "text": "show" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others", "text": "hide" }, "$:/config/shortcuts-mac/bold": { "title": "$:/config/shortcuts-mac/bold", "text": "meta-B" }, "$:/config/shortcuts-mac/input-tab-left": { "title": "$:/config/shortcuts-mac/input-tab-left", "text": "ctrl-Left" }, "$:/config/shortcuts-mac/input-tab-right": { "title": "$:/config/shortcuts-mac/input-tab-right", "text": "ctrl-Right" }, "$:/config/shortcuts-mac/italic": { "title": "$:/config/shortcuts-mac/italic", "text": "meta-I" }, "$:/config/shortcuts-mac/underline": { "title": "$:/config/shortcuts-mac/underline", "text": "meta-U" }, "$:/config/shortcuts-mac/new-image": { "title": "$:/config/shortcuts-mac/new-image", "text": "ctrl-I" }, "$:/config/shortcuts-mac/new-journal": { "title": "$:/config/shortcuts-mac/new-journal", "text": "ctrl-J" }, "$:/config/shortcuts-mac/new-tiddler": { "title": "$:/config/shortcuts-mac/new-tiddler", "text": "ctrl-N" }, "$:/config/shortcuts-mac/save-wiki": { "title": "$:/config/shortcuts-mac/save-wiki", "text": "meta-S" }, "$:/config/shortcuts-not-mac/bold": { "title": "$:/config/shortcuts-not-mac/bold", "text": "ctrl-B" }, "$:/config/shortcuts-not-mac/italic": { "title": "$:/config/shortcuts-not-mac/italic", "text": "ctrl-I" }, "$:/config/shortcuts-not-mac/underline": { "title": "$:/config/shortcuts-not-mac/underline", "text": "ctrl-U" }, "$:/config/shortcuts-not-mac/new-image": { "title": "$:/config/shortcuts-not-mac/new-image", "text": "alt-I" }, "$:/config/shortcuts-not-mac/new-journal": { "title": "$:/config/shortcuts-not-mac/new-journal", "text": "alt-J" }, "$:/config/shortcuts-not-mac/new-tiddler": { "title": "$:/config/shortcuts-not-mac/new-tiddler", "text": "alt-N" }, "$:/config/shortcuts/add-field": { "title": "$:/config/shortcuts/add-field", "text": "enter" }, "$:/config/shortcuts/advanced-search": { "title": "$:/config/shortcuts/advanced-search", "text": "ctrl-shift-A" }, "$:/config/shortcuts/advanced-search-sidebar": { "title": "$:/config/shortcuts/advanced-search-sidebar", "text": "alt-Enter" }, "$:/config/shortcuts/cancel-edit-tiddler": { "title": "$:/config/shortcuts/cancel-edit-tiddler", "text": "escape" }, "$:/config/shortcuts/change-sidebar-layout": { "title": "$:/config/shortcuts/change-sidebar-layout", "text": "shift-alt-Down" }, "$:/config/shortcuts/delete-field": { "title": "$:/config/shortcuts/delete-field", "text": "shift-alt-D" }, "$:/config/shortcuts/excise": { "title": "$:/config/shortcuts/excise", "text": "ctrl-E" }, "$:/config/shortcuts/sidebar-search": { "title": "$:/config/shortcuts/sidebar-search", "text": "ctrl-shift-F" }, "$:/config/shortcuts/heading-1": { "title": "$:/config/shortcuts/heading-1", "text": "ctrl-1" }, "$:/config/shortcuts/heading-2": { "title": "$:/config/shortcuts/heading-2", "text": "ctrl-2" }, "$:/config/shortcuts/heading-3": { "title": "$:/config/shortcuts/heading-3", "text": "ctrl-3" }, "$:/config/shortcuts/heading-4": { "title": "$:/config/shortcuts/heading-4", "text": "ctrl-4" }, "$:/config/shortcuts/heading-5": { "title": "$:/config/shortcuts/heading-5", "text": "ctrl-5" }, "$:/config/shortcuts/heading-6": { "title": "$:/config/shortcuts/heading-6", "text": "ctrl-6" }, "$:/config/shortcuts/input-accept": { "title": "$:/config/shortcuts/input-accept", "text": "Enter" }, "$:/config/shortcuts/input-accept-variant": { "title": "$:/config/shortcuts/input-accept-variant", "text": "ctrl-Enter" }, "$:/config/shortcuts/input-cancel": { "title": "$:/config/shortcuts/input-cancel", "text": "Escape" }, "$:/config/shortcuts/input-down": { "title": "$:/config/shortcuts/input-down", "text": "Down" }, "$:/config/shortcuts/input-tab-left": { "title": "$:/config/shortcuts/input-tab-left", "text": "alt-Left" }, "$:/config/shortcuts/input-tab-right": { "title": "$:/config/shortcuts/input-tab-right", "text": "alt-Right" }, "$:/config/shortcuts/input-up": { "title": "$:/config/shortcuts/input-up", "text": "Up" }, "$:/config/shortcuts/layout-switcher": { "title": "$:/config/shortcuts/layout-switcher", "text": "ctrl-shift-L" }, "$:/config/shortcuts/link": { "title": "$:/config/shortcuts/link", "text": "ctrl-L" }, "$:/config/shortcuts/linkify": { "title": "$:/config/shortcuts/linkify", "text": "alt-shift-L" }, "$:/config/shortcuts/list-bullet": { "title": "$:/config/shortcuts/list-bullet", "text": "ctrl-shift-L" }, "$:/config/shortcuts/list-number": { "title": "$:/config/shortcuts/list-number", "text": "ctrl-shift-N" }, "$:/config/shortcuts/mono-block": { "title": "$:/config/shortcuts/mono-block", "text": "ctrl-shift-M" }, "$:/config/shortcuts/mono-line": { "title": "$:/config/shortcuts/mono-line", "text": "ctrl-M" }, "$:/config/shortcuts/picture": { "title": "$:/config/shortcuts/picture", "text": "ctrl-shift-I" }, "$:/config/shortcuts/preview": { "title": "$:/config/shortcuts/preview", "text": "alt-P" }, "$:/config/shortcuts/quote": { "title": "$:/config/shortcuts/quote", "text": "ctrl-Q" }, "$:/config/shortcuts/save-tiddler": { "title": "$:/config/shortcuts/save-tiddler", "text": "ctrl+enter" }, "$:/config/shortcuts/save-wiki": { "title": "$:/config/shortcuts/save-wiki", "text": "ctrl-S" }, "$:/config/shortcuts/stamp": { "title": "$:/config/shortcuts/stamp", "text": "ctrl-S" }, "$:/config/shortcuts/strikethrough": { "title": "$:/config/shortcuts/strikethrough", "text": "ctrl-T" }, "$:/config/shortcuts/subscript": { "title": "$:/config/shortcuts/subscript", "text": "ctrl-shift-B" }, "$:/config/shortcuts/superscript": { "title": "$:/config/shortcuts/superscript", "text": "ctrl-shift-P" }, "$:/config/shortcuts/toggle-sidebar": { "title": "$:/config/shortcuts/toggle-sidebar", "text": "alt-shift-S" }, "$:/config/shortcuts/transcludify": { "title": "$:/config/shortcuts/transcludify", "text": "alt-shift-T" }, "$:/config/ui/EditTemplate": { "title": "$:/config/ui/EditTemplate", "text": "$:/core/ui/EditTemplate" }, "$:/config/ui/ViewTemplate": { "title": "$:/config/ui/ViewTemplate", "text": "$:/core/ui/ViewTemplate" }, "$:/config/WikiParserRules/Inline/wikilink": { "title": "$:/config/WikiParserRules/Inline/wikilink", "text": "enable" }, "$:/snippets/currpalettepreview": { "title": "$:/snippets/currpalettepreview", "text": "\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch-inner()\n<$set name=\"swatchColour\" value={{##$(colourResolved)$}}>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}>\n<$set name=\"swatchTitle\" value=<<colour>>>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>\n" }, "$:/snippets/download-wiki-button": { "title": "$:/snippets/download-wiki-button", "text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>" }, "$:/language": { "title": "$:/language", "text": "$:/languages/en-GB" }, "$:/snippets/languageswitcher": { "title": "$:/snippets/languageswitcher", "text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>" }, "$:/core/macros/CSS": { "title": "$:/core/macros/CSS", "tags": "$:/tags/Macro", "text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"><$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/></$transclude></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n" }, "$:/core/macros/colour-picker": { "title": "$:/core/macros/colour-picker", "tags": "$:/tags/Macro", "text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n" }, "$:/core/macros/copy-to-clipboard": { "title": "$:/core/macros/copy-to-clipboard", "tags": "$:/tags/Macro", "text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n" }, "$:/core/macros/diff": { "title": "$:/core/macros/diff", "tags": "$:/tags/Macro", "text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n" }, "$:/core/macros/dumpvariables": { "title": "$:/core/macros/dumpvariables", "tags": "$:/tags/Macro", "text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n" }, "$:/core/macros/export": { "title": "$:/core/macros/export", "tags": "$:/tags/Macro", "text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$set name=\"count\" value={{{ [subfilter<__exportFilter__>count[]] }}}>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$list filter=\"[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]\" variable=\"ignore\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</$list>\n</$set>\n</div>\n</$reveal>\n\\end\n" }, "$:/core/macros/image-picker": { "title": "$:/core/macros/image-picker", "created": "20170715180840889", "modified": "20170715180914005", "tags": "$:/tags/Macro", "type": "text/vnd.tiddlywiki", "text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n" }, "$:/core/macros/keyboard-driven-input": { "title": "$:/core/macros/keyboard-driven-input", "tags": "$:/tags/Macro", "text": "\\define change-input-tab(stateTitle,tag,beforeafter,defaultState,actions)\n<$set name=\"tabsList\" filter=\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]]\">\n<$vars currentState={{{ [<__stateTitle__>!is[missing]get[text]] ~[<__defaultState__>] }}} firstTab={{{ [enlist<tabsList>nth[1]] }}} lastTab={{{ [enlist<tabsList>last[]] }}}>\n<$set name=\"nextTab\" value={{{ [all[shadows+tiddlers]tag<__tag__>!has[draft.of]$beforeafter$<currentState>] ~[[$beforeafter$]removeprefix[after]suffix[]addprefix<firstTab>] ~[[$beforeafter$]removeprefix[before]suffix[]addprefix<lastTab>] }}}>\n<$action-setfield $tiddler=<<__stateTitle__>> text=<<nextTab>>/>\n$actions$\n</$set>\n</$vars>\n</$set>\n\\end\n\n\\define keyboard-input-actions()\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>get<__field__>] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>getindex<__index__>] }}}/>\n</$list>\n\\end\n\n\\define input-next-actions-inner()\n<$list filter=\"[<nextItem>minlength[1]]\" variable=\"ignore\">\n<$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/>\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $field=<<__field__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $index=<<__index__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$action-setfield $tiddler=<<__refreshTitle__>> text=\"yes\"/>\n</$list>\n\\end\n\n\\define input-next-actions(afterOrBefore:\"after\",reverse:\"\")\n<$list filter=\"[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]\" variable=\"ignore\">\n<$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}>\n<$set name=\"configTiddler\" value={{{ [subfilter<__configTiddlerFilter__>] }}}>\n<$vars primaryListFilter={{{ [<configTiddler>get<__firstSearchFilterField__>] }}} secondaryListFilter={{{ [<configTiddler>get<__secondSearchFilterField__>] }}}>\n<$set name=\"filteredList\" filter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\">\n<$vars nextItem={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}} firstItem={{{ [enlist<filteredList>nth[1]] }}} lastItem={{{ [enlist<filteredList>last[]] }}}>\n<$list filter=\"[<selectedItem>match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[before]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<lastItem>!match<firstItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[after]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<firstItem>match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>!match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<<input-next-actions-inner>>\n</$list>\n</$vars>\n</$set>\n</$vars>\n</$set>\n</$vars>\n</$list>\n\\end\n\n\\define keyboard-driven-input(tiddler,storeTitle,field:\"text\",index:\"\",tag:\"input\",type,focus:\"\",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:\"\",default:\"\",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:\"0\",refreshTitle,selectionStateTitle,cancelPopups:\"\",configTiddlerFilter,firstSearchFilterField:\"first-search-filter\",secondSearchFilterField:\"second-search-filter\")\n\\whitespace trim\n<$keyboard key=\"((input-accept))\" actions=<<__inputAcceptActions__>>>\n<$keyboard key=\"((input-accept-variant))\" actions=<<__inputAcceptVariantActions__>>>\n<$keyboard key=\"((input-up))\" actions=<<input-next-actions \"before\" \"reverse[]\">>>\n<$keyboard key=\"((input-down))\" actions=<<input-next-actions>>>\n<$keyboard key=\"((input-cancel))\" actions=<<__inputCancelActions__>>>\n<$edit-text tiddler=<<__tiddler__>> field=<<__field__>> index=<<__index__>> \n\t\tinputActions=<<keyboard-input-actions>> tag=<<__tag__>> class=<<__class__>> \n\t\tplaceholder=<<__placeholder__>> default=<<__default__>> focusPopup=<<__focusPopup__>> \n\t\tfocus=<<__focus__>> type=<<__type__>> rows=<<__rows__>> minHeight=<<__minHeight__>> \n\t\ttabindex=<<__tabindex__>> size=<<__size__>> autoHeight=<<__autoHeight__>> \n\t\trefreshTitle=<<__refreshTitle__>> cancelPopups=<<__cancelPopups__>>/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n\\end\n" }, "$:/core/macros/lingo": { "title": "$:/core/macros/lingo", "tags": "$:/tags/Macro", "text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n" }, "$:/core/macros/list": { "title": "$:/core/macros/list", "tags": "$:/tags/Macro", "text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\">\n{{$:/core/images/blank}}\n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$type$>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n" }, "$:/core/macros/tabs": { "title": "$:/core/macros/tabs", "tags": "$:/tags/Macro", "text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain,actions,explicitState)\n<$set name=\"qualifiedState\" value=<<qualify \"$state$\">>>\n<$vars tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}>\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<tabsState>> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler>$actions$</$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<tabsState>> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n</$vars>\n</$set>\n\\end\n" }, "$:/core/macros/tag-picker": { "title": "$:/core/macros/tag-picker", "tags": "$:/tags/Macro", "first-search-filter": "[tags[]!is[system]search:title<userInput>sort[]]", "second-search-filter": "[tags[]is[system]search:title<userInput>sort[]]", "text": "\\define get-tagpicker-focus-selector() [data-tiddler-title=\"$(currentTiddlerCSSEscaped)$\"] .tc-add-tag-name input\n\n\\define delete-tag-state-tiddlers() <$action-deletetiddler $filter=\"[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]\"/>\n\n\\define add-tag-actions(actions,tagField:\"tags\")\n<$set name=\"tag\" value={{{ [<__tiddler__>get[text]] }}}>\n<$list filter=\"[<saveTiddler>!contains:$tagField$<tag>!match[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[<tag>]\"/>\n\"\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n</$list>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\\end\n\n\\define clear-tags-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-tag-state-tiddlers>>\n</$list>\n\\end\n\n\\define clear-tags-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newTagNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<clear-tags-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newTagNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define tag-picker-inner(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars newTagNameInputTiddlerQualified=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddlerQualified=<<qualify \"$:/temp/NewTagName/selected-item\">> fallbackTarget={{$(palette)$##tag-background}} colourA={{$(palette)$##foreground}} colourB={{$(palette)$##background}}>\n<$vars storeTitle={{{ [<newTagNameInputTiddler>!match[]] ~[<newTagNameInputTiddlerQualified>] }}} tagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] ~[<newTagNameSelectionTiddlerQualified>] }}}>\n<$vars refreshTitle=<<qualify \"$:/temp/NewTagName/refresh\">> nonSystemTagsFilter=\"[tags[]!is[system]search:title<userInput>sort[]]\" systemTagsFilter=\"[tags[]is[system]search:title<userInput>sort[]]\">\n<div class=\"tc-edit-add-tag\">\n<div>\n<span class=\"tc-add-tag-name tc-small-gap-right\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<tagSelectionState>> inputAcceptActions=\"\"\"<$macrocall $name=\"add-tag-actions\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\"\n\t\tinputCancelActions=<<clear-tags-actions>> tag=\"input\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> \n\t\tfocus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} \n\t\tcancelPopups=<<cancelPopups>> configTiddlerFilter=\"[[$:/core/macros/tag-picker]]\"/>\n</span><$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$reveal state=<<storeTitle>> type=\"nomatch\" text=\"\"><$button class=\"tc-btn-invisible tc-small-gap tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}>{{$:/core/images/close-button}}<<delete-tag-state-tiddlers>></$button></$reveal><span class=\"tc-add-tag-button tc-small-gap-left\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=<<newTagNameTiddler>> setTo=\"\" class=\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<<delete-tag-state-tiddlers>><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>>/>\n</$set>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-block-tags-dropdown\">\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<nonSystemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n<hr>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<systemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n</div>\n</$vars>\n</$vars>\n</$vars>\n\\end\n\\define tag-picker(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars saveTiddler=<<currentTiddler>> palette={{$:/palette}}>\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=\"\"\"<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\">\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\n</$set>\n</$list>\n</$vars>\n\\end\n" }, "$:/core/macros/tag": { "title": "$:/core/macros/tag", "tags": "$:/tags/Macro", "text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n" }, "$:/core/macros/thumbnails": { "title": "$:/core/macros/thumbnails", "tags": "$:/tags/Macro", "text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n" }, "$:/core/macros/timeline": { "title": "$:/core/macros/timeline", "created": "20141212105914482", "modified": "20141212110330815", "tags": "$:/tags/Macro", "text": "\\define timeline-title()\n\\whitespace trim\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><<timeline-title>></$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n" }, "$:/core/macros/toc": { "title": "$:/core/macros/toc", "tags": "$:/tags/Macro", "text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n <$transclude field=\"caption\">\n <$view field=\"title\"/>\n </$transclude>\n</$set>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}><$view field='caption'><$view field='title'/></$view></$link>\">\n <<toc-caption>>\n </$list>\n <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </li>\n </$set>\n </$set>\n </$vars>\n </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n <li class=<<toc-item-class>>>\n <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n </$list>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n </$list>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-selective-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n <div class=\"tc-tabbed-table-of-contents\">\n <$linkcatcher to=<<__selectedTiddler__>>>\n <div class=\"tc-table-of-contents\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n </div>\n </$linkcatcher>\n <div class=\"tc-tabbed-table-of-contents-content\">\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n <$transclude mode=\"block\" tiddler=<<__template__>>>\n <h1><<toc-caption>></h1>\n <$transclude mode=\"block\">$missingText$</$transclude>\n </$transclude>\n </$reveal>\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n $unselectedText$\n </$reveal>\n </div>\n </div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=<<__selectedTiddler__>>>\n <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>\n</$linkcatcher>\n\\end\n\n" }, "$:/core/macros/translink": { "title": "$:/core/macros/translink", "tags": "$:/tags/Macro", "text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n" }, "$:/core/macros/tree": { "title": "$:/core/macros/tree", "tags": "$:/tags/Macro", "text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n" }, "$:/core/macros/utils": { "title": "$:/core/macros/utils", "text": "\\define colour(colour)\n$colour$\n\\end\n" }, "$:/snippets/minifocusswitcher": { "title": "$:/snippets/minifocusswitcher", "text": "<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\n" }, "$:/snippets/minilanguageswitcher": { "title": "$:/snippets/minilanguageswitcher", "text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>" }, "$:/snippets/minithemeswitcher": { "title": "$:/snippets/minithemeswitcher", "text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>" }, "$:/snippets/modules": { "title": "$:/snippets/modules", "text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n" }, "$:/palette": { "title": "$:/palette", "text": "$:/palettes/Vanilla" }, "$:/snippets/paletteeditor": { "title": "$:/snippets/paletteeditor", "text": "<$transclude tiddler=\"$:/PaletteManager\"/>\n" }, "$:/snippets/palettepreview": { "title": "$:/snippets/palettepreview", "text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n" }, "$:/snippets/paletteswitcher": { "title": "$:/snippets/paletteswitcher", "text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n" }, "$:/snippets/peek-stylesheets": { "title": "$:/snippets/peek-stylesheets", "text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n" }, "$:/temp/search": { "title": "$:/temp/search", "text": "" }, "$:/tags/AdvancedSearch": { "title": "$:/tags/AdvancedSearch", "list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]" }, "$:/tags/AdvancedSearch/FilterButton": { "title": "$:/tags/AdvancedSearch/FilterButton", "list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete" }, "$:/tags/ControlPanel": { "title": "$:/tags/ControlPanel", "list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals" }, "$:/tags/ControlPanel/Info": { "title": "$:/tags/ControlPanel/Info", "list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced" }, "$:/tags/ControlPanel/Plugins": { "title": "$:/tags/ControlPanel/Plugins", "list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]" }, "$:/tags/EditTemplate": { "title": "$:/tags/EditTemplate", "list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]" }, "$:/tags/EditToolbar": { "title": "$:/tags/EditToolbar", "list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]" }, "$:/tags/EditorToolbar": { "title": "$:/tags/EditorToolbar", "list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type" }, "$:/tags/Manager/ItemMain": { "title": "$:/tags/Manager/ItemMain", "list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields" }, "$:/tags/Manager/ItemSidebar": { "title": "$:/tags/Manager/ItemSidebar", "list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools" }, "$:/tags/MoreSideBar": { "title": "$:/tags/MoreSideBar", "list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]", "text": "" }, "$:/tags/PageControls": { "title": "$:/tags/PageControls", "list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]" }, "$:/tags/PageTemplate": { "title": "$:/tags/PageTemplate", "list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]", "text": "" }, "$:/tags/PluginLibrary": { "title": "$:/tags/PluginLibrary", "list": "$:/config/OfficialPluginLibrary" }, "$:/tags/SideBar": { "title": "$:/tags/SideBar", "list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]", "text": "" }, "$:/tags/SideBarSegment": { "title": "$:/tags/SideBarSegment", "list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]" }, "$:/tags/TiddlerInfo": { "title": "$:/tags/TiddlerInfo", "list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]", "text": "" }, "$:/tags/TiddlerInfo/Advanced": { "title": "$:/tags/TiddlerInfo/Advanced", "list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]" }, "$:/tags/ViewTemplate": { "title": "$:/tags/ViewTemplate", "list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]" }, "$:/tags/ViewToolbar": { "title": "$:/tags/ViewToolbar", "list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]" }, "$:/snippets/themeswitcher": { "title": "$:/snippets/themeswitcher", "text": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>" }, "$:/core/wiki/title": { "title": "$:/core/wiki/title", "text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}" }, "$:/view": { "title": "$:/view", "text": "classic" }, "$:/snippets/viewswitcher": { "title": "$:/snippets/viewswitcher", "text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>" } } }
[tag[Journal]!sort[created]limit[5]] [[🌼 Hello world]]
iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAABfmlDQ1BJQ0MgUHJvZmlsZQAAKJGl0L9LAmEYB/CvZ2GUIZRQRMNB0hAaVkttqYMUDmIGWS135/kD9Hy5O8lobGhpcHCpCCKJ/oGoLfoHgqCophb3hoqWkOt5PUMqaOmFl+dzz/u+z73vAwhpibFCVxAoaqaeiIbFldSq6GpAwACAIYxIisFC8XiMvvAVv4/3ezh4vA3wWr/X/xx9adVQAEcPeVZhukmeJ49tmIw7TfbqdClyhTtre5dbtn3U2pNMRMhnZFG2fcedtf3GreQkqid4yX4lpxfJ/F++YqGstO/DX+JWteUliqOtaSCBKMIQIaOMPAowEaCoAaZaMfmhSIlt6vlszhRD1AFVXNCUSb84HZyaA3g/f/apkyvV6NnPgLPaycknwEUVGH7q5HyHgGcbOL9kki61Uk6aQiYDvJwC/Slg8AboXfvvupGZmbY74V4EuhuW9ToBuA6A5o5lfRxbVrNOhx+Bq5rdw3Yt1B+A5BYQuwb29oFxqu1Z/wSsz3MFQFE60wAAAAlwSFlzAAALEwAACxMBAJqcGAAABBZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPGV4aWY6U2NlbmVDYXB0dXJlVHlwZT4wPC9leGlmOlNjZW5lQ2FwdHVyZVR5cGU+CiAgICAgICAgIDxleGlmOkNvbXBvbmVudHNDb25maWd1cmF0aW9uPgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaT4xPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+MjwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPjM8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaT4wPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC9leGlmOkNvbXBvbmVudHNDb25maWd1cmF0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NDAwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOkV4aWZWZXJzaW9uPjAyMjE8L2V4aWY6RXhpZlZlcnNpb24+CiAgICAgICAgIDxleGlmOkZsYXNoUGl4VmVyc2lvbj4wMTAwPC9leGlmOkZsYXNoUGl4VmVyc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjQwMDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoJYXuoAABAAElEQVR4AZ296a9l2XXYd+bp3nPHd99Yc0+sbjZJkeYgSrYYmgEMW1AiGTIk2ICRAHaQb0G+5H8IYDhRlMQfIgQBEkiyDH+xpNiWCQmSSDZltiSqyeru6pqr3nTfu/O9Zx78W/u8ev3UlAgkm9WH5+6zzx7WXvNa+zz9yR//WqvV0jTNNM2qqsqy9DyPG2qulloVavTauFovNbrO9bLB1adUanr5cU3dtPy4veM4RVEYtTaZTFzPHgwGkd4uy7yqiuOTIydwddN6770P/8Ev/cMP7z/5rd/8rXwTP/rg3i/9/M/e3t86fPzR97777fnuzuu3X03Wyag99Exndjr54IN7X/7SF3/uv/x7//u/+NVar772tb8Vx5swDAf9fp7n4fPkm//vvz/o7Pzpw0df/G/+UWK7rcqzTW+tV2mcvfv7f2ACAquOV0tjHa3Op2OHqU140bZtq1kkC75c7WXNx4v8sXcCEQWsplXz8/KNy5/NEKr+YiwesStc6aC54ZrzvwoAZmxey2stN5skjsus3Bltu5Y9WZ622212t9IMOgzaHXu45Vj2bHW+1lzN9lnp7vbOzZs3v//979NDlCRZlhm2xbiGaXaCwDyKjaow6yIM7DpZbzbLeJFrtfXg7DiN4mcf3XNtc5Wtlotpz3L2Bltb4Ra9Aaz79+9fAOvq2tTs6wZfLusvb2Rlf1Vp6n/0aa2p9uCU4JMgoKY1uMYtkDIADWhcamUhd+yyo2lWXJdlVlRZYVZGr9UFTI9PnnVanYll676/Wm22+53t/etRFD0pi9dv3bk22Ol4Xd90sijebNZh4OuWHrRauZYB/aLIO532JtmkRbqtJ51AL6PpD7/3rXcnj8p2K0iMggeeyYTqzcbvBqaWdMJ0f9D+yudf3bSHhmGcnZ0dH734GLMuIfDXgemywdUbtXipaG4ufzZt+AnSSIdXIHzZRp4q0NOgKbyVJAnYAWBd27EMMCB78ujxr/yz/zlO8iwrLNPUbO/+Rw/izaIbOOsk36wW0XKVrpNVXC7yKo2SMs8nk7Of+cbX1uu1aVv8m88Xe7ZVaXVW5PFmrmt5r+Xf2t86C9329rCV6tE6Slwjg9Z8ozKqvMxtzw071vZer+xcY0umZ+fRam3pcBX1z5Ctl1v+457rXyr8VDUgw9X6ZrXU/OjNRbMaoqO7jxs09QCxGdgwdbaOqw4z1OsgCMB533POx2ff+dY7L56fPH32PC+M07PpaLQTBF43bJ2eTcanJxYIkcROJ3z3ne+tFutru3uB7W9YkmObpv57v/d7T54/Dweh7fphp7dYr7a3R51Oh5fHJy8qPQgcc9RtJelmfrTIknxeFaVRDaHrwALAzDjK83We16vIsizf8euiFmK+Wtjhqz9/zH0Dnb8WRi/BRwP6bK5Xe6OG0tQ0aMVPcKos8r/48z+fnk9Ojo4nZ2erZaTXVplnu6Pt/taW69p+AM4ZLd/Rymw5nwEJXrMNW6sN3/eDoFXp9Xw+t53Asv3f+PVvxkn2c//F3w1a4f7+ATzR2doyHTtaxeBdlrRTnW2yOiFvFUmRZ0WdbspVDYt3wnagGa0ijqOsKJPk5v416yWLvZh3swCufx3UDE1YMosEqNLsJVA+AePmEc3gSqCkbkhLeJN0q5BW+Lji7qqNcHoQCmb8v/6L/2WxWPi2I2K30ubzZZJVWV6MtneXyyWkBO+vteL6wb7nGIbbiiG7NMvj5L0f/rDMi067qxn18cm4NxpmZTbc8qI4Kws9TXO60spqtAE+jhf4hb6obT+Hp1qmYfm1qe9d22nbruG4N9tOd9jT83KTBlaxWUxmyXp1sLN9wbNY2ydKs+c/5kr7Zp0/ps0nHl3dgMvhmk5g79yws3GRtbu9Msnm03noh5YThI5h2o7pOtP5XDdNyzbiNHrw5GnLdxGR0AhbtrW1nW7Wk/EZO2k5/mh3jwaL5TLsDGfT9fnZ4s6tO7bubpKlZgdZkuW1P9gaDd58a5Jl9qoc9Hf233yjNxg+fv/BBx99xN7euPWKW+uz8XmRLoc9Pwz0kzqzSuR0mUOTsAzTMLhP0hh8bmDRrOQCLoppNRh0+bRpAF7Adri/Wi7eEoYlZCiPamH2jQpHjWh2pSJSQ3f9ALT61nfeSdK83epohjufbWbLzbA/tCxnNp9v4shv+4h/w9Qc3wEVs6J4fnjU7/Z7YUfTzVa357j+2Xh8eHQyX676W9uDrZ3a0Ksi/dYf/8mXv/A3DM1KNzmitohKr+suz89v9EPTtotZBE8KttulXY6uDSr7VunbrlNG57PDp/eT6OHNm7fYrKBVCGbJKhrKgskaBvcfL+/q6v+/3DcdXn1DdasGUmwRHS9NMnSGbrc/mc5bQXjvh+9++MHDdrcDBlWZ5rfaiZYdHo3BnU6/h85gWLrrokXYZVHEm6jUWbm2mCxAKEvX274H/0ZdODg4aIWbKC3OZzN23THNs/FsMV/32+gPPe14jJ4WrzdgyYvj59ZWz9Wrw8k4epgG7da237l+q5M7bGk82HNubr/V6rxuGBa0z9WCjPmnV7UpIkvnCvBQqS+FPWC8QIsGOa4C4OX9Vfqi7iqkBBN5XyHk1W0o8hIoFFW93sTD4egHP7j3wx98sF7FhhvqmlnVsLACXSEtylLTkyzthb28zOC2xapIojiPU9swPcc3y3qzWCdaoaVeXSRgZV5WMO9VlAZOy4YH1fX5+PD4cHz3tdfWq5WWJlWeWab1n339p4KffCvvONtBUNWF3vMNy/BA72iTauCWFaL3ltrRYtkOOq6uw1EtEUBl2fBa1kxhSZSXcPjk/zcNPgGRq43+ynep5MXmLbrmnhGhL0dMCHZ++t13vrdeJ/3+aByltumUWjZfLOO16PFVrU8pi3PbRfuxgZGj1Z7rWbVhlJrNkmzWYtVlMTk8nBgnea2fnM3yyr5x+xVUf5ETVfUX7733M3/zK/1+X5tP0rrcHvQ+85Uva19+fbEZd3RDd6zzeFLWxSZax6tFieZQO+k6Wp5Pj+Jie3sXlSWOUxCMvbsAVrNmFkbvzdquQuHy/hJelzWXL/5oTaO5C7oKwGQPRKGra8gwitLBsDObLv+f3/jNPKuDdjdN8jzJV7Eo22lc5DkiO+UFw6wc3zL0uipoUXmm30GDgPukRdfVemYLZQKUGOdRzuR1M23767SOVqsgDDF4DMt85z/+yZt/cOcbX/8ayu4aDd001ummbdSlYc7mC5DYHvhFUbleux2EMCetLh0fvnetm1tVqSFVBtu+qA5Nubr51LCln1j5j/n5o+Cjt7+uvXoEDOEBFoT227/9uz9474PPfOazm3U6Hp+vYMJ5VaZ1xTp0w7axjk3TqUfbPWqj9SLZbFDBEXq223Z1awemZLWClg3t3tjpx1U1XSe2NXt4eJYl0c1bt5+9eIZrICuyf/d7/3Zr1DswtZWpnSbx4WL5em047a5VY8JbkV7qfm2lWPFY9mC9ZTiiuyAn0iQBIExblNJmYSy4KZc1f+VqkXmixOOWUOCQV5oerkCHDhWPajq4lH5XWqAlFKjp7e9857vf/Obv37z9apZWh4fHUzSaLEGx1DU7T3NdN9ugkO9VRr6cLwytcDSjN9jq2H4bAJk+StFAT1ot3w8dy9ELs7tIk7o6n7rLZL3s7XQFZdA6PKvb6c+Wk3f+5J1f/Pmf/cYv/6K3KV75ic/q3WGdpVaea27LKnIdCIFRdV5belzV0+VmPV+Mz34AB0QHhP4EWJcwurz5K8H0/6+y2Qng+YnXGYvt+p3f+R28NKOtnel0uVqt4jhmH7IkRYlplINiWqSp52Eiu3qaR6Jnub6NzC5L17aG3d5Wtel0Q9PHDaGVTo12DmYWun22iHujgxfjk7DbKSvMO8y/6L17733pb37pS3/769rpsjK1P/3zH56vV8bZcnG+Ol2tjo7P4vNlUWrHSXx8elbEaccP79zeeu+995jY9evX4bEOEgDIYZTBv1gAM+GnhbHW6EcKTeQeqMPdNCiXlctTCiDgFWoanYOfCjoXipXcl17TCiVe0wpqxFisay9ovX/vI+yv3YMbaa0/PzmfrgvTCdMyN1w/zpI42cApAtPGtbQ5i/u+uxW297qtkWH3HKfreaFX2uasbfmBqduGU0GcTMso25rFkg7afpFvttCYXFNzt54dH0aZo/nB//2b3/yf/rd/xfLOz+YalrnnHc7PbKxJlmzoKdhpmm5hdFud1Dfd0Lac0G8NegP3C1/8MgrKx+KPBTesCqDIotQqX65foKAqBU7cXNZzc3l/tb65b6BHT/xUGoT8PzZ0Gifn5+cu4lrXcH+s5zNH01GiijzB86Bnqatpdllbde4ZVtgfXB9tDYLWVhvu5ASGBpfxHHiNE3pt5lOCh7qGPTxZzVG7VosFBiQmDjsMS/NawaDXT8/H8CMUtDha20H46q2bdVbFWer3QxiVA0ZpldF2NptNsUxQ2U7GY8xyYIJLEuxBokCGQg6NQARSPGvusUv5B63IGtWKZZVAEJn0skZBqUGli+tly0vwgY4spoJVgplCjDqClh7QGmZn50ZV6iD2ch2Ad7aRx+sOmJrG8BGUUFc3PM3caneu7Yy2Wu0urClwcXeZdQUNtjwvcD3myIRtYfeegQ41y5N4U+Sp6wYdh5ry7HQ80LWbe3vYkGfTSb8d3L52A3aIWIabddutLc+CA/iikGuVb+ad7MX6yfjoJElis20maRTFa8zVp08fiwYPsBoFAnHeYFMDDhbMT8rlzwY6l5VN/eXTqz8vKwEOEFLgFWCx/5pwf7RfU3iTpmWbNWK/Yxmomslyhc6tlxVWSui4/Xa767X2toa39/erJGkj1VybPTT1GsTxPFiIE2UJC8cn4+D+svytQQ/Luo2jwHTT2jyZLT968IglwnGG3f5iNj8/Pv3c25/ZOThAEHe9sKjKB6eHE9tKl0vQ5/GDJ5bpMBPk2P7uHgSG1v/BB3MmfXR0ZIFKgACm8wlOxGoFKKh8QAwdTZYrONLAq7l+DBGFelcfXTbQxdcAcASpKsW31C9tsVjhQQJH0uWm5aBu2kmR9fothg3sAKD0g/buYGvYCvEx9cK2Jg4oiBZ1ota5scSUZQIIO8Uzoa+VbhmDLv7UMK30tLLGs1WSFq5l4pNI1mvPsve3dxaL+dnJ6Wg0qtN8vY7bvf7B9uiNV+5sJpPDk+PJanF4eGhkxc39GygwK9SZNH769OmdO7cWi5kAqwEBA1MEQMpCFKatfjbLbq48Uq1YuBTuuao3BIjNT3lwpag3LkCsXpO9AfppjO652cwWvmHcvflaxwvKNIEWUUjDVjuAxGx3gL/d8UA0HdclmjtbZ4gkAVgw1wIVtShqvQStGBo3tFkbng+cnazUY8IgA2u2ilqus4g2aB627+Kth9PNJ1PoF+fEswePcB8uq+zhehU6Qcv3/uEv/fJsuZgfiij8o2/9MTMZnx1nueb5NsRugcLwJpTUssBVVDCVBgLIPcMQPb6BjgIEFMDDvwSpBixNs6vXy3q6g/QujENBLsbjNztkrmcL/ES3b91+65XbLdP2DL3AcVVUrIc2KPoelFVruEGYHRIH5QBEV55XjFnmAoWj1OcmqiuslH9sQ46VneRlnaQ1LlJYG+SZLtLZbNazt9I8hcyB5nI2HfV7N3ZHPB65dqHXR08PHz169B/e+Tbu68+9dvfVW7e3t7fQsGaL2fXrPQxptIePNXggB7Dg8YLVYu4IZLi5AqyPcUfBTgDCzSVuNgC6BFPTBgjSinbQ4MsGgsvQIAIRcbaPt9fz89XCbbVcWI8YesjxVCaRW6A6TlAX/0iaYUuq6UlsA0jRP/34FmJTGKOasEgqWBrat66V8XqVROtuGJ4sF+PpWG97lucS0Xj6/Nm3v/OH/bC92+k9f/5c67S+9NWfeuuNN3/27b/7a//y1//Db7/7nT9672+8df3OnTvs2vWd/c/9xNtPnjyZzTRRSlFc4W0EMLa3tx1H3CCT81m305ZJyAov5sHkBOlehhTZeYhBtVGYIwCR/6hprg3toWiBVlTDFXkGSqlGslTkie/CpuEquuP56WbTabW9TAI7UJbp4n0TRIHbg0Oaree4wWvUbPBNw9FKP4DFNES31jHlbBv/Cf4JiTryoBa1llFQ2SDbnM2yzNox21b38bOnX/3pn8LkWxwe51m6PEv/z//r3+wNf+cLX/mp19/61P/w6bfXk4mW5ovlFEMdExqFdjw+MYl8ACaQjcLND37wg263C0TZwDRNm/WotX9MesBIgCIAuahUuCOqaVP5iadAF2jzDIaDdxx3EEgLcWVxwiaBywRslIzUbFzJeA8KdBaGEB5QAhSIS8iLp7ZgEwSJ6QjZFDID0KcyUdqEvNM6My0NrsS2xIJgwEqDfAgXodYXpjFdLTomBmaxNRoRTxy2At81/9t/+l/bw84qyf/2177xP/7Kr/7zf/5/vHp3/yc/8/lBO5jNi8nktH+9CwW02n6eFkavN0Aw4X944427N2/edl0fvYcoJrRw+Q+/l/p3IQougSKUonQ0NTeh2R8tLI9KIChXps+t+DhKiPfGjRsEik3LiVNcC47h+IsIZxPLF0gVxA3TwtJQtSxMQgOPW4WxLG4ZoImTHnU08FoaYWu/47XaGOaYF+iBTI8BmCsDMa7shyqr1QL/WI2OGrZZY4VPOI6Gg243DPrdVpal7cDHTHz8+Oje++8lSTTc6gV4kFHsqhqdFjFswbfgeQ0ZsntbhGDDFrvR63b5CYo1oFFXpV6KpiuFeTTl8ucnKnlKjeAh8xbUUqyZkaUKnmyjJeN8QQpVphOhWLYCz3LzeQIWQVAF1KRXtuAhnhQoTtg74MhhWAAB3C9z6mMwSfzyZm27IqZAKR3Gh7Jq5OsE7yCCj7ANDXL0/Lru9oemPugHdkbMudMWV1+VPHpxNOrv5GkKgR/s9l+5dRMNZDE/R+EF6EWZYTiclmOIwN7Z2YNPAezhEIc38sEDv0S3gmwgmJcUJ1Rw1ZuggNRARAFEYHC1qOfCvsS6UTRDT/KPhlrNIkCuKEuToh7PlyfPXnSDoN/rjQwnkNXCdZDUyGmjFqaEfoDUFpiDZJrtlKYNUICOjluOSJno9I7lmmWW4s+ATfIqlO46Dus8Oxuzqq1w4GP5hB1Eyqjj//C732IDCFC2w+BJURC7L7IUPtFrwzhdzK/5+fiV6wd5ktRFaeGTz3IL3gRygVkY0gDr5OQEvMUauuBISguFlVAaqF0FR0Nfl/XNzdVKalQiiXQmjF3AVCrZKJh1cP3atRu3yGYYr6PToxOmjjzeG/S7YQe53mfSDnEUXUzkygArcCsTuQJsRIJS1H/IWaujRY2+ZlbpsBeOei1HJx9Awx9AVJkbk1CIiX2JimRs9fqaxKfdhiMzH0y/zXxpYS14QYiCBoZiYKYxWN3r9udnYHaJvwIjEN4n5MziUf24g20Rm9zZ2cGoEJ0CHVDIR8k0hV9AgdKQHzdXoQZQKE1N86j5yVWvhIkoFg8XBjPUT6RZXhGw+tSbb65nq7oyO0RiyvL0+PSPn9wfhN0b0fbN0c5uu9N1XAnaSAJEFSfpPIqWRX4ebY7n02kUIRKLDZRSh5612+9d3x7swIRa2NpOGueolIRSWSaxNHSQFnRqoLt5ZMvYVhmSCRH4FdhUers7o73dbdIe3v703t033yQmncZRHqPQ7jw7IxWls1quCWqK6gABsk6wqbmRFQqjuGDnCkCinQoxlAioCyhdhZeAQ6Hij1ZipvNUhUCECLGZGlp2bEywFM1B71quHZ/iS8KZZVrzIquijbtaolU4MB6/Qu9CvYjjbLHaTDBp8+Jks3iGphMtkZUDZ9Dv4EVxcZ6OpzPFKepOK0RdQLKfLTegI84MZALcksA8bAerG3/ii+WK2bLkloG1jJcwByUOdvfCdnt+etQeDYlIQ/kgEEwJSxsUw42dQBGoOqv5DJ1ns1yk0UaA5btMlRtZIBQEBCEGXAYl+gvMQ/4pyoQlCeOk0BjnddOcnw3g8IiD8GYm3I9kAlTwzBRxVhZJz7GCeNPKigdPHiVnz97+4uefnxzdP86x3rYs+zTOrX60/6m3iLBCfausWBB5LcvzJJ4T3XQ8YlnE8tv+kPByZRkAoA3YdcctAiO1iS0WgRN37QVuV7/lmH6J6eMEqdkWibym91ZmtzaluW16bcStiUNI6wRtOFRuWy/WC6vbehotbOeV5crKS2MTT8WfRQHgTYHBAzvQip/Uy9JVYeWlqMe4VtF3pDT1tKExP+F91EgkjUdyEWBRA3QBFuLiwoYUHURGJCqzma+aDd8djtAhJAPLdd9/eAjj2N/dxYpNCA6WZeD5aE9VORclLS8wg8/TeOf2raDs3Lv/0SoZf/bTb7PC5+Ox1ut1d3bpXNwoaWkGzjAMPcRiSgQ/sfxwOOiP8xRRIXqRrq8IaWyWMk/MTdOEHa3x86cpXoeTxfkrd/Y3cdxu76AbrFY4cpdi7rAk3mTNTQFevEnQR9WDXlKkb+QQWmAhahJFgCIwoQhmAWLasxzuK5QrkVoCRPg5KpI454TBk6qgFRjEmhb4+FGy0A82UYati1SK5ktI/bN37xKD2up2QBt8rMNet9frsdrRaLhJE9x0RPRapXV792Cext/7znd3B9t724MKX9VyUZVQFZb4stb8Xq8PDXQRq3EcVFXQDne3+m+8fmuaGiI8MVRILWFRptEmAlSUc0hKkiaSyXzGDQAibpZEG2adI0ySyCSifbFsWejF2rlR8EGssPKP3TJNpUWik/J/yVP+E6UUmNTIU6mRuBoAuyBMukILxHBDSYcEBViKmKk/ma20VYyeCYph25A5VSQpHsH9Xv88K9qmHWxtSWYMpjFLSFNsybrM8f1d2951N2tP07Zbna9+7gt7Ozs3D66RfbQfhnaeI7dwexqmK16IddJx7Fvdvj/ot3s91wuw9TzdITRIvEZcfVqZEomoK3IDPNLYfB/Vc7qYAzKsbfYZPqWbG+JvtllvDToX4fsGUmrlF4gDaFh/w/IBmYBADBU9izNukJ7UvASWPEK4cgVYXOXmJZ3i7UYS4RVAMwBhCeHVeAnwgpIhZFpomB0USM1aZ6Xl+QLKrNpud7b7Q88yS1g+uSIZkahyvVw2Dhb0UoyV8ePneMa/9ObbuDvNPA0958atmxmBsuWyH4ZQLry5SmJgekAgEG1ktL3BpVPGKKGz2ZnmmeLZsOClJSknvqYtN0uMVM9wabReLPf2R6wdNxuwo5wcv5jN8HGrVQmVKW9Ms1RgBx4inniBe7EcFP7QBiLlnhtWLrSleBNv6brLPUjUFBqoF3WABXY4GMCG+KwBFlNknj7a5iKaZGeesqsKzcQRirNtCyd7p4s3AqGuuQ55CcBoFSd0iypgwLzAh1F1Pl9kpBD5ZHPo6EVB2BGdDH9WK4RsUS/F54c7KM16jpcslmUnxA+NUM7yKI3XERFDQtq6too2eFbhAi2/ZR8djp89Px2fIPte9W9iErLGTtu7vvf6l7/4E1uD4ScwS3wKDV5ccnpuKE2lABSfmxSJA10Flgh+UQqEAAHTZaEl0AYdNNRt4IXoLBCaxCZc1IB0E3uGg8hA/0QrlqwanAqWRViBTAeiwxApWAzeorIIwZMt43id/evXtw/OpxM0RRym+KzEzTpbEbjGg0pUQpIkNpFRVHDD66Pdx+ensBj8FusswsQ5PyoWi01gdNBRUdtX5Odo+mBvD9cziu7BjYPesPvWW3dRu1BK+1vXUWLgEuyZoIksWyEIsBA4XCGiBoMEiVQDrnBvGvCWvKjeVW8oZUpB6OOW0rrO0DYEepjG+MgRjo1OL14z5I4P6oNiSeLAaYmeI04NoOVodoFNg1JNG1ztmBY2PuA4BTNTtMIsb7me2e0Rv2FuWH85SnxSoSHAHeJNTGe0ZOcyTHGJe2dtwyA/B0eRPZe4dryY7g/D/WsHw17nlddeDYK2bjuf//zn7r796f5whKt6vV7akATkuY4Q30myycl5RrfC4EFrx6PIhihIKc1OqE9gxL4qeSdIR2kAxB4LXYpHAQHY8CwwSJxwDeR5UVqj8SZpr9Mh6ETx3SCBBaVp0GnBwshsID8KFxQReoxc0F6kbZ6Nz894kbwrJstuMQ5smPUALBzRsEXyk3A6Y/VI4ktuaGnpmZ7MLC6BNn42ZsrciGm77Q44tXfrzvF6k52eVb7dDYZ/7+98Az/163duj/odmARZ8ohyFXIuJQKyXsoms3C1ybb4bxOuLP0ii6Z5zJUlNcyb6SrAXT6RG1lxg1QNTinZh/JDNe1poIAFcC9YF5UoUGysXmiojawWlcZyPMyUJ8+fzSZTx+2IDYHQEz+VyBMi02hb7U7Y6CIY0aiCaM0gCzXrdSR2zjrGTymIiu2HXNPQe5kAycTMQ8dyRLHbRInvt2ZRMtzbmS6m73z3W+3bB04//Omvf46wjeuYgICgIWYXw6UZ/nRTXN6ifl+yERQmKECSyJgjV/Of/P2vs0ggyhUIgNUUptXABCiwt6IqoQ6AQLAUhZzqZRap/h9OJSiluNUFQvFSgxY4VSSdypEuOUyBM8alx5OjkwcffrQ6m223+8JmeVAWMN7Ver1Yr8NO6ProkgbRZFLw0K2x9Yjn4Hhh+vPpDEtNBlAyxMIFj6rDTGRA0U9QxAuUI6ZOIqNlRUb9h3/27h+++6436Fu+H682eHz63S67DuqggeIpyrhvzBXMEFnWxeSBXlVLylxTLpQmdhWE4iqTMAxgx1XApPALUDStqaFVA0fa411r0FAQrsI4E5uG60Xf6v9AF3g5aJVncHkIXDufTD/44P7k+Qs3KT+1c8Ms9c16Q0ZGQngnz8AguOnRyUmaZzjXOEOBXFac3egpKUmO1mK+ImELNARtrTpg35mYjFuDVkggOW9Qmvp8vRle2/uj733vX//7P8QoImCEwnD64inJ8o6h4xAm1EMncAYFWFGhoQmZtRgWSGyxO1QBdtRL2s/HeilDNqVpIteaADViLL8KO9Wp6ljxJxlBpShxc6k6cN904oEOmkSdRfuz7fk0enp4NJkvZsuVuclWaWzUJlo3HmUyemwcBiCKZRGkAxxRlvv+XBmx5GmlWwN8A7tQmuW7AAWF3nHdSLlGm9i5CAmFWSkHcYo61spn0/M/+NP/eJpr//ndu22Ug9rAqcnpnMnp+Ma16yK9a4MELvQ/cd7xWynhUi/hVPFYi+tVVGMBhXAMsANYNGsGaxre0QCRLRUMUsmytBSgCGOQQuVl4REv8vMlz7p4Qj2ojmcJkQirSouKpOuT8RnqB0Ia9WedpKEvkojpyQGSkNRz0eDColcwQYNTD/hDxcrFmooSoVO8Ar3hAF+CGHGlxOEZTIwq4Tpi8nGPrCkdozKN3//utx+dzG/f7u0c7MOPkLZlnOBanE3Op+fnXpuwtyuCzLRRqulHyA+ckv9h9guqCn4JH5OrAKtZOcMAIIbkJ4hAFJvEYN26AApPBRTC3xuuLjwBZbcpcq94vJgQLwtdceuaMKkCWQZrP33+DHwB+ijucZafTUhNX+y2QigL7ZrzM5I7jckCH3B93L9MA0C37RAWDhsu0txHR3WFnRUGngBh53IIitgh5hTKQm3ayEe4hg7PMh8fPf/+B/c6O/5rd9+A4dkZmQx2ZcCwdWCNXr7HgQOQqRInlVYJTjB7ZAYBFbVYtRJlyTZrsvD2EZ5gKkCKFgzJstlHXODssGyaEny0hgvzVCduICBTxNs4IlQDXgeg4J0ICFWkMUnENplMVcsPnr84Jl0AM9/13SVsXBykmlitoz2PbKG8nK+WqejiAa4FxB+pLyw/N3MDBU08BzkIwA0cDR+L7A0PHFKeN8KkSDCpdY+tEXyUuAFJ8H/2/T/Pqvrtt97sDvsyI3ayKLpDsqEJjCTnp5P9GzdhiMR+eMg6G4iI8cqyKSK/uHzMgrHcAjIMwBsWRmle4IquTfu8SBka3RV0QNcQAz0WZYSRmS7RYpmE0IEUBUrqhd2C2MyaykW0QiXa5Nn7D94HTfuOt4pyq7RrM5xr09+999HO25+38yVGKknExMqthZyw6bTQxEmLtTt+CyNGJI8n6WOEHqA+bGoAxvzKKLMTiUWxjaxpqdftThClySJaf+fP3sVI+vKn3x6Gvb3B7mK1TNAIW850FmG8h+3OZDKLo7TV7Z6enfeHwySvcdiz4eAdKdyQK4FFvIacKqOwNFZ9mesg5MPaFMTkIoB9yarAGp6CYlyZGfUQI+RLM2q40hdPBXWlDQgldgu5tKB3ux+ibS44ATAj5LY0DdFRKDgv94bgjnH/4f1r3VZ/EHrdPklFVR2ieR6dnog0Yg4cP8IgxLtp4ZyDTKAvSfZWfnmZJ+iLZSQqEocKDRNb72RydjQ+nS+Xr33qjRuv3gG+yEYQbfdgn3T4Ngnh5HJrNbjNabEQRwwpzLAL1BRoS6kEOdkNeKiqEhOVI1SgMTNoBcElsD5WQQVhhRgFcORh0JFg6cvSoKj4EAiry0tsMIwYDizxWgLIAA20A4bKFE/PVnMQhOEVrzFpAKXivXoVyW1aTx89JrJrv3a7a+Ne1nqE4dwRQh54CXutSGpDe8f7U86nK3YBdYh1QnRwceJ4zLBz8xr7hOJDEmGtk+kczdFci+IzX/z83vVr/Ny/ce354XFn2CeWD2mXEfnO4KWFf5UECEQqUIZpMiJrIaMBagLsFpKplGSGsDIlrhFH6EliSMsGqdIAhHdeVmB9CH5R02AQV+4BJaBSldKSBhAI1AE/4oTs+RRhv96sY84lMe3MqDvtEJTBsuUt8FNmELomh9KIrXPg5vD44RPNrvIboz67s1qcgvAeKEZsRjfCXleoD6HZ77MpIozhnoL3GJtMR5smG4CF0gAfA6tzS+/hDLx50Ol1j09PTdd+9uIFqImyHsUxDgmYCVyPoQnQPn78+PD0BL23O+gzCliMgCXG0+uGxFZhcUzA97qIUZJ5WLXwaYZkFZfwYmwKMQKZi6I+HnHDlRc47chI6LDsD9QBFuJXQcZ9+9vfhpGzKnH+i7YhAQ6kxMlynqXPPN3Y39nuBOQXcUIStsthiWTY73727U/fq8uT0zFaYkCQvdTbuDDF64vJRqAayxnYCsOOSUMmAw6mzqEJXO1UImxqfVmKhk17K/CYGAlIchgh8B49fwE+EnWYTDl9TaolkW97HW26lkeHkAMEe3R88uzoEK0AhwdZXRCdCDDbifD1lSTzWKRiLqYzVs0rAqwGNa6wfEVagBCmosQZM2DZzT1XBQjBNcVHLJIkPpLyEIZEwEkYFrqb+L+QaaJa6LZXJdkmS5ks60zymI2FjIjRxcmKvKc33/rUA0PbRNFTfOtl7fSGBWmSylJDLICeTJS4BKoZyAQVIE8kUGxJkBUwaYHLti3TqO0oOWCaSbxGli+zeHd3F8so7HTEEUq8MPDxfPLyOo4AXIcUuRAMcs9mU9YC08B7Qf4DvJLJUMioG+gE0AREpOWjTwnPAhwoA4zbYBA3wALeTBc8Uk9FMjaYhbLDPXTOTyjuwYMH9z54/+jwOAy7IpDwdJYV8QHGpsBwTuEFIr2ydULOkASZRUfhAIjrimperLe3tm+9coeMc9wPmW4fTs8Zl6323EBvBchUKb4vIoapWgIwTlCTqSD7Z5mk5jFbKJ/dY+f6BPTwYht6p9tdrtbgIzwPoTSdzoj1YbYhJQgpByxNlAwQVE7b88jF0djG/eVAjHhfKHGsLUyJSgJEoOhaPjNvTqQ0xHhhDwoshQSEyTaFqVJJedm+JOH6owcf/cVfvHd2zvJcDD+RXTAOOTkoZq+F3IPm0RvXm9kUF8MchhMGAViMV4TdhoPQyQZbx/Neu7tPtBWEsosNRhyjJFA1B6J7HRazVtPHCIeN5PiGMSIx/iRRzalwqyOnMoI3/hpARxGJkASNGyTgXfQQ0qIPDg6anKo4in3OG1jWoyePnz17BuwYFO97wBl0XYSSEA1cyZSwAHm3re3hppKT2EBARBiPaUfvdA2Mmp9ACa4RtDwaIFZBSzacAjvCoYEC+eTJ0w/v35/OFmwkERqyFslDA70BUJonYCpuzSjJRI1QEnO+Wgc4TYIQ3Y3YAVbQfLEAKILwQevkfCLnkEld6HXWUWpygsnBx5RP5xNGx9/CXEnXw3UjGgrsnDPMm01oGOOTQw6VAX2S3lzPX21iji5iGaNDgzUq2JH1uz0kGuiIc43tQD9EmQCP15weStOf+PznsPZBIDAFJwGymFxDhBNE6jruR0+fXrt2jYWDtn/JrQwSMacLVKpqXgOITSV7yCNhukn5/vsfQH1zSVQCo1F6xOGG26TdNki7EIjLxgu1sk501czxWN9kOgM01MA+mJby7zPVFGjqWNO1TjwKPj1erEjxgKmRqgEtKAeMjtxmMiRE5oSK0HWZFjZgATeHlDiHV7ErmrFGQWdQr5KUk6rIGIsRWSeNG5xguE2aSaakayMK2ae7d+/CFvlyA49owyj0IMiloFN4BVoYvcGUmIwAi9LwSsBBoSkFEa0AxLTZSzFiYDFIvXv3HhwdnTCAYuRySh2h1RA5X0XodPuCRkqb50XhzZwDyDiDGkALqPWEd3a3R5zwwm2gmRZaO9MC4XHtsQ/ExPD44opppDvTEO8CXpQ8NfDospUQIb5hTcKUSF0nb8Qu2r+4ZhrGq8Q7FogE0pgJ+ysTEiMZNmCQEs6/+w/uR6gjYQgcR4MhagUNup0O6wKUJQcO1hui/2ATFvK6lhA9B/suVIeX+CSdMkXWif3FhDgTQg0QBK7Q/MOHD58+P0JX9HxyuDLGY/3QFhEyrDfAj2pHv7QHTPTDuyRi6ITXhyOYU15o47MZ1DI0uwIrCB8eTRYGiVGmw8aW4lrJ1yR1wIPJT6tJklnwyRBEGVEzDsFzBJM+mQxLAq+bdxt0YMRmUCbA/A3Evyo0Yx6MRWM4OirCerl6/8MPR8Pha2+8vloIdMADwtFcQUb4FPsBQjErKo1CciAISKF7CLDoHRA1XbNObmQwSRkVRYExmARQAFjkiOumIzq0+MxYnGQxokvD3dEMRFcg19gjWIdhjJZcAOYiiVHOQJZ4tLNRiTrm+Qx8xLFLzhqZQQk4DjGqcC+YJwxFvPo1jkDGTeEiGJtQdRPExV8DXSfkengE6EuXqIcAGXMR3GJVaoPEGYKyh6MBQIgGic8Miw8Upm2SIb5ZFGjFVEnpOx+f4k2Yz6eABlMfeGE2YRiRtoZnYiD2PHRQrflixEsYATQRiPy8uAJC8YsW8jLMdbkE5Pwk1SlWUTwQBI4JklNJYUY04wZ8hHoALjOmN2LxfBuHDDUO5HI6SyfDYbFmrBvXtuHiLAQBRN4nOCO2t07aAIEsCW/MxguiedyTWhdFhPBIJSVeCQA1FGLwH7sEuLISxqU9LfGmcY+mTKUYj6wFnIcbiPJnckgYZDk7Pn72/PDO7Zuvvv76ixfPPveZzwZhm3oWi/kB54GRYTQDSvgGvaG7Ii5FcCHjG2AxWFN4TKGS8bgydW5YD2gFlspGkTZigVwGPJUDeSh4NINrMx6NG4CKWBEVzhTvVEZIj0jSmtm2wvb23r5pu9hac2JMnFJVag5DpFkMlIgzwVaIRxRZGaGEgXPQGkm5cEUS2zkhgOgFACTpYocp7iUnCBAREJgygIARbMn2fJYnrilCrWRA0LVsc4n4e/T0Cd5qYmsgAWU8HsObMBKBPrvC/JkMG8JioVsSQ1ZZusA7odUtok0stYHOJbAUSsmFRw12AGzADLejd5gouAMWgNEIBrRHwgk8opL24C1QYzDwHJlDJ5hNSDf6oQal+fq1m5wxQf+Gos/PpnTC6NixtGSWzIH9YG9kA+R0jhzwppKnWKlcEZeY30JTJAOoKzvUNOB1CkMzNv+ox47B7iPpkysOQsyyk/Hp4eHJq6++igry4Ycfffqzn2Gs4+NjBmV63DMZ5i9IqlCeDoHOfL2aTKdczf/uH/8Cv/Eeg7RwRpC65osJOYeIMY4cKAQf5PsffvTB+w9TknhMHy1LtBGcsDlkC0SxS4XFcEICdMO9CqFwFIeJovu02u1JvDqenmGQYT4lm3nLtXeHfSxjTgUQLY3zsj/ajaFX181tbZ5uSCoDHYAcswHOzA3a4gbmiFMzKTOSG1KjstveOo/9Xjta822sNsPiycBuhSBDvlsURWHQwn/FasF+kYQ1X7OZ3L//8PqwPei0ei2v0/JISWMh/WF/vpjDX+HCcBOdM+6wcmDBkLiO61IsR/RedoE9pIi5hhqDV4hT7KowjoJuxpekxqdnwBtgAnJgD4Nn/9h28l5gv7KZkqIEuEXNaV6nGQXE4RH7Bg+GiwVeAD7QAPuD7H4KogpuyFZZIIwL0+1WmwhMAUa8C0bTBu87rIRlMx/2gA7FfEdqSIRMyuWgNOAt0Bwi4imncLr40FWc4ejk+PnzF7R86623YCmDAZHfDkQHSULQCPTT8ViCKhgGqGaEu/FKAS7wazWnK0iKq+AtVSyMjmR9optIaiNiCLcGlELY6sWLFywVSw9eQ1+0Aml5X7BU8FFKE2plnUwXmPKInoEgZNBqhdQDF16UBmXWCoNejy9/yeEF8cqL6MQRgdYvbipl3gMSANSkTruAGxAzFqXZDBym2ACYcQBLAISOk2CSilSGZ3F8RRQvwuakguP7KIvZcjlbRoPRFh3s7e2gk5EeQ+Ow18c8QHTCCiRdABQgYibxeTn6woQRkYwOpFij2MMXBZ3tgk/B10EsDTo9Pj59+vTZcrWRGvQrPbc7GOiiHrImmgt41fy5UfeiVYAODACYUK2xP6syRkVk5tSTjA8TgSRbHJ03yqNxucQ7SGTRdWJcApU2GnTpGShf7iLw5UW2hxnjymq2gUo5JlZJeJhxadzAsWmM7kAQAh4PERyPT+GHbDZrh68DWeZ2Pp3ik4CHcjyOiBF0ttngPUQXAg8KOVyOdUxgSUxukbYUeiZ8zyg8EiTnNz8wVghsM7Pp5IyPTZEfqEl+lWCfei6t0YTQl5kiEIeuWAD8iz2nDetsgAXuwntJGZB8Yaxqs46JEnIGyWN5kgs7IHW2E+LbBbmaoVFNkZEc1KUTNgJqg8vDVppN5moUhGFKB6am1Vy5J9+KqWKWktGLYGQy0DDclGXBceALawUFcKfX7w4AVjRjjXzXQpTq+JQ92N7bu3fvHjiFggAuya6oABJ2lNwTX1NUzxqFpgRUgiaSWUuSGuAExPT17Nlzvh0ATpFVAktXgBDWwxvi8C3F5QKU8MhAknB5JiFmkrgG5YAZuMwwpJoybaAKqAEWcIRg4SPoFWGnNRz26XA+XxGvBuEHXdRokbl4Sei88QfILBXtNyDjp0MOgIhIhoLdiCBjbmAFlMyC6RtH8dn5KQCCoHjELtIeGkSlGnQ91IVOX449I3/gU6T+k7OJsdWAgpboJIzCTtMGqwn4gL+UCzIk/IM4AC4k2oFrIMRisRyfnmP0MVXmxOLZLn7q+gJTABUGFsMWKF4HmvDNBQne0a/MG0cwyUDkM8molu+RG4KZjPZgAynO0KDaiNy0dM637WyNqvwEx+maD3PUtuEpA14Cawank8Ulm5E+6fT73WYa9M9PWT4f14njMBgBROQ33h68HRw/YVeQNTAQLCexVxCIIohK9Ew2BupndNgHcgDmj0eQY66wOwhWVsrLsJWGCbDJwseF4OAt9CDmDt1xbchHsApjteDjEFBTLodTbBIIpCsoEYcCfvXeYABiMnXmzXsYbRxcaMDElcLe0JtIWD79BuewXTIT6NdxHT4bh6giSw02RRM0Nk7ggs7n48l6CbuPSSDke3NQVsvDDS9sgVGYIeo1N7PZBDwCBIKhdYEk1eoTZCu6PqjBHFECebTCREWXQf3lQwVKw+QG9xnAcsIeb2Ee3bx169nh4Qwnh+tjgCJnxXYUfiIIwA1Uw1h4m5kGk6db87//r34B6mHFFGYGlEWBLoqHjx+h5eP9QUECp2BUIBzLXq4X5A+76uxGEks6N/LcxwdUCJ1KkBh2CycGxZSiZOkedrlEanCa5Ck8wA08mD0rxGziRaaEgYbwRIFG5ebrRHBiODfT5UAKZWd7Gx2i3ydLodvv49LEoW6g+UCMMKugxYkKCVMjzpRJz+c208VqhTjAoQcZ8nFJEj53d7d7JOfwiYzpGZTLV6eYqkjZoPXi6LjXG6IjYpNyiIN/yCH+Q06BUGTtKiNY0mwEs0AwZsYOAHjugRTfhGHVoAY4RUFzBsb4c4Emew7ucAOsxUAlmVZYnkngvcECrnQCyHiFG04s0XlTqARhYXaM1emIT1HCfY6eJ8XeDh8ewi1YvNl18azS8mBvn56xHJgPUgxVA14D3QEabBtu0BVfeeW1R49eMBBKANMlPxTzCxRjkvAKXpc8PThgy+9zsAWLr9Um6sQGkOwL1nIig2Xu7117+OQxndCeK7MSC4WilgnUWFFTwDWIC7wRsmJtFAYjXZOfgAn0U9ISqCJpBEYEu/EHsHjWILMU2SiqIHaBpEZoAiAUHBAMJod8glvRD/RKY0uonudIkgoW4404/yWWcVwkfGANyYLrIK7T3ZsSVecoFxuLFcd7+H9hMfSDcBRGyVegOAWdJc9fHKHui82M5zNJ8N9i02AZ8vlIuuXF+XTCyrCN+KAN/o+YGG2eswE4L1gyPr/7Dx6icB1cuw5zaJSegrxbjkdBnKKH4msT1wCcGCS6cNE0iMd+4kXAqpTFkxMiGQgKVqKBSRFgKQQUg1b0BrHRJatKTv9glIvgUM0EJE2Rd4R3isJNeEl+KR8dAWrUv06br3+IeQMjYK8gVZTBwxcv4FW7Ozt0jlbB3kJNTAmcor7ZSMf32ZLlcg5q0yfJXDiU11HMrPBviDcqwVsdcFAPmybs9wLPwWnBpw4PRltYhQc3byzX8fn5dDgYncEI+WBQLsYJygcHqUWx5T8JtUloBJRkUTy1+NYIq4YAmQ1VABjAA3XRo5TEpZFo98JoBUF4ExLgJ4YCiYrcoEYzRfCJnWcxDYxQkWs+7pLlJDcITcJ6wfGyTHLJRGQgCAQNC68lkIJ18PUr4Y7oYnnOVzyY+nxyDieGT6F2sRm4WBfyZUnSliByjr/h+cMed1kpvdMe1wC/4aciapWOigOed8FijpnJx3TFuBQEpAEFfzgrJcjGZsDvOPmIKxXiaZYra1EAAltEIRdKqsTUVjmRErZAb0Cus59kCAG7BlgCVIGVFNowD668JVSVC9ShR5CWxBhYPB0LcDHdkJ/C13B/SSaAyFJ2CmgQL1BuRddpkeYBjyeU4oYkySRwC9qgJrEZaPqN75TOkZXg1NHJKeiDzMIEYkJMABeOoD+hSZWYiGGAC0hizioIyDyBI59UIZBFhJlvaWFoc+IetoD8vX//PmYY+43KoG9EoIHmrJe8E7BGvpeEWOPIALqA4tGy3bAiUEHO7SlVgvAfaE9tAyZW26CfLFu+dSzgg69DbA3U4MSAKYPGORYgBi0na0VWEJDgFV6mmUoSA1MVzxQZZyFWwS14AmwAThQQvJHcCGg+ox8+ycYewpVh6qJ0EAQ9nzIuUAA9Ud/wxsE++NKofG0EbU484yqchY+x3WZtDEp7HDMgOYhCsj+H+jdrOffIJI6OzrBy4FZ4LYmG4f3aGu3gkCBTju0n+4iNsdW5tUaLEDJXJ7vhJSICNpsVzZj3k6ePQXXQCsxEOrJsZSmLMwHYgyZc5XM2yvbmCnXQNTOjHk4NfJgnU0d4snjwiXqrheJK5iPNySJiISh4gn2EeJApGCueQgT2HI8vNECHdAvywxDwCoAFwItK/Ez0jwD3UX0LRzoSNyleUIg0R9dgqYzBZBAnUDToyT3woho0hMmuNvKNEvYAlW0ZbTi8+sYbbxyfnj998XxruK0oQUiBxhwdFaVJQhTy1QhWwWgAyvzlv/PTXDEGHz16/PjJM6YrWXpwKDhFkbdCwny5hNoZW3KmxZ8GsMXxnRQ3bt5GmdwebckvDiS7Dr3Snowa3HTK3SGhKxRbSIlKuDgJfsR942iJNY1xhXUOYCoWzGFxvlvFZ7c5NF3x/T/OmnOEkBM++hoFGz0QnGWTODgubBHGRQobiFOb+A0NvlDgEHnHqS7xUdqSs00wRTfavttWuZDYN/im/Rafnm6jkbb5iM9ijV+RtQCI5WKJpxFwwCrYSPg1tIb/Bd8WXE8hjVzkjj2czxbweFor3JEzK2qLBJ+ZHB1AZY2CC0mLUy0XUgUZeYUroKSfBvW4Ua/LJ/HZbbyWSqXsK3wRA5BYANKNF3kI92FyPGLGDWrgx6NniuynEqM0hrgwfajE0QjWc8Mo+DV4N9dkaPHLqAQ+0VJEEIk7FxkCi2QGtD87O6UGieEGLte+7YCz49mEDyeTRg4jnMyE/7BKmuEFYdVgPgthUUyVQp8Wm7RebZALLJjpCuNcrWQx2HFMTkUEESN0JK0BmOwxR1rBcznvQNdgDYTGXOmBMRiAlowBc5d75V8EFjyiMKrAiDgCAo6icnKAC615yotsNhukXoe44EtKYkALdQXcIUlegtMzFnvAbFsdkizFZcK79MN8Uad4HTcQdih6qKigpr5cxrv7uxAgr+CcWazWZRHzFvOnKxRN0TZEZRfdHU8Zo+Ds4ykKlGxGo7I2eMELjMRUGIbWrA1HGsAi2ki9xMvFfpTtYgBq2ADUsX7eJZOKxnTNUnEGCTwUrxJbEuVJQQHNgFG40owVwoBgRjSkq2YPuGepzYJlruQfSIIrcBdsBbGbWbFO+JU0Jq8EY8eVDC+yCeiEiVEDyVNT4miRzEA81dThXIJ14pIQAx4+h5IN2yJjmiQEvH28i4+T2eIo4V3GBQgqKRUYycYDLCoptLTEqhSjFNxltqK5Snwc1YoIiiIoBQiZHDMG0BxETfnYLJ+OSU8BH1ggrB1NR1n29CAohNnFTHVMZfF7iWb08srKZRi21BNFgRvA1MC6QQ00X+qVhiv7ydxgeQyNz4ArahZX2T+Br7yOyU978bSxt4pIsem4g9dgL6qvawkjbbdb08VM1Ks4Ozw+gh1jZvKhtiTmO/noIqakcAo2CVpAOvQM/bIHRcTHzGRTBZTsOTvWkAnDYSuQsM4ifdJfAANpUGJdqyC7clPgpmZVzJgrpCRbSiMhRgms48GC+kg6lg+iyABiaUPXCP6GMaFVg1yAHjWSQXnKKDKQIl6Bs0qSoH8KzegWc5eJodNIM+FNOOQVfqkhMsLB8IcG7nwpUSwwxIZNbI1vnIrvCPcTqcPtNj4NzD7SkBiFucFDuKIsAHv0KxowH1QjoIGA4BHfjm92kdHVHHWLjIFNrPJs0FA4EQg2CUeUDHpkH44CmjYuV2iHp7UpEVoyIvEaw+x8LyBzn07JXUFhg32w4eS8QtfwVlx6mOosuIELtNHE8lgenFmGUNYBHXLDlTkxdRRYsR+gZ36qifI6QWPA3WAWugLvAjT0sDoVdiE+fIo6HsP/0R1uG86zAh2UcjJaObJB50S9lHeDTwVqhBfwBfJFqWg+o1uGU5glqWHKhSWfGoBEMJiY2wWwGAlY0o7kMZy0/GSazEoO6KqkbdrRGooAfWhGYjAkNp/NuIKVoAyU0ggscEEkgfAv+WwzpERBJDE8LaEj5DJjsYfgGq+zOrWZSvtSjE9eUNwUQDBuc2V0ZgX0uRFEpoAJCrXpgRrq8a404OKtxs1BvJItEGuKwndAsmxvbw+PO/0fHh4eXL+B41QOkSeiV5NLAX9gU7F06Q2eRTP0H/qX06SqUG9+9VM3+CkgEkpFxZCZMQO0SwZghUiQwG9xFol9RN3hu/3QEeYIzVCp8CuRLAuACL11e11cbKI+fwAAB8ZJREFUuwCi+XYh+8koOPzwEJE5hYrUCtq4wOCxQFTYNFfJo0KYsgGQDCQPDYkkEkcC5J/KVzLYVogFHsxThhYzlnfElhDmJQ1hWBeGvXjlhcU7dhfvlYo2cmXyig2RVZGH3R6zhcHDZPnmHUEgPKVMj20D0CA3YGosRDVCjsVDPUWA9TNv36Edq+I3eNHcMF38/1wbrKFfthNRwAtyDkeMGJHooA/19M673LAMqJC9J1eZLvn0I5OjLf0AdyYNWoFlvA6ecs+Cmxdlb1SfUqPMbEVUwlkozSMInCHohCvOFzoEcHTCrGnAtJkPkKIwHZoR1uJdtorOgQCA5Se6AVEA2oQd/nqDQYyHLpHO5+eTZiBwnW7QQ6GVkOyMTgfUpAcKc7YArUqnIGDDeIJykmhJOKGqWDwzAy7oIFABFMfTfI0kYUsluUtOpeapzXEJjja0xecPRkiIRfF+AMFKFC9AD6hQjmQ9Aljxf9EzOyGo8VJFonPmw0pQRlVoR1IVmIwgfVFGKd4RATqFbmhMfB+gYPRyzy5TyZxhFRjMbAkFaC4XBOLXOCKQd+Av8mE8PQMQnDdDI+OGV2gGATEZmZ4iZhgYEyMNXmCkNk8mDYIzOQa7LFQ162EeFLoDoZil7JL6sLCYaeL2Iiq+hnwZjBVSw5CtVoCVK0yq5eG0RPrwyRssGtrQD4tEcgN0sJwr82PQy9HpgaGpUcgitEBpxuV1CvOmhvbNFXDTCY0xeqUS5VfkqTRjPtwzWxrQJ6K8amNZguMMYuBpoLfZfCnAEoASOd4QBqY9j+lBIKDcGMhGIMjHoJgVlfSJi0MAxXgUbphKJYd+ZE6sh/HYIsQ2Y5D0IXDhO8YGJ1JwGJAmybd3152azwQ4sKrQ7DYL5kqN6g2UtlG3cTDAQalhxwQEfFBBafANKjEcC5A/nkFL/NAUEZzSnsJMKI07hNepp3M6oZUsQBLiMH1c5kkdqi/bySNeZLOBAgcXcBOg0PBP3u3IYQroABFN8AVuhauecDJ0yxzIiWBKCAe1UpkVwoHCQDLoV+/eoopJULjhQfOTBTAkP1kVKMkkqOEnNCLdecKASDRmeaAf06IxLAxlla1drdasFHYA9gEXOqSZIBecngijMhWICdAbCNKwHipRJukTs0amolR/NpYaNQG+2Sf8tLnnppkk115X3DLdLqncXRga/QNZhgNk8DRwArUANgq9wNZQEifLc7qFlVuIS8tE2jAWU0W0UPhBn0yeuaGnU4OjjQZUssCLgIXMTrGPBkDcAx2urFDoy/P5408sjGG83oAryvHO7giXOxFKkAtlhDgl9YwBKJkujTFNGIPl8ZOd4Z7NpU9qKDhYBDSq8Ja0MQywg7x2psg2Cdbg+BdXlzgq2WWewjeZEnOTZSjtYavPX60jJiinAPE1NV2xCtCOUaAWdL11xTkmvgoCFeu+KVaXRBL5PoKcIF6ju5PvzOsCJr6bJ8ASSUGePL0gGxmLqzhmuaPQgkIvPOaGpiAFywZS7NhmuYHHE1xhuoGowhEaD1Y7nkkmhGJDe1bODnNlutAvNEsz3uIbjiAwndAhOiJ7Tv885csSzYh0yUDcN379dp8UXpkJs6dDegPvmRWYIs1EZxAWQT2VtMn4gu1LSQp7pRJo0oZ7qI/TAGAGf0mrwRi65W/TMDEiyvxJEE6nYPQMR1s44xtp1qhlCrGkf7XxAh+WQDG/cGePWvFUIaf4kDop+SpVFMFOCARmD/6RSjVdzrGh+FKoDuLmybATklodL+ev3LhOxhYfkOaQPHk60AFeICAofx5HpWNwjgYswZHFkXj0fjLASTEgKY8o7TaJPy2Pz2jz9ble4OyNOjvDzg76UV3wQbrdPp9bI3s1Cn2SsfiYla+RRZrFLVJNMGv0KrDNLOIMDOFFeGiOEzlKl/v7+7i3+CM1OHOwxPE/kN+xtTsitXcVz8+mp3GmgVUgp9I/kIlQeqz2pZEPxnK1kA+bgD8FjBOrE/QkjqV41lfeuMFGQbGyV8q1xiCAD4KhplERad1AlxoIGcThbwEpWhBmBPpATGie7LCyxkWxoz26CIW/awZ5wv5Xy6Vgn2WRGUWAq9fn3FYPH5SSX0pVwy6BTlXsTeiWEJnCVkwH+lF6aOOSFUnBRNh2xl2KnIkBkMxHgrwiTzHClHuHTwNy+mfF/CkIARAc2NGAcC9X5ksnrJR7OlRYKXYFWMzoLEMwS/0xS9AKLBb+IkX044tIlkBEFZAZAAv3EbeLFHrn9DKi5BQjC6HYakFc/KSeEBXtmRPmCqDnRr14wZKZhwxmWRyyIHiD3YYmx4RQWhEiKEc0aDgF1ih01AwHvYikV8E+UACwyi5SVNp5AyymASKrP3sozIhly8pbfE6EtrITqKLNZNT4FvCicxQpHvMUKLAxdMmOSr1SCWQ5arH8VBR/ARCRhrzWAAPUoh27w0O64NpgVsPTmAqj4t5mNkBFQCw4JFkIAnhPxKWyeyWyI65glRQIXdMPDfhGJOyZfENJZhRMybjyWVWmJSJBGIQorGAWOIIiCnD5q1esTbIkRDJIDQ3kh8r5BFhAE75J/0IzKB9lhmXGsjfrCB8lHhfITQSfcsMjWmnv+i1WoZwFF2dvwFK6YvL0w46x/dzQBtRgODCLngEr5T8BWM8NQ3V6gbgAAAAASUVORK5CYII=
The following tiddlers were imported: # [[$:/plugins/jd/NTFS19]]
yes
no
no
yes
no
\rules only filteredtranscludeinline transcludeinline <div class="tc-remove-when-wiki-loaded"> <style scoped> html body{ background: #000; padding-top: 2rem; width: 50em; } p { color: #49acf4; font-family: Courier, "Lucida Console", Monaco, monospace; font-size: 1rem; font-weight: normal; line-height: 1rem; text-shadow: 0 0 2rem #77c6ff; margin: -2rem 0 0 0; padding: 1rem 2rem; width: 0; white-space: nowrap; overflow: hidden; visibility: hidden; transform:scale(.70,1); transform-origin: left; } p:nth-child(1){ animation: type 2.1s 0s steps(41, end); animation-fill-mode: forwards; } /* List Games */ p:nth-child(2){ animation: type .1s 1.1s steps(41, end); animation-fill-mode: forwards; } /* blank */ p:nth-child(3){ animation: type 1s 1.2s steps(41, end); animation-fill-mode: forwards; } /* FALKEN'S MAZE */ p:nth-child(4){ animation: type 1s 1.3s steps(41, end); animation-fill-mode: forwards; } /* BLACK JACK */ p:nth-child(5){ animation: type .1s 1.4s steps(41, end); animation-fill-mode: forwards; } /* GIN RUMMY */ p:nth-child(6){ animation: type .1s 1.5s steps(41, end); animation-fill-mode: forwards; } /* HEARTS */ p:nth-child(7){ animation: type .1s 1.6s steps(41, end); animation-fill-mode: forwards; } /* BRIDGE */ p:nth-child(8){ animation: type .1s 1.7s steps(41, end); animation-fill-mode: forwards; } /* CHECKERS */ p:nth-child(9){ animation: type .1s 1.8s steps(41, end); animation-fill-mode: forwards; } /* CHESS */ p:nth-child(10){ animation: type .2s 1.9s steps(41, end); animation-fill-mode: forwards; } /* POKER */ p:nth-child(11){ animation: type .3s 2.1s steps(41, end); animation-fill-mode: forwards; } /* FIGHTER COMBAT */ p:nth-child(12){ animation: type .1s 2.4s steps(41, end); animation-fill-mode: forwards; } /* GUERRILLA ENGAGEMENT */ p:nth-child(13){ animation: type .3s 2.5s steps(41, end); animation-fill-mode: forwards; } /* DESERT WARFARE */ p:nth-child(14){ animation: type .2s 2.8s steps(41, end); animation-fill-mode: forwards; } /* AIR-TO-GROUND ACTIONS */ p:nth-child(15){ animation: type .3s 3s steps(41, end); animation-fill-mode: forwards; } /* THEATERWIDE TACTICAL WARFARE */ p:nth-child(16){ animation: type .1s 3.3s steps(41, end); animation-fill-mode: forwards; } /* THEATERWIDE BIOTOXIC AND CHEMICAL WARFARE */ p:nth-child(17){ animation: type 1.1s 3.4s steps(41, end); animation-fill-mode: forwards; } /* blank */ p:nth-child(18){ animation: type 1.2s 3.5s steps(41, end); animation-fill-mode: forwards; } /* GLOBAL THERMONUCLEAR WAR */ span{ animation: blink 1s infinite; } @keyframes type{ 0%{width: 0%; visibility: hidden;} 1%{width: 1%; visibility: visible;} 50%{width: 50%; visibility: visible;} 100%{width: 100%; visibility: visible;} } @keyframes blink { 0%{opacity: 0} 49%{opacity: 0} 50%{opacity: 1} } ::selection{ background: black; } </style> <div> <p>List Games</p> <p> </p> <p>FALKEN'S MAZE</p> <p>BLACK JACK</p> <p>GIN RUMMY</p> <p>HEARTS</p> <p>BRIDGE</p> <p>CHECKERS</p> <p>CHESS </p> <p>POKER</p> <p>FIGHTER COMBAT</p> <p>GUERRILLA ENGAGEMENT</p> <p>DESERT WARFARE</p> <p>AIR-TO-GROUND ACTIONS</p> <p>THEATERWIDE TACTICAL WARFARE</p> <p>THEATERWIDE BIOTOXIC AND CHEMICAL WARFARE</p> <p> </p> <p>GLOBAL THERMONUCLEAR WAR<span>█</span></p> </div>
\define sectionSymbol() @@text-align:center; ∵ @@ \end
Escape
Enter
Down
Up
$:/palettes/Vanilla
alert-background: #ffe476 alert-border: #b99e2f alert-highlight: #881122 alert-muted-foreground: #b99e2f background: #ffffff blockquote-bar: <<colour muted-foreground>> button-background: button-foreground: button-border: code-background: #f7f7f9 code-border: #e1e1e8 code-foreground: #dd1144 diff-delete-background: #ffc9c9 diff-delete-foreground: <<colour foreground>> diff-equal-background: diff-equal-foreground: <<colour foreground>> diff-insert-background: #aaefad diff-insert-foreground: <<colour foreground>> diff-invisible-background: diff-invisible-foreground: <<colour muted-foreground>> dirty-indicator: #ff0000 download-background: #34c734 download-foreground: <<colour background>> dragger-background: <<colour foreground>> dragger-foreground: <<colour background>> dropdown-background: <<colour background>> dropdown-border: <<colour muted-foreground>> dropdown-tab-background-selected: #fff dropdown-tab-background: #ececec dropzone-background: rgba(0,200,0,0.7) external-link-background-hover: inherit external-link-background-visited: inherit external-link-background: inherit external-link-foreground-hover: inherit external-link-foreground-visited: #0000aa external-link-foreground: #0000ee foreground: #333333 message-background: #ecf2ff message-border: #cfd6e6 message-foreground: #547599 modal-backdrop: <<colour foreground>> modal-background: <<colour background>> modal-border: #999999 modal-footer-background: #f5f5f5 modal-footer-border: #dddddd modal-header-border: #eeeeee muted-foreground: #bbb notification-background: #ffffdd notification-border: #999999 page-background: #f4f4f4 pre-background: #f5f5f5 pre-border: #cccccc primary: #5778d8 select-tag-background: select-tag-foreground: sidebar-button-foreground: <<colour foreground>> sidebar-controls-foreground-hover: #000000 sidebar-controls-foreground: #aaaaaa sidebar-foreground-shadow: rgba(255,255,255, 0.8) sidebar-foreground: #acacac sidebar-muted-foreground-hover: #444444 sidebar-muted-foreground: #c0c0c0 sidebar-tab-background-selected: #f4f4f4 sidebar-tab-background: #e0e0e0 sidebar-tab-border-selected: <<colour tab-border-selected>> sidebar-tab-border: <<colour tab-border>> sidebar-tab-divider: #e4e4e4 sidebar-tab-foreground-selected: sidebar-tab-foreground: <<colour tab-foreground>> sidebar-tiddler-link-foreground-hover: #444444 sidebar-tiddler-link-foreground: #999999 site-title-foreground: <<colour tiddler-title-foreground>> static-alert-foreground: #aaaaaa tab-background-selected: #ffffff tab-background: #d8d8d8 tab-border-selected: #d8d8d8 tab-border: #cccccc tab-divider: #d8d8d8 tab-foreground-selected: <<colour tab-foreground>> tab-foreground: #666666 table-border: #dddddd table-footer-background: #a8a8a8 table-header-background: #f0f0f0 tag-background: #ec6 tag-foreground: #ffffff tiddler-background: <<colour background>> tiddler-border: <<colour background>> tiddler-controls-foreground-hover: #888888 tiddler-controls-foreground-selected: #444444 tiddler-controls-foreground: #cccccc tiddler-editor-background: #f8f8f8 tiddler-editor-border-image: #ffffff tiddler-editor-border: #cccccc tiddler-editor-fields-even: #e0e8e0 tiddler-editor-fields-odd: #f0f4f0 tiddler-info-background: #f8f8f8 tiddler-info-border: #dddddd tiddler-info-tab-background: #f8f8f8 tiddler-link-background: <<colour background>> tiddler-link-foreground: <<colour primary>> tiddler-subtitle-foreground: #c0c0c0 tiddler-title-foreground: #182955 toolbar-new-button: toolbar-options-button: toolbar-save-button: toolbar-info-button: toolbar-edit-button: toolbar-close-button: toolbar-delete-button: toolbar-cancel-button: toolbar-done-button: untagged-background: #999999 very-muted-foreground: #888888
{ "tiddlers": { "$:/plugins/BurningTreeC/escapecss/modules/startup/CSSescape.js": { "text": "/*\\\ntitle: $:/plugins/BurningTreeC/escapecss/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n", "type": "application/javascript", "title": "$:/plugins/BurningTreeC/escapecss/modules/startup/CSSescape.js", "module-type": "startup" }, "$:/plugins/BurningTreeC/escapecss/modules/filters/escapecss.js": { "text": "/*\\\ntitle: $:/plugins/BurningTreeC/escapecss/modules/filters/escapecss.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for applying CSS.escape() to each item.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n", "type": "application/javascript", "title": "$:/plugins/BurningTreeC/escapecss/modules/filters/escapecss.js", "module-type": "filteroperator" }, "$:/plugins/BurningTreeC/escapecss/license": { "title": "$:/plugins/BurningTreeC/escapecss/license", "text": "The ''CSS.escape'' polyfill by [ext[@mathiasbynens|https://mathiasbynens.be]]\n\n```\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n```\n\nThe ''escapecss[]'' plugin by [ext[@BurningTreeC|https://github.com/BurningTreeC]]\n\n```\nCopyright Simon Huber https://github.com/BurningTreeC\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n```\n" }, "$:/plugins/BurningTreeC/escapecss/readme": { "title": "$:/plugins/BurningTreeC/escapecss/readme", "text": "! escapecss[]\n\n!! About\n\nThis plugin adds a new ''escapecss'' filter to [ext[TiddlyWiki5|https://tiddlywiki.com]] which uses the Browser-native [ext[CSS.escape|https://developer.mozilla.org/docs/Web/API/CSS/escape]] to generate ''valid'' [ext[CSS selectors|https://developer.mozilla.org/docs/Web/CSS/CSS_Selectors]]\n\nFor Browsers not supporting ''CSS.escape'' [ext[a polyfill|https://github.com/mathiasbynens/CSS.escape/blob/master/css.escape.js]] adds its functionality\n\nThanks and Kudos to [ext[@mathiasbynens|https://github.com/mathiasbynens]] for creating the polyfill and releasing it under [ext[MIT LICENSE|https://github.com/mathiasbynens/CSS.escape/blob/master/LICENSE-MIT.txt]]\n\n!! Examples\n\nSince TiddlyWiki version 5.1.16 Tiddlers can be addressed through [ext[data attributes|https://tiddlywiki.com/#Custom%20styles%20by%20data-tiddler-title:%5B%5BCustom%20styles%20by%20data-tiddler-title%5D%5D%20%5B%5BCustom%20styles%20by%20data-tags%5D%5D]]\n\nTiddler-Titles can contain characters that aren't valid for CSS selectors. The solution is to escape them through CSS.escape:\n\n```\n<$list filter=\"[all[tiddlers]tag[$:/tags/very-bad-title]escapecss[]]\">\n\n</$list>\n```\n\nWe can assign css properties to a generated, cssescaped selector from within a [ext[Stylesheet Tiddler|https://tiddlywiki.com/#Using%20Stylesheets]]:\n\nNote the rules pragma `\\rules only` on top of `assign-css` - it disables all parsing rules for the `assign-css` macro, so that titles can contain characters and character-sequences that would be rendered by the wiki-parser\n\n```\n\\define assign-css()\n\\rules only\n[data-tiddler-title=\"$(currentTiddler)$\"].tc-tiddler-frame {\nborder-radius: 50%;\n}\n\\end\n<$list filter=\"[all[tiddlers]tag[$:/tags/very-bad-title]escapecss[]]\">\n<<assign-css>>\n</$list>\n```\n\n" } } }
{ "tiddlers": { "$:/config/EditCancelPopups": { "title": "$:/config/EditCancelPopups", "text": "yes" }, "$:/config/EditTabindex": { "title": "$:/config/EditTabindex", "text": "1" }, "$:/config/FocusedTiddler/Style/ClassSelector": { "title": "$:/config/FocusedTiddler/Style/ClassSelector", "text": ".tc-tiddler-frame" }, "$:/config/FocusedTiddler/Style": { "title": "$:/config/FocusedTiddler/Style", "text": "border: 1px solid <<colour foreground>>;" }, "$:/config/ShortcutInfo/close-focused-tiddler": { "title": "$:/config/ShortcutInfo/close-focused-tiddler", "text": "close (or cancel) the focused tiddler" }, "$:/config/ShortcutInfo/edit-focused-tiddler": { "title": "$:/config/ShortcutInfo/edit-focused-tiddler", "text": "edit the focused tiddler" }, "$:/config/ShortcutInfo/more-tiddler-actions": { "title": "$:/config/ShortcutInfo/more-tiddler-actions", "text": "open the more-tiddler-actions popup of the focused tiddler" }, "$:/config/ShortcutInfo/navigate-story-down": { "title": "$:/config/ShortcutInfo/navigate-story-down", "text": "navigate down the story river to the next tiddler after the focused one" }, "$:/config/ShortcutInfo/navigate-story-up": { "title": "$:/config/ShortcutInfo/navigate-story-up", "text": "navigate up the story river to the previous tiddler before the focused one" }, "$:/config/ShortcutInfo/sidebar-search": { "title": "$:/config/ShortcutInfo/sidebar-search", "text": "open the sidebar and focus the search field" }, "$:/config/ShortcutInfo/sidebar-state": { "title": "$:/config/ShortcutInfo/sidebar-state", "text": "toggle between the sidebar states shown/hidden" }, "$:/config/ShortcutInfo/sidebar-tab-next": { "title": "$:/config/ShortcutInfo/sidebar-tab-next", "text": "open the next sidebar tab" }, "$:/config/ShortcutInfo/sidebar-tab-previous": { "title": "$:/config/ShortcutInfo/sidebar-tab-previous", "text": "open the previous sidebar tab" }, "$:/config/ShortcutInfo/tiddler-info": { "title": "$:/config/ShortcutInfo/tiddler-info", "text": "open/close the tiddler-info section of the focused tiddler" }, "$:/config/ShortcutInfo/input-accept": { "title": "$:/config/ShortcutInfo/input-accept", "text": "{{$:/language/Shortcuts/Input/Accept/Hint}}" }, "$:/config/ShortcutInfo/input-clear": { "title": "$:/config/ShortcutInfo/input-clear", "text": "{{$:/language/Shortcuts/Input/Clear/Hint}}" }, "$:/config/ShortcutInfo/input-down": { "title": "$:/config/ShortcutInfo/input-down", "text": "{{$:/language/Shortcuts/Input/Down/Hint}}" }, "$:/config/ShortcutInfo/input-tabs-left": { "title": "$:/config/ShortcutInfo/input-tabs-left", "text": "{{$:/language/Shortcuts/Input/Tabs-Left/Hint}}" }, "$:/config/ShortcutInfo/input-tabs-right": { "title": "$:/config/ShortcutInfo/input-tabs-right", "text": "{{$:/language/Shortcuts/Input/Tabs-Right/Hint}}" }, "$:/config/ShortcutInfo/input-up": { "title": "$:/config/ShortcutInfo/input-up", "text": "{{$:/language/Shortcuts/Input/Up/Hint}}" }, "$:/config/ShortcutInfo/close-popup": { "title": "$:/config/ShortcutInfo/close-popup", "text": "temporarily active - close the last popup" }, "$:/config/ShortcutInfo/popup-accept": { "title": "$:/config/ShortcutInfo/popup-accept", "text": "temporarily active - accept the selected item within a popup-list (trigger its action)" }, "$:/config/ShortcutInfo/popup-down": { "title": "$:/config/ShortcutInfo/popup-down", "text": "temporarily active - select the next item within a popup-list" }, "$:/config/ShortcutInfo/popup-tab-next": { "title": "$:/config/ShortcutInfo/popup-tab-next", "text": "temporarily active - open the previous tab within a popup before the open tab" }, "$:/config/ShortcutInfo/popup-tab-previous": { "title": "$:/config/ShortcutInfo/popup-tab-previous", "text": "temporarily active - open the next tab within a popup after the open tab" }, "$:/config/ShortcutInfo/popup-up": { "title": "$:/config/ShortcutInfo/popup-up", "text": "temporarily active - select the previous item within a popup-list" }, "$:/config/shortcuts/input-accept": { "title": "$:/config/shortcuts/input-accept", "text": "Enter" }, "$:/config/shortcuts/input-clear": { "title": "$:/config/shortcuts/input-clear", "text": "Escape" }, "$:/config/shortcuts/input-down": { "title": "$:/config/shortcuts/input-down", "text": "Down" }, "$:/config/shortcuts/input-tabs-left": { "title": "$:/config/shortcuts/input-tabs-left", "text": "" }, "$:/config/shortcuts/input-tabs-right": { "title": "$:/config/shortcuts/input-tabs-right", "text": "" }, "$:/config/shortcuts/input-up": { "title": "$:/config/shortcuts/input-up", "text": "Up" }, "$:/config/shortcuts/close-focused-tiddler": { "title": "$:/config/shortcuts/close-focused-tiddler", "text": "" }, "$:/config/shortcuts/edit-focused-tiddler": { "title": "$:/config/shortcuts/edit-focused-tiddler", "text": "" }, "$:/config/shortcuts/navigate-story-down": { "title": "$:/config/shortcuts/navigate-story-down", "text": "" }, "$:/config/shortcuts/navigate-story-up": { "title": "$:/config/shortcuts/navigate-story-up", "text": "" }, "$:/config/shortcuts/tiddler-info": { "title": "$:/config/shortcuts/tiddler-info", "text": "" }, "$:/plugins/BurningTreeC/navigator/config/shortuts/temporary": { "title": "$:/plugins/BurningTreeC/navigator/config/shortuts/temporary", "close-popup": "Escape", "popup-accept": "Enter", "popup-down": "Down", "popup-tab-next": "Right", "popup-tab-previous": "Left", "popup-up": "Up" }, "$:/core/modules/startup/story.js": { "text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers();\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// If a target tiddler was specified add it to the history stack\n\tif(target && target !== \"\") {\n\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t}\n\t\t$tw.wiki.setText(DEFAULT_HISTORY_TITLE,\"focus-tiddler\",undefined,target);\n\t\t$tw.wiki.addToHistory(target);\n\t} else if(storyList.length > 0) {\n\t\t$tw.wiki.setText(DEFAULT_HISTORY_TITLE,\"focus-tiddler\",undefined,storyList[0]);\n\t\t$tw.wiki.addToHistory(storyList[0]);\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n", "type": "application/javascript", "title": "$:/core/modules/startup/story.js", "module-type": "startup" }, "$:/core/modules/widgets/navigator.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"},\n\t\t{type: \"tm-edit-text-operation\", handler: \"handleExternalTextOperationEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList}\n\t));\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tvar p = storyList.indexOf(title);\n\twhile(p !== -1) {\n\t\tstoryList.splice(p,1);\n\t\tp = storyList.indexOf(title);\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tvar pos = storyList.indexOf(oldTitle);\n\tif(pos !== -1) {\n\t\tstoryList[pos] = newTitle;\n\t\tdo {\n\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\tif(pos !== -1) {\n\t\t\t\tstoryList.splice(pos,1);\n\t\t\t}\n\t\t} while(pos !== -1);\n\t} else {\n\t\tstoryList.splice(0,0,newTitle);\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tthis.wiki.addToStory(title,fromTitle,this.storyTitle,{openLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),openLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")});\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n\tthis.wiki.setText(this.historyTitle,\"previous-focus-tiddler\",undefined,this.wiki.getTiddler(this.historyTitle).getFieldString(\"focus-tiddler\"));\n\tthis.wiki.setText(this.historyTitle,\"focus-tiddler\",undefined,title);\n};\n\nNavigatorWidget.prototype.findAdjacentStoryTiddler = function(title,storyList) {\n\tif(this.wiki.getTiddler(this.historyTitle).getFieldString(\"focus-tiddler\") === title) {\n\t\tvar titleIndex = storyList.indexOf(title);\n\t\treturn storyList[titleIndex + 1] ? storyList[titleIndex + 1] :\n\t\t\t(storyList[titleIndex - 1] ? storyList[titleIndex - 1] : null);\n\t}\n\treturn false;\n};\n\n/*\nHandle a tm-edit-text-operation message coming from a global keyboard shortcut for example\nevent.tiddler targets the tiddler for the message\neditor/factory.js adds to the hook and triggers the text operation\n*/\nNavigatorWidget.prototype.handleExternalTextOperationEvent = function(event) {\n\t$tw.hooks.invokeHook(\"th-external-text-operation\",event);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\tvar adjacentTiddler = this.historyTitle ? this.findAdjacentStoryTiddler(title,storyList) : null;\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\tif(adjacentTiddler) {\n\t\tthis.wiki.setText(this.historyTitle,\"previous-focus-tiddler\",undefined,this.wiki.getTiddler(this.historyTitle).getFieldString(\"focus-tiddler\"));\n\t\tthis.wiki.setText(this.historyTitle,\"focus-tiddler\",undefined,adjacentTiddler);\n\t}\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\tif(this.historyTitle) {\n\t\tthis.wiki.setText(this.historyTitle,\"previous-focus-tiddler\",undefined,this.wiki.getTiddler(this.historyTitle).getFieldString(\"focus-tiddler\"));\n\t\tthis.wiki.setText(this.historyTitle,\"focus-tiddler\",undefined,\"\");\n\t}\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\tif(this.historyTitle) {\n\t\tthis.wiki.setText(this.historyTitle,\"previous-focus-tiddler\",undefined,this.wiki.getTiddler(this.historyTitle).getFieldString(\"focus-tiddler\"));\n\t\tthis.wiki.setText(this.historyTitle,\"focus-tiddler\",undefined,title);\n\t}\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle,\n\t \tadjacentTiddler;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\tif(this.historyTitle) {\n\t\tadjacentTiddler = this.findAdjacentStoryTiddler(title,storyList);\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\tif(adjacentTiddler) {\n\t\tthis.wiki.setText(this.historyTitle,\"previous-focus-tiddler\",undefined,this.wiki.getTiddler(this.historyTitle).getFieldString(\"focus-tiddler\"));\n\t\tthis.wiki.setText(this.historyTitle,\"focus-tiddler\",undefined,adjacentTiddler);\n\t}\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.wiki.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.wiki.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\nconsole.log(\"Relinking '\" + draftOf + \"' to '\" + draftTitle + \"'\");\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"],\n\t \tadjacentTiddler;\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tif(!originalTiddler && this.historyTitle) {\n\t\t\t\tadjacentTiddler = this.findAdjacentStoryTiddler(draftTitle,this.getStoryList());\n\t\t\t}\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\tif(adjacentTiddler) {\n\t\t\t\t\tthis.wiki.setText(this.historyTitle,\"previous-focus-tiddler\",undefined,this.wiki.getTiddler(this.historyTitle).getFieldString(\"focus-tiddler\"));\n\t\t\t\t\tthis.wiki.setText(this.historyTitle,\"focus-tiddler\",undefined,adjacentTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-renaming-tiddler\", event);\n\tvar paramObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\t$tw.wiki.renameTiddler(from,to);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n", "type": "application/javascript", "title": "$:/core/modules/widgets/navigator.js", "module-type": "widget" }, "$:/core/modules/widgets/reveal.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tthis.classes.push(\"tc-reveal\");\n\tdomNode.className = this.classes.join(\" \");\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tif(this.isPopupWidget) {\n\t\t\tvar index = $tw.popup.findPopupIndex(this.stateTitle ? this.stateTitle : this.state);\n\t\t\tvar popup = $tw.popup.popups[index];\n\t\t\tpopup.isShown = false;\n\t\t\t/*if(!popup.isTriggered) {\n\t\t\t\t$tw.popup.deletePopup(popup);\n\t\t\t}*/\n\t\t}\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tdomNode.style.left = Math.max(0, this.popup.left - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = Math.max(0, this.popup.top - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = Math.max(0, this.popup.top + this.popup.height - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tdomNode.style.left = Math.max(0, this.popup.left + this.popup.width - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.registerPopup = function() {\n\tvar state = this.stateTitle ? this.stateTitle : this.state;\n\tvar index = $tw.popup.findPopupIndex(state);\n\tif(index === -1) {\n\t\tvar popupOptions = {\n\t\t\ttitle: state,\n\t\t\trevealWidget: this,\n\t\t\tparentPopups: this.findParentPopups(),\n\t\t\tisShown: false\n\t\t};\n\t\tif(this.openActions) {\n\t\t\tpopupOptions.openActions = this.openActions;\n\t\t}\n\t\tif(this.closeActions) {\n\t\t\tpopupOptions.closeActions = this.closeActions;\n\t\t}\n\t\t$tw.utils.pushTop($tw.popup.popups,popupOptions);\n\t} else {\n\t\tvar popup = $tw.popup.popups[index];\n\t\tpopup.title = state;\n\t\tpopup.revealWidget = this;\n\t\tpopup.parentPopups = this.findParentPopups();\n\t\tif(this.isOpen) {\n\t\t\tpopup.isShown = true;\n\t\t} else {\n\t\t\tpopup.isShown = false;\n\t\t}\n\t\tif(this.openActions) {\n\t\t\tpopup.openActions = this.openActions;\n\t\t}\n\t\tif(this.closeActions) {\n\t\t\tpopup.closeActions = this.closeActions;\n\t\t}\n\t}\n};\n\nRevealWidget.prototype.findParentPopups = function() {\n\tvar self = this;\n\tvar node = self;\n\tvar parentPopups = [];\n\twhile (node) {\n\t\tif(node !== self) {\n\t\t\tif(node.isPopupWidget) {\n\t\t\t\tvar popupState = node.stateTitle ? node.stateTitle : node.state;\n\t\t\t\t$tw.utils.pushTop(parentPopups,popupState);\n\t\t\t}\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn parentPopups;\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.openActions = this.getAttribute(\"openActions\");\n\tthis.closeActions = this.getAttribute(\"closeActions\");\n\tthis.classes = this[\"class\"].split(\" \") || [];\n\tif(this.type === \"popup\" || this.classes.indexOf(\"tc-popup-handle\") > -1) {\n\t\tthis.isPopupWidget = true;\n\t\tthis.registerPopup();\n\t}\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state = this.stateTitle ? (this.stateField ? this.wiki.getTiddler(this.stateTitle).getFieldString(this.stateField) :\n\t\t(this.stateIndex ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) :\n\t\t\tthis.wiki.getTiddlerText(this.stateTitle))) || this[\"default\"] || this.getVariable(\"currentTiddler\") :\n\t\t(this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"]);\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tvar currentlyOpen = this.isOpen;\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) == 0);\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) == 0);\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n\tif(this.isPopupWidget) {\n\t\tvar popupState = this.stateTitle ? this.stateTitle : this.state;\n\t\tvar index = $tw.popup.findPopupIndex(popupState);\n\t\tif(this.isOpen) {\n\t\t\t$tw.popup.popups[index].isShown = true;\n\t\t} else {\n\t\t\t$tw.popup.popups[index].isShown = false;\n\t\t}\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex || changedAttributes.openActions || changedAttributes.closeActions) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen || (this.stateTiddlerTitle && changedTiddlers[this.stateTiddlerTitle])) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tif(this.isPopupWidget && !this.isOpen) {\n\t\t\t\t\tvar index = $tw.popup.findPopupIndex(this.stateTitle ? this.stateTitle : this.state);\n\t\t\t\t\tvar popup = $tw.popup.popups[index]\n\t\t\t\t\t$tw.popup.deletePopup(popup);\n\t\t\t\t}\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState();\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t\tif(this.isPopupWidget) {\n\t\t\t\tvar index = $tw.popup.findPopupIndex(this.stateTitle ? this.stateTitle : this.state);\n\t\t\t\t$tw.popup.popups[index].isShown = false;\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n", "type": "application/javascript", "title": "$:/core/modules/widgets/reveal.js", "module-type": "widget" }, "$:/core/modules/widgets/button.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = \"button\";\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tvar index,\n\t\tisShown;\n\tif(this.popupTitle) {\n\t\tindex = $tw.popup.findPopupIndex(this.popupTitle);\n\t\tisShown = $tw.popup.popups[index].isShown;\n\t\t$tw.popup.popups[index].isShown = isShown;\n\t\t$tw.popup.popups[index].isTriggered = !isShown;\n\t\t$tw.popup.popups[index].noStateReference = true;\n\t\t$tw.popup.triggerPopup(this.popupTitle);\n\t} else {\n\t\tindex = $tw.popup.findPopupIndex(this.popup);\n\t\tisShown = $tw.popup.popups[index].isShown;\n\t\t$tw.popup.popups[index].isShown = isShown;\n\t\t$tw.popup.popups[index].isTriggered = !isShown;\n\t\t$tw.popup.popups[index].noStateReference = false;\n\t\t$tw.popup.triggerPopup(this.popup);\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\nButtonWidget.prototype.registerPopup = function() {\n\tvar state = this.popupTitle ? this.popupTitle : this.popup;\n\tvar index = $tw.popup.findPopupIndex(state);\n\tif(index === -1) {\n\t\t$tw.utils.pushTop($tw.popup.popups,{\n\t\t\ttitle: state,\n\t\t\ttriggeringWidget: this\n\t\t});\n\t} else {\n\t\tvar popup = $tw.popup.popups[index];\n\t\tpopup.triggeringWidget = this;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tif(this.popup || this.popupTitle) {\n\t\tthis.registerPopup();\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n", "type": "application/javascript", "title": "$:/core/modules/widgets/button.js", "module-type": "widget" }, "$:/core/modules/utils/dom/popup.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\tvar self = this;\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n\tthis.rootElement.addEventListener(\"click\",function(event) {\n\t\tself.handleEvent(event);\n\t});\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(title,options) {\n\t// Check if this popup is already active\n\t// Compute the new state\n\tvar popup = this.popups[this.findPopupIndex(title)];\n\tvar isTriggeredShown = popup.isTriggered;\n\tif(!isTriggeredShown) {\n\t\t//cancel all popups but my parent popups\n\t\tthis.cancelCancellablePopups(popup);\n\t} else {\n\t\t// cancel all popups but my parent popups\n\t\tthis.cancelCancellablePopups(popup);\n\t\tthis.showPopup(title);\n\t}\n};\n\nPopup.prototype.cancelCancellablePopups = function(triggerPopup) {\n\tvar popupParents = triggerPopup !== undefined ? triggerPopup.parentPopups : undefined;\n\tfor(var i=0; i<this.popups.length; i++) {\n\t\tvar popup = this.popups[i];\n\t\tvar popupTitle = popup.title;\n\t\tif(popupParents) {\n\t\t\tif(popupParents.indexOf(popupTitle) === -1) {\n\t\t\t\tthis.deletePopup(popup);\n\t\t\t} else if(!triggerPopup.isTriggered && (popupTitle === triggerPopup.title)) {\n\t\t\t\t// delete only up to level\n\t\t\t\tthis.deletePopup(popup);\n\t\t\t}\n\t\t} else if (!popupParents && (popupTitle !== triggerPopup.title)) {\n\t\t\tthis.deletePopup(popup);\n\t\t}\n\t}\n};\n\nPopup.prototype.deletePopup = function(popup) {\n\tif(popup.isShown === true && popup.revealWidget) {\n\t\tif(popup.closeActions) {\n\t\t\tpopup.revealWidget.wiki.deleteTiddler(\"$:/popup/StartupAction/\" + popup.title);\n\t\t\tpopup.revealWidget.wiki.deleteTiddler(popup.title);\n\t\t\tpopup.revealWidget.invokeActionString(popup.closeActions);\n\t\t} else {\n\t\t\tpopup.revealWidget.wiki.deleteTiddler(popup.title);\n\t\t}\n\t\tpopup.isShown = false;\n\t}\n};\n\nPopup.prototype.cancelPopup = function(title) {\n\t$tw.wiki.deleteTiddler(title);\n};\n\nPopup.prototype.isPopupShown = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t\tif(this.popups[t].isShown === true) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.findPopupIndex = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar clickedOnPopup = this.popupClickInfo(event.target);\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(!clickedOnPopup) {\n\t\t\tfor(var i=0; i<this.popups.length; i++) {\n\t\t\t\tvar popup = this.popups[i];\n\t\t\t\tif(popup.isShown === true) {\n\t\t\t\t\tthis.deletePopup(popup);\n\t\t\t\t\tpopup.isShown = false;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar higherPopupsAtLevel = this.findHigherPopupsAtLevel(event.target);\n\t\t\tfor(var k=0; k<higherPopupsAtLevel.length; k++) {\n\t\t\t\tthis.deletePopup(higherPopupsAtLevel[k]);\n\t\t\t}\n\t\t}\n\t}\n};\n\nPopup.prototype.findHigherPopupsAtLevel = function(domNode) {\n\tvar node = domNode,\n\t\tshownPopups = [],\n\t\tpopupTitle,\n\t\tfoundPopups = [];\n\twhile(node) {\n\t\tfor(var i=0; i<this.popups.length; i++) {\n\t\t\tvar popup = this.popups[i];\n\t\t\tif(popup.isShown) {\n\t\t\t\tshownPopups.push(popup);\n\t\t\t\tif(popup.revealWidget.domNodes[0] === domNode) {\n\t\t\t\t\tpopupTitle = popup.title;\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tfor(var k=0; k<shownPopups.length; k++) {\n\t\tvar shownPopup = shownPopups[k];\n\t\tif(shownPopup.parentPopups && shownPopup.parentPopups.indexOf(popupTitle) > -1) {\n\t\t\tfoundPopups.push(shownPopup);\n\t\t}\n\t}\n\treturn foundPopups;\n};\n\nPopup.prototype.popupClickInfo = function(domNode) {\n\tvar node = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\treturn true;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\treturn false;\n};\n\nPopup.prototype.showPopup = function(title) {\n\tvar self = this;\n\tvar index = this.findPopupIndex(title);\n\tvar popup = this.popups[index];\n\tif(!popup.isShown) {\n\t\t// Set the state tiddler\n\t\tvar domNode = popup.triggeringWidget ? popup.triggeringWidget.domNodes[0] : popup.revealWidget.domNodes[0];\n\t\tvar rect = {\n\t\t\tleft: domNode.offsetLeft,\n\t\t\ttop: domNode.offsetTop,\n\t\t\twidth: domNode.offsetWidth,\n\t\t\theight: domNode.offsetHeight\n\t\t};\n\t\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\trect.width + \",\" + rect.height + \")\";\n\t\tif(popup.noStateReference && popup.revealWidget) {\n\t\t\tpopup.revealWidget.wiki.setText(title,\"text\",undefined,popupRect);\n\t\t\tpopup.isTriggered = false;\n\t\t\tpopup.isShown = true;\n\t\t} else if(popup.revealWidget) {\n\t\t\tpopup.revealWidget.wiki.setTextReference(title,popupRect);\n\t\t\tpopup.isTriggered = false;\n\t\t\tpopup.isShown = true;\n\t\t}\n\t\tvar shownPopups = [];\n\t\tfor(var i=0; i<this.popups.length; i++) {\n\t\t\tif(this.popups[i].isShown) {\n\t\t\t\tshownPopups.push(this.popups[i].title);\n\t\t\t}\n\t\t}\n/*\t\tif(shownPopups.length === 1) {\n\t\t\tthis.rootElement.addEventListener(\"click\",this,true);\n\t\t}*/\n\t\tif(popup.openActions) {\n\t\t\tpopup.revealWidget.invokeActionString(popup.openActions);\n\t\t}\n/*\t\tif(popup.closeActions) {\n\t\t\tpopup.revealWidget.wiki.setText(\"$:/popup/StartupAction/\" + popup.title,\"text\",undefined,popup.closeActions);\n\t\t\tpopup.revealWidget.wiki.setText(\"$:/popup/StartupAction/\" + popup.title,\"tags\",undefined,\"$:/tags/StartupAction\");\n\t\t}*/\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n", "type": "application/javascript", "title": "$:/core/modules/utils/dom/popup.js", "module-type": "utils" }, "$:/plugins/BurningTreeC/navigator/modules/widgets/action-popup.js": { "text": "/*\\\ntitle: $:/plugins/BurningTreeC/navigator/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction-Popup widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\n};\n\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tif(this.popup) {\n\t\tthis.triggerPopup();\n\t}\n\treturn true;\n};\n\nActionPopupWidget.prototype.triggerPopup = function() {\n\tvar index = $tw.popup.findPopupIndex(this.popup);\n\tvar popup = $tw.popup.popups[index];\n\tthis.document.activeElement.blur();\n\tif(popup) {\n\t\tpopup.isTriggered = !popup.isShown;\n\t\t$tw.popup.triggerPopup(this.popup);\n\t}\n\treturn true;\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.popup = this.getAttribute(\"$popup\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.popup || (this.popup && changedTiddlers[this.popup])) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n", "type": "application/javascript", "title": "$:/plugins/BurningTreeC/navigator/modules/widgets/action-popup.js", "module-type": "widget" }, "$:/plugins/BurningTreeC/navigator/modules/widgets/rootpipe.js": { "text": "/*\\\ntitle: $:/plugins/BurningTreeC/navigator/modules/widgets/rootpipe.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RootPipeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRootPipeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRootPipeWidget.prototype.render = function(parent,nextSibling) {\n this.parentWidget = $tw.rootWidget;\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nRootPipeWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRootPipeWidget.prototype.refresh = function(changedTiddlers) {\n\t\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.rootpipe = RootPipeWidget;\n\n})();\n", "type": "application/javascript", "title": "$:/plugins/BurningTreeC/navigator/modules/widgets/rootpipe.js", "module-type": "widget" }, "$:/plugins/BurningTreeC/refreshinputs/modules/startup/initializeinputmanager.js": { "text": "/*\\\ntitle: $:/plugins/BurningTreeC/refreshinputs/modules/startup/initializeinputmanager.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"initializeinputmanager\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\n\t$tw.inputManager = new $tw.InputManager();\n};\n\n})();\n", "type": "application/javascript", "title": "$:/plugins/BurningTreeC/refreshinputs/modules/startup/initializeinputmanager.js", "module-type": "startup" }, "$:/plugins/BurningTreeC/refreshinputs/modules/input.js": { "text": "/*\\\ntitle: $:/plugins/BurningTreeC/refreshinputs/modules/input.js\ntype: application/javascript\nmodule-type: global\n\nInput handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction InputManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\tthis.selections = {};\n\t$tw.rootWidget.addEventListener(\"tm-refresh-input\",function(event) {\n\t\tself.handleRefreshMessage(event);\n\t});\n}\n\nInputManager.prototype.handleRefreshMessage = function(event) {\n\tvar self = this;\n\tvar widget = event.widget,\n\t\taction = event.widget.editRefreshAction;\n\tif(widget && action) {\n\t\tswitch(action) {\n\t\t\tcase \"focus\":\n\t\t\t\twidget.engine.focus();\n\t\t\t\tbreak;\n\t\t\tcase \"focus-update\":\n\t\t\t\tvar editInfo = widget.getEditInfo();\n\t\t\t\twidget.engine.domNode.value = editInfo.value;\n\t\t\t\twidget.engine.focus();\n\t\t\t\tbreak;\n\t\t\tcase \"focus-again\":\n\t\t\t\tvar stateQualifier = widget.stateQualifier + widget.getStateQualifier(),\n\t\t\t\t\tcurrentTiddler = widget.getVariable(\"currentTiddler\"),\n\t\t\t\t\tdomNode = widget.engine.domNode;\n\t\t\t\tvar focusedInput = this.selections[currentTiddler].focusedInput;\n\t\t\t\tif(this.selections[currentTiddler] && (stateQualifier === focusedInput)) {\n\t\t\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(domNode.ownerDocument.defaultView);\n\t\t\t\t\tdomNode.ownerDocument.defaultView.setTimeout(function() {\n\t\t\t\t\t\tvar selectionStart = self.selections[currentTiddler] ? (self.selections[currentTiddler][stateQualifier] ? self.selections[currentTiddler][stateQualifier].selectionStart : domNode.value.length) : domNode.value.length;\n\t\t\t\t\t\tvar selectionEnd = self.selections[currentTiddler] ? (self.selections[currentTiddler][stateQualifier] ? self.selections[currentTiddler][stateQualifier].selectionEnd : domNode.value.length) : domNode.value.length;\n\t\t\t\t\t\tif(domNode.setSelectionRange && !widget.engine.cm) {\n\t\t\t\t\t\t\tdomNode.setSelectionRange(selectionStart,selectionEnd);\n\t\t\t\t\t\t} else if(widget.engine.cm) {\n\t\t\t\t\t\t\twidget.engine.cm.setSelection(widget.engine.cm.posFromIndex(selectionStart),widget.engine.cm.posFromIndex(selectionEnd), { scroll: false });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(domNode.focus && !widget.engine.cm) {\n\t\t\t\t\t\t\tdomNode.focus({preventScroll: true});\n\t\t\t\t\t\t} else if(widget.engine.cm) {\n\t\t\t\t\t\t\twidget.engine.cm.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t},10);\n\t\t\t\t\tdomNode.ownerDocument.defaultView.scrollTo(scrollPosition.x,scrollPosition.y);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"focus-scrollto\":\n\t\t\t\tvar domNode = widget.engine.domNode;\n\t\t\t\tif(domNode) {\n\t\t\t\t\tdomNode.focus({preventScroll: true});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t};\n\t}\n}\n\nexports.InputManager = InputManager;\n\n})();\n", "type": "application/javascript", "title": "$:/plugins/BurningTreeC/refreshinputs/modules/input.js", "module-type": "global" }, "$:/core/modules/editor/factory.js": { "text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\tvar self = this;\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t\tif(this.editRefreshTiddler && this.editRefreshAction && this.editRefreshCondition) {\n\t\t\tif(this.editRefreshCondition === \"true\" || this.editRefreshCondition === \"yes\") {\n\t\t\t\tthis.dispatchEvent({ type: \"tm-refresh-input\", widget: this});\n\t\t\t}\n\t\t}\n\t\tif(this.editShowToolbar) {\n\t\t\t$tw.hooks.addHook(\"th-external-text-operation\", function(event) {\n\t\t\t\tevent = event || {};\n\t\t\t\tif(event.paramObject.tiddler && (self.getVariable(\"storyTiddler\") === event.paramObject.tiddler)) {\n\t\t\t\t\tself.handleEditTextOperationMessage(event);\n\t\t\t\t}\n\t\t\t\treturn event;\n\t\t\t});\n\t\t}\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t\tif(self.editSaveTiddler) {\n\t\t\t\t\tvar saveTiddler = self.wiki.getTiddler(self.editSaveTiddler),\n\t\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\t\ttitle: self.editSaveTiddler\n\t\t\t\t\t\t};\n\t\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),saveTiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\tif(this.editFocusPopup) {\n\t\t\tthis.registerPopup();\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag);\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"no\") === \"yes\";\n\t\tthis.editSaveTiddler = this.getAttribute(\"saveTiddler\");\n\t\tthis.editRefreshTiddler = this.getAttribute(\"refreshTiddler\");\n\t\tthis.editRefreshCondition = this.getAttribute(\"refreshCondition\");\n\t\tthis.editRefreshAction = this.getAttribute(\"refreshAction\");\n\t\tthis.stateQualifier = this.editTitle + this.editField + this.editIndex;\n\t};\n\n\tEditTextWidget.prototype.registerPopup = function() {\n\t\tvar state = this.editFocusPopup;\n\t\tvar index = $tw.popup.findPopupIndex(state);\n\t\tif(index === -1) {\n\t\t\t$tw.utils.pushTop($tw.popup.popups,{\n\t\t\t\ttitle: state,\n\t\t\t\ttriggeringWidget: this,\n\t\t\t\tisShown: false\n\t\t\t});\n\t\t} else {\n\t\t\tvar popup = $tw.popup.popups[index];\n\t\t\tpopup.triggeringWidget = this;\n\t\t}\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes[\"tabindex\"] || changedAttributes[\"cancelPopups\"] || changedAttributes.saveTiddler || changedAttributes.rows || changedAttributes.refreshTiddler || changedAttributes.refreshAction || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if(this.editRefreshTiddler && this.editRefreshCondition && changedTiddlers[this.editRefreshTiddler] && (this.getAttribute(\"refreshCondition\") === \"true\" || this.getAttribute(\"refreshCondition\") === \"yes\")) {\n\t\t\tthis.dispatchEvent({type: \"tm-refresh-input\", widget: this});\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tthis.engine.saveSelections && this.engine.saveSelections();\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n", "type": "application/javascript", "title": "$:/core/modules/editor/factory.js", "module-type": "library" }, "$:/core/modules/widgets/edit.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"no\");\n\tthis.editSaveTiddler = this.getAttribute(\"saveTiddler\");\n\tthis.editRefreshTiddler = this.getAttribute(\"refreshTiddler\");\n\tthis.editRefreshCondition = this.getAttribute(\"refreshCondition\");\n\tthis.editRefreshAction = this.getAttribute(\"refreshAction\");\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder},\n\t\t\t\"tabindex\": {type: \"string\", value: this.editTabIndex},\n\t\t\t\"cancelPopups\": {type: \"string\", value: this.editCancelPopups},\n\t\t\t\"saveTiddler\": {type: \"string\", value: this.editSaveTiddler},\n\t\t\t\"refreshTiddler\": {type: \"string\", value: this.editRefreshTiddler},\n\t\t\t\"refreshCondition\": {type: \"string\", value: this.editRefreshCondition},\n\t\t\t\"refreshAction\": {type: \"string\", value: this.editRefreshAction}\n\t\t},\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"tabindex\"] || changedAttributes[\"cancelPopups\"] || changedAttributes.saveTiddler || changedAttributes.refreshTiddler || changedAttributes.refreshAction || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n", "type": "application/javascript", "title": "$:/core/modules/widgets/edit.js", "module-type": "widget" }, "$:/core/modules/editor/engines/framed.js": { "text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass + \" tc-tiddler-editor\";\n\t}\n//\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n//\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n//\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n/*\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";*/\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.dummyTextArea;\n\t// Set the text\n\t/*if(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {*/\n\t\tthis.domNode.value = this.value;\n//\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Copy the styles from the dummy textarea\n\t//this.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"},\n\t\t{name: \"blur\",handlerObject: this,handlerMethod: \"handleBlurEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\t//this.iframeDoc.body.appendChild(this.domNode);\n\t\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\nFramedEngine.prototype.saveSelections = function() {\n\tvar selectionStart = this.domNode.selectionStart,\n\t\tselectionEnd = this.domNode.selectionEnd,\n\t\tstateQualifier = this.widget.stateQualifier + this.widget.getStateQualifier();\n\tvar currentTiddler = this.widget.getVariable(\"currentTiddler\");\n\tif(!$tw.inputManager.selections[currentTiddler]) {\n\t\t$tw.inputManager.selections[currentTiddler] = {};\n\t}\n\tif(!$tw.inputManager.selections[currentTiddler][stateQualifier]) {\n\t\t$tw.inputManager.selections[currentTiddler][stateQualifier] = {};\n\t}\n\t$tw.inputManager.selections[currentTiddler].focusedInput = stateQualifier;\n\t$tw.inputManager.selections[currentTiddler][stateQualifier].selectionStart = selectionStart;\n\t$tw.inputManager.selections[currentTiddler][stateQualifier].selectionEnd = selectionEnd;\n};\n\nFramedEngine.prototype.handleBlurEvent = function(event) {\n\tthis.saveSelections();\n};\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.domNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\t//this.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\nFramedEngine.prototype.handleFocusEvent = function() {\n\tvar stateQualifier = this.widget.stateQualifier + this.widget.getStateQualifier(),\n\t\tcurrentTiddler = this.widget.getVariable(\"currentTiddler\");\n\tif(!$tw.inputManager.selections[currentTiddler]) {\n\t\t$tw.inputManager.selections[currentTiddler] = {};\n\t}\n\tif(!$tw.inputManager.selections[currentTiddler][stateQualifier]) {\n\t\t$tw.inputManager.selections[currentTiddler][stateQualifier] = {};\n\t}\n\t$tw.inputManager.selections[currentTiddler].focusedInput = stateQualifier;\n\tif(this.widget.editCancelPopups) {\n\t\t/*var numPopups = $tw.popup.popups.length;\n\t\tif(numPopups !== 0) {\n\t\t\tfor(var i=0; i < numPopups; i++) {\n\t\t\t\t$tw.popup.cancel(i);\n\t\t\t}\n\t\t}*/\n\t\tfor(var i=0; i<$tw.popup.popups.length; i++) {\n\t\t\t$tw.popup.deletePopup($tw.popup.popups[i]);\n\t\t}\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.domNode.ownerDocument.queryCommandSupported(\"insertText\") && this.domNode.ownerDocument.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.domNode.ownerDocument.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.domNode.ownerDocument.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n", "type": "application/javascript", "title": "$:/core/modules/editor/engines/framed.js", "module-type": "library" }, "$:/core/modules/editor/engines/simple.js": { "text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"blur\", handlerObject: this, handlerMethod: \"handleBlurEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\nSimpleEngine.prototype.saveSelections = function() {\n\tvar selectionStart = this.domNode.selectionStart,\n\t\tselectionEnd = this.domNode.selectionEnd,\n\t\tstateQualifier = this.widget.stateQualifier + this.widget.getStateQualifier();\n\tvar currentTiddler = this.widget.getVariable(\"currentTiddler\");\n\tif(!$tw.inputManager.selections[currentTiddler]) {\n\t\t$tw.inputManager.selections[currentTiddler] = {};\n\t}\n\tif(!$tw.inputManager.selections[currentTiddler][stateQualifier]) {\n\t\t$tw.inputManager.selections[currentTiddler][stateQualifier] = {};\n\t}\n\t$tw.inputManager.selections[currentTiddler].focusedInput = stateQualifier;\n\t$tw.inputManager.selections[currentTiddler][stateQualifier].selectionStart = selectionStart;\n\t$tw.inputManager.selections[currentTiddler][stateQualifier].selectionEnd = selectionEnd;\n};\n\nSimpleEngine.prototype.handleBlurEvent = function(event) {\n\tthis.saveSelections();\n\tif(this.widget.editFocusPopup) {\n\t\tvar index = $tw.popup.findPopupIndex(this.widget.editFocusPopup);\n\t\tvar popup = $tw.popup.popups[index];\n\t\tif(!popup.revealWidget.isOpen) {\n\t\t\t$tw.popup.deletePopup($tw.popup.popups[index]);\n\t\t}\n\t}\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tvar stateQualifier = this.widget.stateQualifier + this.widget.getStateQualifier(),\n\t\tcurrentTiddler = this.widget.getVariable(\"currentTiddler\");\n\tif(!$tw.inputManager.selections[currentTiddler]) {\n\t\t$tw.inputManager.selections[currentTiddler] = {};\n\t}\n\tif(!$tw.inputManager.selections[currentTiddler][stateQualifier]) {\n\t\t$tw.inputManager.selections[currentTiddler][stateQualifier] = {};\n\t}\n\t$tw.inputManager.selections[currentTiddler].focusedInput = stateQualifier;\n\n\tif(this.widget.editFocusPopup) {\n\t\tvar index = $tw.popup.findPopupIndex(this.widget.editFocusPopup);\n\t\tif(!index) {\n\t\t\tthis.widget.registerPopup();\n\t\t\tindex = $tw.popup.findPopupIndex(this.widget.editFocusPopup);\n\t\t}\n\t\tvar isShown = $tw.popup.popups[index].isShown;\n\t\t$tw.popup.popups[index].isShown = isShown;\n\t\t$tw.popup.popups[index].isTriggered = true;\n\t\t$tw.popup.popups[index].noStateReference = false;\n\t\tif(!$tw.popup.popups[index].revealWidget) {\n\t\t\t$tw.popup.popups[index].revealWidget = this.widget;\n\t\t}\n\t\t$tw.popup.triggerPopup(this.widget.editFocusPopup);\n\t} else if(this.widget.editCancelPopups) {\n\t\tfor(var i=0; i<$tw.popup.popups.length; i++) {\n\t\t\t$tw.popup.deletePopup($tw.popup.popups[i]);\n\t\t}\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n", "type": "application/javascript", "title": "$:/core/modules/editor/engines/simple.js", "module-type": "library" }, "$:/language/Shortcuts/Input/Accept/Hint": { "title": "$:/language/Shortcuts/Input/Accept/Hint", "text": "accept the selected dropdown item" }, "$:/language/Shortcuts/Input/Clear/Hint": { "title": "$:/language/Shortcuts/Input/Clear/Hint", "text": "clear the focused input field" }, "$:/language/Shortcuts/Input/Down/Hint": { "title": "$:/language/Shortcuts/Input/Down/Hint", "text": "select the next item within a dropdown list" }, "$:/language/Shortcuts/Input/Tabs-Right/Hint": { "title": "$:/language/Shortcuts/Input/Tabs-Right/Hint", "text": "select the next tab within a dropdown" }, "$:/language/Shortcuts/Input/Tabs-Left/Hint": { "title": "$:/language/Shortcuts/Input/Tabs-Left/Hint", "text": "select the previous tab within a dropdown" }, "$:/language/Shortcuts/Input/Up/Hint": { "title": "$:/language/Shortcuts/Input/Up/Hint", "text": "select the previous item within a dropdown list" }, "$:/language/Search/Matches/More": { "title": "$:/language/Search/Matches/More", "text": "More Matches" }, "$:/language/Search/SystemResults/Caption": { "title": "$:/language/Search/SystemResults/Caption", "text": "System and Shadows" }, "$:/plugins/BurningTreeC/navigator/license": { "title": "$:/plugins/BurningTreeC/navigator/license", "text": "```\nMIT License\n\nCopyright (c) 2018 Simon Huber @BurningTreeC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n" }, "$:/plugins/BurningTreeC/navigator/macros/actions": { "title": "$:/plugins/BurningTreeC/navigator/macros/actions", "tags": "$:/tags/Macro", "text": "\\define Navigatorinfoaction() <$macrocall $name=\"navigator-qualified-state-actions\" tiddler={{{ [[$:/HistoryList]get[focus-tiddler]] }}} title=\"$:/state/popup/tiddler-info\" storyOrSideBar=\"story\" editOrView=\"view\" level=\"1\" action=\"\"\"<$action-popup $popup=<<state>>/>\"\"\"/>\n\\define Navigatorexport-tiddleraction() <$macrocall $name=\"navigator-qualified-state-actions\" tiddler={{{ [[$:/HistoryList]get[focus-tiddler]] }}} title=\"$:/state/popup/export\" storyOrSideBar=\"story\" editOrView=\"view\" level=\"4\" suffix=\"title\" template1=\"$:/core/ui/Buttons/more-tiddler-actions\" template2=\"$:/core/ui/Buttons/export-tiddler\" action=\"\"\"<$action-popup $popup=<<state>>/>\"\"\"/>\n\\define Navigatordeleteaction() <<story-navigation '<$action-sendmessage $message=\"tm-delete-tiddler\" $param={{{ [[$:/HistoryList]get[focus-tiddler]] }}}/>'>>\n\\define Navigatorcloneaction() <<story-navigation '<$action-sendmessage $message=\"tm-new-tiddler\" $param={{{ [[$:/HistoryList]get[focus-tiddler]] }}}/>'>>\n\\define Navigatorpermalinkaction() <$action-sendmessage $message=\"tm-permalink\" $param={{{ [[$:/HistoryList]get[focus-tiddler]] }}}/>\n\\define Navigatorpermaviewaction() <$action-sendmessage $message=\"tm-permaview\"/>\n\\define Navigatoropen-windowaction() <$action-sendmessage $message=\"tm-open-window\" $param={{{ [[$:/HistoryList]get[focus-tiddler]] }}}/>\n\\define NavigatorJournalTags()\n[[$(currentTiddlerTag)$]] [[$(journalTags)$]]\n\\end\n\\define Navigatornew-journal-hereaction()\n\\whitespace trim\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"focusTiddler\" value={{{ [[$:/HistoryList]get[focus-tiddler]] }}}>\n<$set name=\"currentTiddlerTag\" value=<<focusTiddler>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$macrocall $name=\"story-navigation\" actions=\"\"\"<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<NavigatorJournalTags>>/>\"\"\"/>\n</$wikify>\n</$set>\n</$set>\n</$set>\n</$set>\n\\end\n\\define NavigatorFocusTag()\n[[$(focusTiddler)$]]\n\\end\n\\define Navigatornew-hereaction() <$macrocall $name=\"story-navigation\" actions=\"\"\"<$set name=\"focusTiddler\" value={{{ [[$:/HistoryList]get[focus-tiddler]] }}}><$action-sendmessage $message=\"tm-new-tiddler\" tags=<<NavigatorFocusTag>>/></$set>\"\"\"/>\n\\define Navigatorfold-othersaction() <<story-navigation '<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param={{{ [[$:/HistoryList]get[focus-tiddler]] }}} foldedStatePrefix=\"$:/state/folded/\"/>'>>\n\\define Navigatorfoldaction() <<story-navigation '<$action-sendmessage $message=\"tm-fold-tiddler\" $param={{{ [[$:/HistoryList]get[focus-tiddler]] }}} foldedState={{{ [[$:/HistoryList]get[focus-tiddler]addprefix[$:/state/folded/]] }}}/>'>>\n\\define Navigatoreditaction() <<story-navigation '<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [[$:/HistoryList]get[focus-tiddler]] }}}/>'>>\n\\define Navigatorclose-othersaction() <<story-navigation '<$action-sendmessage $message=\"tm-close-other-tiddlers\" $param={{{ [[$:/HistoryList]get[focus-tiddler]] }}}/>'>>\n\\define Navigatorcloseaction() <<story-navigation '<$action-sendmessage $message=\"tm-close-tiddler\" $param={{{ [[$:/HistoryList]get[focus-tiddler]] }}}/>'>>\n\\define NavigatorTidFileaction() <$macrocall $name=\"NavigatorDownloadSingleTidAction\" suffix=\"TidFile\"/>\n\\define NavigatorJsonFileaction() <$macrocall $name=\"NavigatorDownloadSingleTidAction\" suffix=\"JsonFile\"/>\n\\define NavigatorCsvFileaction() <$macrocall $name=\"NavigatorDownloadSingleTidAction\" suffix=\"CsvFile\"/>\n\\define NavigatorStaticRiveraction() <$macrocall $name=\"NavigatorDownloadSingleTidAction\" suffix=\"StaticRiver\"/>\n\\define NavigatorMakeFilter()\n[[$(focusTiddler)$]]\n\\end\n\\define NavigatorDownloadSingleTidAction(suffix)\n\\import [[$:/core/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]]\n<$set name=\"focusTiddler\" value={{{ [subfilter<NavigatorFocusTiddler>] }}}>\n<$set name=\"exportFilter\" value=<<NavigatorMakeFilter>>>\n<$set name=\"baseFilename\" value=<<focusTiddler>>>\n<$set name=\"exporterTemplate\" value={{{ [[$:/core/templates/exporters/]addsuffix<__suffix__>] }}}>\n<$set name=\"extension\" value={{{ [<exporterTemplate>get[extension]] }}}>\n<$action-sendmessage $message=\"tm-download-file\" $param=<<exporterTemplate>> exportFilter=<<exportFilter>> filename={{{ [<baseFilename>addsuffix<extension>] }}}/>\n</$set>\n</$set>\n</$set>\n</$set>\n</$set>\n\\end\n\n" }, "$:/core/macros/export": { "title": "$:/core/macros/export", "tags": "$:/tags/Macro", "text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\" openActions=<<navigator-export-tiddler-openactions>> closeActions=<<navigator-export-tiddler-closeactions>>>\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$set name=\"tv-config-toolbar-class\" filter=\"[[tc-btn-invisible]] [<currentTiddler>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$button class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n" }, "$:/plugins/BurningTreeC/navigator/macros/filters": { "title": "$:/plugins/BurningTreeC/navigator/macros/filters", "tags": "$:/tags/Macro", "text": "\\define NavigatorFocusTiddler() [[$:/HistoryList]get[focus-tiddler]]\n\\define NavigatorSearchResultsTitle() [!is[system]search:title<userInput>sort[title]limit[250]]\n\\define NavigatorSearchResultsMore() [!is[system]search:author,title,caption,tags,text<userInput>sort[title]limit[250]] -[subfilter<NavigatorSearchResultsTitle>]\n\\define NavigatorSearchResultsSystemTitle() [all[shadows+tiddlers]search:title<userInput>sort[title]limit[250]] -[[$:/temp/search]] -[[$:/temp/search/input]] -[[$:/temp/SelectedSearchItem]] -[subfilter<NavigatorSearchResultsTitle>]\n\\define NavigatorSearchResultsSystemMore() [all[shadows+tiddlers]search:author,title,caption,tags,text<userInput>sort[title]limit[250]] -[subfilter<NavigatorSearchResultsSystemTitle>] -[subfilter<NavigatorSearchResultsTitle>] -[subfilter<NavigatorSearchResultsMore>]\n\\define NavigatorTiddlerInfoTabsFilter() [all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\n\\define NavigatorMoreTiddlerFilter() [all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]addprefix[$:/config/ViewToolbarButtons/Visibility/]contains:text[hide]removeprefix[$:/config/ViewToolbarButtons/Visibility/]]\n\\define NavigatorExportTiddlerFilter() [all[shadows+tiddlers]tag[$:/tags/Exporter]]\n" }, "$:/plugins/BurningTreeC/navigator/macros/input": { "title": "$:/plugins/BurningTreeC/navigator/macros/input", "tags": "$:/tags/Macro", "text": "\\define change-input-tab(stateTitle,tag,beforeafter,defaultState)\n<$set name=\"tabsList\" filter=\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]]\">\n<$vars currentState={{{ [<__stateTitle__>!is[missing]get[text]] ~[<__defaultState__>] }}} firstTab={{{ [enlist<tabsList>nth[1]] }}} lastTab={{{ [enlist<tabsList>last[]] }}}>\n<$set name=\"nextTab\" value={{{ [all[shadows+tiddlers]tag<__tag__>!has[draft.of]$beforeafter$<currentState>] ~[[$beforeafter$]removeprefix[after]suffix[]addprefix<firstTab>] ~[[$beforeafter$]removeprefix[before]suffix[]addprefix<lastTab>] }}}>\n<$action-setfield $tiddler=<<__stateTitle__>> text=<<nextTab>>/>\n</$set>\n</$vars>\n</$set>\n\\end\n\n\\define accept-input-actions(editTiddler,acceptActions)\n<$vars selectedDropDownItem={{{ [<__editTiddler__>get[text]] }}}>\n$acceptActions$\n<$action-deletetiddler $tiddler=<<__editTiddler__>>/>\n</$vars>\n\\end\n\n\\define clear-input-field(editTiddler,saveTiddler,refreshTiddler,refreshQualifier)\n<$action-setfield $tiddler=<<__refreshTiddler__>> refresh-qualifier=<<__refreshQualifier__>>/>\n<$action-setfield $tiddler=<<__refreshTiddler__>> text=<<__refreshQualifier__>>/>\n<$action-deletetiddler $tiddler=<<__editTiddler__>>/>\n<$action-deletetiddler $tiddler=<<__saveTiddler__>>/>\n<$action-setfield $tiddler=<<__refreshTiddler__>> text=\"\"/>\n\\end\n\n\\define clear-input-actions(editTiddler,saveTiddler,refreshTiddler,clearEmptyActions,refreshQualifier)\n<$list filter=\"[<__editTiddler__>!is[missing]get[text]minlength[1]] [<__saveTiddler__>!is[missing]get[text]minlength[1]] +[limit[1]]\" variable=\"ignore\" emptyMessage=\"\"\"$clearEmptyActions$\"\"\">\n<$macrocall $name=\"clear-input-field\" editTiddler=<<__editTiddler__>> saveTiddler=<<__saveTiddler__>> refreshTiddler=<<__refreshTiddler__>> refreshQualifier=<<__refreshQualifier__>>/>\n</$list>\n\\end\n\n\\define get-dropdown-list()\n$(dropDownFilter1)$ $(dropDownFilter2)$\n\\end\n\n\\define select-dropdown-actions(beforeafter,reverse,editTiddler,saveTiddler,refreshTiddler,filter1,filter2,filterMinLength)\n<$list filter=\"[<__saveTiddler__>get[text]minlength[$filterMinLength$]] [[$filterMinLength$]removeprefix[0]suffix[]]\">\n<$vars userInput={{{ [<__saveTiddler__>get[text]] }}} selectedDropDownItem={{{ [<__editTiddler__>get[text]] }}}>\n<$set name=\"dropDownFilter1\" filter=<<__filter1__>>>\n<$set name=\"dropDownFilter2\" filter=<<__filter2__>>>\n<$set name=\"dropDownList\" filter=<<get-dropdown-list>>>\n<$list filter=\"[enlist<dropDownList>] +[$beforeafter$<selectedDropDownItem>] ~[enlist<dropDownList>$reverse$nth[1]]\" variable=\"nextTag\">\n<$action-setfield $tiddler=<<__editTiddler__>> text=<<nextTag>>/>\n<$action-deletetiddler $tiddler=<<__refreshTiddler__>>/>\n<$action-setfield $tiddler=<<__refreshTiddler__>> refresh-qualifier={{{ [[$(tv-refresh-input-qualifier)$]] }}}/>\n<$action-setfield $tiddler=<<__refreshTiddler__>> text=<<nextTag>>/>\n</$list>\n</$set>\n</$set>\n</$set>\n</$vars>\n</$list>\n\\end\n\n\\define selectable-dropdown-input(editTiddler,inputTag:\"input\",inputDefault,inputPlaceHolder,inputPopup,inputClass,inputFocus:\"no\",saveTiddler,refreshTiddler,refreshCondition,refreshAction,filterTiddler,refreshQualifier,filterMinLength:\"0\",tabIndex:\"\",cancelPopups:\"\")\n<$vars tv-refresh-input-qualifier=<<__refreshQualifier__>> userKeyOne={{{ [<__filterTiddler__>get[keyboard-action-1-key]] }}} userActionOne={{{ [<__filterTiddler__>get[keyboard-action-1]] }}} userKeyTwo={{{ [<__filterTiddler__>get[keyboard-action-2-key]] }}} userActionTwo={{{ [<__filterTiddler__>get[keyboard-action-2]] }}}>\n<$keyboard key=\"((input-down))\" actions=\"\"\"<$macrocall $name=\"select-dropdown-actions\" beforeafter=\"after\" reverse=\"\" editTiddler=<<__editTiddler__>> saveTiddler=<<__saveTiddler__>> refreshTiddler=<<__refreshTiddler__>> filter1={{{ [<__filterTiddler__>get[dropdown-filter-1]] }}} filter2={{{ [<__filterTiddler__>get[dropdown-filter-2]] }}} filterMinLength=\"$filterMinLength$\"/>\"\"\">\n<$keyboard key=\"((input-up))\" actions=\"\"\"<$macrocall $name=\"select-dropdown-actions\" beforeafter=\"before\" reverse=\"reverse[]\" editTiddler=<<__editTiddler__>> saveTiddler=<<__saveTiddler__>> refreshTiddler=<<__refreshTiddler__>> filter1={{{ [<__filterTiddler__>get[dropdown-filter-1]] }}} filter2={{{ [<__filterTiddler__>get[dropdown-filter-2]] }}} filterMinLength=\"$filterMinLength$\"/>\"\"\">\n<$keyboard key=\"((input-accept))\" actions=\"\"\"<$macrocall $name=\"accept-input-actions\" editTiddler=<<__editTiddler__>> acceptActions={{{ [<__filterTiddler__>get[accept-actions]] }}}/>\"\"\">\n<$keyboard key=\"((input-clear))\" actions=\"\"\"<$macrocall $name=\"clear-input-actions\" editTiddler=<<__editTiddler__>> saveTiddler=<<__saveTiddler__>> refreshTiddler=<<__refreshTiddler__>> clearEmptyActions={{{ [<__filterTiddler__>get[clear-input-empty-actions]] }}} refreshQualifier=<<__refreshQualifier__>>/>\"\"\">\n<$keyboard key=<<userKeyOne>> actions=<<userActionOne>>>\n<$keyboard key=<<userKeyTwo>> actions=<<userActionTwo>>>\n<$edit-text tiddler=<<__editTiddler__>> tag=<<__inputTag__>> default=<<__inputDefault__>> placeholder=<<__inputPlaceHolder__>> focusPopup=<<__inputPopup__>> class=<<__inputClass__>> focus=<<__inputFocus__>> saveTiddler=<<__saveTiddler__>> refreshTiddler=<<__refreshTiddler__>> refreshCondition={{{ $refreshCondition$ }}} refreshAction=<<__refreshAction__>> tabindex=<<__tabIndex__>> cancelPopups=<<__cancelPopups__>>/>\n</$keyboard></$keyboard></$keyboard></$keyboard></$keyboard></$keyboard>\n</$vars>\n\\end\n" }, "$:/plugins/BurningTreeC/navigator/macros/navigation": { "title": "$:/plugins/BurningTreeC/navigator/macros/navigation", "tags": "$:/tags/Macro", "text": "\\define story-navigation(actions)\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n$actions$\n</$navigator>\n\\end\n\\define navigator-set-sidebar(yesno)\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"$yesno$\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/navigator/sidebarstate\"/>\n\\end\n\\define navigator-set-last-popup()\n<$list filter=\"[list<NavigatorVariablesPopupStateTiddler>limit[1]]\" emptyMessage=\"\"\"\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[close-popup]] }}} tiddler=\"$:/config/shortcuts/close-popup\" field=\"text\"/>\n<$action-deletetiddler $tiddler=<<NavigatorVariablesPopupStateTiddler>>/>\n\"\"\">\n<$set name=\"nextOpenPopup\" value={{{ [list<NavigatorVariablesPopupStateTiddler>last[]] }}}>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> text=<<nextOpenPopup>>/>\n<$action-listops $tiddler=<<NavigatorVariablesPopupStateTiddler>> $subfilter=\"-[<nextOpenPopup>]\"/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-filter-variable={{{ [[$:/navigator/backup/popup-state/]addsuffix<nextOpenPopup>get[item-filter-variable]] }}}/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-state-variable={{{ [[$:/navigator/backup/popup-state/]addsuffix<nextOpenPopup>get[item-state-variable]] }}}/>\n</$set>\n<$list filter=\"[<NavigatorVariablesPopupStateTiddler>get[text]is[missing]]\">\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[close-popup]] }}} tiddler=\"$:/config/shortcuts/close-popup\" field=\"text\"/>\n</$list>\n</$list>\n\\end\n\\define navigator-tiddlerinfo-openactions()\n<$macrocall $name=\"navigator-qualified-state-actions\" tiddler={{{ [[$:/HistoryList]get[focus-tiddler]] }}} title=\"$:/state/tab\" storyOrSideBar=\"story\" editOrView=\"view\" level=\"3\" suffix=\"title\" template1=\"$:/core/ui/TiddlerInfo\" action=\"\"\"<$action-deletetiddler $tiddler=<<NavigatorVariablesPopupStateTiddler>>/><$action-setfield $tiddler=\"$:/temp/navigator/popup-tabs/state\" text=<<state>> tabs-filter=\"[subfilter<NavigatorTiddlerInfoTabsFilter>]\" tabs-default={{$:/config/TiddlerInfo/Default}}/>\"\"\"/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-tab-next]] }}} tiddler=\"$:/config/shortcuts/popup-tab-next\" field=\"text\"/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-tab-previous]] }}} tiddler=\"$:/config/shortcuts/popup-tab-previous\" field=\"text\"/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[close-popup]] }}} tiddler=\"$:/config/shortcuts/close-popup\" field=\"text\"/>\n<$macrocall $name=\"navigator-qualified-state-actions\" tiddler={{{ [[$:/HistoryList]get[focus-tiddler]] }}} title=\"$:/state/popup/tiddler-info\" storyOrSideBar=\"story\" editOrView=\"view\" level=\"1\" action=\"\"\"<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> text=<<state>>/>\"\"\"/>\n\\end\n\\define navigator-tiddlerinfo-closeactions()\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-tab-next]] }}} tiddler=\"$:/config/shortcuts/popup-tab-next\" field=\"text\"/>\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-tab-previous]] }}} tiddler=\"$:/config/shortcuts/popup-tab-previous\" field=\"text\"/>\n<<navigator-set-last-popup>>\n\\end\n\\define navigator-more-tiddler-openactions()\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-down]] }}} tiddler=\"$:/config/shortcuts/popup-down\" field=\"text\"/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-up]] }}} tiddler=\"$:/config/shortcuts/popup-up\" field=\"text\"/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-accept]] }}} tiddler=\"$:/config/shortcuts/popup-accept\" field=\"text\"/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[close-popup]] }}} tiddler=\"$:/config/shortcuts/close-popup\" field=\"text\"/>\n<$macrocall $name=\"navigator-qualified-state-actions\" tiddler={{{ [[$:/HistoryList]get[focus-tiddler]] }}} title=\"$:/state/popup/more\" storyOrSideBar=\"story\" editOrView=\"view\" level=\"3\" suffix=\"title\" template1=\"$:/core/ui/Buttons/more-tiddler-actions\" action=\"\"\"<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> text=<<state>>/>\"\"\"/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-state-variable=\"NavigatorVariablesMorePopupSelectedItem\"/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-filter-variable=\"NavigatorMoreTiddlerFilter\"/>\n\\end\n\\define navigator-more-tiddler-closeactions()\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-down]] }}} tiddler=\"$:/config/shortcuts/popup-down\" field=\"text\"/>\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-up]] }}} tiddler=\"$:/config/shortcuts/popup-up\" field=\"text\"/>\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-accept]] }}} tiddler=\"$:/config/shortcuts/popup-accept\" field=\"text\"/>\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[close-popup]] }}} tiddler=\"$:/config/shortcuts/close-popup\" field=\"text\"/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-state-variable=\"\"/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-filter-variable=\"\"/>\n<<navigator-set-last-popup>>\n\\end\n\\define navigator-export-tiddler-openactions()\n<$action-listops $tiddler=<<NavigatorVariablesPopupStateTiddler>> $subfilter=\"[<NavigatorVariablesPopupStateTiddler>get[text]]\"/>\n<$action-setfield $tiddler={{{ [<NavigatorVariablesPopupStateTiddler>get[text]addprefix[$:/navigator/backup/popup-state/]] }}} item-state-variable={{{ [<NavigatorVariablesPopupStateTiddler>get[item-state-variable]] }}} item-filter-variable={{{ [<NavigatorVariablesPopupStateTiddler>get[item-filter-variable]] }}}/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-down]] }}} tiddler=\"$:/config/shortcuts/popup-down\" field=\"text\"/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-up]] }}} tiddler=\"$:/config/shortcuts/popup-up\" field=\"text\"/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-accept]] }}} tiddler=\"$:/config/shortcuts/popup-accept\" field=\"text\"/>\n<$macrocall $name=\"navigator-set-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[close-popup]] }}} tiddler=\"$:/config/shortcuts/close-popup\" field=\"text\"/>\n<$macrocall $name=\"navigator-qualified-state-actions\" tiddler={{{ [[$:/HistoryList]get[focus-tiddler]] }}} title=\"$:/state/popup/export\" storyOrSideBar=\"story\" editOrView=\"view\" level=\"4\" suffix=\"title\" template1=\"$:/core/ui/Buttons/more-tiddler-actions\" template2=\"$:/core/ui/Buttons/export-tiddler\" action=\"\"\"<$action-sendmessage $message=\"tm-rename-tiddler\" from=<<NavigatorVariablesPopupStateTiddler>> to={{{ [<NavigatorVariablesPopupStateTiddler>addprefix[$:/navigator/backup/popup-state/]] }}}/><$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> text=<<state>>/>\"\"\"/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-state-variable=\"NavigatorVariablesExportTiddlerPopupSelectedItem\"/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-filter-variable=\"NavigatorExportTiddlerFilter\"/>\n\\end\n\\define navigator-export-tiddler-closeactions()\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-down]] }}} tiddler=\"$:/config/shortcuts/popup-down\" field=\"text\"/>\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-up]] }}} tiddler=\"$:/config/shortcuts/popup-up\" field=\"text\"/>\n<$macrocall $name=\"navigator-unset-shortcut\" key={{{ [<NavigatorVariablesTempShortcutsConfig>get[popup-accept]] }}} tiddler=\"$:/config/shortcuts/popup-accept\" field=\"text\"/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-state-variable=\"\"/>\n<$action-setfield $tiddler=<<NavigatorVariablesPopupStateTiddler>> item-filter-variable=\"\"/>\n<<navigator-set-last-popup>>\n\\end\n\n" }, "$:/plugins/BurningTreeC/navigator/macros/shortcuts": { "title": "$:/plugins/BurningTreeC/navigator/macros/shortcuts", "tags": "$:/tags/Macro", "text": "\\define navigator-save-shortcut-config(tiddler,field,keyArray,actions)\n<$list filter=\"[all[tiddlers]prefix[$:/navigator/backups/shortcutconfig/]suffix<__tiddler__>limit[1]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler={{{ [[$:/navigator/backups/shortcutconfig/]addsuffix<__tiddler__>] }}} $field=<<__field__>> $value=<<__keyArray__>>/>\n<$action-listops $tiddler=<<__tiddler__>> $field=<<__field__>> $subfilter=\"-[<__key__>]\"/>\n$actions$\n\"\"\">\n<$list filter=\"[all[tiddlers]prefix[$:/navigator/backups/shortcutconfig/]suffix<__tiddler__>!sort[title]]\" variable=\"backupTiddler\">\n<$action-sendmessage $message=\"tm-rename-tiddler\" from=<<backupTiddler>> to={{{ [<backupTiddler>addprefix[$:/navigator/backups/shortcutconfig/]] }}}/>\n</$list>\n<$action-setfield $tiddler={{{ [[$:/navigator/backups/shortcutconfig/]addsuffix<__tiddler__>] }}} $field=<<__field__>> $value=<<__keyArray__>>/>\n<$action-listops $tiddler=<<__tiddler__>> $field=<<__field__>> $subfilter=\"-[<__key__>]\"/>\n$actions$\n</$list>\n\\end\n\\define navigator-backup-shortcuts(key,actions)\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/KeyboardShortcut]]\" variable=\"shortcutTiddler\">\n<$list filter=\"[<shortcutTiddler>get[key]removeprefix[((]removesuffix[))]]\" variable=\"keyDescriptor\" emptyMessage=\"\"\"\n<$list filter=\"[<shorcutTiddler>contains:key<__key__>get[key]]\" variable=\"keyArray\" emptyMessage='\n$actions$\n'>\n<$macrocall $name=\"navigator-save-shortcut-config\" tiddler=<<shortcutTiddler>> field=\"key\" keyArray=<<keyArray>> actions=<<__actions__>>/>\n</$list>\n\"\"\">\n<$list filter=\"shortcuts shortcuts-linux shortcuts-not-linux shortcuts-not-mac shortcuts-not-windows shortcuts-mac shortcuts-windows\" variable=\"platform\">\n<$set name=\"configTiddler\" value={{{ [[$:/config/]addsuffix<platform>addsuffix[/]addsuffix<keyDescriptor>] }}}>\n<$list filter=\"[<configTiddler>contains:text<__key__>get[text]]\" variable=\"keyArray\" emptyMessage=\"\"\"\n$actions$\n\"\"\">\n<$macrocall $name=\"navigator-save-shortcut-config\" tiddler=<<configTiddler>> field=\"text\" keyArray=<<keyArray>>/>\n</$list>\n</$set>\n</$list>\n</$list>\n</$list>\n\\end\n\\define navigator-restore-shortcut-config(tiddler,field,keyArray,actions,restoreprefix:\"$:/navigator/backups/shortcutconfig/\")\n<$list filter=\"[<__tiddler__>!prefix<__restoreprefix__>]\" emptyMessage=\"\"\"\n<$action-sendmessage $message=\"tm-rename-tiddler\" from={{{ [<__tiddler__>addprefix<__restoreprefix__>] }}} to=<<__tiddler__>>/>\n\"\"\">\n<$action-setfield $tiddler=<<__tiddler__>> $field=<<__field__>> $value=<<__keyArray__>>/>\n<$list filter=\"[<NavigatorVariablesPopupStateTiddler>get[text]is[missing]]\" variable=\"ignore\">\n$actions$\n</$list>\n<$action-deletetiddler $tiddler={{{ [<__restoreprefix__>addsuffix<__tiddler__>] }}}/>\n</$list>\n\\end\n\\define navigator-restore-shortcuts(tiddler,key,actions,restoreprefix:\"$:/navigator/backups/shortcutconfig/\")\n<$list filter=\"[all[tiddlers]prefix<__restoreprefix__>suffix<__tiddler__>sort[title]]\" variable=\"backupTiddler\" emptyMessage=\"\"\"\n<$list filter=\"[<NavigatorVariablesPopupStateTiddler>get[text]is[missing]]\" variable=\"ignore\">\n$actions$\n</$list>\n\"\"\">\n<$list filter=\"[<backupTiddler>has[key]]\" emptyMessage=\"\"\"\n<$macrocall $name=\"navigator-restore-shortcut-config\" tiddler={{{ [<backupTiddler>removeprefix<__restoreprefix__>] }}} field=\"text\" keyArray={{{ [<backupTiddler>get[text]] }}} actions=<<__actions__>>/>\n\"\"\">\n<$macrocall $name=\"navigator-restore-shortcut-config\" tiddler={{{ [<backupTiddler>removeprefix<__restoreprefix__>] }}} field=\"key\" keyArray={{{ [<backupTiddler>get[key]] }}} actions=<<__actions__>>/>\n</$list>\n</$list>\n\\end\n\\define navigator-set-shortcut(tiddler,field,key)\n<$macrocall $name=\"navigator-backup-shortcuts\" key=<<__key__>> actions=\"\"\"\n<$action-listops $tiddler=\"$tiddler$\" $field=\"$field$\" $subfilter=\"[[$key$]]\"/>\n\"\"\"/>\n\\end\n\\define navigator-unset-shortcut(tiddler,field,key)\n<$action-listops $tiddler=\"$tiddler$\" $field=\"$field$\" $subfilter=\"-[[$key$]]\"/>\n<$macrocall $name=\"navigator-restore-shortcuts\" tiddler=<<__tiddler__>> key=<<__key__>> actions=\"\"\"\n\"\"\"/>\n\\end\n\n" }, "$:/plugins/BurningTreeC/navigator/macros/states": { "title": "$:/plugins/BurningTreeC/navigator/macros/states", "tags": "$:/tags/Macro", "text": "\\define navigator-qualified-state-actions(tiddler,title,storyOrSideBar,editOrView:\"view\",action,level,suffix:\"\",template1:\"\",template2:\"\")\n<$rootpipe>\n<$set name=\"transclusion\" value=\"{|$:/core/ui/PageTemplate|||}\">\n<$set name=\"transclusion\" value=\"{|$:/core/ui/PageTemplate/$storyOrSideBar$|||}\">\n<$macrocall $name=\"navigator-qualified-state-$storyOrSideBar$-$editOrView$-$level$\" tiddler=<<__tiddler__>> title=<<__title__>> action=<<__action__>> template1=<<__template1__>> template2=<<__template2__>> suffix=<<__suffix__>>/>\n</$set>\n</$set>\n</$rootpipe>\n\\end\n\\define navigator-qualified-state-sidebar-view-1(title,action)\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n\\end\n\\define navigator-qualified-state-sidebar-view-2(tiddler,suffix,title,action)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|$:/core/ui/SideBarSegments/]addsuffix<__suffix__>addsuffix[|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n\\end\n\\define navigator-qualified-state-sidebar-view-3(tiddler,suffix,title,action,template1)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|$:/core/ui/SideBarSegments/]addsuffix<__suffix__>addsuffix[|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix<__template1__>addsuffix[|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n</$set>\n\\end\n\\define navigator-qualified-state-story-view-1(tiddler,title,action)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix[$:/core/ui/ViewTemplate|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n\\end\n\\define navigator-qualified-state-story-view-2(tiddler,title,action,suffix)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix[$:/core/ui/ViewTemplate|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|$:/core/ui/ViewTemplate/]addsuffix<__suffix__>addsuffix[|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n</$set>\n\\end\n\\define navigator-qualified-state-story-view-3(tiddler,title,action,suffix,template1)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix[$:/core/ui/ViewTemplate|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|$:/core/ui/ViewTemplate/]addsuffix<__suffix__>addsuffix[|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix<__template1__>addsuffix[|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n</$set>\n</$set>\n\\end\n\\define navigator-qualified-state-story-view-4(tiddler,title,action,suffix,template1,template2)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix[$:/core/ui/ViewTemplate|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|$:/core/ui/ViewTemplate/]addsuffix<__suffix__>addsuffix[|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix<__template1__>addsuffix[|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix<__template2__>addsuffix[|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n</$set>\n</$set>\n</$set>\n\\end\n\\define navigator-qualified-state-story-edit-1(tiddler,title,action)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix[$:/core/ui/EditTemplate|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n\\end\n\\define navigator-qualified-state-story-edit-2(tiddler,title,action,suffix)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix[$:/core/ui/EditTemplate|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|$:/core/ui/EditTemplate/]addsuffix<__suffix__>addsuffix[|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n</$set>\n\\end\n\\define navigator-qualified-state-story-edit-3(tiddler,title,action,suffix,template1)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix[$:/core/ui/EditTemplate|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|$:/core/ui/EditTemplate/]addsuffix<__suffix__>addsuffix[|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix<__template1__>addsuffix[|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n</$set>\n</$set>\n\\end\n\\define navigator-qualified-state-story-edit-4(tiddler,title,action,suffix,template1,template2)\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix[$:/core/ui/EditTemplate|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|$:/core/ui/EditTemplate/]addsuffix<__suffix__>addsuffix[|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix<__template1__>addsuffix[|||}]] }}}>\n<$set name=\"transclusion\" value={{{ [<__tiddler__>addprefix[{]addsuffix[|]addsuffix<__template2__>addsuffix[|||}]] }}}>\n<$qualify name=\"state\" title=<<__title__>>>\n$action$\n</$qualify>\n</$set>\n</$set>\n</$set>\n</$set>\n\\end\n" }, "$:/core/macros/tabs": { "title": "$:/core/macros/tabs", "tags": "$:/tags/Macro", "text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain,explicitState)\n<$set name=\"qualifiedState\" value=<<qualify \"$state$\">>>\n<$set name=\"tabsState\" filter=\"[<__explicitState__>minlength[1]] ~[<qualifiedState>]\">\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<tabsState>> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler></$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<tabsState>> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n\n</div>\n</div>\n</$set>\n</$set>\n\\end\n" }, "$:/core/macros/tag-picker": { "title": "$:/core/macros/tag-picker", "tags": "$:/tags/Macro", "dropdown-filter-1": "[tags[]!is[system]search:title<userInput>sort[]]", "dropdown-filter-2": "[tags[]is[system]search:title<userInput>sort[]]", "accept-actions": "<$list filter=\"[[$(currentTiddler)$]!contains:tags<selectedDropDownItem>]\" variable=\"ignore\"><$action-sendmessage $message=\"tm-add-tag\" $param=<<selectedDropDownItem>>/></$list><$list filter=\"[[$(currentTiddler)$]contains:tags<selectedDropDownItem>]\" variable=\"ignore\"><$action-sendmessage $message=\"tm-remove-tag\" $param=<<selectedDropDownItem>>/></$list>/>", "clear-input-empty-actions": "<$action-deletetiddler $tiddler=<<__editTiddler__>>/><$action-deletetiddler $tiddler=<<__saveTiddler__>>/><$action-deletetiddler $tiddler=<<__refreshTiddler__>>/><$action-sendmessage $message=\"tm-cancel-tiddler\"/>", "text": "\\define tag-button(selectedClass)\n<$button class=\"tc-btn-invisible $selectedClass$\" tag=\"a\">\n$(actions)$\n<$action-deletetiddler $tiddler={{{ [[$:/temp/NewTagName/]addsuffix[$(currentTiddler)$]] }}}/>\n<$action-deletetiddler $tiddler={{{ [[$:/temp/NewTagName/Input/]addsuffix[$(currentTiddler)$]] }}}/>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$button>\n\\end\n\n\\define tag-picker(actions)\n<$vars newTagNameTiddler={{{ [[$:/temp/NewTagName/]addsuffix<currentTiddler>] }}} saveInputTiddler={{{ [[$:/temp/NewTagName/Input/]addsuffix<currentTiddler>] }}} actions=<<__actions__>>>\n<div class=\"tc-edit-add-tag\">\n<span class=\"tc-add-tag-name\">\n<$macrocall $name=\"selectable-dropdown-input\" editTiddler=<<newTagNameTiddler>> inputTag=\"input\" inputDefault=\"\" inputPlaceHolder={{$:/language/EditTemplate/Tags/Add/Placeholder}} inputPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> inputClass=\"tc-edit-texteditor tc-popup-handle\" saveTiddler=<<saveInputTiddler>> refreshTiddler=\"$:/temp/SelectedTag\" filterTiddler=\"$:/core/macros/tag-picker\" refreshQualifier=<<qualify \"$:/qualifier/refresh-input\">> refreshCondition=\"\"\"[<__refreshTiddler__>get[refresh-qualifier]removeprefix<__refreshQualifier__>suffix[]addprefix[true]] ~[[false]]\"\"\" refreshAction=\"focus-update\" tabIndex={{$:/config/EditTabindex}} cancelPopups={{$:/config/EditCancelPopups}}/>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button setTitle=<<newTagNameTiddler>> setTo=\"\" class=\"\">\n$actions$\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<saveInputTiddler>>/>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$vars userInput={{{ [<saveInputTiddler>get[text]] }}}>\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown\">\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]!is[system]search:title<userInput>sort[]]\" variable=\"tag\">\n<$list filter=\"[<newTagNameTiddler>get[text]removeprefix<tag>suffix[]]\" emptyMessage=\"\"\"<<tag-button>>\"\"\">\n<<tag-button \"tc-tag-button-selected\">>\n</$list>\n</$list></$list>\n<hr>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]is[system]search:title<userInput>sort[]]\" variable=\"tag\">\n<$list filter=\"[<newTagNameTiddler>get[text]removeprefix<tag>suffix[]]\" emptyMessage=\"\"\"<<tag-button>>\"\"\">\n<<tag-button \"tc-tag-button-selected\">>\n</$list>\n</$list></$list>\n</div>\n</$reveal>\n</$vars>\n</div>\n</$vars>\n\\end\n" }, "$:/plugins/BurningTreeC/navigator/macros/utils": { "title": "$:/plugins/BurningTreeC/navigator/macros/utils", "tags": "$:/tags/Macro", "text": "\\define navigatorSplitInner(string,removeprefix,char)\n\\whitespace trim\n<$list filter=\"[<__string__>removeprefix<__removeprefix__>]\" variable=\"newstring\"><$macrocall $name=\"navigatorSplit\" string=<<newstring>> char=<<__char__>>/></$list>\n\\end\n\\define navigatorSplit(string,char)\n\\whitespace trim\n<$set name=\"charRegex\" value={{{ [<__char__>escaperegexp[]] }}}><$list filter=\"[<__string__>regexp<charRegex>splitbefore<__char__>]\" emptyMessage=\"\"\"<<__string__>>\"\"\"><$set name=\"prefix\" value={{{ [<__string__>splitbefore<__char__>] }}}><$macrocall $name=\"navigatorSplitInner\" string=<<__string__>> removeprefix=<<prefix>> char=<<__char__>>/></$set></$list></$set>\n\\end\n" }, "$:/plugins/BurningTreeC/navigator/macros/variables": { "title": "$:/plugins/BurningTreeC/navigator/macros/variables", "tags": "$:/tags/Macro", "text": "\\define NavigatorVariablesPopupStateTiddler() $:/temp/navigator/popup-state\n\\define NavigatorVariablesPopupTabsStateTiddler() $:/temp/navigator/popup-tabs/state\n\\define NavigatorVariablesTempShortcutsConfig() $:/plugins/BurningTreeC/navigator/config/shortuts/temporary\n\\define NavigatorVariablesMorePopupSelectedItem() $:/temp/navigator/more-popup/selected-item\n\\define NavigatorVariablesExportTiddlerPopupSelectedItem() $:/temp/navigator/export-tiddler/selected-item\n" }, "$:/plugins/BurningTreeC/navigator/readme": { "title": "$:/plugins/BurningTreeC/navigator/readme", "text": "!! This plugin adds enhanced ways for navigation to [ext[TiddlyWiki 5.1.18|https://tiddlywiki.com]] and above\n\n!! It depends on the following plugins to be installed, too:\n\n* [ext[escapecss plugin|https://burningtreec.github.io/TW5-escapecss]] [ext[source|https://github.com/BurningTreeC/TW5-escapecss]]\n\n<hr>\n\n!! Features\n\n# The ''focused Tiddler'' is stored in the ''focus-tiddler'' field of the ''History List''\n# The ''focused Tiddler'' is emphasized\n# Actions on the ''focused Tiddler'' can be triggered through Keyboard Shortcuts\n# Pre-made Keyboard Shortcuts for Navigation through the Story-River, actions on the ''focused Tiddler'' and the Sidebar\n# Re-designed Popup Mechanism for more enhanced interaction with popups\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/close-tiddler": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/close-tiddler", "tags": "$:/tags/KeyboardShortcut", "key": "((close-focused-tiddler))", "text": "\\import $:/plugins/BurningTreeC/navigator/macros/navigation\n\n<$set name=\"closeTiddler\" value={{$:/HistoryList!!focus-tiddler}}>\n<$list filter=\"[[$:/StoryList]contains<closeTiddler>]\" variable=\"ignore\">\n<$list filter=\"[<closeTiddler>!has[draft.of]addprefix[tm-close-tiddler]removesuffix<closeTiddler>] ~[<closeTiddler>has[draft.of]addprefix[tm-cancel-tiddler]removesuffix<closeTiddler>]\" variable=\"message\">\n<$macrocall $name=\"story-navigation\" actions=\"\"\"\n<$action-sendmessage $message=<<message>> $param=<<closeTiddler>>/>\n\"\"\"/>\n</$list>\n</$list>\n</$set>\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/edit-tiddler": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/edit-tiddler", "tags": "$:/tags/KeyboardShortcut", "key": "((edit-focused-tiddler))", "text": "\\import $:/plugins/BurningTreeC/navigator/macros/navigation\n\n<$set name=\"editTiddler\" value={{$:/HistoryList!!focus-tiddler}}>\n<$list filter=\"[<editTiddler>!has[draft.of]]\" variable=\"ignore\">\n<$list filter=\"[[$:/StoryList]contains<editTiddler>]\" variable=\"ignore\">\n<$macrocall $name=\"story-navigation\" actions=\"\"\"\n<$action-sendmessage $message=\"tm-edit-tiddler\" $param=<<editTiddler>>/>\n\"\"\"/>\n</$list>\n</$list>\n</$set>\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/more-tiddler-actions": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/more-tiddler-actions", "tags": "$:/tags/KeyboardShortcut", "key": "((more-tiddler-actions))", "text": "\\import $:/plugins/BurningTreeC/navigator/macros/states\n\n<$set name=\"focusedTiddler\" value={{{ [[$:/HistoryList]get[focus-tiddler]] }}}>\n<$macrocall $name=\"navigator-qualified-state-actions\" tiddler=<<focusedTiddler>> title=\"$:/state/popup/more\" storyOrSideBar=\"story\" level=\"3\" editOrView=\"view\" suffix=\"title\" template1=\"$:/core/ui/Buttons/more-tiddler-actions\" action=\"\"\"<$action-popup $popup=<<state>>/>\"\"\"/>\n</$set>\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/navigate-down": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/navigate-down", "tags": "$:/tags/KeyboardShortcut", "key": "((navigate-story-down))", "text": "\\import $:/plugins/BurningTreeC/navigator/macros/navigation\n\n<$set name=\"navigationTiddler\" value={{{ [list[$:/StoryList]after{$:/HistoryList!!focus-tiddler}] ~[list[$:/StoryList]nth[1]] ~[[HistoryList]get[previous-focus-tiddler]] }}}>\n<$macrocall $name=\"story-navigation\" actions=\"\"\"\n<$action-navigate $to=<<navigationTiddler>>/>\n\"\"\"/>\n</$set>\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/navigate-up": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/navigate-up", "tags": "$:/tags/KeyboardShortcut", "key": "((navigate-story-up))", "text": "\\import $:/plugins/BurningTreeC/navigator/macros/navigation\n\n<$set name=\"navigationTiddler\" value={{{ [list[$:/StoryList]before{$:/HistoryList!!focus-tiddler}] ~[list[$:/StoryList]last[]] ~[[HistoryList]get[previous-focus-tiddler]] }}}>\n<$macrocall $name=\"story-navigation\" actions=\"\"\"\n<$action-navigate $to=<<navigationTiddler>>/>\n\"\"\"/>\n</$set>\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/sidebar-search": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/sidebar-search", "tags": "$:/tags/KeyboardShortcut", "key": "((sidebar-search))", "text": "\\define focus-sidebar-actions()\n<$action-setfield $tiddler=\"$:/config/Search/AutoFocus\" text={{{ [[$:/config/Search/AutoFocus]get[text]removeprefix[yes]suffix[]addprefix[true]] ~[[$:/config/Search/AutoFocus]get[text]removeprefix[true]suffix[]addprefix[yes]] }}}/>\n\\end\n<$rootpipe>\n<$set name=\"transclusion\" value=\"{|$:/core/ui/PageTemplate|||}\">\n<$set name=\"transclusion\" value=\"{|$:/core/ui/PageTemplate/sidebar|||}\">\n<$set name=\"transclusion\" value=\"{|$:/core/ui/SideBarSegments/search|||}\">\n<$set name=\"focusPopup\" value=<<qualify \"$:/state/popup/search-dropdown\">>>\n<$list filter=\"[<focusPopup>is[missing]]\" emptyMessage='<$action-popup $popup=\"$:/temp/dummypopup\"/><$action-deletetiddler $tiddler=<<focusPopup>>/><$list filter=\"[[$:/temp/navigator/sidebarstate]!is[missing]get[text]prefix[hide]]\"><$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/><$action-deletetiddler $tiddler=\"$:/temp/navigator/sidebarstate\"/></$list><$action-deletetiddler $tiddler=\"$:/temp/dummypopup\"/>'>\n<$list filter=\"[[$:/state/sidebar]is[missing]] [[$:/state/sidebar]get[text]removeprefix[yes]suffix[]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/><$action-setfield $tiddler=\"$:/temp/navigator/sidebarstate\" text=\"hide\"/><<focus-sidebar-actions>>\n\"\"\">\n<<focus-sidebar-actions>>\n</$list>\n</$list>\n</$set>\n</$set>\n</$set>\n</$set>\n</$rootpipe>\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/sidebar-state": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/sidebar-state", "tags": "$:/tags/KeyboardShortcut", "key": "((sidebar-state))", "text": "\\import $:/plugins/BurningTreeC/navigator/macros/navigation\n<$list filter=\"[[$:/state/sidebar]is[missing]] [[$:/state/sidebar]get[text]removeprefix[yes]suffix[]]\" emptyMessage=\"\"\"\n<<navigator-set-sidebar \"yes\">>\n\"\"\">\n<<navigator-set-sidebar \"no\">>\n<$rootpipe>\n<$set name=\"transclusion\" value=\"{|$:/core/ui/PageTemplate|||}\">\n<$set name=\"transclusion\" value=\"{|$:/core/ui/PageTemplate/sidebar|||}\">\n<$set name=\"transclusion\" value=\"{|$:/core/ui/SideBarSegments/search|||}\">\n<$set name=\"focusPopup\" value=<<qualify \"$:/state/popup/search-dropdown\">>>\n<$list filter=\"[<focusPopup>!is[missing]]\">\n<$action-popup $popup=\"$:/temp/dummypopup\"/><$action-deletetiddler $tiddler=\"$:/temp/dummypopup\"/><$action-deletetiddler $tiddler=<<focusPopup>>/>\n</$list>\n</$set>\n</$set>\n</$set>\n</$set>\n</$rootpipe>\n</$list>\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/sidebar-tab-next": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/sidebar-tab-next", "tags": "$:/tags/KeyboardShortcut", "key": "((sidebar-tab-next))", "text": "<$set name=\"transclusion\" value=\"\"\"{|$:/core/ui/PageTemplate|||}\"\"\">\n<$set name=\"transclusion\" value=\"\"\"{|$:/core/ui/PageTemplate/sidebar|||}\"\"\">\n<$set name=\"transclusion\" value=\"\"\"{|$:/core/ui/SideBarSegments/tabs|||}\"\"\">\n<$set name=\"state\" value=<<qualify \"$:/state/tab/sidebar\">>>\n<$set name=\"currentTab\" value={{{ [<state>get[text]] ~[{$:/config/DefaultSidebarTab}] }}}>\n<$action-setfield $tiddler=<<state>> text={{{ [all[shadows+tiddlers]tag[$:/tags/SideBar]after<currentTab>] ~[{$:/config/DefaultSidebarTab}] }}}/>\n</$set>\n</$set>\n</$set>\n</$set>\n</$set>\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/sidebar-tab-previous": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/sidebar-tab-previous", "tags": "$:/tags/KeyboardShortcut", "key": "((sidebar-tab-previous))", "text": "<$set name=\"transclusion\" value=\"\"\"{|$:/core/ui/PageTemplate|||}\"\"\">\n<$set name=\"transclusion\" value=\"\"\"{|$:/core/ui/PageTemplate/sidebar|||}\"\"\">\n<$set name=\"transclusion\" value=\"\"\"{|$:/core/ui/SideBarSegments/tabs|||}\"\"\">\n<$set name=\"state\" value=<<qualify \"$:/state/tab/sidebar\">>>\n<$set name=\"currentTab\" value={{{ [<state>get[text]] ~[{$:/config/DefaultSidebarTab}] }}}>\n<$action-setfield $tiddler=<<state>> text={{{ [all[shadows+tiddlers]tag[$:/tags/SideBar]before<currentTab>] ~[all[shadows+tiddlers]tag[$:/tags/SideBar]last[]] }}}/>\n</$set>\n</$set>\n</$set>\n</$set>\n</$set>\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/close-popup": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/close-popup", "tags": "$:/tags/KeyboardShortcut", "key": "((close-popup))", "text": "\\import [[$:/plugins/BurningTreeC/navigator]plugintiddlers[]tag[$:/tags/Macro]]\n\n<$action-popup $popup={{{ [<NavigatorVariablesPopupStateTiddler>get[text]] }}}/>\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-accept": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-accept", "tags": "$:/tags/KeyboardShortcut", "key": "((popup-accept))", "text": "\\import [[$:/plugins/BurningTreeC/navigator]plugintiddlers[]tag[$:/tags/Macro]]\n\n<$set name=\"popupItemStateVariable\" value={{{ [<NavigatorVariablesPopupStateTiddler>get[item-state-variable]] }}}>\n<$wikify name=\"popupItemState\" text=\"\"\"<$macrocall $name=<<popupItemStateVariable>>/>\"\"\">\n<$set name=\"currentPopupItem\" value={{{ [<popupItemState>get[text]] }}}>\n<$wikify name=\"currentPopupItemSuffix\" text=\"\"\"<$macrocall $name=\"navigatorSplit\" string=<<currentPopupItem>> char=\"/\"/>\"\"\">\n<$macrocall $name={{{ [[Navigator]addsuffix<currentPopupItemSuffix>addsuffix[action]] }}}/>\n</$wikify>\n</$set>\n</$wikify>\n</$set>\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-down": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-down", "tags": "$:/tags/KeyboardShortcut", "key": "((popup-down))", "text": "\\import [[$:/plugins/BurningTreeC/navigator]plugintiddlers[]tag[$:/tags/Macro]]\n\n<$set name=\"popupItemFilterTitle\" value={{{ [<NavigatorVariablesPopupStateTiddler>get[item-filter-variable]] }}}>\n<$wikify name=\"popupItemFilter\" text=\"\"\"<$macrocall $name=<<popupItemFilterTitle>>/>\"\"\">\n<$set name=\"popupItemStateTitle\" value={{{ [<NavigatorVariablesPopupStateTiddler>get[item-state-variable]] }}}>\n<$wikify name=\"popupItemState\" text=\"\"\"<$macrocall $name=<<popupItemStateTitle>>/>\"\"\">\n<$set name=\"currentPopupItem\" value={{{ [<popupItemState>get[text]] }}}>\n<$set name=\"lastPopupItem\" value={{{ [subfilter<popupItemFilter>last[]] }}}>\n<$list filter=\"[<popupItemState>is[missing]] [<popupItemState>!is[missing]get[text]suffix[]] [<popupItemState>!is[missing]get[text]!suffix[]removeprefix<lastPopupItem>suffix[]]\" emptyMessage=\"\"\"\n<$list filter=\"[subfilter<popupItemFilter>after<currentPopupItem>] ~[subfilter<popupItemFilter>nth[1]]\" variable=\"nextPopupItem\">\n<$action-setfield $tiddler=<<popupItemState>> text=<<nextPopupItem>>/>\n</$list>\n\"\"\">\n<$action-setfield $tiddler=<<popupItemState>> text={{{ [subfilter<popupItemFilter>nth[1]] }}}/>\n</$list>\n</$wikify>\n</$set>\n</$set>\n</$wikify>\n</$set>\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-tab-next": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-tab-next", "tags": "$:/tags/KeyboardShortcut", "key": "((popup-tab-next))", "text": "\\import [[$:/plugins/BurningTreeC/navigator]plugintiddlers[]tag[$:/tags/Macro]]\n<$list filter=\"[<NavigatorVariablesPopupTabsStateTiddler>get[text]]\" variable=\"popupTabsState\">\n<$set name=\"popupTabsFilter\" value={{{ [<NavigatorVariablesPopupTabsStateTiddler>get[tabs-filter]] }}}>\n<$set name=\"popupTabsDefault\" value={{{ [<NavigatorVariablesPopupTabsStateTiddler>get[tabs-default]] }}}>\n<$set name=\"currentPopupTab\" value={{{ [<popupTabsState>get[text]] ~[<popupTabsDefault>] }}}>\n<$action-setfield $tiddler=<<popupTabsState>> text={{{ [subfilter<popupTabsFilter>after<currentPopupTab>!suffix[]] ~[subfilter<popupTabsFilter>nth[1]] }}}>\n</$set>\n</$set>\n</$set>\n</$list>\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-tab-previous": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-tab-previous", "tags": "$:/tags/KeyboardShortcut", "key": "((popup-tab-previous))", "text": "\\import [[$:/plugins/BurningTreeC/navigator]plugintiddlers[]tag[$:/tags/Macro]]\n<$list filter=\"[<NavigatorVariablesPopupTabsStateTiddler>get[text]]\" variable=\"popupTabsState\">\n<$set name=\"popupTabsFilter\" value={{{ [<NavigatorVariablesPopupTabsStateTiddler>get[tabs-filter]] }}}>\n<$set name=\"popupTabsDefault\" value={{{ [<NavigatorVariablesPopupTabsStateTiddler>get[tabs-default]] }}}>\n<$set name=\"currentPopupTab\" value={{{ [<popupTabsState>get[text]] ~[<popupTabsDefault>] }}}>\n<$action-setfield $tiddler=<<popupTabsState>> text={{{ [subfilter<popupTabsFilter>before<currentPopupTab>!suffix[]] ~[subfilter<popupTabsFilter>last[]] }}}>\n</$set>\n</$set>\n</$set>\n</$list>\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-up": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/temporary/popup-up", "tags": "$:/tags/KeyboardShortcut", "key": "((popup-up))", "text": "\\import [[$:/plugins/BurningTreeC/navigator]plugintiddlers[]tag[$:/tags/Macro]]\n\n<$set name=\"popupItemFilterTitle\" value={{{ [<NavigatorVariablesPopupStateTiddler>get[item-filter-variable]] }}}>\n<$wikify name=\"popupItemFilter\" text=\"\"\"<$macrocall $name=<<popupItemFilterTitle>>/>\"\"\">\n<$set name=\"popupItemStateTitle\" value={{{ [<NavigatorVariablesPopupStateTiddler>get[item-state-variable]] }}}>\n<$wikify name=\"popupItemState\" text=\"\"\"<$macrocall $name=<<popupItemStateTitle>>/>\"\"\">\n<$set name=\"currentPopupItem\" value={{{ [<popupItemState>get[text]] }}}>\n<$set name=\"firstPopupItem\" value={{{ [subfilter<popupItemFilter>nth[1]] }}}>\n<$list filter=\"[<popupItemState>is[missing]] [<popupItemState>!is[missing]get[text]suffix[]] [<popupItemState>!is[missing]get[text]!suffix[]removeprefix<firstPopupItem>suffix[]]\" emptyMessage=\"\"\"\n<$list filter=\"[subfilter<popupItemFilter>before<currentPopupItem>] ~[subfilter<popupItemFilter>last[]]\" variable=\"nextPopupItem\">\n<$action-setfield $tiddler=<<popupItemState>> text=<<nextPopupItem>>/>\n</$list>\n\"\"\">\n<$action-setfield $tiddler=<<popupItemState>> text={{{ [subfilter<popupItemFilter>last[]] }}}/>\n</$list>\n</$wikify>\n</$set>\n</$set>\n</$wikify>\n</$set>\n\n" }, "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/tiddler-info": { "title": "$:/plugins/BurningTreeC/navigator/KeyboardShortcut/tiddler-info", "tags": "$:/tags/KeyboardShortcut", "key": "((tiddler-info))", "text": "\\import [[$:/plugins/BurningTreeC/navigator]plugintiddlers[]tag[$:/tags/Macro]]\n\n<$set name=\"focusedTiddler\" value={{{ [[$:/HistoryList]get[focus-tiddler]] }}}>\n<$macrocall $name=\"navigator-qualified-state-actions\" tiddler=<<focusedTiddler>> title=\"$:/state/popup/tiddler-info\" storyOrSideBar=\"story\" editOrView=\"view\" level=\"1\" action=\"\"\"<$action-popup $popup=<<state>>/>\"\"\"/>\n</$set>\n" }, "$:/plugins/BurningTreeC/navigator/styles": { "title": "$:/plugins/BurningTreeC/navigator/styles", "tags": "$:/tags/Stylesheet", "text": "\\define style-focus-tiddler()\n\\rules only\n[data-tiddler-title=\"$(focusTiddler)$\"]$(focusedTiddlerSelectors)$ {\n$(focusedTiddlerStyles)$\n}\n\\end\n<$set name=\"focusedTiddlerSelectors\" value={{$:/config/FocusedTiddler/Style/ClassSelector}}>\n<$wikify name=\"focusedTiddlerStyles\" text={{$:/config/FocusedTiddler/Style}}>\n<$list filter=\"[[$:/HistoryList]get[focus-tiddler]escapecss[]]\" variable=\"focusTiddler\">\n<<style-focus-tiddler>>\n</$list>\n</$wikify>\n</$set>\n\n<$list filter=\"[[$:/temp/search/input]!is[missing]get[text]minlength{$:/config/MinLength/Search}]\">\n<$rootpipe>\n<$set name=\"transclusion\" value=\"{|$:/core/ui/PageTemplate|||}\">\n<$set name=\"transclusion\" value=\"{|$:/core/ui/PageTemplate/sidebar|||}\">\n<$set name=\"transclusion\" value=\"{|$:/core/ui/SideBarSegments/search|||}\">\n<$set name=\"focusPopup\" value=<<qualify \"$:/state/popup/search-dropdown\">>>\n<$list filter=\"[<focusPopup>!is[missing]]\">\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n.tc-sidebar-scrollable {\noverflow: inherit !important;\n}\n}\n</$list>\n</$set>\n</$set>\n</$set>\n</$set>\n</$rootpipe>\n</$list>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n.tc-edit-texteditor.tc-tiddler-editor {\nwidth: 49% !important;\ndisplay: inline-block !important;\n}\n</$reveal>\n\n<$vars selectedMorePopupItem={{{ [<NavigatorVariablesMorePopupSelectedItem>get[text]encodeuricomponent[]escapecss[]addprefix[.tc-btn-]] }}} selectedExportTiddlerPopupItem={{{ [<NavigatorVariablesExportTiddlerPopupSelectedItem>get[text]encodeuricomponent[]escapecss[]addprefix[.tc-btn-]] }}}>\n\n.tc-tag-button-selected, .tc-list-item-selected a.tc-tiddlylink {\n\tbackground-color: <<colour primary>>;\n}\n\n<<selectedMorePopupItem>> {\n\tbackground-color: <<colour primary>>;\n}\n\n<<selectedExportTiddlerPopupItem>> {\n\tbackground-color: <<colour primary>>;\n}\n\n</$vars>\n\n@media (max-width:{{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n.tc-tiddler-frame {\nmargin-bottom: 0.5em;\n}\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n.tc-sidebar-scrollable {\npadding: 0;\nheight: 0;\nmargin: 0;\n}\n</$reveal>\n}\n\n" }, "$:/core/ui/DefaultSearchResultList": { "title": "$:/core/ui/DefaultSearchResultList", "tags": "$:/tags/SearchResults", "caption": "{{$:/language/Search/DefaultResults/Caption}}", "accept-actions": "<$list filter=\"[<selectedDropDownItem>!is[shadow]!is[missing]] [<selectedDropDownItem>is[shadow]]\" emptyMessage=\"\"\"<$action-sendmessage $message=\"tm-edit-tiddler\" $param=<<selectedDropDownItem>>/>\"\"\"><$action-navigate $to=<<selectedDropDownItem>>/></$list>", "clear-input-empty-actions": "<$action-deletetiddler $tiddler=<<__editTiddler__>>/><$action-deletetiddler $tiddler=<<__saveTiddler__>>/><$action-deletetiddler $tiddler=<<__refreshTiddler__>>/>", "dropdown-filter-1": "[subfilter<NavigatorSearchResultsTitle>]", "dropdown-filter-2": "[subfilter<NavigatorSearchResultsMore>]", "text": "\\define searchResultList()\n//<span style=\"font-size: 0.85em;\">sorted by: {{$:/temp/search/input}}</span>//<br>\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n<$list filter=\"[subfilter<NavigatorSearchResultsTitle>]\">\n<$list filter=\"[{$:/temp/search}removeprefix<currentTiddler>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\"\"\">\n<span class=\"tc-list-item-selected\"><$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/></span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/More}}</small>//\n\n<$list filter=\"[subfilter<NavigatorSearchResultsMore>]\">\n<$list filter=\"[{$:/temp/search}removeprefix<currentTiddler>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\"\"\">\n<span class=\"tc-list-item-selected\"><$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/></span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n" }, "$:/core/ui/EditTemplate/body/editor": { "title": "$:/core/ui/EditTemplate/body/editor", "text": "<$edit\n\n field=\"text\"\n class=\"tc-edit-texteditor\"\n placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n tabindex={{$:/config/EditTabindex}}\n cancelPopups={{$:/config/EditCancelPopups}}\n refreshTiddler=\"$:/state/showeditpreview\"\n refreshCondition={{{ [[$:/state/showeditpreview]get[preview-tiddler]removeprefix<currentTiddler>suffix[]addprefix[true]] ~[[false]] }}}\n refreshAction=\"focus-again\"\n\n><$set\n\n name=\"targetTiddler\"\n value=<<currentTiddler>>\n\n><$list\n\n filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n type=\"nomatch\"\n state=<<config-visibility-title>>\n text=\"hide\"\n class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n" }, "$:/core/ui/EditTemplate/body": { "title": "$:/core/ui/EditTemplate/body", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabindex}} cancelPopups={{$:/config/EditCancelPopups}}></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n" }, "$:/core/ui/EditTemplate/fields": { "title": "$:/core/ui/EditTemplate/fields", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define new-field()\n<$vars name={{$:/temp/newfieldname}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{$:/temp/newfieldvalue}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\n<div class=\"tc-edit-fields\">\n<table class=\"tc-edit-fields\">\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabindex}} cancelPopups={{$:/config/EditCancelPopups}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=\"$:/temp/newfieldname\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabindex}} cancelPopups={{$:/config/EditCancelPopups}}/>\n</span>\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=\"$:/temp/newfieldname\">\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title{$:/temp/newfieldname}sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<<currentField>>\n</$link>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title{$:/temp/newfieldname}sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<<currentField>>\n</$link>\n</$list>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n<span class=\"tc-edit-field-add-value\">\n<$edit-text tiddler=\"$:/temp/newfieldvalue\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabindex}} cancelPopups={{$:/config/EditCancelPopups}}/>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</div>\n</$fieldmangler>\n" }, "$:/core/ui/EditTemplate/title": { "title": "$:/core/ui/EditTemplate/title", "tags": "$:/tags/EditTemplate", "text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus=\"true\" tabindex={{$:/config/EditTabindex}} cancelPopups={{$:/config/EditCancelPopups}} refreshTiddler=\"$:/HistoryList\" refreshCondition={{{ [[$:/HistoryList]get[focus-tiddler]removeprefix<currentTiddler>suffix[]addprefix[true]] ~[[false]] }}} refreshAction=\"focus-scrollto\"/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n" }, "$:/core/ui/EditTemplate/type": { "title": "$:/core/ui/EditTemplate/type", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-popup-handle\" tabindex={{$:/config/EditTabindex}} cancelPopups={{$:/config/EditCancelPopups}}/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n" }, "$:/core/ui/EditorToolbar/preview": { "title": "$:/core/ui/EditorToolbar/preview", "tags": "$:/tags/EditorToolbar", "icon": "$:/core/images/preview-open", "custom-icon": "yes", "caption": "{{$:/language/Buttons/Preview/Caption}}", "description": "{{$:/language/Buttons/Preview/Hint}}", "condition": "[<targetTiddler>]", "button-classes": "tc-text-editor-toolbar-item-start-group", "shortcuts": "((preview))", "text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" preview-tiddler=<<storyTiddler>>/>\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" preview-tiddler=<<storyTiddler>>/>\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n" }, "$:/core/ui/SearchResults": { "title": "$:/core/ui/SearchResults", "text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} explicitState=\"$:/state/tab/search-results/sidebar\"/>\n\n</$list>\n\n</div>\n" }, "$:/core/ui/SideBarSegments/search": { "title": "$:/core/ui/SideBarSegments/search", "tags": "$:/tags/SideBarSegment", "text": "<div class=\"tc-sidebar-lists\">\n\n<$vars searchTiddler=\"$:/temp/search\" defaultSearchResults={{$:/config/SearchResults/Default}} tabStateTiddler=\"$:/state/tab/search-results/sidebar\">\n<$set name=\"filterTiddler\" value={{{ [<tabStateTiddler>!is[missing]get[text]] ~[<defaultSearchResults>] }}}>\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tabs-right))\" actions=\"\"\"<$macrocall $name=\"change-input-tab\" stateTitle=<<tabStateTiddler>> tag=\"$:/tags/SearchResults\" beforeafter=\"after\" defaultState=<<defaultSearchResults>>/>\"\"\">\n<$keyboard key=\"((input-tabs-left))\" actions=\"\"\"<$macrocall $name=\"change-input-tab\" stateTitle=<<tabStateTiddler>> tag=\"$:/tags/SearchResults\" beforeafter=\"before\" defaultState=<<defaultSearchResults>>/>\"\"\">\n<$macrocall $name=\"selectable-dropdown-input\" editTiddler=<<searchTiddler>> inputPopup=<<qualify \"$:/state/popup/search-dropdown\">> inputClass=\"tc-popup-handle\" inputFocus={{$:/config/Search/AutoFocus}} saveTiddler=\"$:/temp/search/input\" filterTiddler=<<filterTiddler>> refreshTiddler=\"$:/temp/SelectedSearchItem\" refreshCondition=\"\"\"[<__refreshTiddler__>get[refresh-qualifier]removeprefix<__refreshQualifier__>suffix[]addprefix[true]] ~[[false]]\"\"\" refreshAction=\"focus-update\" refreshQualifier=<<qualify \"$:/temp/search\">> filterMinLength={{$:/config/Search/MinLength}} cancelPopups={{$:/config/EditCancelPopups}}/>\n</$keyboard></$keyboard>\n<$reveal state=\"$:/temp/search/input\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search/input}}/>\n<$action-setfield $tiddler=\"$:/temp/search/input\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n<$action-setfield $tiddler=\"$:/temp/search/input\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$:/temp/search/input}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$set name=\"searchTerm\" value={{{ [[$:/temp/search/input]get[text]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search<searchTerm>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$set>\n</$list>\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search/input\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/temp/search/input\" type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<$list filter=\"[{$:/temp/search/input}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$vars userInput={{$:/temp/search/input}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$list>\n\n</$reveal>\n\n</$reveal>\n\n</$set>\n\n</$vars>\n\n</div>\n" }, "$:/plugins/BurningTreeC/navigator/ui/SystemSearchResultList": { "title": "$:/plugins/BurningTreeC/navigator/ui/SystemSearchResultList", "tags": "$:/tags/SearchResults", "caption": "{{$:/language/Search/SystemResults/Caption}}", "accept-actions": "<$list filter=\"[<selectedDropDownItem>!is[shadow]!is[missing]] [<selectedDropDownItem>is[shadow]]\" emptyMessage=\"\"\"<$action-sendmessage $message=\"tm-edit-tiddler\" $param=<<selectedDropDownItem>>/>\"\"\"><$action-navigate $to=<<selectedDropDownItem>>/></$list>", "clear-input-empty-actions": "<$action-deletetiddler $tiddler=<<__editTiddler__>>/><$action-deletetiddler $tiddler=<<__saveTiddler__>>/><$action-deletetiddler $tiddler=<<__refreshTiddler__>>/>", "dropdown-filter-1": "[subfilter<NavigatorSearchResultsSystemTitle>]", "dropdown-filter-2": "[subfilter<NavigatorSearchResultsSystemMore>]", "text": "\\define searchResultList()\n//<span style=\"font-size: 0.85em;\">sorted by: {{$:/temp/search/input}}</span>//<br>\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n<$list filter=\"[subfilter<NavigatorSearchResultsSystemTitle>]\">\n<$list filter=\"[{$:/temp/search}removeprefix<currentTiddler>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\"\"\">\n<span class=\"tc-list-item-selected\"><$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/></span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/More}}</small>//\n\n<$list filter=\"\">\n<$list filter=\"[{$:/temp/search}removeprefix<currentTiddler>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\"\"\">\n<span class=\"tc-list-item-selected\"><$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/></span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n" }, "$:/core/ui/TopBar/menu": { "title": "$:/core/ui/TopBar/menu", "tags": "$:/tags/TopRightBar", "text": "\\define sidebar-actions()\n{{$:/plugins/BurningTreeC/navigator/KeyboardShortcut/sidebar-state}}\n\\end\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"no\">\n<$button actions=<<sidebar-actions>> tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n<$button actions=<<sidebar-actions>> tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$reveal>\n\n" }, "$:/core/ui/ViewTemplate/title": { "title": "$:/core/ui/ViewTemplate/title", "tags": "$:/tags/ViewTemplate", "text": "\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}/>\n</span>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\" openActions=<<navigator-tiddlerinfo-openactions>> closeActions=<<navigator-tiddlerinfo-closeactions>>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>\n" }, "$:/core/ui/Buttons/info": { "title": "$:/core/ui/Buttons/info", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}", "description": "{{$:/language/Buttons/Info/Hint}}", "text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>" }, "$:/core/ui/Buttons/more-tiddler-actions": { "title": "$:/core/ui/Buttons/more-tiddler-actions", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}", "description": "{{$:/language/Buttons/More/Hint}}", "text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popupTitle=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal stateTitle=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\" openActions=<<navigator-more-tiddler-openactions>> closeActions=<<navigator-more-tiddler-closeactions>>>\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[subfilter<NavigatorMoreTiddlerFilter>]\" variable=\"listItem\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>\n" }, "$:/plugins/BurningTreeC/navigator/usage": { "title": "$:/plugins/BurningTreeC/navigator/usage", "text": "Usage here\n" } } }
{ "tiddlers": { "$:/plugins/jd/NTFS19/readme": { "text": "This plugin adds a function to create a new tiddler based on the text string entered in the searchbar. \n\nThis can be done via:\n\n# the \"+\" button that will appear to the right of the searchbar when you type or, \n# the keyboard shortcut \"ctrl+space\"\n\n!!! ''What were overwritten?''\n\n# Changed the `div` enveloping the searchbar into a `<$keyboard>` widget, to catch the \"ctrl+space\" shortcut.\n# Added the \"+\" button that will appear when the searchbar is not empty.\n\n<a target=\"blank\" href=\"http://j.d.ntfs19.tiddlyspot.com\">Project Homepage on Tiddlyspot</a>\n\n!!!''Not compatible with TW5.1.18 and below''\n\nFor TW5.1.18 and below: <a target=\"blank\" href=\"http://j.d.ntfs.tiddlyspot.com\">NTFS</a>", "title": "$:/plugins/jd/NTFS19/readme", "tags": "", "modifier": "jd", "modified": "20190129114653931", "creator": "HC Haase", "created": "20180903082203162" }, "$:/core/ui/AdvancedSearch/Filter": { "text": "\\define lingo-base() $:/language/Search/\n<<lingo Filter/Hint>>\n\n<$importvariables filter=\"[[$:/core/ui/SideBarSegments/search]]\">\n<$keyboard class=\"tc-search tc-advanced-search\" tag=\"div\" key=\"ctrl+space\" actions=<<NewTidActions \"$:/temp/advancedsearch\">>>\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$list filter=\"[[$:/temp/advancedsearch]!text[]]\"><<NewTidBtn \"$:/temp/advancedsearch\">></$list>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</$keyboard>\n</$importvariables>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$set>\n</$reveal>\n", "title": "$:/core/ui/AdvancedSearch/Filter", "tags": "$:/tags/AdvancedSearch", "modifier": "jd", "modified": "20190129113823570", "creator": "jd", "created": "20180903105957506", "caption": "{{$:/language/Search/Filter/Caption}}" }, "$:/core/ui/AdvancedSearch/Shadows": { "text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<$importvariables filter=\"[[$:/core/ui/SideBarSegments/search]]\">\n<$keyboard class=\"tc-search\" tag=\"div\" key=\"ctrl+space\" actions=<<NewTidActions \"$:/temp/advancedsearch\">>>\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$list filter=\"[[$:/temp/advancedsearch]!text[]]\"><<NewTidBtn \"$:/temp/advancedsearch\">></$list>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$keyboard>\n</$importvariables>\n\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n", "title": "$:/core/ui/AdvancedSearch/Shadows", "tags": "$:/tags/AdvancedSearch", "modifier": "jd", "modified": "20190129113816484", "creator": "jd", "created": "20180903111038029", "caption": "{{$:/language/Search/Shadows/Caption}}" }, "$:/core/ui/AdvancedSearch/Standard": { "text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<$importvariables filter=\"[[$:/core/ui/SideBarSegments/search]]\">\n<$keyboard class=\"tc-search\" tag=\"div\" key=\"ctrl+space\" actions=<<NewTidActions \"$:/temp/advancedsearch\">>>\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$list filter=\"[[$:/temp/advancedsearch]!text[]]\"><<NewTidBtn \"$:/temp/advancedsearch\">></$list>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$keyboard>\n</$importvariables>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$list>\n</$reveal>\n", "title": "$:/core/ui/AdvancedSearch/Standard", "tags": "$:/tags/AdvancedSearch", "modifier": "jd", "modified": "20190129113810696", "creator": "jd", "created": "20180903111148689", "caption": "{{$:/language/Search/Standard/Caption}}" }, "$:/core/ui/AdvancedSearch/System": { "text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<$importvariables filter=\"[[$:/core/ui/SideBarSegments/search]]\">\n<$keyboard class=\"tc-search\" tag=\"div\" key=\"ctrl+space\" actions=<<NewTidActions \"$:/temp/advancedsearch\">>>\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$list filter=\"[[$:/temp/advancedsearch]!text[]]\"><<NewTidBtn \"$:/temp/advancedsearch\">></$list>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$keyboard>\n</$importvariables>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n", "title": "$:/core/ui/AdvancedSearch/System", "tags": "$:/tags/AdvancedSearch", "modifier": "jd", "modified": "20190129113803409", "creator": "jd", "created": "20180903111230192", "caption": "{{$:/language/Search/System/Caption}}" }, "$:/core/ui/SideBarSegments/search": { "text": "\\define NewTidActions(searcharea)\n<$action-createtiddler $basetitle={{$searcharea$}} $savetitle=\"$:/temp/NewTidTitle\"/>\n<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{$:/temp/NewTidTitle}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/NewTidTitle\"/>\n<$action-setfield $tiddler=\"$searcharea$\" text=\"\"/>\n\\end\n\n\\define NewTidBtn(searcharea)\n<$button tooltip=\"Create new tiddler with this title\" class=\"tc-btn-invisible\" actions=<<NewTidActions \"$searcharea$\">>>\n{{$:/core/images/new-button}}\n</$button>\n\\end\n\n<div class=\"tc-sidebar-lists\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n<$keyboard class=\"tc-search\" tag=\"div\" key=\"ctrl+space\" actions=<<NewTidActions \"$:/temp/search\">>>\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-popup-handle\"/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<<NewTidBtn \"$:/temp/search\">>\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$set name=\"searchTerm\" value={{{ [<searchTiddler>get[text]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search<searchTerm>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$set>\n</$list>\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</$keyboard>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n{{$:/core/ui/SearchResults}}\n\n</$list>\n\n</$reveal>\n\n</$reveal>\n\n</$set>\n\n</div>\n", "title": "$:/core/ui/SideBarSegments/search", "tags": "$:/tags/SideBarSegment", "modifier": "jd", "modified": "20190129113714240", "creator": "jd", "created": "20190129113515705" } } }
{ "tiddlers": { "$:/language/Buttons/RandomSelection/Hint": { "text": "Open a random tiddler", "title": "$:/language/Buttons/RandomSelection/Hint", "tags": "", "modified": "20210725102851778", "created": "20210725102837447" }, "$:/language/Buttons/RandomSelection/Caption": { "created": "20210808072830993", "text": "random selection", "title": "$:/language/Buttons/RandomSelection/Caption", "modified": "20210808072844786", "tags": "", "type": "text/vnd.tiddlywiki" }, "$:/core/ui/Buttons/RandomSelection": { "created": "20210725102642198", "text": "\\whitespace trim\n\\define randomselectionButton()\n<$button tooltip={{$:/language/Buttons/RandomSelection/Hint}} aria-label={{$:/language/Buttons/RandomSelection/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/RandomSelection}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/randomselection.svg}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/RandomSelection/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<randomselectionButton>>", "title": "$:/core/ui/Buttons/RandomSelection", "tags": "$:/tags/PageControls", "modified": "20210808094557580", "description": "{{$:/language/Buttons/RandomSelection/Hint}}", "caption": "{{$:/core/images/randomselection}} {{$:/language/Buttons/RandomSelection/Caption}}" }, "$:/core/ui/Actions/RandomSelection": { "created": "20210725102925324", "text": "\\define navigateTo(link)\n<$action-navigate $to=\"$link$\" />\n\\end\n\n<$macrocall $name=\"navigateTo\" link={{{ [!is[system]random[1]] }}} />", "title": "$:/core/ui/Actions/RandomSelection", "tags": "$:/tags/Actions", "modified": "20210808074924225", "abstract": "Navigate to a random tiddler" }, "$:/core/images/randomselection.svg": { "created": "20210725102334343", "text": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18pt\" height=\"18pt\" viewBox=\"0 0 640 512\"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d=\"M592 192H473.26c12.69 29.59 7.12 65.2-17 89.32L320 417.58V464c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48V240c0-26.51-21.49-48-48-48zM480 376c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm-46.37-186.7L258.7 14.37c-19.16-19.16-50.23-19.16-69.39 0L14.37 189.3c-19.16 19.16-19.16 50.23 0 69.39L189.3 433.63c19.16 19.16 50.23 19.16 69.39 0L433.63 258.7c19.16-19.17 19.16-50.24 0-69.4zM96 248c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"/></svg>", "title": "$:/core/images/randomselection.svg", "tags": "$:/tags/Image", "modified": "20210808094647631", "type": "text/vnd.tiddlywiki" }, "$:/plugins/kiasu/RandomTiddlerButton/readme": { "created": "20210808094912103", "text": "RandomTiddlerButton simply adds a random tiddler button to TiddlyWiki's page toolbar.\n\nYou can override the filter behaviour at [[$:/core/ui/Actions/RandomSelection]]. It currently opens one random non-system tiddler when clicked (i.e. ``[!is[system]random[1]]``).\n\nRequires [[Tobibeer's random plugin|https://tobibeer.github.io/tw5-plugins/#random]] to work.\n\nFor more information:\n\n* [[Live instance/documentation|https://sonephetr2.github.io/RandomTiddlerButton/]].\n* [[GitHub|https://github.com/SonephetR2/TW5RandomTiddlerButton]].", "title": "$:/plugins/kiasu/RandomTiddlerButton/readme", "type": "text/vnd.tiddlywiki", "tags": "", "modified": "20210808095450953" } } }
{ "tiddlers": { "$:/plugins/snowgoon88/edit-comptext/config": { "title": "$:/plugins/snowgoon88/edit-comptext/config", "type": "application/json", "text": "{\n \"configuration\": {\n \"caseSensitive\" : false,\n \"maxMatch\" : 8,\n \"minPatLength\" : 2,\n \"triggerKeyCombination\" : \"^ \"\n },\n \"template\": [{\n \"pattern\": \"[[\",\n \"filter\": \"[all[tiddlers]!is[system]]\",\n \"start\": \"[[\",\n \"end\": \"]]\"\n }\n ]\n}\n" }, "$:/plugins/snowgoon88/edit-comptext/edit-comptext.js": { "title": "$:/plugins/snowgoon88/edit-comptext/edit-comptext.js", "text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/edit-comptext.js\ntype: application/javascript\nmodule-type: widget\n\nTaken from original Edit-text widget\nVersion 5.1.13 of TW5\nAdd link-to-tiddler completion in framed.js and simple.js\n\nTODO : CHECK usefull, and particularly save_changes after every input ??\nTODO : where should popupNode be created in the DOM ?\nTODO : check that options are valid (numeric ?)\nvar isNumeric = function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedCompEngine = require(\"$:/plugins/snowgoon88/edit-comptext/framed.js\").FramedCompEngine,\n\tSimpleCompEngine = require(\"$:/plugins/snowgoon88/edit-comptext/simple.js\").SimpleCompEngine;\n\nexports[\"edit-comptext\"] = editTextWidgetFactory(FramedCompEngine,SimpleCompEngine);\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/plugins/snowgoon88/edit-comptext/examples": { "title": "$:/plugins/snowgoon88/edit-comptext/examples", "text": "The configuration file [[$:/plugins/snowgoon88/edit-comptext/config]] allow you to use the completion plugin for various usages. Here are some examples...\n\n!! Link Completion\nThe basic and default usage. Completion is triggered by `[[`, the search is among all non-system tiddlers. When selected, the `title` of the tiddler is inserted in the text, surrounded by `[[` and `]]`. This gives the following Completion Template.\n\n\n```\n{\n \"pattern\": \"[[\",\n \"title\": \"[all[tiddlers]!is[system]]\",\n \"start\": \"[[\",\n \"end\": \"]]\"\n}\t \n```\n\n\n!! Special macro completion\nI have a 'pnjin' macro that is invoked by `<<pnjin \"TiddlerPNJName\">>` where 'TiddlerPNJName is a tiddler that hold data about a PNJ. I use tiddlywiki to organise my Role Playing Games campaigns. So, I want `<p` to trigger the completion. The search is among all non-system tiddlers tagged `PNJ` and, once selected, the title of the tiddler must be inserted surrouned by `<<pnjin \\\"` and `\\\">>`. So...\n\n```\n{\n\t\"pattern\": \"<p\",\n \t\"title\": \"[tag[PNJ]!is[system]]\",\n \t\"start\": \"<<pnjin \\\"\",\n \t\"end\": \"\\\">>\"\n}\n```\n\n!! Insert some templates or stamp or snippets into text.\nI frequently use some text pattern and I want to insert them easily. So, I could create several tiddlers, tagged '$:stamp' and in their body are the piece of texte I want to insert. The titles of these tiddlers always start with `$:/config/stamp/` (i.e. $:/config/stamp/macro, $:/config/stamp/list1, $:/config/stamp/list2). I want to trigger the completion by using `<<`, then I only want to chose among the last part of the titles of tiddlers tagged `$:stamp` so I use a mask (`$:/config/stamp/`) to only display the last part of the tiddlers title. When selectected, the `body` of the tiddler is inserted, with no surrounding strings. As a results, the Completion Template is (notice the `body` field):\n\n```\n{\n \"pattern\": \"<<\",\n \"body\": \"[tag[$:stamp]]\",\n \"mask\" : \"$:/config/stamp/\",\n \"start\": \"\",\n \"end\": \"\"\n}\n```\n\n!! And you ?\nIf you have funny usages of completion, let me know. If you'd like to do something that is not yet possible, let me know...\n\nmail : snowgoon88(AT)gmail(DOT)com" }, "$:/plugins/snowgoon88/edit-comptext/framed.js": { "text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/framed.js\ntype: application/javascript\nmodule-type: library\n\nTaken from $:/core/modules/editor/engines/framed.js\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\n// Configuration tiddler\nvar COMPLETION_OPTIONS = \"$:/plugins/snowgoon88/edit-comptext/config\";\nvar Completion = require(\"$:/plugins/snowgoon88/edit-comptext/completion.js\").Completion;\n\t\nfunction FramedCompEngine(options) {\n //DEBUG console.log( \"==FramedCompEngine::creation\" );\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\n\t// Completion\n\t// Load Completion configuration as JSON\n this._configOptions = $tw.wiki.getTiddlerData( COMPLETION_OPTIONS, {} );\n\t\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create dummy popup for reading its styles\n\t//this._dummyCompletion = new Completion( this.widget, this.dummyTextArea, this._configOptions);\n\t//REMOVEthis._dummyCompletion.setAttribute(\"hidden\",\"true\");\n\t\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n\n\t// add Completion popup\n this._completion = new Completion( this.widget, this.domNode, this._configOptions, this.dummyTextArea, this.iframeNode.offsetTop, this.iframeNode.offsetLeft );\n\t// print iframe offset\n\t//DEBUG console.log( \" __iframe.offsetLeft: \"+this.iframeNode.offsetLeft );\n //DEBUG console.log( \" __iframe.offsetTop: \"+this.iframeNode.offsetTop );\n \n\t// Copy all styles from dummyCompletion\n\t//$tw.utils.copyStyles(this._dummyCompletion._popNode, this._completion._popNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\t//this._completion._popNode.style.display = \"block\";\n\t//this._completion._popNode.style.width = \"100%\";\n\t//this._completion._popNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\t//this._completion._popNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n \n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedCompEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedCompEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nFramedCompEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedCompEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedCompEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedCompEngine.prototype.handleInputEvent = function(event) {\n //DEBUG console.log( \"__framed.js::handleInputEvent\");\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedCompEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedCompEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedCompEngine = FramedCompEngine;\n\n})();\n", "type": "application/javascript", "title": "$:/plugins/snowgoon88/edit-comptext/framed.js", "module-type": "library" }, "$:/plugins/snowgoon88/edit-comptext/simple.js": { "text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/simple.js\ntype: application/javascript\nmodule-type: library\n\nTaken from $:/core/modules/editor/engines/simple.js\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\n// Configuration tiddler\nvar COMPLETION_OPTIONS = \"$:/plugins/snowgoon88/edit-comptext/config\";\nvar Completion = require(\"$:/plugins/snowgoon88/edit-comptext/completion.js\").Completion;\n\nfunction SimpleCompEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\n // Completion\n\t// Load Completion configuration as JSON\n this._configOptions = $tw.wiki.getTiddlerData( COMPLETION_OPTIONS, {} );\n\t\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n\n\t// add Completion popup\n this._completion = new Completion( this.widget, this.domNode, this._configOptions );\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleCompEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nSimpleCompEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleCompEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleCompEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleCompEngine.prototype.handleInputEvent = function(event) {\n\tconsole.log( \"__simple.js::handleInputEvent\");\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleCompEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleCompEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleCompEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleCompEngine = SimpleCompEngine;\n\n})();\n", "type": "application/javascript", "title": "$:/plugins/snowgoon88/edit-comptext/simple.js", "module-type": "library" }, "$:/plugins/snowgoon88/edit-comptext/cursor-position.js": { "text": "/*\\\nModule that compute the pixel position of the cursor of a text\nements.\n\nTaken from https://github.com/component/textarea-caret-position\n\n(as https://github.com/kir/js_cursor_position is not updated any more)\n\\*/\n// Fonction anonyme executée immediatement\n( function(){\n \n// The properties that we copy into a mirrored div.\n// Note that some browsers, such as Firefox,\n// do not concatenate properties, i.e. padding-top, bottom etc. -> padding,\n// so we have to do every single property specifically.\nvar properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize'\n\n];\nvar isFirefox = false;\nif($tw.browser) {\n isFirefox = window.mozInnerScreenX != null;\n}\n\nfunction getCaretCoordinates(element, position, options) {\n\n var debug = options && options.debug || false;\n if (debug) {\n var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n if ( el ) { el.parentNode.removeChild(el); }\n }\n\n // mirrored div\n var div = document.createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n var style = div.style;\n var computed;\n if($tw.browser) {\n computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n } \n else {\n computed = element.currentStyle;\n }\n \n\n // default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (element.nodeName !== 'INPUT')\n style.wordWrap = 'break-word'; // only for textarea-s\n\n // position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n if (!debug)\n style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n // transfer the element's properties to the div\n properties.forEach(function (prop) {\n style[prop] = computed[prop];\n });\n\n if (isFirefox) {\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n }\n\n div.textContent = element.value.substring(0, position);\n // the second special handling for input type=\"text\" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (element.nodeName === 'INPUT')\n div.textContent = div.textContent.replace(/\\s/g, \"\\u00a0\");\n\n var span = document.createElement('span');\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the <span> created at the caret position.\n // for inputs, just '.' would be enough, but why bother?\n span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n var coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth'])\n };\n\n if (debug) {\n span.style.backgroundColor = '#aaa';\n } else {\n document.body.removeChild(div);\n }\n\n return coordinates;\n}\n\n// Exporte as a module of node.js otherwise set as global\nif (typeof module != \"undefined\" && typeof module.exports != \"undefined\") {\n module.exports = getCaretCoordinates;\n} else {\n window.getCaretCoordinates = getCaretCoordinates;\n}\n\n})();\n", "type": "application/javascript", "title": "$:/plugins/snowgoon88/edit-comptext/cursor-position.js", "module-type": "library" }, "$:/plugins/snowgoon88/edit-comptext/completion.js": { "text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/completion.js\ntype: application/javascript\nmodule-type: library\n\nTry to make self-contained completion module.\n\nTo use this 'module', you need a `widget` with a kind of `editarea` node.\nI do not know the exacte prerequisites of this editarea node for the module to\nwork, but mostly one should be able to attach the following `eventHandler` to\nit:\n - input\n - keydown\n - keypress\n - keyup\nThe `widget` is needed because I use:\n - widget.document\n - widget.wiki.filterTiddlers(...)\n\nFrom the Widget, once you have a proper editarea, you just have to call\n - var completion = new Completion( theWidget, theEditAreaNode, configObject);\nwhere `configObject` is expected to have the following fields. if a field is missing, a default value will be given.\nOne can have many `elements' in the template array.\n\n{\n \"configuration\": {\n \"caseSensitive\" : false,\n \"maxMatch\" : 8,\n \"minPatLength\" : 2,\n \"triggerKeyCombination\" : \"^ \"\n },\n \"template\": [{\n \"pattern\": \"[[\",\n \"filter\": \"[all[tiddlers]!is[system]]\",\n \"start\": \"[[\",\n \"end\": \"]]\"\n }\n ]\n}\n\nTODO : CHECK if needed\n\\*/\n\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// To compute pixel coordinates of cursor\nvar getCaretCoordinates = require(\"$:/plugins/snowgoon88/edit-comptext/cursor-position.js\");\n\n/** Default Completion Attributes */\nvar DEFATT = { maxMatch: 5, minPatLength: 2, caseSensitive: false, triggerKeyCombination: \"^ \" };\n\n/** \n * Struct for generic Completion Templates.\n * <ul>\n * <li>pat : pattern searched for.</li>\n * <li>filter : filter operation used to find the list of completion options</li>\n * <li>mask: replaced by \"\" when presenting completion options</li>\n * </ul>\n */\nvar Template = function( pat, filter, mask, field, start, end ) {\n this.pat = pat;\n this.filter = filter;\n this.mask = \"^\"+regExpEscape(mask);\n this.field = field;\n this.start = start;\n this.end = end;\n this.pos = 0;\n};\n/**\n * Struct for storing completion options, as we need to memorise \n * the titles of the tiddlers when masked and when body must be displayed.\n */\nvar OptCompletion = function( title, str ) {\n this.title = title;\n this.str = str;\n};\n\nvar keyMatchGenerator = function(combination) {\n\tlet singleMatchGenerator = function(character) {\n\t\tif (character === '^') {\n\t\t\treturn event => event.ctrlKey;\n\t\t}\n\t\telse if (character === '+') {\n\t\t\treturn event => event.shiftKey;\n\t\t}\n\t\telse if (character === '!') {\n\t\t\treturn event => event.altKey;\n\t\t}\n\t\telse {\n\t\t\treturn event => (event.keyCode || event.which) === character.charCodeAt(0);\n\t\t}\n\t};\n\n\tlet matchers = [];\n\tfor (let i = 0; i < combination.length; i++) {\n\t\tmatchers.push(singleMatchGenerator(combination[i]));\n\t}\n\n\treturn event => {\n\t\tfor (let i = 0; i < matchers.length; i++) {\n\t\t\tif (!matchers[i](event)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n};\n\n/**\n * Widget is needed in creating popupNode.\n * - widget.document\n * - widget.wiki.filterTiddlers(...)\n * - sibling : where to create the popup in the DOM.\n */\n\tvar Completion = function( editWidget, areaNode, param, sibling, offTop, offLeft ) {\n\tconsole.log( \"==Completion::creation\" );\n\n // About underlying Widget\n this._widget = editWidget;\n\tthis._areaNode = areaNode;\n\tthis._sibling = (typeof sibling !== 'undefined') ? sibling : this._areaNode;\n\tthis._offTop = (typeof offTop !== 'undefined') ? offTop : 0;\n\tthis._offLeft = (typeof offLeft !== 'undefined') ? offLeft : 0;\t\n\t\t\n // Completions attributes\n /** State */\n this._state = \"VOID\";\n this._template = undefined;\n /** Best matches */\n this._bestMatches = []; // An array of OptCompletion\n this._idxChoice = -1;\n /** Param */\n // maximum nb of match displayed\n this._maxMatch = param.configuration.maxMatch || DEFATT.maxMatch; \n this._minPatLength = param.configuration.minPatLength || DEFATT.minPatLength;\n this._caseSensitive= param.configuration.caseSensitive || DEFATT.caseSensitive;\n this._triggerKeyMatcher = keyMatchGenerator(param.configuration.triggerKeyCombination || DEFATT.triggerKeyCombination);\n /** Input information */\n this._lastChar = \"\";\n this._hasInput = false;\n /** List of Completion Templates */\n this._listTemp = [];\n \n // Read templates from Param\n if( param.template ) {\n \tvar idT;\n \tfor( idT=0; idT<param.template.length; idT++ ) {\n \t var temp = param.template[idT];\n\t // field 'body' ou 'title' (default)\n\t if( temp.body ) {\t\t\n \t\tthis._listTemp.push( \n \t\t new Template( temp.pattern, temp.body,\n\t\t\t\t temp.mask ? temp.mask : \"\",\n\t\t\t\t \"body\",\n \t\t\t\t temp.start, temp.end )\n \t\t);\n\t }\n\t else {\n \t\tthis._listTemp.push( \n \t\t new Template( temp.pattern, \n\t\t\t\t temp.title ? temp.title : temp.filter,\n\t\t\t\t temp.mask ? temp.mask : \"\",\n\t\t\t\t \"title\",\n \t\t\t\t temp.start, temp.end )\n \t\t);\n\t }\n\t //DEBUG temp = this._listTemp[this._listTemp.length-1];\n\t //DEBUG console.log( \"__CONF : \"+temp.pattern+\":\"+temp.filter+\":\"+temp.mask+\":\"+temp.field+\":\"+temp.start+\":\"+temp.end );\n \t}\n }\n // or defaut template\n else {\n \tthis._listTemp = [\n \t new Template( \"[[\", \"[all[tiddlers]!is[system]]\", \n\t\t\t \"\", \"title\",\n\t\t\t \"[[\", \"]]\" )\n \t];\n }\n // Create Popup\n\t//this._popNode = createPopup(this._widget, this._areaNode );\n\tthis._popNode = createPopup(this._widget, this._sibling );\t\n \n // Listen to the Keyboard\n $tw.utils.addEventListeners( this._areaNode,[\n\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInput\"},\n\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydown\"},\n\t{name: \"keypress\", handlerObject: this, handlerMethod: \"handleKeypress\"},\n \t{name: \"keyup\", handlerObject: this, handlerMethod: \"handleKeyup\"}\n ]);\n \n /** \n * Find the bestMatches among listChoice with given pattern\n * @param listChoice : array of String\n * @change : this._bestMatches => array of OptCompletion\n */\n this._findBestMatches = function( listChoice, pattern, nbMax) {\n\t// regexp search pattern, case sensitive\n\tvar flagSearch = this._caseSensitive ? \"\" : \"i\" ;\n\tvar regpat = RegExp( regExpEscape(pattern), flagSearch );\n\tvar regpat_start = RegExp( \"^\"+regExpEscape(pattern), flagSearch );\n\tvar regMask = RegExp( this._template.mask ? this._template.mask : \"\",\"\");\n\tvar nbMatch = 0;\n\t// nbMax set to _maxMatch if no value given\n\tnbMax = nbMax !== undefined ? nbMax : this._maxMatch;\n\n\t//DEBUG console.log( \"__FIND masked=\"+regMask+\" regPat=\"+regpat);\n\n\tthis._bestMatches= [];\n\tvar otherMatches = [];\n\t// We test every possible choice\n\tfor( var i=0; i< listChoice.length; i++ ) {\n\t // apply mask over potential choice\n\t var maskedChoice = listChoice[i].replace( regMask, \"\");\n\t // Test first if pattern is found at START of the maskedChoice\n\t // THEN added to BestMatches\n \t if( regpat_start.test( maskedChoice )) {\n\t\tif (nbMatch >= nbMax) {\n\t\t this._bestMatches.push( new OptCompletion(\"\",\"...\") );\n\t\t return;\n\t\t} else {\n\t\t this._bestMatches.push( new OptCompletion(listChoice[i],maskedChoice) );\n\t\t nbMatch += 1;\n\t\t}\n\t }\n\t // then if pattern is found WITHIN the maskedChoice\n\t // added AFTER the choices that starts with pattern\n\t else if( regpat.test( maskedChoice ) ) {\n\t\tif (nbMatch >= nbMax) {\n\t\t // add all otherMatches to _bestMatches\n\t\t this._bestMatches.push( new OptCompletion(\"\",\"<hr>\") ) ; //separator\n\t\t this._bestMatches = this._bestMatches.concat( otherMatches );\n\t\t this._bestMatches.push( new OptCompletion(\"\",\"...\") );\n\t\t return;\n\t\t} else {\n\t\t otherMatches.push( new OptCompletion(listChoice[i],maskedChoice) );\n\t\t nbMatch += 1;\n\t\t}\n\t }\n\t}\n\t// Here, must add the otherMatches\n\tthis._bestMatches.push( new OptCompletion(\"\",\"<hr>\") ) ; //separator\n\tthis._bestMatches = this._bestMatches.concat( otherMatches );\n };\n /**\n * Change Selected Status of Items\n */\n this._next = function (node) {\n\tvar count = node.children.length;\n\t//DEBUG console.log( \"__NEXT: co=\"+count+\" nbMatch=\"+this._bestMatches.length);\n\tif( this._bestMatches.length > 0 ) \n\t this._goto( node, this._idxChoice < count - 1 ? this._idxChoice + 1 : -1);\n\t//DEBUG this._logStatus( \"NexT\" );\n };\n this._previous = function (node) {\n\tvar count = node.children.length;\n\tvar selected = this._idxChoice > -1;\n\t//DEBUG console.log( \"__PREV: co=\"+count+\" nbMatch=\"+this._bestMatches.length);\n\tif( this._bestMatches.length > 0 ) \n\t this._goto( node, selected ? this._idxChoice - 1 : count - 1);\n\t//DEBUG this._logStatus( \"PreV\" );\n };\n // Should not be used, highlights specific item without any checks!\n this._goto = function (node, idx) {\n\tvar lis = node.children;\n\tvar selected = this._idxChoice > -1;\n\tif (selected) {\n\t lis[this._idxChoice].setAttribute(\"patt-selected\", \"false\");\n\t}\n\n\tthis._idxChoice = idx;\n \n\tif (idx > -1 && lis.length > 0) {\n\t lis[idx].setAttribute(\"patt-selected\", \"true\");\n\t}\n };\n /**\n * Abort pattern and undisplay.\n */\n this._abortPattern = function (displayNode) {\n\tthis._state = \"VOID\";\n\tthis._bestChoices = [];\n\tthis._idxChoice = -1;\n\tthis._undisplay( displayNode );\n\tthis._template = undefined;\n };\n /**\n * Display popupNode at the cursor position in areaNode.\n */\n this._display = function( areaNode, popupNode ) {\n\tif ( popupNode.style.display == 'none' ) {\n\t // Must get coordinate\n\t // Cursor coordinates within area + area coordinates + scroll\n var coord = getCaretCoordinates(areaNode, areaNode.selectionEnd);\n var styleSize = getComputedStyle(areaNode).getPropertyValue('font-size');\n var fontSize = parseFloat(styleSize); \n\t\t\n\t popupNode.style.left = (this._offLeft+areaNode.offsetLeft-areaNode.scrollLeft+coord.left) + 'px';\n\t popupNode.style.top = (this._offTop+areaNode.offsetTop-areaNode.scrollTop+coord.top+fontSize*2) + 'px';\n\t popupNode.style.display = 'block';\n\t}\n };\n /**\n * Undisplay someNode\n */\n this._undisplay = function( displayNode ) {\n\tif ( displayNode.style.display != 'none' ) {\n\t displayNode.style.display = 'none';\n\t}\n };\n\n /**\n * Used for debug\n */\n this._logStatus = function(msg) {\n\tconsole.log( \"__STATUS: \"+this._state+\":-\"+msg+\"- idx=\"+this._idxChoice );\n };\n\n};\n// **************************************************************************\n// ******************************************************************eventCbk\n// **************************************************************************\n/**\n * Disable the *effects* of ENTER / UP / DOWN / ESC when needed.\n * Set _hasInput to false.\n */\nCompletion.prototype.handleKeydown = function(event) {\n // key \n var key = event.keyCode;\n this._hasInput = false;\n \n //DEBUG console.log( \"__KEYDOWN (\"+key+\") hasI=\"+this._hasInput);\n \n // ENTER while selecting\n if( (this._state === \"PATTERN\" || this._state === \"SELECT\") && key === 13 ) {\n \tevent.preventDefault();\n \tevent.stopPropagation();\n }\n // ESC while selecting\n if( (this._state === \"PATTERN\" || this._state === \"SELECT\") && key === 27 ) {\n \tevent.preventDefault();\n \tevent.stopPropagation();\n }\n // UP/DOWN while a pattern is extracted\n if( (key===38 || key===40) && \n\t(this._state === \"PATTERN\" || this._state === \"SELECT\") ) {\n\tevent.preventDefault();\n }\n};\n/**\n * Means that something has been added/deleted => set _hasInput\n */\nCompletion.prototype.handleInput = function(event) {\n this._hasInput = true;\n //DEBUG console.log( \"__INPUT hasI=\"+this._hasInput );\n};\n\t\n/**\n * Set _lastChar, detects CTRL+SPACE.\n */\nCompletion.prototype.handleKeypress = function(event) {\n var curPos = this._areaNode.selectionStart; // cursor position\n var val = this._areaNode.value; // text in the area\n // key \n var key = event.keyCode || event.which;\n\t\n this._lastChar = String.fromCharCode(key);\n //DEBUG console.log( \"__KEYPRESS (\"+key+\") hasI=\"+this._hasInput+\" char=\"+this._lastChar );\n //DEBUG this._logStatus( \"KEYPRESS\" );\n \n // Detect Ctrl+Space\n if( this._triggerKeyMatcher(event) && this._state === \"VOID\" ) {\n\t//Find a proper Template\n\t// first from which we can extract a pattern\n\tif( this._template === undefined ) {\n\t //DEBUG console.log(\"__SPACE : find a Template\" );\n\t var idT, res;\n\t for( idT=0; idT < this._listTemp.length; idT++ ) {\n\t\tres = extractPattern( val, curPos, this._listTemp[idT] );\n\t\t//DEBUG console.log(\" t=\"+this._listTemp[idT].pat+\" res=\"+res);\n\t\t// res is not undefined => good template candidate\n\t\tif( res ) {\n\t\t this._template = this._listTemp[idT];\n\t\t this._state = \"PATTERN\";\n\t\t break;\n\t\t}\n\t }\n\t}\n\telse {\n\t //DEBUG console.log(\"__SPACE : already a template\" );\n\t this._state = \"PATTERN\";\n\t}\n }\n};\n/**\n * ESC -> abort; \n * Detect [ -> VOID switch to _state=PATTERN\n * PATTERN || SELECT : ENTER -> insertText\n * UP/DOWN -> previous/next\n * pattern.length > _minPatternLength -> display \n */\nCompletion.prototype.handleKeyup = function(event) {\n var curPos = this._areaNode.selectionStart; // cursor position\n var val = this._areaNode.value; // text in the area\n // key a\n var key = event.keyCode;\n \n //DEBUG console.log( \"__KEYUP (\"+key+\") hasI=\"+this._hasInput );\n \n // ESC\n if( key === 27 ) {\n\tthis._abortPattern( this._popNode );\n\t//DEBUG this._logStatus( \"\" );\n }\n // Check for every template\n if( this._hasInput && this._state === \"VOID\" ) {\n\t// check every template's pattern\n\tvar idT, template;\n\tfor( idT=0; idT < this._listTemp.length; idT++ ) {\n\t template = this._listTemp[idT];\n\t if( this._lastChar === template.pat[template.pos] ) {\n\t\ttemplate.pos += 1;\n\t\t//DEBUG console.log( \"__CHECK : pat=\"+template.pat+\" pos=\"+template.pos );\n\t\t// Pattern totaly matched ?\n\t\tif( template.pos === template.pat.length ) {\n\t\t //DEBUG console.log( \"__CHECK => found \"+template.pat );\n\t\t this._state = \"PATTERN\";\n\t\t this._template = template;\n\t\t \n\t\t break; // get out of loop\n\t\t}\n\t }\n\t else {\n\t\ttemplate.pos = 0;\n\t\t//DEBUG console.log( \"__CHECK : pat=\"+template.pat+\" pos=\"+template.pos );\n\t }\n\t}\n }\n // a pattern\n else if( this._state === \"PATTERN\" || this._state === \"SELECT\" ) {\n\t// Pattern below cursor : undefined if no pattern\n\tvar pattern = extractPattern( val, curPos, this._template );\n\tif( key === 13 ) { // ENTER\n\t //DEBUG console.log( \"KEY : Enter\" );\n \t // Choice made in the displayNode ?\n \t var selected = this._idxChoice > -1 && this._idxChoice !== this._maxMatch;\n \t //DEBUG console.log( \" > sel=\"+selected+\" len=\"+this._bestChoices.length );\n \t if( selected ) {\n \t\t//DEBUG console.log( \" > selected\" );\n\t\tvar temp = this._bestMatches[this._idxChoice];\n\t\tvar str = temp.str;\n\t\tif( this._template.field === \"body\" ) {\n\t\t str = $tw.wiki.getTiddlerText( temp.title );\n\t\t}\n \t\tinsertInto( this._areaNode,\n\t\t\t str,\n\t\t\t pattern.start, curPos, this._template );\n\t\t// save this new content\n\t\tthis._widget.saveChanges( this._areaNode.value );\n\t }\n\t // otherwise take the first choice (if exists)\n\t else if( this._bestMatches.length > 0 ) {\n \t\t//DEBUG console.log( \" > take first one\" );\n\t\tvar temp = this._bestMatches[0];\n\t\tvar str = temp.str;\n\t\tif( this._template.field === \"body\" ) {\n\t\t str = $tw.wiki.getTiddlerText( temp.title );\n\t\t}\n \t\tinsertInto( this._areaNode,\n\t\t\t str,\n\t\t\t pattern.start, curPos, this._template );\n\t\t// save this new content\n\t\tthis._widget.saveChanges( this._areaNode.value );\n\t }\n\t this._abortPattern( this._popNode );\n\t\t//DEBUG this._logStatus( \"\" );\n \t }\n\t else if( key === 38 && this._hasInput === false) { // up\n\t\tthis._state = \"SELECT\";\n \t\tevent.preventDefault();\n \t\tthis._previous( this._popNode );\n\t\t//DEBUG this._logStatus( pattern.text );\n \t\t//event.stopPropagation();\n \t }\n \t else if( key === 40 && this._hasInput === false) { // down\n\t\tthis._state = \"SELECT\";\n \t\tevent.preventDefault();\n \t\tthis._next( this._popNode );\n\t\t//DEBUG this._logStatus( pattern.text );\n \t\t//event.stopPropagation();\n \t }\n \t else if( pattern ) { // pattern changed by keypressed\n\t\tthis._idxChoice = -1;\n \t\t// log\n\t\t//DEBUG this._logStatus( pattern.text );\n \t\t// Popup with choices if pattern at least minPatLength letters long\n\t\tif( pattern.text.length > (this._minPatLength-1) ) {\n\t\t // compute listOptions from templateFilter\n\t\t var allOptions;\n\t\t if( this._template )\n\t\t\tallOptions = this._widget.wiki.filterTiddlers( this._template.filter );\n\t\t else\n\t\t\tallOptions = this._widget.wiki.filterTiddlers(\"[all[tiddlers]]\");\n\t\t this._findBestMatches( allOptions, pattern.text );\n \t\t this._popNode.innerHTML = \"\";\n \t\t //console.log( \"BC \"+ this._pattern + \" => \" + choice );\n \t\t if (this._bestMatches.length > 0) {\n\t\t\tfor( var i=0; i<this._bestMatches.length; i++) {\n \t\t\t this._popNode.appendChild( \n\t\t\t\titemHTML(this._bestMatches[i].str,\n\t\t\t\t\t pattern.text));\n \t\t\t}\n\t\t\tthis._display( this._areaNode, this._popNode );\t\t\t\n \t\t }\n\t\t else { // no matches\n\t\t\tthis._state = \"PATTERN\";\n\t\t\tthis._undisplay( this._popNode );\n\t\t }\n\t\t}\n \t }\n\t else { // no pattern detected\n\t\tthis._abortPattern( this._popNode );\n\t }\n\t}\n\t// to ensure that one MUST add an input (through onInput())\n\tthis._hasInput = false;\n};\n// **************************************************************************\n// ******************************************************** private functions\n// **************************************************************************\n/**\n * Create popup element.\n */\nvar createPopup = function( widget, node ) {\n // Insert a special \"div\" element for poping up\n // Its 'display' property in 'style' control its visibility\n var popupNode = widget.document.createElement(\"div\");\n popupNode.setAttribute( \"style\", \"display:none; position: absolute;\");\n popupNode.className = \"tc-block-dropdown ect-block-dropdown\";\n // Insert the element into the DOM\n node.parentNode.insertBefore(popupNode,node.nextSibling);\n //CHECK the domNodes is a attribute of Widget [widget.js]\n //CHECK this.domNodes.push(popupNode);\n \n return popupNode;\n};\n/**\n * Extract Pattern from text at a given position.\n *\n * Between previous template.pat (or '[[') and pos\n * \n * If no pattern -> undefined\n */\nvar extractPattern = function( text, pos, template ) {\n // Detect previous and next ]]=>STOP or [[=>START\n var sPat = template.pat ? template.pat : '[[';\n var pos_prevOpen = text.lastIndexOf( sPat, pos );\n var ePat = template.end ? template.end : ']]';\n var pos_prevClosed = text.lastIndexOf( ePat, pos );\n var pos_nextClosed = text.indexOf( ePat, pos );\n //DEBUG console.log(\"__CALC st=\"+sPat+\" -> en=\"+ePat );\n //DEBUG console.log(\"__CALC po=\"+pos_prevOpen+\" pc=\"+pos_prevClosed+\" nc=\"+pos_nextClosed+\" pos=\"+pos);\n pos_nextClosed = (pos_nextClosed >= 0) ? pos_nextClosed : pos;\n \n if( (pos_prevOpen >= 0) && // must be opened\n\t((pos_prevOpen > pos_prevClosed ) || // not closed yet\n\t (pos_prevClosed === pos))) { // closed at cursor\n\t//DEBUG console.log(\" pat=\"+text.slice( pos_prevOpen+sPat.length, pos) );\n\treturn { text: text.slice( pos_prevOpen+sPat.length, pos ),\n\t\t start: pos_prevOpen,\n\t\t end: pos_nextClosed\n\t };\n }\n};\n/**\n * Controls how list items are generated.\n * Function that takes two parameters :\n * - text : suggestion text\n * - input : the user’s input\n * Returns : list item. \n * Generates list items with the user’s input highlighted via <mark>.\n */\nvar itemHTML = function (text, input ) {\n // text si input === ''\n // otherwise, build RegExp that is global (g) and case insensitive (i)\n // to replace with <mark>$&</mark> where \"$&\" is the matched pattern\n var html = input === '' ? text : text.replace(RegExp(regExpEscape(input.trim()), \"gi\"), \"<mark>$&</mark>\");\n return create(\"li\", {\n\tinnerHTML: html,\n\t\"patt-selected\": \"false\"\n });\n};\n/**\n * Insert text into a textarea node, \n * enclosing in 'template.start..template.end'\n *\n * - posBefore : where the 'template.pat+pattern' starts\n * - posAfter : where the cursor currently is\n */\nvar insertInto = function(node, text, posBefore, posAfter, template ) {\n //DEBUG console.log( \"__INSERT : \"+template.pattern+\":\"+template.filter+\":\"+template.mask+\":\"+template.field+\":\"+template.start+\":\"+template.end );\n var val = node.value;\n var sStart = template.start !== undefined ? template.start : '[[';\n var sEnd = template.end !== undefined ? template.end : ']]';\n var newVal = val.slice(0, posBefore) + sStart + text + sEnd + val.slice(posAfter);\n //console.log(\"__INSERT s=\"+sStart+\" e=\"+sEnd);\n //console.log (\"__INSERT pb=\"+posBefore+\" pa=\"+posAfter+\" txt=\"+text);\n //console.log( \"NEW VAL = \"+newVal );\n // WARN : Directly modifie domNode.value.\n // Not sure it does not short-circuit other update methods of the domNode....\n // i.e. could use widget.updateEditor(newVal) from edit-comptext widget.\n // but how to be sure that cursor is well positionned ?\n node.value = newVal;\n node.setSelectionRange(posBefore+text.length+sStart.length+sEnd.length, posBefore+text.length+sStart.length+sEnd.length );\n};\n/**\n * Add an '\\' in front of -\\^$*+?.()|[]{}\n */\nvar regExpEscape = function (s) {\n return s.replace(/[-\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n};\n/**\n * Add an element in the DOM.\n */\nvar create = function(tag, o) {\n var element = document.createElement(tag);\n \n for (var i in o) {\n\tvar val = o[i];\n\t\n\tif (i === \"inside\") {\n\t $(val).appendChild(element);\n\t}\n\telse if (i === \"around\") {\n\t var ref = $(val);\n\t ref.parentNode.insertBefore(element, ref);\n\t element.appendChild(ref);\n\t}\n\telse if (i in element) {\n\t element[i] = val;\n\t}\n\telse {\n\t element.setAttribute(i, val);\n\t}\n }\n \n return element;\n};\n\n\nexports.Completion = Completion;\n\n})();\n\n \n", "type": "application/javascript", "title": "$:/plugins/snowgoon88/edit-comptext/completion.js", "module-type": "library" }, "$:/plugins/snowgoon88/edit-comptext/edit-comptext.css": { "text": "\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/* The \\rules pragma at the top of the tiddler restricts the WikiText \n * to just allow macros and transclusion. This avoids mistakenly \n * triggering unwanted WikiText processing.\n * \n * MUST not save as text/css for macro to be processed\n*/\n\n.ect-block-dropdown li {\n display: block;\n padding: 4px 14px 4px 14px;\n text-decoration: none;\n color: <<colour tiddler-link-foreground>>; /*#5778d8;*/ \n background: transparent;\n}\n.ect-block-dropdown li[patt-selected=\"true\"] {\n color: <<colour tiddler-link-background>>; /*#ffffff; */\n background-color: <<colour tiddler-link-foreground>>; /*#5778d8; */\n}\n.ect-block-dropdown li[patt-selected=\"true\"] mark {\n background: hsl(86, 100%, 21%);\n color: inherit;\n}\n\n", "type": "text/vnd.tiddlywiki", "title": "$:/plugins/snowgoon88/edit-comptext/edit-comptext.css", "tags": "[[$:/tags/Stylesheet]]" }, "$:/plugins/snowgoon88/edit-comptext/readme": { "title": "$:/plugins/snowgoon88/edit-comptext/readme", "text": "!! What ?\nThis plugin adds ''completion'' when editing the body of a tiddler.\n\n* Enter completion-mode by typing `[[` or `CTRL+SPACE`\n* A list of tiddlers with a title that matches the pattern between `[[` and cursor appears\n* `UP/DOWN` keys can select a tiddler, `ENTER` to validate\n* If there is only one match, `ENTER` selects it.\n* `NEW` : you can specify you own trigger pattern and the list of possible completions. See [[$:/plugins/snowgoon88/edit-comptext/usage]] for more details.\n\n\n!! To try it or get the latest news\nSee [[http://snowgoon88.github.io/TW5-extendedit]]\n\n!! Install \n\nTo add the plugin to your own TiddlyWiki5, just drag this link to the browser window:\n\n[[$:/plugins/snowgoon88/edit-comptext]]\n\nSometime, a small configuration step is then needed\n\nin `$:/ControlPanel -> Advanced -> Editor Type -> text/vnd.tiddlywiki` you must chose `comptext` instead of `text`.\n\nReload and « voilà »...\n\nThis plugin is quite mature now :o)\n\n!! Old version\n\n* A version compatible with 5.0.8 to 5.1.11 : [[http://snowgoon88.github.io/TW5-extendedit/index_5.1.11.html]]\n\n!! Source code\nOn github [[https://github.com/snowgoon88/TW5-extendedit]]\n\nGet in touch : snowgoon88(AT)gmail(DOT)com\n" }, "$:/plugins/snowgoon88/edit-comptext/usage": { "title": "$:/plugins/snowgoon88/edit-comptext/usage", "text": "''Important'' : be sure that in `$:/ControlPanel -> Advanced -> Editor Type -> text/vnd.tiddlywiki` you have chosen `comptext` instead of `text`.\n\nConfiguration of the edit-comptext plugin can be done through the tiddler [[$:/plugins/snowgoon88/edit-comptext/config]]. Use a JSON tiddler (do not forget to set the type to `application/json`. See some examples at [[$:/plugins/snowgoon88/edit-comptext/examples]]\n\nIn the `configuration` object you can set :\n\n* `caseSensitive`: `true`/`false` (is search case sensitive ?)\n* `maxMatch` : an `integer` (max number of match displayed)\n* `minPatLength` : an `integer` (minimal length of a pattern to trigger completion search)\n* `triggerKeyCombination ` : a `string` representing the key combination that triggers the autocompletion popup. To use modifier keys in your combination, use following conversions : `ctrl` -> `^`, `alt` -> `!`, `shift` -> `+`. Note: ` ` (literally a whitespace) represents the `space` key.\n\nIn the `template` array you can specify the various completion templates that will be used. Every template can have the following members.\n\n* `pattern` : `string` (pattern that triggers a completion, default \"[[\" )\n* `title` or `body`: `string` (the filter operators that gives the list of valid completions, default \"[all[tiddlers]!is[system]]\"). If you specify `body`, then the body of the tiddler will be inserted on selection.\n* `start` : `string` (when completion is chosen, start is put before the completion, default \"[[\")\n* `end` : `string` (when completion is chosen, end is put after the completion, default \"]]\")\n\n!! Current body of Config Tiddler\n\n{{$:/plugins/snowgoon88/edit-comptext/config}}\n\n" } } }
{"tiddlers":{"$:/plugins/TheDiveO/TwFusejs/libs/fuse.js":{"text":"/* automatically included from npm package `fuse.js` */\r\n/*!\n * Fuse.js v3.2.1 - Lightweight fuzzy-search (http://fusejs.io)\n * \n * Copyright (c) 2012-2017 Kirollos Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n */\n!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(\"Fuse\",[],t):\"object\"==typeof exports?exports.Fuse=t():e.Fuse=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,\"a\",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"\",t(t.s=8)}([function(e,t,r){\"use strict\";e.exports=function(e){return Array.isArray?Array.isArray(e):\"[object Array]\"===Object.prototype.toString.call(e)}},function(e,t,r){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}var o=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),i=r(5),a=r(7),s=r(4),c=function(){function e(t,r){var o=r.location,i=void 0===o?0:o,a=r.distance,c=void 0===a?100:a,h=r.threshold,l=void 0===h?.6:h,u=r.maxPatternLength,f=void 0===u?32:u,d=r.isCaseSensitive,v=void 0!==d&&d,p=r.tokenSeparator,g=void 0===p?/ +/g:p,y=r.findAllMatches,m=void 0!==y&&y,k=r.minMatchCharLength,x=void 0===k?1:k;n(this,e),this.options={location:i,distance:c,threshold:l,maxPatternLength:f,isCaseSensitive:v,tokenSeparator:g,findAllMatches:m,minMatchCharLength:x},this.pattern=this.options.isCaseSensitive?t:t.toLowerCase(),this.pattern.length<=f&&(this.patternAlphabet=s(this.pattern))}return o(e,[{key:\"search\",value:function(e){if(this.options.isCaseSensitive||(e=e.toLowerCase()),this.pattern===e)return{isMatch:!0,score:0,matchedIndices:[[0,e.length-1]]};var t=this.options,r=t.maxPatternLength,n=t.tokenSeparator;if(this.pattern.length>r)return i(e,this.pattern,n);var o=this.options,s=o.location,c=o.distance,h=o.threshold,l=o.findAllMatches,u=o.minMatchCharLength;return a(e,this.pattern,this.patternAlphabet,{location:s,distance:c,threshold:h,findAllMatches:l,minMatchCharLength:u})}}]),e}();e.exports=c},function(e,t,r){\"use strict\";var n=r(0),o=function e(t,r,o){if(r){var i=r.indexOf(\".\"),a=r,s=null;-1!==i&&(a=r.slice(0,i),s=r.slice(i+1));var c=t[a];if(null!==c&&void 0!==c)if(s||\"string\"!=typeof c&&\"number\"!=typeof c)if(n(c))for(var h=0,l=c.length;h<l;h+=1)e(c[h],s,o);else s&&e(c,s,o);else o.push(c.toString())}else o.push(t);return o};e.exports=function(e,t){return o(e,t,[])}},function(e,t,r){\"use strict\";e.exports=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=[],n=-1,o=-1,i=0,a=e.length;i<a;i+=1){var s=e[i];s&&-1===n?n=i:s||-1===n||(o=i-1,o-n+1>=t&&r.push([n,o]),n=-1)}return e[i-1]&&i-n>=t&&r.push([n,i-1]),r}},function(e,t,r){\"use strict\";e.exports=function(e){for(var t={},r=e.length,n=0;n<r;n+=1)t[e.charAt(n)]=0;for(var o=0;o<r;o+=1)t[e.charAt(o)]|=1<<r-o-1;return t}},function(e,t,r){\"use strict\";e.exports=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:/ +/g,n=new RegExp(t.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\"\\\\$&\").replace(r,\"|\")),o=e.match(n),i=!!o,a=[];if(i)for(var s=0,c=o.length;s<c;s+=1){var h=o[s];a.push([e.indexOf(h),h.length-1])}return{score:i?.5:1,isMatch:i,matchedIndices:a}}},function(e,t,r){\"use strict\";e.exports=function(e,t){var r=t.errors,n=void 0===r?0:r,o=t.currentLocation,i=void 0===o?0:o,a=t.expectedLocation,s=void 0===a?0:a,c=t.distance,h=void 0===c?100:c,l=n/e.length,u=Math.abs(s-i);return h?l+u/h:u?1:l}},function(e,t,r){\"use strict\";var n=r(6),o=r(3);e.exports=function(e,t,r,i){for(var a=i.location,s=void 0===a?0:a,c=i.distance,h=void 0===c?100:c,l=i.threshold,u=void 0===l?.6:l,f=i.findAllMatches,d=void 0!==f&&f,v=i.minMatchCharLength,p=void 0===v?1:v,g=s,y=e.length,m=u,k=e.indexOf(t,g),x=t.length,S=[],M=0;M<y;M+=1)S[M]=0;if(-1!==k){var b=n(t,{errors:0,currentLocation:k,expectedLocation:g,distance:h});if(m=Math.min(b,m),-1!==(k=e.lastIndexOf(t,g+x))){var _=n(t,{errors:0,currentLocation:k,expectedLocation:g,distance:h});m=Math.min(_,m)}}k=-1;for(var L=[],w=1,A=x+y,C=1<<x-1,I=0;I<x;I+=1){for(var O=0,F=A;O<F;){n(t,{errors:I,currentLocation:g+F,expectedLocation:g,distance:h})<=m?O=F:A=F,F=Math.floor((A-O)/2+O)}A=F;var P=Math.max(1,g-F+1),j=d?y:Math.min(g+F,y)+x,z=Array(j+2);z[j+1]=(1<<I)-1;for(var T=j;T>=P;T-=1){var E=T-1,K=r[e.charAt(E)];if(K&&(S[E]=1),z[T]=(z[T+1]<<1|1)&K,0!==I&&(z[T]|=(L[T+1]|L[T])<<1|1|L[T+1]),z[T]&C&&(w=n(t,{errors:I,currentLocation:E,expectedLocation:g,distance:h}))<=m){if(m=w,(k=E)<=g)break;P=Math.max(1,2*g-k)}}if(n(t,{errors:I+1,currentLocation:g,expectedLocation:g,distance:h})>m)break;L=z}return{isMatch:k>=0,score:0===w?.001:w,matchedIndices:o(S,p)}}},function(e,t,r){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}var o=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),i=r(1),a=r(2),s=r(0),c=function(){function e(t,r){var o=r.location,i=void 0===o?0:o,s=r.distance,c=void 0===s?100:s,h=r.threshold,l=void 0===h?.6:h,u=r.maxPatternLength,f=void 0===u?32:u,d=r.caseSensitive,v=void 0!==d&&d,p=r.tokenSeparator,g=void 0===p?/ +/g:p,y=r.findAllMatches,m=void 0!==y&&y,k=r.minMatchCharLength,x=void 0===k?1:k,S=r.id,M=void 0===S?null:S,b=r.keys,_=void 0===b?[]:b,L=r.shouldSort,w=void 0===L||L,A=r.getFn,C=void 0===A?a:A,I=r.sortFn,O=void 0===I?function(e,t){return e.score-t.score}:I,F=r.tokenize,P=void 0!==F&&F,j=r.matchAllTokens,z=void 0!==j&&j,T=r.includeMatches,E=void 0!==T&&T,K=r.includeScore,$=void 0!==K&&K,J=r.verbose,N=void 0!==J&&J;n(this,e),this.options={location:i,distance:c,threshold:l,maxPatternLength:f,isCaseSensitive:v,tokenSeparator:g,findAllMatches:m,minMatchCharLength:x,id:M,keys:_,includeMatches:E,includeScore:$,shouldSort:w,getFn:C,sortFn:O,verbose:N,tokenize:P,matchAllTokens:z},this.setCollection(t)}return o(e,[{key:\"setCollection\",value:function(e){return this.list=e,e}},{key:\"search\",value:function(e){this._log('---------\\nSearch pattern: \"'+e+'\"');var t=this._prepareSearchers(e),r=t.tokenSearchers,n=t.fullSearcher,o=this._search(r,n),i=o.weights,a=o.results;return this._computeScore(i,a),this.options.shouldSort&&this._sort(a),this._format(a)}},{key:\"_prepareSearchers\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",t=[];if(this.options.tokenize)for(var r=e.split(this.options.tokenSeparator),n=0,o=r.length;n<o;n+=1)t.push(new i(r[n],this.options));return{tokenSearchers:t,fullSearcher:new i(e,this.options)}}},{key:\"_search\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments[1],r=this.list,n={},o=[];if(\"string\"==typeof r[0]){for(var i=0,a=r.length;i<a;i+=1)this._analyze({key:\"\",value:r[i],record:i,index:i},{resultMap:n,results:o,tokenSearchers:e,fullSearcher:t});return{weights:null,results:o}}for(var s={},c=0,h=r.length;c<h;c+=1)for(var l=r[c],u=0,f=this.options.keys.length;u<f;u+=1){var d=this.options.keys[u];if(\"string\"!=typeof d){if(s[d.name]={weight:1-d.weight||1},d.weight<=0||d.weight>1)throw new Error(\"Key weight has to be > 0 and <= 1\");d=d.name}else s[d]={weight:1};this._analyze({key:d,value:this.options.getFn(l,d),record:l,index:c},{resultMap:n,results:o,tokenSearchers:e,fullSearcher:t})}return{weights:s,results:o}}},{key:\"_analyze\",value:function(e,t){var r=e.key,n=e.arrayIndex,o=void 0===n?-1:n,i=e.value,a=e.record,c=e.index,h=t.tokenSearchers,l=void 0===h?[]:h,u=t.fullSearcher,f=void 0===u?[]:u,d=t.resultMap,v=void 0===d?{}:d,p=t.results,g=void 0===p?[]:p;if(void 0!==i&&null!==i){var y=!1,m=-1,k=0;if(\"string\"==typeof i){this._log(\"\\nKey: \"+(\"\"===r?\"-\":r));var x=f.search(i);if(this._log('Full text: \"'+i+'\", score: '+x.score),this.options.tokenize){for(var S=i.split(this.options.tokenSeparator),M=[],b=0;b<l.length;b+=1){var _=l[b];this._log('\\nPattern: \"'+_.pattern+'\"');for(var L=!1,w=0;w<S.length;w+=1){var A=S[w],C=_.search(A),I={};C.isMatch?(I[A]=C.score,y=!0,L=!0,M.push(C.score)):(I[A]=1,this.options.matchAllTokens||M.push(1)),this._log('Token: \"'+A+'\", score: '+I[A])}L&&(k+=1)}m=M[0];for(var O=M.length,F=1;F<O;F+=1)m+=M[F];m/=O,this._log(\"Token score average:\",m)}var P=x.score;m>-1&&(P=(P+m)/2),this._log(\"Score average:\",P);var j=!this.options.tokenize||!this.options.matchAllTokens||k>=l.length;if(this._log(\"\\nCheck Matches: \"+j),(y||x.isMatch)&&j){var z=v[c];z?z.output.push({key:r,arrayIndex:o,value:i,score:P,matchedIndices:x.matchedIndices}):(v[c]={item:a,output:[{key:r,arrayIndex:o,value:i,score:P,matchedIndices:x.matchedIndices}]},g.push(v[c]))}}else if(s(i))for(var T=0,E=i.length;T<E;T+=1)this._analyze({key:r,arrayIndex:T,value:i[T],record:a,index:c},{resultMap:v,results:g,tokenSearchers:l,fullSearcher:f})}}},{key:\"_computeScore\",value:function(e,t){this._log(\"\\n\\nComputing score:\\n\");for(var r=0,n=t.length;r<n;r+=1){for(var o=t[r].output,i=o.length,a=1,s=1,c=0;c<i;c+=1){var h=e?e[o[c].key].weight:1,l=1===h?o[c].score:o[c].score||.001,u=l*h;1!==h?s=Math.min(s,u):(o[c].nScore=u,a*=u)}t[r].score=1===s?a:s,this._log(t[r])}}},{key:\"_sort\",value:function(e){this._log(\"\\n\\nSorting....\"),e.sort(this.options.sortFn)}},{key:\"_format\",value:function(e){var t=[];this.options.verbose&&this._log(\"\\n\\nOutput:\\n\\n\",JSON.stringify(e));var r=[];this.options.includeMatches&&r.push(function(e,t){var r=e.output;t.matches=[];for(var n=0,o=r.length;n<o;n+=1){var i=r[n];if(0!==i.matchedIndices.length){var a={indices:i.matchedIndices,value:i.value};i.key&&(a.key=i.key),i.hasOwnProperty(\"arrayIndex\")&&i.arrayIndex>-1&&(a.arrayIndex=i.arrayIndex),t.matches.push(a)}}}),this.options.includeScore&&r.push(function(e,t){t.score=e.score});for(var n=0,o=e.length;n<o;n+=1){var i=e[n];if(this.options.id&&(i.item=this.options.getFn(i.item,this.options.id)[0]),r.length){for(var a={item:i.item},s=0,c=r.length;s<c;s+=1)r[s](i,a);t.push(a)}else t.push(i.item)}return t}},{key:\"_log\",value:function(){if(this.options.verbose){var e;(e=console).log.apply(e,arguments)}}}]),e}();e.exports=c}])});","title":"$:/plugins/TheDiveO/TwFusejs/libs/fuse.js","type":"application/javascript","module-type":"library","created":"20180802114846490","creator":"TheDiveO","modified":"20180802114846490"},"$:/plugins/TheDiveO/TwFusejs/filters/fuse.js":{"title":"$:/plugins/TheDiveO/TwFusejs/filters/fuse.js","text":"/*\\\ncreated: 20180809165919537\ntitle: $:/plugins/TheDiveO/TwFusejs/filters/fuse.js\ntype: application/javascript\nmodified: 20180809170012994\ntags:\nmodule-type: filteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Plugin-relative path to default Fuse.js options JSON data tiddler.\nvar FUSE_OPTS_DEFAULT = \"/options/default\";\n\n// Locate the plugin title, so we can later easily access our plugin tiddlers\n// without having to repeat the plugin title root/stem over and over again.\n// Thanks to the CommonJS definitions, we have access to this tiddlers title\n// as the module id(entifier).\nvar PLUGIN = module.id.split(\"/\").slice(0, 4).join(\"/\");\n\nvar Fuse = require(\"../libs/fuse.js\");\n\n/* The \"fuse\" filter operator, powered by Fuse.js.\n *\n * Usage examples:\n *\n * [fuse[foobar]] searches all tiddlers (including shadows, et cetera!) for\n * \"foobar\" or something similar, returning a list of matching tiddler\n * titles.\n * [!is[current]!is[system]fuse[foobar]] searches only normal tiddlers.\n * [fuse:myfuseopts[foobar]] uses the fuse search options stored in the\n * JSON data tiddler \"myfuseopts\" and searches for \"foobar\" or similar.\n *\n * The parameters to this operator function are as follows:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step. This is the set of tiddlers our fuse search operator will\n * have to search through.\n * operator: the arguments to the fuse filter operator...\n * .operator: name of the filter operator: always \"fuse\", so AWFUL.\n * .operand: the operand as a string: what to search for; text references\n * and variable names have already been resolved at this point into the\n * string to be searched for.\n * .prefix: an optional \"!\" if the filter is to be negated; when the prefix\n * is empty, then options.matchAllTokens=True is assumed; if the prefix\n * is \"!\", then options.matchAllTokens=False.\n * .suffix: an optional string containing an additional filter argument:\n * the name of a (TiddlyWiki) variable either directly specifying the\n * Fuse.js options in form of a JSON string, or instead referencing a\n * JSON data tiddler by title which then contains the Fuse.js options.\n * If left empty/unspecified, then the default TwFusejs plugin options\n * will be taken instead, stored in ./options/default inside this plugin.\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's allowed to return either an array of titles or a tiddler iterator,\n * depending on your needs: however, for the fuse operator, we always return\n * an array of title (strings).\n */\nexports.fuse = function(source, operator, options) {\n\t//console.log(\"searching for:\", \"'\"+operator.operand+\"'\");\n\n\t// As we want Fuse.js to search an array of tiddlers and not just\n\t// tiddler titles, we ensure to have all input tiddler objects ready\n\t// for Fuse.js to work on.\n\tvar tiddlers = [];\n\tsource(function(tiddler, title) {\n tiddlers.push(tiddler);\n\t});\n\n\t// Prepare the Fuse.js search options: there are basically three different\n\t// sources:\n\t// 1. no suffix given: take the default options.\n\t// 2. suffix given, contains JSON data resulting in an option object.\n\t// 3. suffix given, not JSON, but instead references a JSON data tiddler.\n\tvar fuse_options;\n\tif (!operator.suffix) {\n\t\t// case 1: use the default, Luke!\n\t\t// console.log(\"using default TwFusejs options\");\n\t\tvar optionsTitle = PLUGIN + FUSE_OPTS_DEFAULT;\n\t\ttry {\n\t\t\tfuse_options = JSON.parse(options.wiki.getTiddler(optionsTitle).fields.text);\n\t\t} catch (e) {\n\t\t\t// Return an error message instead of a list of matching tiddlers\n\t\t\t// in case we cannot properly parse the options JSON data tiddler.\n\t\t\tvar msg = \"invalid fuse options JSON tiddler: \\\"\" + optionsTitle + \"\\\"\";\n\t\t\tconsole.log(msg);\n\t\t\treturn [msg];\n\t\t}\n\t} else if (options.widget) {\n\t\t// try case 2: variable contents are JSON.\n\t\t// console.log(\"using variable:\", operator.suffix);\n\t\ttry {\n\t\t\tfuse_options = JSON.parse(options.widget.getVariable(operator.suffix));\n\t\t\t// console.log(\"variable JSON contents:\", options.widget.getVariable(operator.suffix));\n\t\t} catch (e) {\n\t\t\tfuse_options = null;\n\t\t}\n\t\tif (!fuse_options || typeof fuse_options === \"string\") {\n\t\t\t// Erm, case 2 failed, so this should better be case 3: a title of a\n\t\t\t// JSON data tiddler.\n\t\t\tvar optionsTitle = fuse_options ?\n\t\t\t\t\t\tfuse_options : options.widget.getVariable(operator.suffix);\n\t\t\t// console.log(\"using JSON tiddler:\", optionsTitle);\n\t\t\ttry {\n\t\t\t\tfuse_options = JSON.parse(\n\t\t\t\t\toptions.wiki.getTiddler(optionsTitle).fields.text);\n\t\t\t} catch (e) {\n\t\t\t\t\tvar msg = \"malformed JSON data in tiddler \\\"\" + optionsTitle + \"\\\"\";\n\t\t\t\t\tconsole.log(msg);\n\t\t\t\t\treturn [msg];\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// erm: suffix = variable name given, but there is no widget context and\n\t\t// thus no variables...\n\t\tvar msg = \"missing widget context to look up search options variable\";\n\t\tconsole.log(msg);\n\t\treturn [msg];\n\t}\n\n\t// Handle optional \"!\" prefix: when no prefix is given, or the prefix\n\t// is something other than \"!\", then we AND all search tokens; otherwise,\n\t// we OR them.\n\tfuse_options.matchAllTokens = operator.prefix !== \"!\";\n\t// console.log(\"Find all matches:\", fuse_options.matchAllTokens);\n\n\t// Handle options element \"getFn\" especially: Fuse.js expect it to\n\t// contain a function object. If it contains a string instead, then\n\t// we interpret it to be a module export, so we try to locate the\n\t// exported function.\n\tif (fuse_options.getFn && typeof fuse_options.getFn === \"string\") {\n\t\ttry {\n\t\t\t// First try to resolve the given module tiddler title; if that fails,\n\t\t\t// then try again with \".js\" appended to the title.\n\t\t\tvar module;\n\t\t\ttry {\n\t\t\t\tmodule = require(fuse_options.getFn);\n\t\t\t} catch (e) {\n\t\t\t\tif ($tw.utils.strEndsWith(fuse_options.getFn, \".js\")) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t\tmodule = require(fuse_options.getFn + \".js\");\n\t\t\t}\n\t\t\tfuse_options.getFn = module.getFn;\n\t\t} catch (e) {\n\t\t\tconsole.warn(\"cannot resolve getFn:\", fuse_options.getFn);\n\t\t\tdelete fuse_options.getFn;\n\t\t}\n\t} else {\n\t\tdelete fuse_options.getFn;\n\t}\n\n\t// Make sure that there is an \"id\" option present; default to a\n\t// tiddler's title.\n\tfuse_options.id = fuse_options.id || \"fields.title\";\n\n\t// Ready to search!\n\tvar search_terms = operator.operand.trim();\n\t// console.log(\"Fuse.js search for:\", \"'\"+search+\"'\");\n\t// console.log(\"Fuse.js options:\", fuse_options);\n\tvar fuse = new Fuse(tiddlers, fuse_options);\n\tvar hits = search_terms ? fuse.search(search_terms) : [];\n\n\t// In case the fuse options cause hit objects instead of simple hit\n\t// strings to be returned, then only return the (hit) item; this should\n\t// be a tiddler title, if the \"id\" option was set to \"fields.title\".\n\tvar result = [];\n\t$tw.utils.each(hits, function(hit) {\n\t\tif (typeof(hit) === \"string\") {\n\t\t\tresult.push(hit);\n\t\t} else {\n\t\t\tresult.push(hit.item);\n\t\t}\n\t})\n\treturn result;\n};\n\n})();\n","created":"20180809165919537","type":"application/javascript","modified":"20180809170012994","tags":"","module-type":"filteroperator"},"$:/plugins/TheDiveO/TwFusejs/filters/rendertext.js":{"title":"$:/plugins/TheDiveO/TwFusejs/filters/rendertext.js","text":"/*\\\ncreated: 20180811135806330\ntitle: $:/plugins/TheDiveO/TwFusejs/filters/rendertext.js\ntype: application/javascript\nmodified: 20180811140005330\ntags:\nmodule-type: filteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Given a set of titles, renders each title's text content (or another tiddler\n * field) into text.\n *\n * Usage examples:\n *\n * [rendertext[]] renders each title's text field into plain text.\n *\n * [rendertext:F[]] renders each title's field \"F\" into plain text.\n *\n * The parameters to the operator function are as follows:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step.\n * operator: the arguments to this filter operator...\n * .operator: name of the filter operator.\n * .operand: the operand as a string; text references and variable names\n * have already been resolved at this point. This filter ignores the\n * operand.\n * .prefix: an optional \"!\" if the filter is to be negated; this gets\n * ignored by this filter, though.\n * .suffix: an optional string containing an additional filter argument:\n * the name of the tiddler field to render as text.\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's allowed to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.rendertext = function(source, operator, options) {\n\tvar field = operator.suffix || \"text\";\n\tvar results = [];\n\tsource(function(tiddler, title) {\n\t\tconsole.log(\"render tiddler:\", tiddler);\n\t\tvar text = options.wiki.renderText(\n\t\t\t\"text/plain\",\n\t\t\ttiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t tiddler.fields[field],\n\t\t\t{\n\t\t\t\tparseAsInline: false,\n\t\t\t\tparentWidget: options.widget\n\t\t\t});\n\t\tresults.push(text);\n\t});\n\treturn results;\n};\n\n})();\n","created":"20180811135806330","type":"application/javascript","modified":"20180811140005330","tags":"","module-type":"filteroperator"},"$:/plugins/TheDiveO/TwFusejs/filters/stringlimit.js":{"title":"$:/plugins/TheDiveO/TwFusejs/filters/stringlimit.js","text":"/*\\\ncreated: 20180811135806330\ntitle: $:/plugins/TheDiveO/TwFusejs/filters/stringlimit.js\ntype: application/javascript\nmodified: 20180811140005330\ntags:\nmodule-type: filteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Given a set of titles, this filter limits each title to a certain maximum length..\n *\n * Usage examples:\n *\n * [stringlimit[]] limits title to the default length of 100 characters; defaults to\n * adding a trailing ellipsis \"...\" when truncating a title.\n * [stringlimit[20]] truncates titles to max 20 characters.\n * [stringlimit:***[]] sets the ellipsis to \"***\" when truncating titles.\n *\n * The parameters to the operator function are as follows:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step.\n * operator: the arguments to this filter operator...\n * .operator: name of the filter operator.\n * .operand: the operand as a string; text references and variable names\n * have already been resolved at this point.\n * .prefix: an optional \"!\" if the filter is to be negated.\n * .suffix: an optional string containing an additional filter argument.\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's allowed to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.stringlimit = function(source, operator, options) {\n\tvar ellipsis = operator.suffix || \"...\";\n\tvar maxTitleLen = parseInt(operator.operand) || 100;\n\tvar results = [];\n\tsource(function(tiddler, title) {\n\t\tif (title.length > maxTitleLen) {\n\t\t\ttitle = title.substr(0, maxTitleLen) + ellipsis;\n\t\t}\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n","created":"20180811135806330","type":"application/javascript","modified":"20180811140005330","tags":"","module-type":"filteroperator"},"$:/plugins/TheDiveO/TwFusejs/getfns/multipath.js":{"title":"$:/plugins/TheDiveO/TwFusejs/getfns/multipath.js","text":"/*\\\ncreated: 20180815181502529\ntitle: $:/plugins/TheDiveO/TwFusejs/getfns/multipath.js\ntype: application/javascript\nmodified: 20180815181519493\ntags:\nmodule-type: library\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar deep = require(\"../libs/deep.js\").deep;\n\n/* Export a Fuse.js getFn function that interprets the key/path not as a single\n * attribute name, but instead as a list of names/keys/paths, separated by \",\".\n * The resulting values are then banged together into one single string, with\n * the values separated by plain spaces \" \".\n */\nexports.getFn = function (item, key) {\n var keys = key.split(\",\");\n var results = [];\n $tw.utils.each(keys, function(key) {\n results.push(deep(item, key.trim(), []));\n });\n // Fuse.js expects getFn()s to return lists, erm, arrays, instead of\n // scalars.\n return [results.join(\" \")];\n};\n\n})();\n","created":"20180815181502529","type":"application/javascript","modified":"20180815181519493","tags":"","module-type":"library"},"$:/plugins/TheDiveO/TwFusejs/getfns/wildcard.js":{"title":"$:/plugins/TheDiveO/TwFusejs/getfns/wildcard.js","text":"/*\\\ncreated: 20180813165310714\ntitle: $:/plugins/TheDiveO/TwFusejs/getfns/wildcard.js\ntype: application/javascript\nmodified: 20180813165403648\ntags:\nmodule-type: library\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar deepValues = function(object, path, result) {\n if (!path) {\n // Reached the leaf, at least according to the path specified.\n result.push(object);\n } else {\n var field;\n var path;\n var dot = path.indexOf(\".\");\n if (dot >= 0) {\n field = path.slice(0, dot);\n path = path.slice(dot + 1);\n } else {\n field = path;\n path = null;\n }\n if (field === \"*\" && !path) {\n // Wildcard on a path leaf!\n $tw.utils.each(object, function(value, field) {\n console.log(\"wildcarded field:\", field);\n \t\tresult.push(value.toString());\n \t});\n } else {\n var value = object[field];\n if (value !== undefined && value !== null) {\n if (!path && (typeof value === \"string\" || typeof value === \"number\")) {\n // We've reached the leaf, and it is a scalar value (so no objects)...\n result.push(value.toString());\n } else if ($tw.utils.isArray(value)) {\n // We've got an array, so we continue to resolve, but this time the\n // path remaining on all array elements...\n for (var idx = 0, len = value.length; idx < len; idx += 1) {\n deepValues(value[idx], path, result);\n }\n } else if (path) {\n // This is an object, so try to resolve further if there is a path\n // still left...\n deepValues(value, path, result);\n }\n }\n }\n }\n return result;\n};\n\n/* Export a Fuse.js getFn function that allows to use the \"*\" wildcard referring\n * to all object attributes (on this level). Otherwise, it works like the\n * Fuse.js-builtin deepValue getFn.\n */\nexports.getFn = function (item, key) {\n var result = deepValues(item, key, []);\n\treturn result;\n};\n\n})();\n","created":"20180813165310714","type":"application/javascript","modified":"20180813165403648","tags":"","module-type":"library"},"$:/plugins/TheDiveO/TwFusejs/history":{"title":"$:/plugins/TheDiveO/TwFusejs/history","created":"20180809162835518","modified":"20180818165138360","tags":"","type":"text/vnd.tiddlywiki","text":"* ''0.9.1''\n** require better fuzzy matching by lowering(!) the threshold option.\n** internal code cleanup.\n\n* ''0.9.0'' -- first beta release for more general testing."},"$:/plugins/TheDiveO/TwFusejs/icon":{"title":"$:/plugins/TheDiveO/TwFusejs/icon","comment":"\"artwork\" by TheDiveO","created":"20180810165337479","modified":"20180816174307842","tags":"","type":"text/vnd.tiddlywiki","text":"<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path\n style=\"display:inline;overflow:visible;visibility:visible;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85333335;marker:none;enable-background:accumulate\"\n d=\"M 14.599609 0.23242188 L 2.0996094 7.4667969 L 2.0996094 21.900391 L 14.599609 29.132812 L 27.132812 21.900391 L 27.132812 7.4667969 L 14.599609 0.23242188 z M 11.248047 6.1601562 C 14.454461 6.1601563 17.080078 8.7877256 17.080078 11.994141 C 17.080078 13.245949 16.676851 14.406277 15.998047 15.359375 C 16.186364 15.235686 16.435703 15.24625 16.601562 15.412109 L 22.568359 21.378906 C 22.758375 21.568922 22.758375 21.874437 22.568359 22.064453 L 21.494141 23.138672 C 21.304125 23.328688 20.99861 23.328688 20.808594 23.138672 L 14.841797 17.171875 C 14.700841 17.030919 14.664252 16.826242 14.732422 16.652344 C 13.757464 17.384677 12.553369 17.826172 11.248047 17.826172 C 8.041632 17.826172 5.4160154 15.200555 5.4160156 11.994141 C 5.4160156 8.7877256 8.0416322 6.1601562 11.248047 6.1601562 z M 11.248047 8.6601562 C 9.3927324 8.6601562 7.9160156 10.138826 7.9160156 11.994141 C 7.9160156 13.849455 9.3927324 15.326172 11.248047 15.326172 C 13.103361 15.326172 14.580078 13.849455 14.580078 11.994141 C 14.580078 10.138826 13.103361 8.6601562 11.248047 8.6601562 z \"\n transform=\"scale(4.3636363)\"\n id=\"path887\" />\n </g>\n</svg>"},"$:/plugins/TheDiveO/TwFusejs/libs/deep.js":{"title":"$:/plugins/TheDiveO/TwFusejs/libs/deep.js","text":"/*\\\ncreated: 20180815161626210\ntitle: $:/plugins/TheDiveO/TwFusejs/libs/deep.js\ntype: application/javascript\nmodified: 20180815161710665\ntags:\nmodule-type: library\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Utility to fetch the value of a named (multi-level) object element/attribute.\n *\n * The parameters are as follows:\n *\n * object: the object from which the values should be taken.\n * path: the element/attribute path, in the form of \"a1\", \"a1.a2\", et cetera.\n * result: result array to push requested values onto.\n * leafhook: optional hook function called on leaves.\n */\nfunction deepValues(object, path, result, leafhook) {\n if (!path) {\n // Reached the leaf, at least according to the path specified. So we\n // can add the \"object\" as the final value.\n result.push(object);\n } else {\n // There is still some path left, bite off the first element from the\n // remaining path, and work on that...\n var field;\n var path;\n var dot = path.indexOf(\".\");\n if (dot >= 0) {\n field = path.slice(0, dot);\n path = path.slice(dot + 1);\n } else {\n field = path;\n path = null;\n }\n // If there is no path left, give an optional leafhook a chance\n // to get into business; if a leafhook returns true, then we don't\n // need to care anymore about this field and its value.\n if (!path && leafhook) {\n if (leafhook(object, field, result)) {\n return;\n }\n }\n var value = object[field];\n if (value !== undefined && value !== null) {\n if (!path && (typeof value === \"string\" || typeof value === \"number\")) {\n // We've reached the leaf, and it is a scalar value (so no objects)...\n result.push(value.toString());\n } else if ($tw.utils.isArray(value)) {\n // We've got an array, so we continue to resolve, but this time the\n // path remaining on all array elements...\n for (var idx = 0, len = value.length; idx < len; idx += 1) {\n deepValues(value[idx], path, result);\n }\n } else if (path) {\n // This is an object, so try to resolve further if there is a path\n // still left...\n deepValues(value, path, result);\n } else {\n $tw.utils.each(value, function(value) {\n results.push(value.toString());\n })\n }\n }\n }\n return result;\n};\n\nexports.deep = deepValues;\n\n})();\n","created":"20180815161626210","type":"application/javascript","modified":"20180815161710665","tags":"","module-type":"library"},"$:/plugins/TheDiveO/TwFusejs/license":{"title":"$:/plugins/TheDiveO/TwFusejs/license","created":"20180809162835520","modified":"20180816174341113","tags":"","type":"text/vnd.tiddlywiki","text":"* The included Fuse.js is licensed as [[Apache 2.0|https://github.com/krisk/Fuse/blob/master/LICENSE]].\n* My contributions (by ~TheDiveO) that aren't part of a standard ~TiddlyWiki 5 distribution itself (as available from the [[TiddlyWiki|http://tiddlywiki.com]] web site) are licensed as:\n** documentation is covered by [[CC BY 3.0|http://creativecommons.org/licenses/by/3.0/]].\n** code (such as ~TiddlyWiki 5 macros, ~JavaScript, et cetera) and CSS definitions are covered by the [[MIT License|http://opensource.org/licenses/mit-license.html]].\n"},"$:/plugins/TheDiveO/TwFusejs/options/default":{"title":"$:/plugins/TheDiveO/TwFusejs/options/default","created":"20180809170111776","modified":"20180818164951057","tags":"","type":"application/json","text":"{\n\t\"tokenize\": true,\n \"shouldSort\": true,\n\t\"minMatchCharLength\": 3,\n \"threshold\": 0.35,\n \"distance\": 1000,\n\t\"keys\": [ \"fields.text,fields.title,fields.tags\" ],\n \"getFn\": \"$:/plugins/TheDiveO/TwFusejs/getfns/multipath.js\"\n}"},"$:/plugins/TheDiveO/TwFusejs/options/weighted":{"title":"$:/plugins/TheDiveO/TwFusejs/options/weighted","created":"20180815183410797","modified":"20180818165150453","tags":"","type":"application/json","text":"{\n\t\"tokenize\": true,\n \"shouldSort\": true,\n\t\"minMatchCharLength\": 3,\n \"threshold\": 0.35,\n \"distance\": 1000,\n\t\"keys\": [\n \t{ \"name\": \"fields.title\", \"weight\": 0.1 },\n { \"name\": \"fields.text\", \"weight\": 0.45 },\n { \"name\": \"fields.tags\", \"weight\": 0.45 }\n ]\n}"},"$:/plugins/TheDiveO/TwFusejs/readme":{"title":"$:/plugins/TheDiveO/TwFusejs/readme","created":"20180809162835521","modified":"20180816174232500","tags":"","type":"text/vnd.tiddlywiki","text":"This plugin brings lightweight fuzzy searching to ~TiddlyWiki, powered by [[Fuse.js|http://fusejs.io/]].\n\nYou can immediately use fuzzy searching in every ~TiddlyWiki where you install this plugin, right from the sidebar's search box. Just punch in some term(s) and you'll see an additional \"Fuzzy\" tab with fuzzy search results. Go to [[Default Search Result List|$:/plugins/TheDiveO/TwFusejs/ui/ControlPanel/fusedefaultsearchresultlist]] to make this new \"Fuzzy\" tab your default (fuzzy) search results tab.\n\nOn purpose, this ~TwFusejs plugin is not a one-size-fits-it-all fuzzy search plugin covering all bases. Instead, this is \"just\" a //lightweight// solution on purpose, and thus has some limitations in terms of speed and functionality. On the plus side, this plugin avoids having to calculate and maintain a dedicated search index.\n\nWe hope you will enjoy this plugin in your ~TiddlyWiki projects nevertheless.\n\n* Fuzzy search-related settings:\n** [[Fuzzy Term Searching|$:/plugins/TheDiveO/TwFusejs/ui/ControlPanel/everyorall]]\n** [[Default Search Result List|$:/plugins/TheDiveO/TwFusejs/ui/ControlPanel/fusedefaultsearchresultlist]]\n* [[TwFusejs GitHub Project|https://github.com/TheDiveO/TwFusejs]]"},"$:/plugins/TheDiveO/TwFusejs/styles/fusesearch.css":{"title":"$:/plugins/TheDiveO/TwFusejs/styles/fusesearch.css","created":"20180816115946548","modified":"20180816165107351","tags":"$:/tags/Stylesheet","type":"text/css","text":"div.fuse-results-count::after {\n content: \"...\";\n}\n\ndiv.fuse-results-count + dl.fuse-results {\n margin-top: 0;\n}\n\ndl.fuse-results dd {\n font-size: 90%;\n font-style: italic;\n line-height: normal;\n}\n\ndl.fuse-results dd + dt {\n margin-top: 1ex;\n}"},"$:/plugins/TheDiveO/TwFusejs/templates/fusesearch":{"title":"$:/plugins/TheDiveO/TwFusejs/templates/fusesearch","created":"20180811161220722","modified":"20180816171858922","tags":"","type":"text/vnd.tiddlywiki","text":"\\define fusesearch(anyterm)\n<!-- Set the variable \"fuse-search\" with the string to search for -->\n<!-- Optionally set the variable \"fuse-options\" to either a JSON data\n string with options, or to the title of a JSON data tiddler\n specifying the search options\n-->\n<$set name=\"fuse-options\" value=<<fuse-options>> emptyValue={{$:/plugins/TheDiveO/TwFusejs/options/default!!text}} >\n <$set name=\"hits\" filter=\"[!is[current]!is[system]$anyterm$fuse:fuse-options<fuse-search>limit[20]]\">\n <div class=\"fuse-results-count\">\n <$count filter=\"[enlist<hits>]\"/> matches for\n <$list filter=\"[[$anyterm$]prefix[!]]\">any</$list>\n <$list filter=\"[[$anyterm$]!prefix[!]]\">all</$list>\n search terms\n </div>\n <dl class=\"fuse-results\">\n <$list variable=\"hit\" filter=\"[enlist<hits>]\">\n <dt>\n <!-- render matching titles as tiddler links -->\n <$link to=<<hit>> ><$view tiddler=<<hit>> field=\"title\"/></$link>\n </dt>\n <dd>\n <!-- render the (beginning) of a matching tiddler as pure text without any markup -->\n <$list filter=\"[<hit>rendertext[]stringlimit[300]]\">\n <$view field=\"title\" format=\"plainwikified\"/>\n </$list>\n </dd>\n </$list>\n </dl>\n </$set>\n</$set>\n\\end\n<$macrocall $name=\"fusesearch\" anyterm={{$:/config/TwFusejs/allterms!!text}} />\n"},"$:/plugins/TheDiveO/TwFusejs/ui/ControlPanel/everyorall":{"title":"$:/plugins/TheDiveO/TwFusejs/ui/ControlPanel/everyorall","caption":"Fuzzy Term Searching","created":"20180816111158550","modified":"20180816124903959","tags":"$:/tags/ControlPanel/Settings","type":"text/vnd.tiddlywiki","text":"<$set name=\"cfgtiddler\" value=\"$:/config/TwFusejs/allterms\">\n\n<$link to=<<cfgtiddler>> >You can either search for //any// or //all// of your search terms:</$link>\n\n<$select tiddler=<<cfgtiddler>> default=\"\">\n<option value=\"\">All</option>\n<option value=\"!\">Any</option>\n</$select>\n</$set>"},"$:/plugins/TheDiveO/TwFusejs/ui/ControlPanel/fusedefaultsearchresultlist":{"title":"$:/plugins/TheDiveO/TwFusejs/ui/ControlPanel/fusedefaultsearchresultlist","caption":"Default Search Result List","created":"20180816123006775","modified":"20180816125741864","tags":"$:/tags/ControlPanel/Settings","type":"text/vnd.tiddlywiki","text":"Choose the default search result list to be opened automatically:\n\n<$select tiddler=\"$:/config/SearchResults/Default\">\n <$list filter=\"[all[tiddlers+shadows]tag[$:/tags/SearchResults]]\">\n <option value=<<currentTiddler>> >{{!!caption}}</option>\n </$list>\n</$select>"},"$:/plugins/TheDiveO/TwFusejs/ui/fusesearchresults":{"title":"$:/plugins/TheDiveO/TwFusejs/ui/fusesearchresults","caption":"Fuzzy","created":"20180816121802012","modified":"20180817090000126","tags":"$:/tags/SearchResults","type":"text/vnd.tiddlywiki","text":"\\define fusesearchresults(anyterm)\n<$set name=\"fuse-options\" value=<<fuse-options>> emptyValue={{$:/plugins/TheDiveO/TwFusejs/options/default!!text}} >\n <$set name=\"hits\" filter=\"[!is[current]!is[system]$anyterm$fuse:fuse-options{$(searchTiddler)$}limit[20]]\">\n <small>//<$count filter=\"[enlist<hits>]\"/> matches://</small>\n <$list variable=\"hit\" filter=\"[enlist<hits>]\">\n <div class=\"tc-menu-list-item\">\n <$link to=<<hit>> ><$view tiddler=<<hit>> field=\"title\"/></$link>\n </div>\n </$list>\n </$set>\n</$set>\n\\end\n<$macrocall $name=\"fusesearchresults\" anyterm={{$:/config/TwFusejs/allterms!!text}} />"}}}
\define fusesearchresults(anyterm) <$set name="fuse-options" value=<<fuse-options>> emptyValue={{$:/plugins/TheDiveO/TwFusejs/options/default!!text}} > <$set name="hits" filter="[!is[current]!is[system]$anyterm$fuse:fuse-options{$(searchTiddler)$}limit[20]]"> <small>//<$count filter="[enlist<hits>]"/> matches://</small> <$list variable="hit" filter="[enlist<hits>]"> <dt> <!-- render matching titles as tiddler links --> <$link to=<<hit>> ><$view tiddler=<<hit>> field="title"/></$link> </dt> <dd> <!-- render the (beginning) of a matching tiddler as pure text without any markup --> <$list filter="[<hit>rendertext[]stringlimit[300]]"> <$view field="title" format="plainwikified"/> </$list> </dd> </$list> </$set> </$set> \end <$macrocall $name="fusesearchresults" anyterm={{$:/config/TwFusejs/allterms!!text}} />
{ "tiddlers": { "$:/plugins/tiddlywiki/filesystem/filesystemadaptor.js": { "title": "$:/plugins/tiddlywiki/filesystem/filesystemadaptor.js", "text": "/*\\\ntitle: $:/plugins/tiddlywiki/filesystem/filesystemadaptor.js\ntype: application/javascript\nmodule-type: syncadaptor\n\nA sync adaptor module for synchronising with the local filesystem via node.js APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Get a reference to the file system\nvar fs = $tw.node ? require(\"fs\") : null,\n\tpath = $tw.node ? require(\"path\") : null;\n\nfunction FileSystemAdaptor(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.boot = options.boot || $tw.boot;\n\tthis.logger = new $tw.utils.Logger(\"filesystem\",{colour: \"blue\"});\n\t// Create the <wiki>/tiddlers folder if it doesn't exist\n\t$tw.utils.createDirectory(this.boot.wikiTiddlersPath);\n}\n\nFileSystemAdaptor.prototype.name = \"filesystem\";\n\nFileSystemAdaptor.prototype.supportsLazyLoading = false;\n\nFileSystemAdaptor.prototype.isReady = function() {\n\t// The file system adaptor is always ready\n\treturn true;\n};\n\nFileSystemAdaptor.prototype.getTiddlerInfo = function(tiddler) {\n\t//Returns the existing fileInfo for the tiddler. To regenerate, call getTiddlerFileInfo().\n\tvar title = tiddler.fields.title;\n\treturn this.boot.files[title];\n};\n\n/*\nReturn a fileInfo object for a tiddler, creating it if necessary:\n filepath: the absolute path to the file containing the tiddler\n type: the type of the tiddler file (NOT the type of the tiddler -- see below)\n hasMetaFile: true if the file also has a companion .meta file\n\nThe boot process populates this.boot.files for each of the tiddler files that it loads.\nThe type is found by looking up the extension in $tw.config.fileExtensionInfo (eg \"application/x-tiddler\" for \".tid\" files).\n\nIt is the responsibility of the filesystem adaptor to update this.boot.files for new files that are created.\n*/\nFileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) {\n\t// Always generate a fileInfo object when this fuction is called\n\tvar title = tiddler.fields.title, newInfo, pathFilters, extFilters;\n\tif(this.wiki.tiddlerExists(\"$:/config/FileSystemPaths\")){\n\t\tpathFilters = this.wiki.getTiddlerText(\"$:/config/FileSystemPaths\",\"\").split(\"\\n\");\n\t}\n\tif(this.wiki.tiddlerExists(\"$:/config/FileSystemExtensions\")){\n\t\textFilters = this.wiki.getTiddlerText(\"$:/config/FileSystemExtensions\",\"\").split(\"\\n\");\n\t}\n\tnewInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: this.boot.wikiTiddlersPath,\n\t\tpathFilters: pathFilters,\n\t\textFilters: extFilters,\n\t\twiki: this.wiki,\n\t\tfileInfo: this.boot.files[title],\n\t\toriginalpath: this.wiki.extractTiddlerDataItem(\"$:/config/OriginalTiddlerPaths\",title, \"\")\n\t});\n\tthis.boot.files[title] = newInfo;\n\tcallback(null,newInfo);\n};\n\n\n/*\nSave a tiddler and invoke the callback with (err,adaptorInfo,revision)\n*/\nFileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback) {\n\tvar self = this;\n\tthis.getTiddlerFileInfo(tiddler,function(err,fileInfo) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t$tw.utils.saveTiddlerToFile(tiddler,fileInfo,function(err) {\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"open\") {\n\t\t\t\t\tvar bootInfo = self.boot.files[tiddler.fields.title];\n\t\t\t\t\tbootInfo.writeError = true;\n\t\t\t\t\tself.boot.files[tiddler.fields.title] = bootInfo;\n\t\t\t\t\t$tw.syncer.displayError(\"Sync for tiddler [[\"+tiddler.fields.title+\"]] will be retried with encoded filepath\", encodeURIComponent(bootInfo.filepath));\n\t\t\t\t\treturn callback(err);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Cleanup duplicates if the file moved or changed extensions\n\t\t\tvar options = {\n\t\t\t\tadaptorInfo: ($tw.syncer.tiddlerInfo[tiddler.fields.title] || {adaptorInfo: {} }).adaptorInfo,\n\t\t\t\tbootInfo: self.boot.files[tiddler.fields.title] || {},\n\t\t\t\ttitle: tiddler.fields.title\n\t\t\t};\n\t\t\t$tw.utils.cleanupTiddlerFiles(options, function(err){\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null, self.boot.files[tiddler.fields.title]);\n\t\t\t});\n\t\t});\n\t});\n};\n\n/*\nLoad a tiddler and invoke the callback with (err,tiddlerFields)\n\nWe don't need to implement loading for the file system adaptor, because all the tiddler files will have been loaded during the boot process.\n*/\nFileSystemAdaptor.prototype.loadTiddler = function(title,callback) {\n\tcallback(null,null);\n};\n\n/*\nDelete a tiddler and invoke the callback with (err)\n*/\nFileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) {\n\tvar self = this,\n\t\tfileInfo = this.boot.files[title];\n\t// Only delete the tiddler if we have writable information for the file\n\tif(fileInfo) {\n\t\t$tw.utils.deleteTiddlerFile(fileInfo, function(err){\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"unlink\") {\n\t\t\t\t\t// Error deleting the file on disk, should fail gracefully\n\t\t\t\t\t$tw.syncer.displayError(\"Server desynchronized. Error deleting file for deleted tiddler: \"+title, err);\n\t\t\t\t\treturn callback(null);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn callback(null);\n\t\t});\n\t} else {\n\t\tcallback(null);\n\t}\n};\n\nif(fs) {\n\texports.adaptorClass = FileSystemAdaptor;\n}\n\n})();\n", "type": "application/javascript", "module-type": "syncadaptor" }, "$:/plugins/tiddlywiki/filesystem/readme": { "title": "$:/plugins/tiddlywiki/filesystem/readme", "text": "The filesystem plugin is used under Node.js to synchronise tiddler changes back to the file system. It is inert when used in the browser.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/filesystem]]\n" } } }
{ "tiddlers": { "$:/config/HighlightPlugin/TypeMappings/application/javascript": { "title": "$:/config/HighlightPlugin/TypeMappings/application/javascript", "text": "javascript" }, "$:/config/HighlightPlugin/TypeMappings/application/json": { "title": "$:/config/HighlightPlugin/TypeMappings/application/json", "text": "json" }, "$:/config/HighlightPlugin/TypeMappings/text/css": { "title": "$:/config/HighlightPlugin/TypeMappings/text/css", "text": "css" }, "$:/config/HighlightPlugin/TypeMappings/text/html": { "title": "$:/config/HighlightPlugin/TypeMappings/text/html", "text": "html" }, "$:/config/HighlightPlugin/TypeMappings/image/svg+xml": { "title": "$:/config/HighlightPlugin/TypeMappings/image/svg+xml", "text": "xml" }, "$:/config/HighlightPlugin/TypeMappings/text/x-markdown": { "title": "$:/config/HighlightPlugin/TypeMappings/text/x-markdown", "text": "markdown" }, "$:/plugins/tiddlywiki/highlight/highlight.js": { "text": "var hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n/*! highlight.js v9.18.1 | BSD3 License | git.io/hljslicense */\n!function(e){var n=\"object\"==typeof window&&window||\"object\"==typeof self&&self;\"undefined\"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],i=Object.keys,_={},c={},C=!0,n=/^(no-?highlight|plain|text)$/i,l=/\\blang(?:uage)?-([\\w-]+)\\b/i,t=/((^(<[^>]+>|\\t|)+|(?:\\n)))/gm,r={case_insensitive:\"cI\",lexemes:\"l\",contains:\"c\",keywords:\"k\",subLanguage:\"sL\",className:\"cN\",begin:\"b\",beginKeywords:\"bK\",end:\"e\",endsWithParent:\"eW\",illegal:\"i\",excludeBegin:\"eB\",excludeEnd:\"eE\",returnBegin:\"rB\",returnEnd:\"rE\",variants:\"v\",IDENT_RE:\"IR\",UNDERSCORE_IDENT_RE:\"UIR\",NUMBER_RE:\"NR\",C_NUMBER_RE:\"CNR\",BINARY_NUMBER_RE:\"BNR\",RE_STARTERS_RE:\"RSR\",BACKSLASH_ESCAPE:\"BE\",APOS_STRING_MODE:\"ASM\",QUOTE_STRING_MODE:\"QSM\",PHRASAL_WORDS_MODE:\"PWM\",C_LINE_COMMENT_MODE:\"CLCM\",C_BLOCK_COMMENT_MODE:\"CBCM\",HASH_COMMENT_MODE:\"HCM\",NUMBER_MODE:\"NM\",C_NUMBER_MODE:\"CNM\",BINARY_NUMBER_MODE:\"BNM\",CSS_NUMBER_MODE:\"CSSNM\",REGEXP_MODE:\"RM\",TITLE_MODE:\"TM\",UNDERSCORE_TITLE_MODE:\"UTM\",COMMENT:\"C\",beginRe:\"bR\",endRe:\"eR\",illegalRe:\"iR\",lexemesRe:\"lR\",terminators:\"t\",terminator_end:\"tE\"},m=\"</span>\",O=\"Could not find the language '{}', did you forget to load/include a language module?\",B={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},o=\"of and for in not or if then\".split(\" \");function x(e){return e.replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\")}function g(e){return e.nodeName.toLowerCase()}function u(e){return n.test(e)}function s(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function E(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:\"start\",offset:t,node:r}),t=e(r,t),g(r).match(/br|hr|img|input/)||a.push({event:\"stop\",offset:t,node:r}));return t}(e,0),a}function d(e,n,t){var r=0,a=\"\",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:\"start\"===n[0].event?e:n:e.length?e:n}function c(e){a+=\"<\"+g(e)+f.map.call(e.attributes,function(e){return\" \"+e.nodeName+'=\"'+x(e.value).replace(/\"/g,\""\")+'\"'}).join(\"\")+\">\"}function l(e){a+=\"</\"+g(e)+\">\"}function u(e){(\"start\"===e.event?c:l)(e.node)}for(;e.length||n.length;){var s=o();if(a+=x(t.substring(r,s[0].offset)),r=s[0].offset,s===e){for(i.reverse().forEach(l);u(s.splice(0,1)[0]),(s=o())===e&&s.length&&s[0].offset===r;);i.reverse().forEach(c)}else\"start\"===s[0].event?i.push(s[0].node):i.pop(),u(s.splice(0,1)[0])}return a+x(t.substr(r))}function R(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return s(n,{v:null},e)})),n.cached_variants?n.cached_variants:function e(n){return!!n&&(n.eW||e(n.starts))}(n)?[s(n,{starts:n.starts?s(n.starts):null})]:Object.isFrozen(n)?[s(n)]:[n]}function p(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(p)}}function v(n,r){var a={};return\"string\"==typeof n?t(\"keyword\",n):i(n).forEach(function(e){t(e,n[e])}),a;function t(t,e){r&&(e=e.toLowerCase()),e.split(\" \").forEach(function(e){var n=e.split(\"|\");a[n[0]]=[t,function(e,n){return n?Number(n):function(e){return-1!=o.indexOf(e.toLowerCase())}(e)?0:1}(n[0],n[1])]})}}function S(r){function s(e){return e&&e.source||e}function f(e,n){return new RegExp(s(e),\"m\"+(r.cI?\"i\":\"\")+(n?\"g\":\"\"))}function a(a){var i,e,o={},c=[],l={},t=1;function n(e,n){o[t]=e,c.push([e,n]),t+=function(e){return new RegExp(e.toString()+\"|\").exec(\"\").length-1}(n)+1}for(var r=0;r<a.c.length;r++){n(e=a.c[r],e.bK?\"\\\\.?(?:\"+e.b+\")\\\\.?\":e.b)}a.tE&&n(\"end\",a.tE),a.i&&n(\"illegal\",a.i);var u=c.map(function(e){return e[1]});return i=f(function(e,n){for(var t=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./,r=0,a=\"\",i=0;i<e.length;i++){var o=r+=1,c=s(e[i]);for(0<i&&(a+=n),a+=\"(\";0<c.length;){var l=t.exec(c);if(null==l){a+=c;break}a+=c.substring(0,l.index),c=c.substring(l.index+l[0].length),\"\\\\\"==l[0][0]&&l[1]?a+=\"\\\\\"+String(Number(l[1])+o):(a+=l[0],\"(\"==l[0]&&r++)}a+=\")\"}return a}(u,\"|\"),!0),l.lastIndex=0,l.exec=function(e){var n;if(0===c.length)return null;i.lastIndex=l.lastIndex;var t=i.exec(e);if(!t)return null;for(var r=0;r<t.length;r++)if(null!=t[r]&&null!=o[\"\"+r]){n=o[\"\"+r];break}return\"string\"==typeof n?(t.type=n,t.extra=[a.i,a.tE]):(t.type=\"begin\",t.rule=n),t},l}if(r.c&&-1!=r.c.indexOf(\"self\")){if(!C)throw new Error(\"ERR: contains `self` is not supported at the top-level of a language. See documentation.\");r.c=r.c.filter(function(e){return\"self\"!=e})}!function n(t,e){t.compiled||(t.compiled=!0,t.k=t.k||t.bK,t.k&&(t.k=v(t.k,r.cI)),t.lR=f(t.l||/\\w+/,!0),e&&(t.bK&&(t.b=\"\\\\b(\"+t.bK.split(\" \").join(\"|\")+\")\\\\b\"),t.b||(t.b=/\\B|\\b/),t.bR=f(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\\B|\\b/),t.e&&(t.eR=f(t.e)),t.tE=s(t.e)||\"\",t.eW&&e.tE&&(t.tE+=(t.e?\"|\":\"\")+e.tE)),t.i&&(t.iR=f(t.i)),null==t.relevance&&(t.relevance=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return R(\"self\"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e),t.t=a(t))}(r)}function T(n,e,a,t){var i=e;function o(e,n){if(function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}if(e.eW)return o(e.parent,n)}function c(e,n,t,r){if(!t&&\"\"===n)return\"\";if(!e)return n;var a='<span class=\"'+(r?\"\":B.classPrefix);return(a+=e+'\">')+n+(t?\"\":m)}function l(){p+=null!=d.sL?function(){var e=\"string\"==typeof d.sL;if(e&&!_[d.sL])return x(v);var n=e?T(d.sL,v,!0,R[d.sL]):w(v,d.sL.length?d.sL:void 0);return 0<d.relevance&&(M+=n.relevance),e&&(R[d.sL]=n.top),c(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,o;if(!d.k)return x(v);for(r=\"\",n=0,d.lR.lastIndex=0,t=d.lR.exec(v);t;)r+=x(v.substring(n,t.index)),a=d,i=t,void 0,o=g.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(o)&&a.k[o])?(M+=e[1],r+=c(e[0],x(t[0]))):r+=x(t[0]),n=d.lR.lastIndex,t=d.lR.exec(v);return r+x(v.substr(n))}(),v=\"\"}function u(e){p+=e.cN?c(e.cN,\"\",!0):\"\",d=Object.create(e,{parent:{value:d}})}function s(e){var n=e[0],t=e.rule;return t&&t.endSameAsBegin&&(t.eR=function(e){return new RegExp(e.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),\"m\")}(n)),t.skip?v+=n:(t.eB&&(v+=n),l(),t.rB||t.eB||(v=n)),u(t),t.rB?0:n.length}var f={};function r(e,n){var t=n&&n[0];if(v+=e,null==t)return l(),0;if(\"begin\"==f.type&&\"end\"==n.type&&f.index==n.index&&\"\"===t)return v+=i.slice(n.index,n.index+1),1;if(\"begin\"===(f=n).type)return s(n);if(\"illegal\"===n.type&&!a)throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(d.cN||\"<unnamed>\")+'\"');if(\"end\"===n.type){var r=function(e){var n=e[0],t=i.substr(e.index),r=o(d,t);if(r){var a=d;for(a.skip?v+=n:(a.rE||a.eE||(v+=n),l(),a.eE&&(v=n));d.cN&&(p+=m),d.skip||d.sL||(M+=d.relevance),(d=d.parent)!==r.parent;);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),u(r.starts)),a.rE?0:n.length}}(n);if(null!=r)return r}return v+=t,t.length}var g=D(n);if(!g)throw console.error(O.replace(\"{}\",n)),new Error('Unknown language: \"'+n+'\"');S(g);var E,d=t||g,R={},p=\"\";for(E=d;E!==g;E=E.parent)E.cN&&(p=c(E.cN,\"\",!0)+p);var v=\"\",M=0;try{for(var b,h,N=0;d.t.lastIndex=N,b=d.t.exec(i);)h=r(i.substring(N,b.index),b),N=b.index+h;for(r(i.substr(N)),E=d;E.parent;E=E.parent)E.cN&&(p+=m);return{relevance:M,value:p,i:!1,language:n,top:d}}catch(e){if(e.message&&-1!==e.message.indexOf(\"Illegal\"))return{i:!0,relevance:0,value:x(i)};if(C)return{relevance:0,value:x(i),language:n,top:d,errorRaised:e};throw e}}function w(t,e){e=e||B.languages||i(_);var r={relevance:0,value:x(t)},a=r;return e.filter(D).filter(L).forEach(function(e){var n=T(e,t,!1);n.language=e,n.relevance>a.relevance&&(a=n),n.relevance>r.relevance&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function M(e){return B.tabReplace||B.useBR?e.replace(t,function(e,n){return B.useBR&&\"\\n\"===e?\"<br>\":B.tabReplace?n.replace(/\\t/g,B.tabReplace):\"\"}):e}function b(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+\" \";if(i+=e.parentNode?e.parentNode.className:\"\",t=l.exec(i)){var o=D(t[1]);return o||(console.warn(O.replace(\"{}\",t[1])),console.warn(\"Falling back to no-highlight mode for this block.\",e)),o?t[1]:\"no-highlight\"}for(n=0,r=(i=i.split(/\\s+/)).length;n<r;n++)if(u(a=i[n])||D(a))return a}(e);u(o)||(B.useBR?(n=document.createElement(\"div\")).innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\"):n=e,i=n.textContent,r=o?T(o,i,!0):w(i),(t=E(n)).length&&((a=document.createElement(\"div\")).innerHTML=r.value,r.value=d(t,E(a),i)),r.value=M(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");f.forEach.call(e,b)}}var N={disableAutodetect:!0};function D(e){return e=(e||\"\").toLowerCase(),_[e]||_[c[e]]}function L(e){var n=D(e);return n&&!n.disableAutodetect}return a.highlight=T,a.highlightAuto=w,a.fixMarkup=M,a.highlightBlock=b,a.configure=function(e){B=s(B,e)},a.initHighlighting=h,a.initHighlightingOnLoad=function(){window.addEventListener(\"DOMContentLoaded\",h,!1),window.addEventListener(\"load\",h,!1)},a.registerLanguage=function(n,e){var t;try{t=e(a)}catch(e){if(console.error(\"Language definition for '{}' could not be registered.\".replace(\"{}\",n)),!C)throw e;console.error(e),t=N}p(_[n]=t),t.rawDefinition=e.bind(null,a),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return i(_)},a.getLanguage=D,a.requireLanguage=function(e){var n=D(e);if(n)return n;throw new Error(\"The '{}' language is required, but not loaded.\".replace(\"{}\",e))},a.autoDetection=L,a.inherit=s,a.debugMode=function(){C=!1},a.IR=a.IDENT_RE=\"[a-zA-Z]\\\\w*\",a.UIR=a.UNDERSCORE_IDENT_RE=\"[a-zA-Z_]\\\\w*\",a.NR=a.NUMBER_RE=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",a.CNR=a.C_NUMBER_RE=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",a.BNR=a.BINARY_NUMBER_RE=\"\\\\b(0b[01]+)\",a.RSR=a.RE_STARTERS_RE=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",a.BE=a.BACKSLASH_ESCAPE={b:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},a.ASM=a.APOS_STRING_MODE={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:\"comment\",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",relevance:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C(\"//\",\"$\"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C(\"/\\\\*\",\"\\\\*/\"),a.HCM=a.HASH_COMMENT_MODE=a.C(\"#\",\"$\"),a.NM=a.NUMBER_MODE={cN:\"number\",b:a.NR,relevance:0},a.CNM=a.C_NUMBER_MODE={cN:\"number\",b:a.CNR,relevance:0},a.BNM=a.BINARY_NUMBER_MODE={cN:\"number\",b:a.BNR,relevance:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:\"number\",b:a.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",relevance:0},a.RM=a.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[a.BE,{b:/\\[/,e:/\\]/,relevance:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:\"title\",b:a.IR,relevance:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:\"title\",b:a.UIR,relevance:0},a.METHOD_GUARD={b:\"\\\\.\\\\s*\"+a.UIR,relevance:0},[a.BE,a.ASM,a.QSM,a.PWM,a.C,a.CLCM,a.CBCM,a.HCM,a.NM,a.CNM,a.BNM,a.CSSNM,a.RM,a.TM,a.UTM,a.METHOD_GUARD].forEach(function(e){!function n(t){Object.freeze(t);var r=\"function\"==typeof t;Object.getOwnPropertyNames(t).forEach(function(e){!t.hasOwnProperty(e)||null===t[e]||\"object\"!=typeof t[e]&&\"function\"!=typeof t[e]||r&&(\"caller\"===e||\"callee\"===e||\"arguments\"===e)||Object.isFrozen(t[e])||n(t[e])});return t}(e)}),a});hljs.registerLanguage(\"swift\",function(e){var i={keyword:\"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet\",literal:\"true false nil\",built_in:\"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip\"},t=e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),n={cN:\"subst\",b:/\\\\\\(/,e:\"\\\\)\",k:i,c:[]},r={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/\"/,e:/\"/}]},a={cN:\"number\",b:\"\\\\b([\\\\d_]+(\\\\.[\\\\deE_]+)?|0x[a-fA-F0-9_]+(\\\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\\\b\",relevance:0};return n.c=[a],{k:i,c:[r,e.CLCM,t,{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*[!?]\"},{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*\",relevance:0},a,{cN:\"function\",bK:\"func\",e:\"{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b:/</,e:/>/},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:i,c:[\"self\",a,r,e.CBCM,{b:\":\"}],i:/[\"']/}],i:/\\[|%/},{cN:\"class\",bK:\"struct protocol class extension enum\",k:i,e:\"\\\\{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\\u00C0-\\u02B80-9A-Za-z$_]*/})]},{cN:\"meta\",b:\"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\"},{bK:\"import\",e:/$/,c:[e.CLCM,t]}]}});hljs.registerLanguage(\"less\",function(e){function r(e){return{cN:\"string\",b:\"~?\"+e+\".*?\"+e}}function t(e,r,t){return{cN:e,b:r,relevance:t}}var a=\"[\\\\w-]+\",c=\"(\"+a+\"|@{\"+a+\"})\",s=[],n=[],b={b:\"\\\\(\",e:\"\\\\)\",c:n,relevance:0};n.push(e.CLCM,e.CBCM,r(\"'\"),r('\"'),e.CSSNM,{b:\"(url|data-uri)\\\\(\",starts:{cN:\"string\",e:\"[\\\\)\\\\n]\",eE:!0}},t(\"number\",\"#[0-9A-Fa-f]+\\\\b\"),b,t(\"variable\",\"@@?\"+a,10),t(\"variable\",\"@{\"+a+\"}\"),t(\"built_in\",\"~?`[^`]*?`\"),{cN:\"attribute\",b:a+\"\\\\s*:\",e:\":\",rB:!0,eE:!0},{cN:\"meta\",b:\"!important\"});var i=n.concat({b:\"{\",e:\"}\",c:s}),l={bK:\"when\",eW:!0,c:[{bK:\"and not\"}].concat(n)},o={b:c+\"\\\\s*:\",rB:!0,e:\"[;}]\",relevance:0,c:[{cN:\"attribute\",b:c,e:\":\",eE:!0,starts:{eW:!0,i:\"[<=$]\",relevance:0,c:n}}]},u={cN:\"keyword\",b:\"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\\\b\",starts:{e:\"[;{}]\",rE:!0,c:n,relevance:0}},v={cN:\"variable\",v:[{b:\"@\"+a+\"\\\\s*:\",relevance:15},{b:\"@\"+a}],starts:{e:\"[;}]\",rE:!0,c:i}},C={v:[{b:\"[\\\\.#:&\\\\[>]\",e:\"[;{}]\"},{b:c,e:\"{\"}],rB:!0,rE:!0,i:\"[<='$\\\"]\",relevance:0,c:[e.CLCM,e.CBCM,l,t(\"keyword\",\"all\\\\b\"),t(\"variable\",\"@{\"+a+\"}\"),t(\"selector-tag\",c+\"%?\",0),t(\"selector-id\",\"#\"+c),t(\"selector-class\",\"\\\\.\"+c,0),t(\"selector-tag\",\"&\",0),{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"\\\\(\",e:\"\\\\)\",c:i},{b:\"!important\"}]};return s.push(e.CLCM,e.CBCM,u,v,o,C),{cI:!0,i:\"[=>'/<($\\\"]\",c:s}});hljs.registerLanguage(\"armasm\",function(s){return{cI:!0,aliases:[\"arm\"],l:\"\\\\.?\"+s.IR,k:{meta:\".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND \",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @\"},c:[{cN:\"keyword\",b:\"\\\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?\",e:\"\\\\s\"},s.C(\"[;@]\",\"$\",{relevance:0}),s.CBCM,s.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",relevance:0},{cN:\"title\",b:\"\\\\|\",e:\"\\\\|\",i:\"\\\\n\",relevance:0},{cN:\"number\",v:[{b:\"[#$=]?0x[0-9a-f]+\"},{b:\"[#$=]?0b[01]+\"},{b:\"[#$=]\\\\d+\"},{b:\"\\\\b\\\\d+\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+\"},{b:\"^\\\\s*[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+:\"},{b:\"[=#]\\\\w+\"}],relevance:0}]}});hljs.registerLanguage(\"ruby\",function(e){var c=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",b={keyword:\"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\",literal:\"true false nil\"},r={cN:\"doctag\",b:\"@[A-Za-z]+\"},a={b:\"#<\",e:\">\"},n=[e.C(\"#\",\"$\",{c:[r]}),e.C(\"^\\\\=begin\",\"^\\\\=end\",{c:[r],relevance:10}),e.C(\"^__END__\",\"\\\\n$\")],s={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:b},t={cN:\"string\",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/},{b:/<<[-~]?'?(\\w+)(?:.|\\n)*?\\n\\s*\\1\\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\\w+/,endSameAsBegin:!0,c:[e.BE,s]}]}]},i={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",endsParent:!0,k:b},l=[t,a,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{b:\"<\\\\s*\",c:[{b:\"(\"+e.IR+\"::)?\"+e.IR}]}].concat(n)},{cN:\"function\",bK:\"def\",e:\"$|;\",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{b:e.IR+\"::\"},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",relevance:0},{cN:\"symbol\",b:\":(?!\\\\s)\",c:[t,{b:c}],relevance:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{cN:\"params\",b:/\\|/,e:/\\|/,k:b},{b:\"(\"+e.RSR+\"|unless)\\\\s*\",k:\"unless\",c:[a,{cN:\"regexp\",c:[e.BE,s],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}].concat(n),relevance:0}].concat(n);s.c=l;var d=[{b:/^\\s*=>/,starts:{e:\"$\",c:i.c=l}},{cN:\"meta\",b:\"^([>?]>|[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>|(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>)\",starts:{e:\"$\",c:l}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:b,i:/\\/\\*/,c:n.concat(d).concat(l)}});hljs.registerLanguage(\"lua\",function(e){var t=\"\\\\[=*\\\\[\",a=\"\\\\]=*\\\\]\",n={b:t,e:a,c:[\"self\"]},l=[e.C(\"--(?!\"+t+\")\",\"$\"),e.C(\"--\"+t,a,{c:[n],relevance:10})];return{l:e.UIR,k:{literal:\"true false nil\",keyword:\"and break do else elseif end for goto if in local not or repeat return then until while\",built_in:\"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove\"},c:l.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[e.inherit(e.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:!0,c:l}].concat(l)},e.CNM,e.ASM,e.QSM,{cN:\"string\",b:t,e:a,c:[n],relevance:5}])}});hljs.registerLanguage(\"matlab\",function(e){var a=\"('|\\\\.')+\",s={relevance:0,c:[{b:a}]};return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell \"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[e.UTM,{cN:\"params\",v:[{b:\"\\\\(\",e:\"\\\\)\"},{b:\"\\\\[\",e:\"\\\\]\"}]}]},{cN:\"built_in\",b:/true|false/,relevance:0,starts:s},{b:\"[a-zA-Z][a-zA-Z_0-9]*\"+a,relevance:0},{cN:\"number\",b:e.CNR,relevance:0,starts:s},{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{b:/\\]|}|\\)/,relevance:0,starts:s},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}],starts:s},e.C(\"^\\\\s*\\\\%\\\\{\\\\s*$\",\"^\\\\s*\\\\%\\\\}\\\\s*$\"),e.C(\"\\\\%\",\"$\")]}});hljs.registerLanguage(\"apache\",function(e){var r={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.HCM,{cN:\"section\",b:\"</?\",e:\">\"},{cN:\"attribute\",b:/\\w+/,relevance:0,k:{nomarkup:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,relevance:0,k:{literal:\"on off all\"},c:[{cN:\"meta\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"variable\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",r]},r,e.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"yaml\",function(e){var b=\"true false yes no null\",a={cN:\"string\",relevance:0,v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/\\S+/}],c:[e.BE,{cN:\"template-variable\",v:[{b:\"{{\",e:\"}}\"},{b:\"%{\",e:\"}\"}]}]};return{cI:!0,aliases:[\"yml\",\"YAML\",\"yaml\"],c:[{cN:\"attr\",v:[{b:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{b:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{b:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{cN:\"meta\",b:\"^---s*$\",relevance:10},{cN:\"string\",b:\"[\\\\|>]([0-9]?[+-])?[ ]*\\\\n( *)[\\\\S ]+\\\\n(\\\\2[\\\\S ]+\\\\n?)*\"},{b:\"<%[%=-]?\",e:\"[%-]?%>\",sL:\"ruby\",eB:!0,eE:!0,relevance:0},{cN:\"type\",b:\"!\"+e.UIR},{cN:\"type\",b:\"!!\"+e.UIR},{cN:\"meta\",b:\"&\"+e.UIR+\"$\"},{cN:\"meta\",b:\"\\\\*\"+e.UIR+\"$\"},{cN:\"bullet\",b:\"\\\\-(?=[ ]|$)\",relevance:0},e.HCM,{bK:b,k:{literal:b}},{cN:\"number\",b:e.CNR+\"\\\\b\"},a]}});hljs.registerLanguage(\"plaintext\",function(e){return{disableAutodetect:!0}});hljs.registerLanguage(\"erlang-repl\",function(e){return{k:{built_in:\"spawn spawn_link self\",keyword:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"meta\",b:\"^[0-9]+> \",relevance:10},e.C(\"%\",\"$\"),{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},e.ASM,e.QSM,{b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{b:\"->\"},{b:\"ok\"},{b:\"!\"},{b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",relevance:0},{b:\"[A-Z][a-zA-Z0-9_']*\",relevance:0}]}});hljs.registerLanguage(\"cmake\",function(e){return{aliases:[\"cmake.in\"],cI:!0,k:{keyword:\"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined\"},c:[{cN:\"variable\",b:\"\\\\${\",e:\"}\"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage(\"kotlin\",function(e){var t={keyword:\"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default\",built_in:\"Byte Short Char Int Long Boolean Float Double Void Unit Nothing\",literal:\"true false null\"},a={cN:\"symbol\",b:e.UIR+\"@\"},n={cN:\"subst\",b:\"\\\\${\",e:\"}\",c:[e.CNM]},c={cN:\"variable\",b:\"\\\\$\"+e.UIR},r={cN:\"string\",v:[{b:'\"\"\"',e:'\"\"\"(?=[^\"])',c:[c,n]},{b:\"'\",e:\"'\",i:/\\n/,c:[e.BE]},{b:'\"',e:'\"',i:/\\n/,c:[e.BE,c,n]}]};n.c.push(r);var i={cN:\"meta\",b:\"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\\\s*:(?:\\\\s*\"+e.UIR+\")?\"},l={cN:\"meta\",b:\"@\"+e.UIR,c:[{b:/\\(/,e:/\\)/,c:[e.inherit(r,{cN:\"meta-string\"})]}]},s={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0},b=e.C(\"/\\\\*\",\"\\\\*/\",{c:[e.CBCM]}),o={v:[{cN:\"type\",b:e.UIR},{b:/\\(/,e:/\\)/,c:[]}]},d=o;return d.v[1].c=[o],o.v[1].c=[d],{aliases:[\"kt\"],k:t,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,b,{cN:\"keyword\",b:/\\b(break|continue|return|this)\\b/,starts:{c:[{cN:\"symbol\",b:/@\\w+/}]}},a,i,l,{cN:\"function\",bK:\"fun\",e:\"[(]|$\",rB:!0,eE:!0,k:t,i:/fun\\s+(<.*>)?[^\\s\\(]+(\\s+[^\\s\\(]+)\\s*=/,relevance:5,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"type\",b:/</,e:/>/,k:\"reified\",relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:t,relevance:0,c:[{b:/:/,e:/[=,\\/]/,eW:!0,c:[o,e.CLCM,b],relevance:0},e.CLCM,b,i,l,r,e.CNM]},b]},{cN:\"class\",bK:\"class interface trait\",e:/[:\\{(]|$/,eE:!0,i:\"extends implements\",c:[{bK:\"public protected internal private constructor\"},e.UTM,{cN:\"type\",b:/</,e:/>/,eB:!0,eE:!0,relevance:0},{cN:\"type\",b:/[,:]\\s*/,e:/[<\\(,]|$/,eB:!0,rE:!0},i,l]},r,{cN:\"meta\",b:\"^#!/usr/bin/env\",e:\"$\",i:\"\\n\"},s]}});hljs.registerLanguage(\"javascript\",function(e){var r=\"<>\",a=\"</>\",t={b:/<[A-Za-z0-9\\\\._:-]+/,e:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/},c=\"[A-Za-z$_][0-9A-Za-z$_]*\",n={keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:n,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},b={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},l={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};o.c=[e.ASM,e.QSM,i,b,l,s,e.RM];var u=o.c.concat([e.CBCM,e.CLCM]);return{aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],k:n,c:[{cN:\"meta\",relevance:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,i,b,l,e.CLCM,e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\",c:[{cN:\"type\",b:\"\\\\{\",e:\"\\\\}\",relevance:0},{cN:\"variable\",b:c+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{b:/(?=[^\\n])\\s/,relevance:0}]}]}),e.CBCM,s,{b:/[{,\\n]\\s*/,relevance:0,c:[{b:c+\"\\\\s*:\",rB:!0,relevance:0,c:[{cN:\"attr\",b:c,relevance:0}]}]},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+c+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:c},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:n,c:u}]}]},{cN:\"\",b:/\\s/,e:/\\s*/,skip:!0},{v:[{b:r,e:a},{b:t.b,e:t.e}],sL:\"xml\",c:[{b:t.b,e:t.e,skip:!0,c:[\"self\"]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:c}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:u}],i:/\\[|%/},{b:/\\$[(.]/},e.METHOD_GUARD,{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor get set\",e:/\\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage(\"scss\",function(e){var t=\"@[a-z-]+\",r={cN:\"variable\",b:\"(\\\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\\\b\"},i={cN:\"number\",b:\"#[0-9A-Fa-f]+\"};e.CSSNM,e.QSM,e.ASM,e.CBCM;return{cI:!0,i:\"[=/|']\",c:[e.CLCM,e.CBCM,{cN:\"selector-id\",b:\"\\\\#[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-class\",b:\"\\\\.[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"selector-tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",relevance:0},{cN:\"selector-pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"selector-pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},r,{cN:\"attribute\",b:\"\\\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{b:\":\",e:\";\",c:[r,i,e.CSSNM,e.QSM,e.ASM,{cN:\"meta\",b:\"!important\"}]},{b:\"@(page|font-face)\",l:t,k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",rB:!0,k:\"and or not only\",c:[{b:t,cN:\"keyword\"},r,e.QSM,e.ASM,i,e.CSSNM]}]}});hljs.registerLanguage(\"perl\",function(e){var t=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},s={b:\"->{\",e:\"}\"},n={v:[{b:/\\$\\d/},{b:/[\\$%@](\\^\\w\\b|#\\w+(::\\w+)*|{\\w+}|\\w+(::\\w*)*)/},{b:/[\\$%@][^\\s\\w{]/,relevance:0}]},c=[e.BE,r,n],a=[n,e.HCM,e.C(\"^\\\\=\\\\w\",\"\\\\=cut\",{eW:!0}),s,{cN:\"string\",c:c,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",relevance:5},{b:\"qw\\\\s+q\",e:\"q\",relevance:5},{b:\"'\",e:\"'\",c:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.BE]},{b:\"{\\\\w+}\",c:[],relevance:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],relevance:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",relevance:0,c:[e.HCM,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",relevance:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],relevance:0}]},{cN:\"function\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",eE:!0,relevance:5,c:[e.TM]},{b:\"-\\\\w\\\\b\",relevance:0},{b:\"^__DATA__$\",e:\"^__END__$\",sL:\"mojolicious\",c:[{b:\"^@@.*\",e:\"$\",cN:\"comment\"}]}];return r.c=a,{aliases:[\"pl\",\"pm\"],l:/[\\w\\.]+/,k:t,c:s.c=a}});hljs.registerLanguage(\"go\",function(e){var n={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",literal:\"true false iota nil\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:n,i:\"</\",c:[e.CLCM,e.CBCM,{cN:\"string\",v:[e.QSM,e.ASM,{b:\"`\",e:\"`\"}]},{cN:\"number\",v:[{b:e.CNR+\"[i]\",relevance:1},e.CNM]},{b:/:=/},{cN:\"function\",bK:\"func\",e:\"\\\\s*(\\\\{|$)\",eE:!0,c:[e.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:n,i:/[\"']/}]}]}});hljs.registerLanguage(\"x86asm\",function(s){return{cI:!0,l:\"[.%]?\"+s.IR,k:{keyword:\"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63\",built_in:\"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr\",meta:\"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__\"},c:[s.C(\";\",\"$\",{relevance:0}),{cN:\"number\",v:[{b:\"\\\\b(?:([0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\\\b\",relevance:0},{b:\"\\\\$[0-9][0-9A-Fa-f]*\",relevance:0},{b:\"\\\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\\\b\"},{b:\"\\\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\\\b\"}]},s.QSM,{cN:\"string\",v:[{b:\"'\",e:\"[^\\\\\\\\]'\"},{b:\"`\",e:\"[^\\\\\\\\]`\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^\\\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\\\s+label)\"},{b:\"^\\\\s*%%[A-Za-z0-9_$#@~.?]*:\"}],relevance:0},{cN:\"subst\",b:\"%[0-9]+\",relevance:0},{cN:\"subst\",b:\"%!S+\",relevance:0},{cN:\"meta\",b:/^\\s*\\.[\\w_-]+/}]}});hljs.registerLanguage(\"cpp\",function(e){function t(e){return\"(?:\"+e+\")?\"}var r=\"decltype\\\\(auto\\\\)\",a=\"[a-zA-Z_]\\\\w*::\",i=\"(\"+r+\"|\"+t(a)+\"[a-zA-Z_]\\\\w*\"+t(\"<.*?>\")+\")\",c={cN:\"keyword\",b:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},s={cN:\"string\",v:[{b:'(u8?|U|L)?\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"(u8?|U|L)?'(\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)|.)\",e:\"'\",i:\".\"},{b:/(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\((?:.|\\n)*?\\)\\1\"/}]},n={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},o={cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(s,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},l={cN:\"title\",b:t(a)+e.IR,relevance:0},u=t(a)+e.IR+\"\\\\s*\\\\(\",p={keyword:\"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_tshort reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq\",built_in:\"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary\",literal:\"true false nullptr NULL\"},m=[c,e.CLCM,e.CBCM,n,s],d={v:[{b:/=/,e:/;/},{b:/\\(/,e:/\\)/},{bK:\"new throw return else\",e:/;/}],k:p,c:m.concat([{b:/\\(/,e:/\\)/,k:p,c:m.concat([\"self\"]),relevance:0}]),relevance:0},b={cN:\"function\",b:\"(\"+i+\"[\\\\*&\\\\s]+)+\"+u,rB:!0,e:/[{;=]/,eE:!0,k:p,i:/[^\\w\\s\\*&:<>]/,c:[{b:r,k:p,relevance:0},{b:u,rB:!0,c:[l],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:p,relevance:0,c:[e.CLCM,e.CBCM,s,n,c,{b:/\\(/,e:/\\)/,k:p,relevance:0,c:[\"self\",e.CLCM,e.CBCM,s,n,c]}]},c,e.CLCM,e.CBCM,o]};return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\",\"hh\",\"hxx\",\"cxx\"],k:p,i:\"</\",c:[].concat(d,b,m,[o,{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:p,c:[\"self\",c]},{b:e.IR+\"::\",k:p},{cN:\"class\",bK:\"class struct\",e:/[{;:]/,c:[{b:/</,e:/>/,c:[\"self\"]},e.TM]}]),exports:{preprocessor:o,strings:s,k:p}}});hljs.registerLanguage(\"arduino\",function(e){var t=\"boolean byte word String\",r=\"setup loopKeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put\",i=\"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW\",o=e.requireLanguage(\"cpp\").rawDefinition(),a=o.k;return a.keyword+=\" \"+t,a.literal+=\" \"+i,a.built_in+=\" \"+r,o});hljs.registerLanguage(\"nginx\",function(e){var r={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},b={eW:!0,l:\"[a-z/_]+\",k:{literal:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},relevance:0,i:\"=>\",c:[e.HCM,{cN:\"string\",c:[e.BE,r],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[r]},{cN:\"regexp\",c:[e.BE,r],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",relevance:0},r]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s+{\",rB:!0,e:\"{\",c:[{cN:\"section\",b:e.UIR}],relevance:0},{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"attribute\",b:e.UIR,starts:b}],relevance:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"xml\",function(e){var c={cN:\"symbol\",b:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},s={b:\"\\\\s\",c:[{cN:\"meta-keyword\",b:\"#?[a-z_][a-z1-9_-]+\",i:\"\\\\n\"}]},a=e.inherit(s,{b:\"\\\\(\",e:\"\\\\)\"}),t=e.inherit(e.ASM,{cN:\"meta-string\"}),l=e.inherit(e.QSM,{cN:\"meta-string\"}),r={eW:!0,i:/</,relevance:0,c:[{cN:\"attr\",b:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{b:/=\\s*/,relevance:0,c:[{cN:\"string\",endsParent:!0,v:[{b:/\"/,e:/\"/,c:[c]},{b:/'/,e:/'/,c:[c]},{b:/[^\\s\"'=<>`]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],cI:!0,c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",relevance:10,c:[s,l,t,a,{b:\"\\\\[\",e:\"\\\\]\",c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",c:[s,a,l,t]}]}]},e.C(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",relevance:10},c,{cN:\"meta\",b:/<\\?xml/,e:/\\?>/,relevance:10},{b:/<\\?(php)?/,e:/\\?>/,sL:\"php\",c:[{b:\"/\\\\*\",e:\"\\\\*/\",skip:!0},{b:'b\"',e:'\"',skip:!0},{b:\"b'\",e:\"'\",skip:!0},e.inherit(e.ASM,{i:null,cN:null,c:null,skip:!0}),e.inherit(e.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:\"tag\",b:\"<style(?=\\\\s|>)\",e:\">\",k:{name:\"style\"},c:[r],starts:{e:\"</style>\",rE:!0,sL:[\"css\",\"xml\"]}},{cN:\"tag\",b:\"<script(?=\\\\s|>)\",e:\">\",k:{name:\"script\"},c:[r],starts:{e:\"<\\/script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,relevance:0},r]}]}});hljs.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"section\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",relevance:0},{cN:\"bullet\",b:\"^\\\\s*([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",relevance:0}]},{cN:\"quote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"^```\\\\w*\\\\s*$\",e:\"^```[ ]*$\"},{b:\"`.+?`\"},{b:\"^( {4}|\\\\t)\",e:\"$\",relevance:0}]},{b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,relevance:0},{cN:\"link\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"symbol\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],relevance:10},{b:/^\\[[^\\n]+\\]:/,rB:!0,c:[{cN:\"symbol\",b:/\\[/,e:/\\]/,eB:!0,eE:!0},{cN:\"link\",b:/:\\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage(\"properties\",function(e){var r=\"[ \\\\t\\\\f]*\",t=\"(\"+r+\"[:=]\"+r+\"|[ \\\\t\\\\f]+)\",n=\"([^\\\\\\\\\\\\W:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",a=\"([^\\\\\\\\:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",c={e:t,relevance:0,starts:{cN:\"string\",e:/$/,relevance:0,c:[{b:\"\\\\\\\\\\\\n\"}]}};return{cI:!0,i:/\\S/,c:[e.C(\"^\\\\s*[!#]\",\"$\"),{b:n+t,rB:!0,c:[{cN:\"attr\",b:n,endsParent:!0,relevance:0}],starts:c},{b:a+t,rB:!0,relevance:0,c:[{cN:\"meta\",b:a,endsParent:!0,relevance:0}],starts:c},{cN:\"attr\",relevance:0,b:a+r+\"$\"}]}});hljs.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},a={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]};return{aliases:[\"sh\",\"zsh\"],l:/\\b-?[a-z\\._]+\\b/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",_:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"meta\",b:/^#![^\\n]+sh\\s*$/,relevance:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],relevance:0},e.HCM,a,{cN:\"\",b:/\\\\\"/},{cN:\"string\",b:/'/,e:/'/},t]}});hljs.registerLanguage(\"dockerfile\",function(e){return{aliases:[\"docker\"],cI:!0,k:\"from maintainer expose env arg user onbuild stopsignal\",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:\"run cmd entrypoint volume add copy workdir label healthcheck shell\",starts:{e:/[^\\\\]$/,sL:\"bash\"}}],i:\"</\"}});hljs.registerLanguage(\"python\",function(e){var r={keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10\",built_in:\"Ellipsis NotImplemented\",literal:\"False None True\"},b={cN:\"meta\",b:/^(>>>|\\.\\.\\.) /},c={cN:\"subst\",b:/\\{/,e:/\\}/,k:r,i:/#/},a={b:/\\{\\{/,relevance:0},l={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[e.BE,b],relevance:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,a,c]},{b:/(fr|rf|f)\"\"\"/,e:/\"\"\"/,c:[e.BE,b,a,c]},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,a,c]},{b:/(fr|rf|f)\"/,e:/\"/,c:[e.BE,a,c]},e.ASM,e.QSM]},n={cN:\"number\",relevance:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},i={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",b,n,l,e.HCM]};return c.c=[l,n,b],{aliases:[\"py\",\"gyp\",\"ipython\"],k:r,i:/(<\\/|->|\\?)|=>/,c:[b,n,{bK:\"if\",relevance:0},l,e.HCM,{v:[{cN:\"function\",bK:\"def\"},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:\"None\"}]},{cN:\"meta\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"ini\",function(e){var b={cN:\"number\",relevance:0,v:[{b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},{b:e.NR}]},a=e.C();a.v=[{b:/;/,e:/$/},{b:/#/,e:/$/}];var c={cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},r={cN:\"literal\",b:/\\bon|off|true|false|yes|no\\b/},n={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",relevance:10},{b:'\"\"\"',e:'\"\"\"',relevance:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[a,{cN:\"section\",b:/\\[+/,e:/\\]+/},{b:/^[a-z0-9\\[\\]_\\.-]+(?=\\s*=\\s*)/,cN:\"attr\",starts:{e:/$/,c:[a,{b:/\\[/,e:/\\]/,c:[a,r,c,n,b,\"self\"],relevance:0},r,c,n,b]}}]}});hljs.registerLanguage(\"diff\",function(e){return{aliases:[\"patch\"],c:[{cN:\"meta\",relevance:10,v:[{b:/^@@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +@@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"comment\",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\\-{3}/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+{3}/,e:/$/},{b:/^\\*{15}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"addition\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"http\",function(e){var t=\"HTTP/[0-9\\\\.]+\";return{aliases:[\"https\"],i:\"\\\\S\",c:[{b:\"^\"+t,e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{b:\"^[A-Z]+ (.*?) \"+t+\"$\",rB:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0},{b:t},{cN:\"keyword\",b:\"[A-Z]+\"}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{e:\"$\",relevance:0}},{b:\"\\\\n\\\\n\",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage(\"sql\",function(e){var t=e.C(\"--\",\"$\");return{cI:!0,i:/[<>{}*]/,c:[{bK:\"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with\",e:/;/,eW:!0,l:/[\\w\\.]+/,k:{keyword:\"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek\",literal:\"true false null unknown\",built_in:\"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\"},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage(\"vala\",function(e){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object Gtk Posix\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface namespace\",e:\"{\",eE:!0,i:\"[^,:\\\\n\\\\s\\\\.]\",c:[e.UTM]},e.CLCM,e.CBCM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',relevance:5},e.ASM,e.QSM,e.CNM,{cN:\"meta\",b:\"^#\",e:\"$\",relevance:2}]}});hljs.registerLanguage(\"asciidoc\",function(e){return{aliases:[\"adoc\"],c:[e.C(\"^/{4,}\\\\n\",\"\\\\n/{4,}$\",{relevance:10}),e.C(\"^//\",\"$\",{relevance:0}),{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",relevance:10},{cN:\"section\",relevance:10,v:[{b:\"^(={1,5}) .+?( \\\\1)?$\"},{b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\"}]},{cN:\"meta\",b:\"^:.+?:\",e:\"\\\\s\",eE:!0,relevance:10},{cN:\"meta\",b:\"^\\\\[.+?\\\\]$\",relevance:0},{cN:\"quote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",relevance:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",relevance:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",relevance:0}],relevance:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"symbol\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",relevance:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",relevance:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",relevance:0}],relevance:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",relevance:0},{cN:\"string\",v:[{b:\"``.+?''\"},{b:\"`.+?'\"}]},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",relevance:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",relevance:0},{b:\"^'{3,}[ \\\\t]*$\",relevance:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:!0,c:[{b:\"(link|image:?):\",relevance:0},{cN:\"link\",b:\"\\\\w\",e:\"[^\\\\[]+\",relevance:0},{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,eE:!0,relevance:0}],relevance:10}]}});hljs.registerLanguage(\"json\",function(e){var i={literal:\"true false null\"},n=[e.CLCM,e.CBCM],c=[e.QSM,e.CNM],r={e:\",\",eW:!0,eE:!0,c:c,k:i},t={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:/\"/,e:/\"/,c:[e.BE],i:\"\\\\n\"},e.inherit(r,{b:/:/})].concat(n),i:\"\\\\S\"},a={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(r)],i:\"\\\\S\"};return c.push(t,a),n.forEach(function(e){c.push(e)}),{c:c,k:i,i:\"\\\\S\"}});hljs.registerLanguage(\"rust\",function(e){var t=\"([ui](8|16|32|64|128|size)|f(32|64))?\",r=\"drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!\";return{aliases:[\"rs\"],k:{keyword:\"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield\",literal:\"true false Some None Ok Err\",built_in:r},l:e.IR+\"!?\",i:\"</\",c:[e.CLCM,e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),e.inherit(e.QSM,{b:/b?\"/,i:null}),{cN:\"string\",v:[{b:/r(#*)\"(.|\\n)*?\"\\1(?!#)/},{b:/b?'\\\\?(x\\w{2}|u\\w{4}|U\\w{8}|.)'/}]},{cN:\"symbol\",b:/'[a-zA-Z_][a-zA-Z0-9_]*/},{cN:\"number\",v:[{b:\"\\\\b0b([01_]+)\"+t},{b:\"\\\\b0o([0-7_]+)\"+t},{b:\"\\\\b0x([A-Fa-f0-9_]+)\"+t},{b:\"\\\\b(\\\\d[\\\\d_]*(\\\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)\"+t}],relevance:0},{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",eE:!0,c:[e.UTM]},{cN:\"meta\",b:\"#\\\\!?\\\\[\",e:\"\\\\]\",c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{cN:\"class\",bK:\"type\",e:\";\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"\\\\S\"},{cN:\"class\",bK:\"trait enum struct union\",e:\"{\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"[\\\\w\\\\d]\"},{b:e.IR+\"::\",k:{built_in:r}},{b:\"->\"}]}});hljs.registerLanguage(\"awk\",function(e){return{k:{keyword:\"BEGIN END if else while do for in break continue delete next nextfile function func exit|10\"},c:[{cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},{cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,relevance:10},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},e.ASM,e.QSM]},e.RM,e.HCM,e.NM]}});hljs.registerLanguage(\"java\",function(e){var a=\"false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do\",t={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0};return{aliases:[\"jsp\"],k:a,i:/<\\/|#/,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{b:/\\w+@/,relevance:0},{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return else\",relevance:0},{cN:\"function\",b:\"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\\\s*,\\\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:a,relevance:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:\"meta\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"cs\",function(e){var a={keyword:\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield\",literal:\"null false true\"},i={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},c={cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},r=e.inherit(c,{i:/\\n/}),n={cN:\"subst\",b:\"{\",e:\"}\",k:a},t=e.inherit(n,{i:/\\n/}),s={cN:\"string\",b:/\\$\"/,e:'\"',i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},e.BE,t]},l={cN:\"string\",b:/\\$@\"/,e:'\"',c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},n]},b=e.inherit(l,{i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},t]});n.c=[l,s,c,e.ASM,e.QSM,i,e.CBCM],t.c=[b,s,r,e.ASM,e.QSM,i,e.inherit(e.CBCM,{i:/\\n/})];var o={v:[l,s,c,e.ASM,e.QSM]},d=e.IR+\"(<\"+e.IR+\"(\\\\s*,\\\\s*\"+e.IR+\")*>)?(\\\\[\\\\])?\";return{aliases:[\"csharp\",\"c#\"],k:a,i:/::/,c:[e.C(\"///\",\"$\",{rB:!0,c:[{cN:\"doctag\",v:[{b:\"///\",relevance:0},{b:\"\\x3c!--|--\\x3e\"},{b:\"</?\",e:\">\"}]}]}),e.CLCM,e.CBCM,{cN:\"meta\",b:\"#\",e:\"$\",k:{\"meta-keyword\":\"if else elif endif define undef warning error line region endregion pragma checksum\"}},o,i,{bK:\"class interface\",e:/[{;=]/,i:/[^\\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"namespace\",e:/[{;=]/,i:/[^\\s:]/,c:[e.inherit(e.TM,{b:\"[a-zA-Z](\\\\.?\\\\w)*\"}),e.CLCM,e.CBCM]},{cN:\"meta\",b:\"^\\\\s*\\\\[\",eB:!0,e:\"\\\\]\",eE:!0,c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{bK:\"new return throw await else\",relevance:0},{cN:\"function\",b:\"(\"+d+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/\\s*[{;=]/,eE:!0,k:a,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:a,relevance:0,c:[o,i,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage(\"mathematica\",function(e){return{aliases:[\"mma\",\"wl\"],l:\"(\\\\$|\\\\b)\"+e.IR+\"\\\\b\",k:\"AASTriangle AbelianGroup Abort AbortKernels AbortProtect AbortScheduledTask Above Abs AbsArg AbsArgPlot Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AcceptanceThreshold AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Activate Active ActiveClassification ActiveClassificationObject ActiveItem ActivePrediction ActivePredictionObject ActiveStyle AcyclicGraphQ AddOnHelpPath AddSides AddTo AddToSearchIndex AddUsers AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AdministrativeDivisionData AffineHalfSpace AffineSpace AffineStateSpaceModel AffineTransform After AggregatedEntityClass AggregationLayer AircraftData AirportData AirPressureData AirTemperatureData AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowAdultContent AllowedCloudExtraParameters AllowedCloudParameterExtensions AllowedDimensions AllowedFrequencyRange AllowedHeads AllowGroupClose AllowIncomplete AllowInlineCells AllowKernelInitialization AllowLooseGrammar AllowReverseGroupClose AllowScriptLevelChange AllTrue Alphabet AlphabeticOrder AlphabeticSort AlphaChannel AlternateImage AlternatingFactorial AlternatingGroup AlternativeHypothesis Alternatives AltitudeMethod AmbientLight AmbiguityFunction AmbiguityList Analytic AnatomyData AnatomyForm AnatomyPlot3D AnatomySkinStyle AnatomyStyling AnchoredSearch And AndersonDarlingTest AngerJ AngleBisector AngleBracket AnglePath AnglePath3D AngleVector AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning AnimationRunTime AnimationTimeIndex Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotate Annotation AnnotationDelete AnnotationNames AnnotationRules AnnotationValue Annuity AnnuityDue Annulus AnomalyDetection AnomalyDetectorFunction Anonymous Antialiasing AntihermitianMatrixQ Antisymmetric AntisymmetricMatrixQ Antonyms AnyOrder AnySubset AnyTrue Apart ApartSquareFree APIFunction Appearance AppearanceElements AppearanceRules AppellF1 Append AppendCheck AppendLayer AppendTo ApplicationIdentificationKey Apply ApplySides ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcCurvature ARCHProcess ArcLength ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Area Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess Around AroundReplace ARProcess Array ArrayComponents ArrayDepth ArrayFilter ArrayFlatten ArrayMesh ArrayPad ArrayPlot ArrayQ ArrayResample ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads ASATriangle Ask AskAppend AskConfirm AskDisplay AskedQ AskedValue AskFunction AskState AskTemplateDisplay AspectRatio AspectRatioFixed Assert AssociateTo Association AssociationFormat AssociationMap AssociationQ AssociationThread AssumeDeterministic Assuming Assumptions AstronomicalData AsymptoticDSolveValue AsymptoticEqual AsymptoticEquivalent AsymptoticGreater AsymptoticGreaterEqual AsymptoticIntegrate AsymptoticLess AsymptoticLessEqual AsymptoticOutputTracker AsymptoticRSolveValue AsymptoticSolve AsymptoticSum Asynchronous AsynchronousTaskObject AsynchronousTasks Atom AtomCoordinates AtomCount AtomDiagramCoordinates AtomList AtomQ AttentionLayer Attributes Audio AudioAmplify AudioAnnotate AudioAnnotationLookup AudioBlockMap AudioCapture AudioChannelAssignment AudioChannelCombine AudioChannelMix AudioChannels AudioChannelSeparate AudioData AudioDelay AudioDelete AudioDevice AudioDistance AudioFade AudioFrequencyShift AudioGenerator AudioIdentify AudioInputDevice AudioInsert AudioIntervals AudioJoin AudioLabel AudioLength AudioLocalMeasurements AudioLooping AudioLoudness AudioMeasurements AudioNormalize AudioOutputDevice AudioOverlay AudioPad AudioPan AudioPartition AudioPause AudioPitchShift AudioPlay AudioPlot AudioQ AudioRecord AudioReplace AudioResample AudioReverb AudioSampleRate AudioSpectralMap AudioSpectralTransformation AudioSplit AudioStop AudioStream AudioStreams AudioTimeStretch AudioTrim AudioType AugmentedPolyhedron AugmentedSymmetricPolynomial Authenticate Authentication AuthenticationDialog AutoAction Autocomplete AutocompletionFunction AutoCopy AutocorrelationTest AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutoQuoteCharacters AutoRefreshed AutoRemove AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords AutoSubmitting Axes AxesEdge AxesLabel AxesOrigin AxesStyle AxiomaticTheory AxisBabyMonsterGroupB Back Background BackgroundAppearance BackgroundTasksSettings Backslash Backsubstitution Backward Ball Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarcodeImage BarcodeRecognize BaringhausHenzeTest BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseDecode BaseEncode BaseForm Baseline BaselinePosition BaseStyle BasicRecurrentLayer BatchNormalizationLayer BatchSize BatesDistribution BattleLemarieWavelet BayesianMaximization BayesianMaximizationObject BayesianMinimization BayesianMinimizationObject Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized Between BetweennessCentrality BeveledPolyhedron BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryDeserialize BinaryDistance BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinarySerialize BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BiquadraticFilterModel BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor BiweightLocation BiweightMidvariance Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockchainAddressData BlockchainBase BlockchainBlockData BlockchainContractValue BlockchainData BlockchainGet BlockchainKeyEncode BlockchainPut BlockchainTokenData BlockchainTransaction BlockchainTransactionData BlockchainTransactionSign BlockchainTransactionSubmit BlockMap BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bond BondCount BondList BondQ Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms BooleanQ BooleanRegion Booleans BooleanStrings BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryDiscretizeGraphics BoundaryDiscretizeRegion BoundaryMesh BoundaryMeshRegion BoundaryMeshRegionQ BoundaryStyle BoundedRegionQ BoundingRegion Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxObject BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break BridgeData BrightnessEqualize BroadcastStationData Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurve3DBoxOptions BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BSplineSurface3DBoxOptions BubbleChart BubbleChart3D BubbleScale BubbleSizes BuildingData BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteArray ByteArrayFormat ByteArrayQ ByteArrayToString ByteCount ByteOrderingC CachedValue CacheGraphics CachePersistence CalendarConvert CalendarData CalendarType Callout CalloutMarker CalloutStyle CallPacket CanberraDistance Cancel CancelButton CandlestickChart CanonicalGraph CanonicalizePolygon CanonicalizePolyhedron CanonicalName CanonicalWarpingCorrespondence CanonicalWarpingDistance CantorMesh CantorStaircase Cap CapForm CapitalDifferentialD Capitalize CapsuleShape CaptureRunning CardinalBSplineBasis CarlemanLinearize CarmichaelLambda CaseOrdering Cases CaseSensitive Cashflow Casoratian Catalan CatalanNumber Catch Catenate CatenateLayer CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling CelestialSystem Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEvaluationLanguage CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellLabelStyle CellLabelTemplate CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterArray CenterDot CentralFeature CentralMoment CentralMomentGeneratingFunction Cepstrogram CepstrogramArray CepstrumArray CForm ChampernowneNumber ChangeOptions ChannelBase ChannelBrokerAction ChannelDatabin ChannelHistoryLength ChannelListen ChannelListener ChannelListeners ChannelListenerWait ChannelObject ChannelPreSendFunction ChannelReceiverFunction ChannelSend ChannelSubscribers ChanVeseBinarize Character CharacterCounts CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterName CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop ChromaticityPlot ChromaticityPlot3D ChromaticPolynomial Circle CircleBox CircleDot CircleMinus CirclePlus CirclePoints CircleThrough CircleTimes CirculantGraph CircularOrthogonalMatrixDistribution CircularQuaternionMatrixDistribution CircularRealMatrixDistribution CircularSymplecticMatrixDistribution CircularUnitaryMatrixDistribution Circumsphere CityData ClassifierFunction ClassifierInformation ClassifierMeasurements ClassifierMeasurementsObject Classify ClassPriors Clear ClearAll ClearAttributes ClearCookies ClearPermissions ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipPlanesStyle ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent CloudAccountData CloudBase CloudConnect CloudDeploy CloudDirectory CloudDisconnect CloudEvaluate CloudExport CloudExpression CloudExpressions CloudFunction CloudGet CloudImport CloudLoggingData CloudObject CloudObjectInformation CloudObjectInformationData CloudObjectNameFormat CloudObjects CloudObjectURLType CloudPublish CloudPut CloudRenderingMethod CloudSave CloudShare CloudSubmit CloudSymbol CloudUnshare ClusterClassify ClusterDissimilarityFunction ClusteringComponents ClusteringTree CMYKColor Coarse CodeAssistOptions Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorBalance ColorCombine ColorConvert ColorCoverage ColorData ColorDataFunction ColorDetect ColorDistance ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQ ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorsNear ColorSpace ColorToneMapping Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CombinedEntityClass CombinerFunction CometData CommonDefaultFormatTypes Commonest CommonestFilter CommonName CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompanyData CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledCodeFunction CompiledFunction CompilerOptions Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComplexListPlot ComplexPlot ComplexPlot3D ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries CompositeQ Composition CompoundElement CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData ComputeUncertainty Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath ConformAudio ConformImages Congruent ConicHullRegion ConicHullRegion3DBox ConicHullRegionBox ConicOptimization Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphComponents ConnectedGraphQ ConnectedMeshComponents ConnectedMoleculeComponents ConnectedMoleculeQ ConnectionSettings ConnectLibraryCallbackFunction ConnectSystemModelComponents ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray ConstantArrayLayer ConstantImage ConstantPlusLayer ConstantRegionQ Constants ConstantTimesLayer ConstellationData ConstrainedMax ConstrainedMin Construct Containing ContainsAll ContainsAny ContainsExactly ContainsNone ContainsOnly ContentFieldOptions ContentLocationFunction ContentObject ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTask ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean ContrastiveLossLayer Control ControlActive ControlAlignment ControlGroupContentsBox ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket ConvexHullMesh ConvexPolygonQ ConvexPolyhedronQ ConvolutionLayer Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CookieFunction Cookies CoordinateBoundingBox CoordinateBoundingBoxArray CoordinateBounds CoordinateBoundsArray CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDatabin CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CountDistinct CountDistinctBy CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Counts CountsBy Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateCellID CreateChannel CreateCloudExpression CreateDatabin CreateDataSystemModel CreateDialog CreateDirectory CreateDocument CreateFile CreateIntermediateDirectories CreateManagedLibraryExpression CreateNotebook CreatePalette CreatePalettePacket CreatePermissionsGroup CreateScheduledTask CreateSearchIndex CreateSystemModel CreateTemporary CreateUUID CreateWindow CriterionFunction CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossEntropyLossLayer CrossingCount CrossingDetect CrossingPolygon CrossMatrix Csc Csch CTCLossLayer Cube CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrencyConvert CurrentDate CurrentImage CurrentlySpeakingPacket CurrentNotebookImage CurrentScreenImage CurrentValue Curry CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecompositionD DagumDistribution DamData DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DatabaseConnect DatabaseDisconnect DatabaseReference Databin DatabinAdd DatabinRemove Databins DatabinUpload DataCompression DataDistribution DataRange DataReversed Dataset Date DateBounds Dated DateDelimiters DateDifference DatedUnit DateFormat DateFunction DateHistogram DateList DateListLogPlot DateListPlot DateListStepPlot DateObject DateObjectQ DateOverlapsQ DatePattern DatePlus DateRange DateReduction DateString DateTicksFormat DateValue DateWithinQ DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayHemisphere DaylightQ DayMatchQ DayName DayNightTerminator DayPlus DayRange DayRound DeBruijnGraph DeBruijnSequence Debug DebugTag Decapitalize Decimal DecimalForm DeclareKnownSymbols DeclarePackage Decompose DeconvolutionLayer Decrement Decrypt DecryptFile DedekindEta DeepSpaceProbeData Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultPrintPrecision DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValue DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod DefineResourceFunction Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic DEigensystem DEigenvalues Deinitialization Del DelaunayMesh Delayed Deletable Delete DeleteAnomalies DeleteBorderComponents DeleteCases DeleteChannel DeleteCloudExpression DeleteContents DeleteDirectory DeleteDuplicates DeleteDuplicatesBy DeleteFile DeleteMissing DeleteObject DeletePermissionsKey DeleteSearchIndex DeleteSmallComponents DeleteStopwords DeleteWithContents DeletionWarning DelimitedArray DelimitedSequence Delimiter DelimiterFlashTime DelimiterMatching Delimiters DeliveryFunction Dendrogram Denominator DensityGraphics DensityHistogram DensityPlot DensityPlot3D DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DerivedKey DescriptorStateSpace DesignMatrix DestroyAfterEvaluation Det DeviceClose DeviceConfigure DeviceExecute DeviceExecuteAsynchronous DeviceObject DeviceOpen DeviceOpenQ DeviceRead DeviceReadBuffer DeviceReadLatest DeviceReadList DeviceReadTimeSeries Devices DeviceStreams DeviceWrite DeviceWriteBuffer DGaussianWavelet DiacriticalPositioning Diagonal DiagonalizableMatrixQ DiagonalMatrix DiagonalMatrixQ Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DictionaryWordQ DifferenceDelta DifferenceOrder DifferenceQuotient DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitalSignature DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralAngle DihedralGroup Dilation DimensionalCombinations DimensionalMeshComponents DimensionReduce DimensionReducerFunction DimensionReduction Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletBeta DirichletCharacter DirichletCondition DirichletConvolve DirichletDistribution DirichletEta DirichletL DirichletLambda DirichletTransform DirichletWindow DisableConsolePrintPacket DisableFormatting DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLimit DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscreteMaxLimit DiscreteMinLimit DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform DiscretizeGraphics DiscretizeRegion Discriminant DisjointQ Disjunction Disk DiskBox DiskMatrix DiskSegment Dispatch DispatchQ DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceMatrix DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers DivideSides Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentGenerator DocumentGeneratorInformation DocumentGeneratorInformationData DocumentGenerators DocumentNotebook DocumentWeightingRules Dodecahedron DomainRegistrationInformation DominantColors DOSTextFormat Dot DotDashed DotEqual DotLayer DotPlusLayer Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DropoutLayer DSolve DSolveValue Dt DualLinearProgramming DualPolyhedron DualSystemsModel DumpGet DumpSave DuplicateFreeQ Duration Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicGeoGraphics DynamicImage DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptionsE EarthImpactData EarthquakeData EccentricityCentrality Echo EchoFunction EclipseType EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeContract EdgeCost EdgeCount EdgeCoverQ EdgeCycleMatrix EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight EdgeWeightedGraphQ Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData ElementwiseLayer ElidedForms Eliminate EliminationOrder Ellipsoid EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmbedCode EmbeddedHTML EmbeddedService EmbeddingLayer EmbeddingObject EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EmptyRegion EnableConsolePrintPacket Enabled Encode Encrypt EncryptedObject EncryptFile End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfBuffer EndOfFile EndOfLine EndOfString EndPackage EngineEnvironment EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entity EntityClass EntityClassList EntityCopies EntityFunction EntityGroup EntityInstance EntityList EntityPrefetch EntityProperties EntityProperty EntityPropertyClass EntityRegister EntityStore EntityStores EntityTypeName EntityUnregister EntityValue Entropy EntropyFilter Environment Epilog EpilogFunction Equal EqualColumns EqualRows EqualTilde EqualTo EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EscapeRadius EstimatedBackground EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerAngles EulerCharacteristic EulerE EulerGamma EulerianGraphQ EulerMatrix EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluateScheduledTask EvaluationBox EvaluationCell EvaluationCompletionAction EvaluationData EvaluationElements EvaluationEnvironment EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels EventSeries ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludedLines ExcludedPhysicalQuantities ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog ExoplanetData Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi ExpirationDate Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportByteArray ExportForm ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpressionUUID ExpToTrig ExtendedEntityClass ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalBundle ExternalCall ExternalDataCharacterEncoding ExternalEvaluate ExternalFunction ExternalFunctionName ExternalObject ExternalOptions ExternalSessionObject ExternalSessions ExternalTypeSignature ExternalValue Extract ExtractArchive ExtractLayer ExtremeValueDistributionFaceForm FaceGrids FaceGridsStyle FacialFeatures Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail Failure FailureAction FailureDistribution FailureQ False FareySequence FARIMAProcess FeatureDistance FeatureExtract FeatureExtraction FeatureExtractor FeatureExtractorFunction FeatureNames FeatureNearest FeatureSpacePlot FeatureSpacePlot3D FeatureTypes FEDisableConsolePrintPacket FeedbackLinearize FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket FetalGrowthData Fibonacci Fibonorial FieldCompletionFunction FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileConvert FileDate FileExistsQ FileExtension FileFormat FileHandler FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameForms FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileSize FileSystemMap FileSystemScan FileTemplate FileTemplateApply FileType FilledCurve FilledCurveBox FilledCurveBoxOptions Filling FillingStyle FillingTransform FilteredEntityClass FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindAnomalies FindArgMax FindArgMin FindChannels FindClique FindClusters FindCookies FindCurvePath FindCycle FindDevices FindDistribution FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEdgeIndependentPaths FindEquationalProof FindEulerianCycle FindExternalEvaluators FindFaces FindFile FindFit FindFormula FindFundamentalCycles FindGeneratingFunction FindGeoLocation FindGeometricConjectures FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindHamiltonianPath FindHiddenMarkovStates FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMatchingColor FindMaximum FindMaximumFlow FindMaxValue FindMeshDefects FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindMoleculeSubstructure FindPath FindPeaks FindPermutation FindPostmanTour FindProcessParameters FindRepeat FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindSpanningTree FindSystemModelEquilibrium FindTextualAnswer FindThreshold FindTransientRepeat FindVertexCover FindVertexCut FindVertexIndependentPaths Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstCase FirstPassageTimeDistribution FirstPosition FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FitRegularization FittedModel FixedOrder FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlattenLayer FlatTopWindow FlipView Floor FlowPolynomial FlushPrintOutputPacket Fold FoldList FoldPair FoldPairList FollowRedirects Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FormControl FormFunction FormLayoutFunction FormObject FormPage FormTheme FormulaData FormulaLookup FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalGaussianNoiseProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameRate FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrenetSerretSystem FrequencySamplingFilterKernel FresnelC FresnelF FresnelG FresnelS Friday FrobeniusNumber FrobeniusSolve FromAbsoluteTime FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS FromEntity FromJulianDate FromLetterNumber FromPolarCoordinates FromRomanNumeral FromSphericalCoordinates FromUnixTime Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullInformationOutputRegulator FullOptions FullRegion FullSimplify Function FunctionCompile FunctionCompileExport FunctionCompileExportByteArray FunctionCompileExportLibrary FunctionCompileExportString FunctionDomain FunctionExpand FunctionInterpolation FunctionPeriod FunctionRange FunctionSpace FussellVeselyImportanceGaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins GalaxyData GalleryView Gamma GammaDistribution GammaRegularized GapPenalty GARCHProcess GatedRecurrentLayer Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianOrthogonalMatrixDistribution GaussianSymplecticMatrixDistribution GaussianUnitaryMatrixDistribution GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateAsymmetricKeyPair GenerateConditions GeneratedCell GeneratedDocumentBinding GenerateDerivedKey GenerateDigitalSignature GenerateDocument GeneratedParameters GeneratedQuantityMagnitudes GenerateHTTPResponse GenerateSecuredAuthenticationKey GenerateSymmetricKey GeneratingFunction GeneratorDescription GeneratorHistoryLength GeneratorOutputType Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeoAntipode GeoArea GeoArraySize GeoBackground GeoBoundingBox GeoBounds GeoBoundsRegion GeoBubbleChart GeoCenter GeoCircle GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDisk GeoDisplacement GeoDistance GeoDistanceList GeoElevationData GeoEntities GeoGraphics GeogravityModelData GeoGridDirectionDifference GeoGridLines GeoGridLinesStyle GeoGridPosition GeoGridRange GeoGridRangePadding GeoGridUnitArea GeoGridUnitDistance GeoGridVector GeoGroup GeoHemisphere GeoHemisphereBoundary GeoHistogram GeoIdentify GeoImage GeoLabels GeoLength GeoListPlot GeoLocation GeologicalPeriodData GeomagneticModelData GeoMarker GeometricAssertion GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricScene GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoModel GeoNearest GeoPath GeoPosition GeoPositionENU GeoPositionXYZ GeoProjection GeoProjectionData GeoRange GeoRangePadding GeoRegionValuePlot GeoResolution GeoScaleBar GeoServer GeoSmoothHistogram GeoStreamPlot GeoStyling GeoStylingImageFunction GeoVariant GeoVector GeoVectorENU GeoVectorPlot GeoVectorXYZ GeoVisibleRegion GeoVisibleRegionBoundary GeoWithinQ GeoZoomLevel GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenAngle GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter GrammarApply GrammarRules GrammarToken Graph Graph3D GraphAssortativity GraphAutomorphismGroup GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel Greater GreaterEqual GreaterEqualLess GreaterEqualThan GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterThan GreaterTilde Green GreenFunction Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupBy GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators Groupings GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain GroupTogetherGrouping GroupTogetherNestedGrouping GrowCutComponents Gudermannian GuidedFilter GumbelDistributionHaarWavelet HadamardMatrix HalfLine HalfNormalDistribution HalfPlane HalfSpace HamiltonianGraphQ HammingDistance HammingWindow HandlerFunctions HandlerFunctionsKeys HankelH1 HankelH2 HankelMatrix HankelTransform HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash Haversine HazardFunction Head HeadCompose HeaderLines Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings Here HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenMarkovProcess HiddenSurface Highlighted HighlightGraph HighlightImage HighlightMesh HighpassFilter HigmanSimsGroupHS HilbertCurve HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HistoricalPeriodData HitMissTransform HITSCentrality HjorthDistribution HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HostLookup HotellingTSquareDistribution HoytDistribution HTMLSave HTTPErrorResponse HTTPRedirect HTTPRequest HTTPRequestData HTTPResponse Hue HumanGrowthData HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyperplane Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestDataI IconData Iconize IconizedObject IconRules Icosahedron Identity IdentityMatrix If IgnoreCase IgnoreDiacritics IgnorePunctuation IgnoreSpellCheck IgnoringInactive Im Image Image3D Image3DProjection Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageApplyIndexed ImageAspectRatio ImageAssemble ImageAugmentationLayer ImageBoundingBoxes ImageCache ImageCacheValid ImageCapture ImageCaptureFunction ImageCases ImageChannels ImageClip ImageCollage ImageColorSpace ImageCompose ImageContainsQ ImageContents ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDisplacements ImageDistance ImageEffect ImageExposureCombine ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageFocusCombine ImageForestingComponents ImageFormattingWidth ImageForwardTransformation ImageGraphics ImageHistogram ImageIdentify ImageInstanceQ ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarker ImageMarkers ImageMeasurements ImageMesh ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImagePosition ImagePreviewFunction ImagePyramid ImagePyramidApply ImageQ ImageRangeCache ImageRecolor ImageReflect ImageRegion ImageResize ImageResolution ImageRestyle ImageRotate ImageRotated ImageSaliencyFilter ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions ImagingDevice ImplicitRegion Implies Import ImportAutoReplacements ImportByteArray ImportOptions ImportString ImprovementImportance In Inactivate Inactive IncidenceGraph IncidenceList IncidenceMatrix IncludeAromaticBonds IncludeConstantBasis IncludeDefinitions IncludeDirectories IncludeFileExtension IncludeGeneratorTasks IncludeHydrogens IncludeInflections IncludeMetaInformation IncludePods IncludeQuantities IncludeRelatedTables IncludeSingularTerm IncludeWindowTimes Increment IndefiniteMatrixQ Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentPhysicalQuantity IndependentUnit IndependentUnitDimension IndependentVertexSetQ Indeterminate IndeterminateThreshold IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers InfiniteLine InfinitePlane Infinity Infix InflationAdjust InflationMethod Information InformationData InformationDataGrid Inherited InheritScope InhomogeneousPoissonProcess InitialEvaluationHistory Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InitializationObjects InitializationValue Initialize InitialSeeding InlineCounterAssignments InlineCounterIncrements InlineRules Inner InnerPolygon InnerPolyhedron Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionFunction InsertionPointObject InsertLinebreaks InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Insphere Install InstallService InstanceNormalizationLayer InString Integer IntegerDigits IntegerExponent IntegerLength IntegerName IntegerPart IntegerPartitions IntegerQ IntegerReverse Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction Interpreter InterpretTemplate InterquartileRange Interrupt InterruptSettings IntersectingQ Intersection Interval IntervalIntersection IntervalMarkers IntervalMarkersStyle IntervalMemberQ IntervalSlider IntervalUnion Into Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHankelTransform InverseHaversine InverseImagePyramid InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InverseMellinTransform InversePermutation InverseRadon InverseRadonTransform InverseSeries InverseShortTimeFourier InverseSpectrogram InverseSurvivalFunction InverseTransformedRegion InverseWaveletTransform InverseWeierstrassP InverseWishartMatrixDistribution InverseZTransform Invisible InvisibleApplication InvisibleTimes IPAddress IrreduciblePolynomialQ IslandData IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemAspectRatio ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcessJaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join JoinAcross Joined JoinedCurve JoinedCurveBox JoinedCurveBoxOptions JoinForm JordanDecomposition JordanModelDecomposition JulianDate JuliaSetBoettcher JuliaSetIterationCount JuliaSetPlot JuliaSetPointsK KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KEdgeConnectedComponents KEdgeConnectedGraphQ KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelFunction KernelMixtureDistribution Kernels Ket Key KeyCollisionFunction KeyComplement KeyDrop KeyDropFrom KeyExistsQ KeyFreeQ KeyIntersection KeyMap KeyMemberQ KeypointStrength Keys KeySelect KeySort KeySortBy KeyTake KeyUnion KeyValueMap KeyValuePattern Khinchin KillProcess KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnapsackSolve KnightTourGraph KnotData KnownUnitQ KochCurve KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter KVertexConnectedComponents KVertexConnectedGraphQLABColor Label Labeled LabeledSlider LabelingFunction LabelingSize LabelStyle LabelVisibility LaguerreL LakeData LambdaComponents LambertW LaminaData LanczosWindow LandauDistribution Language LanguageCategory LanguageData LanguageIdentify LanguageOptions LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCHColor LCM LeaderSize LeafCount LeapYearQ LearnDistribution LearnedDistribution LearningRate LearningRateMultipliers LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessEqualThan LessFullEqual LessGreater LessLess LessSlantEqual LessThan LessTilde LetterCharacter LetterCounts LetterNumber LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryDataType LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox Line3DBoxOptions LinearFilter LinearFractionalOptimization LinearFractionalTransform LinearGradientImage LinearizingTransformationData LinearLayer LinearModelFit LinearOffsetFunction LinearOptimization LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBoxOptions LineBreak LinebreakAdjustments LineBreakChart LinebreakSemicolonWeighting LineBreakWithin LineColor LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRankCentrality LinkRead LinkReadHeld LinkReadyQ Links LinkService LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot ListDensityPlot3D Listen ListFormat ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListSliceContourPlot3D ListSliceDensityPlot3D ListSliceVectorPlot3D ListStepPlot ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalAdaptiveBinarize LocalCache LocalClusteringCoefficient LocalizeDefinitions LocalizeVariables LocalObject LocalObjects LocalResponseNormalizationLayer LocalSubmit LocalSymbol LocalTime LocalTimeZone LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogisticSigmoid LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongestOrderedSequence LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow LongShortTermMemoryLayer Lookup Loopback LoopFreeGraphQ LossFunction LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowerTriangularMatrixQ LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LunarEclipse LUVColor LyapunovSolve LyonsGroupLyMachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MailAddressValidation MailExecute MailFolder MailItem MailReceiverFunction MailResponseFunction MailSearch MailServerConnect MailServerConnection MailSettings MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules ManagedLibraryExpressionID ManagedLibraryExpressionQ MandelbrotSetBoettcher MandelbrotSetDistance MandelbrotSetIterationCount MandelbrotSetMemberQ MandelbrotSetPlot MangoldtLambda ManhattanDistance Manipulate Manipulator MannedSpaceMissionData MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarchenkoPasturDistribution MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicalFunctionData MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixNormalDistribution MatrixPlot MatrixPower MatrixPropertyDistribution MatrixQ MatrixRank MatrixTDistribution Max MaxBend MaxCellMeasure MaxColorDistance MaxDetect MaxDuration MaxExtraBandwidths MaxExtraConditions MaxFeatureDisplacement MaxFeatures MaxFilter MaximalBy Maximize MaxItems MaxIterations MaxLimit MaxMemoryUsed MaxMixtureKernels MaxOverlapFraction MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxTrainingRounds MaxValue MaxwellDistribution MaxWordGap McLaughlinGroupMcL Mean MeanAbsoluteLossLayer MeanAround MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter MeanSquaredLossLayer Median MedianDeviation MedianFilter MedicalTestData Medium MeijerG MeijerGReduce MeixnerDistribution MellinConvolve MellinTransform MemberQ MemoryAvailable MemoryConstrained MemoryConstraint MemoryInUse MengerMesh Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuList MenuPacket MenuSortingValue MenuStyle MenuView Merge MergeDifferences MergingFunction MersennePrimeExponent MersennePrimeExponentQ Mesh MeshCellCentroid MeshCellCount MeshCellHighlight MeshCellIndex MeshCellLabel MeshCellMarker MeshCellMeasure MeshCellQuality MeshCells MeshCellShapeFunction MeshCellStyle MeshCoordinates MeshFunctions MeshPrimitives MeshQualityGoal MeshRange MeshRefinementFunction MeshRegion MeshRegionQ MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageObject MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation MeteorShowerData Method MethodOptions MexicanHatWavelet MeyerWavelet Midpoint Min MinColorDistance MinDetect MineralData MinFilter MinimalBy MinimalPolynomial MinimalStateSpaceModel Minimize MinimumTimeIncrement MinIntervalSize MinkowskiQuestionMark MinLimit MinMax MinorPlanetData Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingBehavior MissingDataMethod MissingDataRules MissingQ MissingString MissingStyle MissingValuePattern MittagLefflerE MixedFractionParts MixedGraphQ MixedMagnitude MixedRadix MixedRadixQuantity MixedUnit MixtureDistribution Mod Modal Mode Modular ModularInverse ModularLambda Module Modulus MoebiusMu Molecule MoleculeContainsQ MoleculeEquivalentQ MoleculeGraph MoleculeModify MoleculePattern MoleculePlot MoleculePlot3D MoleculeProperty MoleculeQ MoleculeValue Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction MomentOfInertia Monday Monitor MonomialList MonomialOrder MonsterGroupM MoonPhase MoonPosition MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform MortalityData Most MountainData MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovieData MovingAverage MovingMap MovingMedian MoyalDistribution Multicolumn MultiedgeStyle MultigraphQ MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity MultiplySides Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistributionN NakagamiDistribution NameQ Names NamespaceBox NamespaceBoxOptions Nand NArgMax NArgMin NBernoulliB NBodySimulation NBodySimulationData NCache NDEigensystem NDEigenvalues NDSolve NDSolveValue Nearest NearestFunction NearestNeighborGraph NearestTo NebulaData NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeDefiniteMatrixQ NegativeIntegers NegativeMultinomialDistribution NegativeRationals NegativeReals NegativeSemidefiniteMatrixQ NeighborhoodData NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestGraph NestList NestWhile NestWhileList NetAppend NetBidirectionalOperator NetChain NetDecoder NetDelete NetDrop NetEncoder NetEvaluationMode NetExtract NetFlatten NetFoldOperator NetGraph NetInformation NetInitialize NetInsert NetInsertSharedArrays NetJoin NetMapOperator NetMapThreadOperator NetMeasurements NetModel NetNestOperator NetPairEmbeddingOperator NetPort NetPortGradient NetPrepend NetRename NetReplace NetReplacePart NetSharedArray NetStateObject NetTake NetTrain NetTrainResultsObject NetworkPacketCapture NetworkPacketRecording NetworkPacketRecordingDuring NetworkPacketTrace NeumannValue NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextCell NextDate NextPrime NextScheduledTaskTime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NightHemisphere NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants NondimensionalizationTransform None NoneTrue NonlinearModelFit NonlinearStateSpaceModel NonlocalMeansFilter NonNegative NonNegativeIntegers NonNegativeRationals NonNegativeReals NonPositive NonPositiveIntegers NonPositiveRationals NonPositiveReals Nor NorlundB Norm Normal NormalDistribution NormalGrouping NormalizationLayer Normalize Normalized NormalizedSquaredEuclideanDistance NormalMatrixQ NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookImport NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookTemplate NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde Nothing NotHumpDownHump NotHumpEqual NotificationFunction NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar Now NoWhitespace NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms NuclearExplosionData NuclearReactorData Null NullRecords NullSpace NullWords Number NumberCompose NumberDecompose NumberExpand NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberLinePlot NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumeratorDenominator NumericalOrder NumericalSort NumericArray NumericArrayQ NumericArrayType NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlotO ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OceanData Octahedron OddQ Off Offset OLEData On ONanGroupON Once OneIdentity Opacity OpacityFunction OpacityFunctionScaling Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionalElement OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering OrderingBy OrderingLayer Orderless OrderlessPatternSequence OrnsteinUhlenbeckProcess Orthogonalize OrthogonalMatrixQ Out Outer OuterPolygon OuterPolyhedron OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OverwriteTarget OwenT OwnValuesPackage PackingMethod PaddedForm Padding PaddingLayer PaddingSize PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageTheme PageWidth Pagination PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath PalindromeQ Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo Parallelepiped ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds Parallelogram ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParametricRegion ParentBox ParentCell ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParentNotebook ParetoDistribution ParetoPickandsDistribution ParkData Part PartBehavior PartialCorrelationFunction PartialD ParticleAcceleratorData ParticleData Partition PartitionGranularity PartitionsP PartitionsQ PartLayer PartOfSpeech PartProtection ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteAutoQuoteCharacters PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PeakDetect PeanoCurve PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PercentForm PerfectNumber PerfectNumberQ PerformanceGoal Perimeter PeriodicBoundaryCondition PeriodicInterpolation Periodogram PeriodogramArray Permanent Permissions PermissionsGroup PermissionsGroupMemberQ PermissionsGroups PermissionsKey PermissionsKeys PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PerpendicularBisector PersistenceLocation PersistenceTime PersistentObject PersistentObjects PersistentValue PersonData PERTDistribution PetersenGraph PhaseMargins PhaseRange PhysicalSystemData Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest PingTime Pink PitchRecognize Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarAngle PlanarGraph PlanarGraphQ PlanckRadiationLaw PlaneCurveData PlanetaryMoonData PlanetData PlantData Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLabels PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangeClipPlanesStyle PlotRangePadding PlotRegion PlotStyle PlotTheme Pluralize Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox Point3DBoxOptions PointBox PointBoxOptions PointFigureChart PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonalNumber PolygonAngle PolygonBox PolygonBoxOptions PolygonCoordinates PolygonDecomposition PolygonHoleScale PolygonIntersections PolygonScale Polyhedron PolyhedronAngle PolyhedronCoordinates PolyhedronData PolyhedronDecomposition PolyhedronGenus PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PoolingLayer PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position PositionIndex Positive PositiveDefiniteMatrixQ PositiveIntegers PositiveRationals PositiveReals PositiveSemidefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerRange PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement Predict PredictionRoot PredictorFunction PredictorInformation PredictorMeasurements PredictorMeasurementsObject PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependLayer PrependTo PreprocessingRules PreserveColor PreserveImageOptions Previous PreviousCell PreviousDate PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitivePolynomialQ PrimitiveRoot PrimitiveRootList PrincipalComponents PrincipalValue Print PrintableASCIIQ PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment Printout3D Printout3DPreviewer PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateKey PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessConnection ProcessDirectory ProcessEnvironment Processes ProcessEstimator ProcessInformation ProcessObject ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessStatus ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm ProofObject Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse PsychrometricPropertyData PublicKey PublisherID PulsarData PunctuationCharacter Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptionsQBinomial QFactorial QGamma QHypergeometricPFQ QnDispersion QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ QuadraticOptimization Quantile QuantilePlot Quantity QuantityArray QuantityDistribution QuantityForm QuantityMagnitude QuantityQ QuantityUnit QuantityVariable QuantityVariableCanonicalUnit QuantityVariableDimensions QuantityVariableIdentifier QuantityVariablePhysicalQuantity Quartics QuartileDeviation Quartiles QuartileSkewness Query QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainderRadialGradientImage RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RadonTransform RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Ramp Random RandomChoice RandomColor RandomComplex RandomEntity RandomFunction RandomGeoPosition RandomGraph RandomImage RandomInstance RandomInteger RandomPermutation RandomPoint RandomPolygon RandomPolyhedron RandomPrime RandomReal RandomSample RandomSeed RandomSeeding RandomVariate RandomWalkProcess RandomWord Range RangeFilter RangeSpecification RankedMax RankedMin RarerProbability Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadByteArray ReadLine ReadList ReadProtected ReadString Real RealAbs RealBlockDiagonalForm RealDigits RealExponent Reals RealSign Reap RecognitionPrior RecognitionThreshold Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RectangularRepeatingElement RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate Region RegionBinarize RegionBoundary RegionBounds RegionCentroid RegionDifference RegionDimension RegionDisjoint RegionDistance RegionDistanceFunction RegionEmbeddingDimension RegionEqual RegionFunction RegionImage RegionIntersection RegionMeasure RegionMember RegionMemberFunction RegionMoment RegionNearest RegionNearestFunction RegionPlot RegionPlot3D RegionProduct RegionQ RegionResize RegionSize RegionSymmetricDifference RegionUnion RegionWithin RegisterExternalEvaluator RegularExpression Regularization RegularlySampledQ RegularPolygon ReIm ReImLabels ReImPlot ReImStyle Reinstall RelationalDatabase RelationGraph Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot RemoteAuthorizationCaching RemoteConnect RemoteConnectionObject RemoteFile RemoteRun RemoteRunProcess Remove RemoveAlphaChannel RemoveAsynchronousTask RemoveAudioStream RemoveBackground RemoveChannelListener RemoveChannelSubscribers Removed RemoveDiacritics RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RemoveUsers RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart RepairMesh Repeated RepeatedNull RepeatedString RepeatedTiming RepeatingElement Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated ReplicateLayer RequiredPhysicalQuantities Resampling ResamplingAlgorithmData ResamplingMethod Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask ReshapeLayer Residue ResizeLayer Resolve ResourceAcquire ResourceData ResourceFunction ResourceObject ResourceRegister ResourceRemove ResourceSearch ResourceSubmissionObject ResourceSubmit ResourceSystemBase ResourceUpdate ResponseForm Rest RestartInterval Restricted Resultant ResumePacket Return ReturnEntersInput ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnReceiptFunction ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseSort ReverseSortBy ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ RiemannXi Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightComposition RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity RollPitchYawAngles RollPitchYawMatrix RomanNumeral Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RSolveValue RudinShapiro RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulePlot RulerUnits Run RunProcess RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilaritySameQ SameTest SampledEntityClass SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SASTriangle SatelliteData SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveConnection SaveDefinitions SavitzkyGolayMatrix SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTask ScheduledTaskActiveQ ScheduledTaskInformation ScheduledTaskInformationData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScientificNotationThreshold ScorerGi ScorerGiPrime ScorerHi ScorerHiPrime ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptForm ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition SearchAdjustment SearchIndexObject SearchIndices SearchQueryString SearchResultObject Sec Sech SechDistribution SecondOrderConeOptimization SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SecuredAuthenticationKey SecuredAuthenticationKeys SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook SelectFirst Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemanticImport SemanticImportString SemanticInterpretation SemialgebraicComponentInstances SemidefiniteOptimization SendMail SendMessage Sequence SequenceAlignment SequenceAttentionLayer SequenceCases SequenceCount SequenceFold SequenceFoldList SequenceForm SequenceHold SequenceLastLayer SequenceMostLayer SequencePosition SequencePredict SequencePredictorFunction SequenceReplace SequenceRestLayer SequenceReverseLayer SequenceSplit Series SeriesCoefficient SeriesData ServiceConnect ServiceDisconnect ServiceExecute ServiceObject ServiceRequest ServiceResponse ServiceSubmit SessionSubmit SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetCloudDirectory SetCookies SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPermissions SetPrecision SetProperty SetSecuredAuthenticationKey SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemModel SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetUsers SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share SharingList Sharpen ShearingMatrix ShearingTransform ShellRegion ShenCastanMatrix ShiftedGompertzDistribution ShiftRegisterSequence Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortTimeFourier ShortTimeFourierData ShortUpArrow Show ShowAutoConvert ShowAutoSpellCheck ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowCodeAssist ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiderealTime SiegelTheta SiegelTukeyTest SierpinskiCurve SierpinskiMesh Sign Signature SignedRankTest SignedRegionDistance SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ SimplePolygonQ SimplePolyhedronQ Simplex Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution SkinStyle Skip SliceContourPlot3D SliceDensityPlot3D SliceDistribution SliceVectorPlot3D Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDecomposition SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SnDispersion Snippet SnubPolyhedron SocialMediaData Socket SocketConnect SocketListen SocketListener SocketObject SocketOpen SocketReadMessage SocketReadyQ Sockets SocketWaitAll SocketWaitNext SoftmaxLayer SokalSneathDissimilarity SolarEclipse SolarSystemFeatureData SolidAngle SolidData SolidRegionQ Solve SolveAlways SolveDelayed Sort SortBy SortedBy SortedEntityClass Sound SoundAndGraphics SoundNote SoundVolume SourceLink Sow Space SpaceCurveData SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution SpatialMedian SpatialTransformationLayer Speak SpeakTextPacket SpearmanRankTest SpearmanRho SpeciesData SpecificityGoal SpectralLineData Spectrogram SpectrogramArray Specularity SpeechRecognize SpeechSynthesize SpellingCorrection SpellingCorrectionList SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SpherePoints SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SphericalShell SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquareMatrixQ SquareRepeatingElement SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave SSSTriangle StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackedDateListPlot StackedListPlot StackInhibit StadiumShape StandardAtmosphereData StandardDeviation StandardDeviationFilter StandardForm Standardize Standardized StandardOceanData StandbyDistribution Star StarClusterData StarData StarGraph StartAsynchronousTask StartExternalSession StartingStepSize StartOfLine StartOfString StartProcess StartScheduledTask StartupSound StartWebSession StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StateTransformationLinearize StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StereochemistryElements StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StoppingPowerData StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamMarkers StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringContainsQ StringCount StringDelete StringDrop StringEndsQ StringExpression StringExtract StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPadLeft StringPadRight StringPart StringPartition StringPosition StringQ StringRepeat StringReplace StringReplaceList StringReplacePart StringReverse StringRiffle StringRotateLeft StringRotateRight StringSkeleton StringSplit StringStartsQ StringTake StringTemplate StringToByteArray StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleData StyleDefinitions StyleForm StyleHints StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subdivide Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subsequences Subset SubsetEqual SubsetMap SubsetQ Subsets SubStar SubstitutionSystem Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubtractSides SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde Success SuchThat Sum SumConvergence SummationLayer Sunday SunPosition Sunrise Sunset SuperDagger SuperMinus SupernovaData SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceArea SurfaceColor SurfaceData SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricKey SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Synonyms Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SynthesizeMissingValues SystemDialogInput SystemException SystemGet SystemHelpPath SystemInformation SystemInformationData SystemInstall SystemModel SystemModeler SystemModelExamples SystemModelLinearize SystemModelParametricSimulate SystemModelPlot SystemModelProgressReporting SystemModelReliability SystemModels SystemModelSimulate SystemModelSimulateSensitivity SystemModelSimulationData SystemOpen SystemOptions SystemProcessData SystemProcesses SystemsConnectionsModel SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelLinearity SystemsModelMerge SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemsModelVectorRelativeOrders SystemStub SystemTestTab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TableViewBoxBackground TableViewBoxOptions TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeDrop TakeLargest TakeLargestBy TakeList TakeSmallest TakeSmallestBy TakeWhile Tally Tan Tanh TargetDevice TargetFunctions TargetSystem TargetUnits TaskAbort TaskExecute TaskObject TaskRemove TaskResume Tasks TaskSuspend TaskWait TautologyQ TelegraphProcess TemplateApply TemplateArgBox TemplateBox TemplateBoxOptions TemplateEvaluate TemplateExpression TemplateIf TemplateObject TemplateSequence TemplateSlot TemplateSlotSequence TemplateUnevaluated TemplateVerbatim TemplateWith TemporalData TemporalRegularity Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge TestID TestReport TestReportObject TestResultObject Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCases TextCell TextClipboardType TextContents TextData TextElement TextForm TextGrid TextJustification TextLine TextPacket TextParagraph TextPosition TextRecognize TextSearch TextSearchReport TextSentences TextString TextStructure TextStyle TextTranslation Texture TextureCoordinateFunction TextureCoordinateScaling TextWords Therefore ThermodynamicData ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreadingLayer ThreeJSymbol Threshold Through Throw ThueMorse Thumbnail Thursday Ticks TicksStyle TideData Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint TimeDirection TimeFormat TimeGoal TimelinePlot TimeObject TimeObjectQ Times TimesBy TimeSeries TimeSeriesAggregate TimeSeriesForecast TimeSeriesInsert TimeSeriesInvertibility TimeSeriesMap TimeSeriesMapThread TimeSeriesModel TimeSeriesModelFit TimeSeriesResample TimeSeriesRescale TimeSeriesShift TimeSeriesThread TimeSeriesWindow TimeUsed TimeValue TimeWarpingCorrespondence TimeWarpingDistance TimeZone TimeZoneConvert TimeZoneOffset Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate Today ToDiscreteTimeModel ToEntity ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase Tomorrow ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform ToPolarCoordinates TopologicalSort ToRadicals ToRules ToSphericalCoordinates ToString Total TotalHeight TotalLayer TotalVariationFilter TotalWidth TouchPosition TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TrackingFunction TracyWidomDistribution TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TrainingProgressCheckpointing TrainingProgressFunction TrainingProgressMeasurements TrainingProgressReporting TrainingStoppingCriterion TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationClass TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField TransformedProcess TransformedRegion TransitionDirection TransitionDuration TransitionEffect TransitiveClosureGraph TransitiveReductionGraph Translate TranslationOptions TranslationTransform Transliterate Transparent TransparentColor Transpose TransposeLayer TrapSelection TravelDirections TravelDirectionsData TravelDistance TravelDistanceList TravelMethod TravelTime TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle Triangle TriangleCenter TriangleConstruct TriangleMeasurement TriangleWave TriangularDistribution TriangulateMesh Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean TrimmedVariance TropicalStormData True TrueQ TruncatedDistribution TruncatedPolyhedron TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBoxOptions TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow TunnelData Tuples TuranGraph TuringMachine TuttePolynomial TwoWayRule Typed TypeSpecifierUnateQ Uncompress UnconstrainedParameters Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UnderseaFeatureData UndirectedEdge UndirectedGraph UndirectedGraphQ UndoOptions UndoTrackedVariables Unequal UnequalTo Unevaluated UniformDistribution UniformGraphDistribution UniformPolyhedron UniformSumDistribution Uninstall Union UnionPlus Unique UnitaryMatrixQ UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitSystem UnitTriangle UnitVector UnitVectorLayer UnityDimensions UniverseModelData UniversityData UnixTime Unprotect UnregisterExternalEvaluator UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpdateSearchIndex UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize UpperTriangularMatrixQ Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpTo UpValues URL URLBuild URLDecode URLDispatcher URLDownload URLDownloadSubmit URLEncode URLExecute URLExpand URLFetch URLFetchAsynchronous URLParse URLQueryDecode URLQueryEncode URLRead URLResponseTime URLSave URLSaveAsynchronous URLShorten URLSubmit UseGraphicsRange UserDefinedWavelet Using UsingFrontEnd UtilityFunctionV2Get ValenceErrorHandling ValidationLength ValidationSet Value ValueBox ValueBoxOptions ValueDimensions ValueForm ValuePreprocessingFunction ValueQ Values ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorAround VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorGreater VectorGreaterEqual VectorLess VectorLessEqual VectorMarkers VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerificationTest VerifyConvergence VerifyDerivedKey VerifyDigitalSignature VerifyInterpretation VerifySecurityCertificates VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexContract VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight VertexWeightedGraphQ Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewProjection ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoiceStyleData VoigtDistribution VolcanoData Volume VonMisesDistribution VoronoiMeshWaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WarpingCorrespondence WarpingDistance WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeatherForecastData WebAudioSearch WebElementObject WeberE WebExecute WebImage WebImageSearch WebSearch WebSessionObject WebSessions WebWindowObject Wedge Wednesday WeibullDistribution WeierstrassE1 WeierstrassE2 WeierstrassE3 WeierstrassEta1 WeierstrassEta2 WeierstrassEta3 WeierstrassHalfPeriods WeierstrassHalfPeriodW1 WeierstrassHalfPeriodW2 WeierstrassHalfPeriodW3 WeierstrassInvariantG2 WeierstrassInvariantG3 WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White WhiteNoiseProcess WhitePoint Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WikipediaData WikipediaSearch WilksW WilksWTest WindDirectionData WindingCount WindingPolygon WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowPersistentStyles WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth WindSpeedData WindVectorData WinsorizedMean WinsorizedVariance WishartMatrixDistribution With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult WolframLanguageData Word WordBoundary WordCharacter WordCloud WordCount WordCounts WordData WordDefinition WordFrequency WordFrequencyData WordList WordOrientation WordSearch WordSelectionFunction WordSeparators WordSpacings WordStem WordTranslation WorkingPrecision WrapAround Write WriteLine WriteString WronskianXMLElement XMLObject XMLTemplate Xnor Xor XYZColorYellow Yesterday YuleDissimilarityZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZIPCodeData ZipfDistribution ZoomCenter ZoomFactor ZTest ZTransform$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AllowExternalChannelFunctions $AssertFunction $Assumptions $AsynchronousTask $AudioInputDevices $AudioOutputDevices $BaseDirectory $BatchInput $BatchOutput $BlockchainBase $BoxForms $ByteOrdering $CacheBaseDirectory $Canceled $ChannelBase $CharacterEncoding $CharacterEncodings $CloudBase $CloudConnected $CloudCreditsAvailable $CloudEvaluation $CloudExpressionBase $CloudObjectNameFormat $CloudObjectURLType $CloudRootDirectory $CloudSymbolBase $CloudUserID $CloudUserUUID $CloudVersion $CloudVersionNumber $CloudWolframEngineVersionNumber $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $Cookies $CookieStore $CreationDate $CurrentLink $CurrentTask $CurrentWebSession $DateStringFormat $DefaultAudioInputDevice $DefaultAudioOutputDevice $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultLocalBase $DefaultMailbox $DefaultNetworkInterface $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $EmbedCodeEnvironments $EmbeddableServices $EntityStores $Epilog $EvaluationCloudBase $EvaluationCloudObject $EvaluationEnvironment $ExportFormats $Failed $FinancialDataSource $FontFamilies $FormatType $FrontEnd $FrontEndSession $GeoEntityTypes $GeoLocation $GeoLocationCity $GeoLocationCountry $GeoLocationPrecision $GeoLocationSource $HistoryLength $HomeDirectory $HTMLExportRules $HTTPCookies $HTTPRequest $IgnoreEOF $ImageFormattingWidth $ImagingDevice $ImagingDevices $ImportFormats $IncomingMailSettings $InitialDirectory $Initialization $InitializationContexts $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $InterpreterTypes $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $LocalBase $LocalSymbolBase $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $MobilePhone $ModuleNumber $NetworkConnected $NetworkInterfaces $NetworkLicense $NewMessage $NewSymbol $Notebooks $NoValue $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $Permissions $PermissionsGroupBase $PersistenceBase $PersistencePath $PipeSupported $PlotTheme $Post $Pre $PreferencesDirectory $PreInitialization $PrePrint $PreRead $PrintForms $PrintLiteral $Printout3DPreviewer $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $PublisherID $RandomState $RecursionLimit $RegisteredDeviceClasses $RegisteredUserName $ReleaseNumber $RequesterAddress $RequesterWolframID $RequesterWolframUUID $ResourceSystemBase $RootDirectory $ScheduledTask $ScriptCommandLine $ScriptInputString $SecuredAuthenticationKeyTokens $ServiceCreditsAvailable $Services $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SourceLink $SSHAuthentication $SummaryBoxDataSizeLimit $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemMemory $SystemShell $SystemTimeZone $SystemWordLength $TemplatePath $TemporaryDirectory $TemporaryPrefix $TestFileName $TextStyle $TimedOut $TimeUnit $TimeZone $TimeZoneEntity $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $UnitSystem $Urgent $UserAddOnsDirectory $UserAgentLanguages $UserAgentMachine $UserAgentName $UserAgentOperatingSystem $UserAgentString $UserAgentVersion $UserBaseDirectory $UserDocumentsDirectory $Username $UserName $UserURLBase $Version $VersionNumber $VoiceStyles $WolframID $WolframUUID\",c:[e.C(\"\\\\(\\\\*\",\"\\\\*\\\\)\",{c:[\"self\"]}),e.QSM,e.CNM]}});hljs.registerLanguage(\"vim\",function(e){return{l:/[!#@\\w]+/,k:{keyword:\"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank\",built_in:\"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp\"},i:/;/,c:[e.NM,{cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\"},{cN:\"string\",b:/\"(\\\\\"|\\n\\\\|[^\"\\n])*\"/},e.C('\"',\"$\"),{cN:\"variable\",b:/[bwtglsav]:[\\w\\d_]*/},{cN:\"function\",bK:\"function function!\",e:\"$\",relevance:0,c:[e.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},{cN:\"symbol\",b:/<[\\w-]+>/}]}});hljs.registerLanguage(\"makefile\",function(e){var i={cN:\"variable\",v:[{b:\"\\\\$\\\\(\"+e.UIR+\"\\\\)\",c:[e.BE]},{b:/\\$[@%<?\\^\\+\\*]/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,i]},a={cN:\"variable\",b:/\\$\\([\\w-]+\\s/,e:/\\)/,k:{built_in:\"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value\"},c:[i]},n={b:\"^\"+e.UIR+\"\\\\s*(?=[:+?]?=)\"},t={cN:\"section\",b:/^[^\\s]+:/,e:/$/,c:[i]};return{aliases:[\"mk\",\"mak\"],k:\"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath\",l:/[\\w-]+/,c:[e.HCM,i,r,a,n,{cN:\"meta\",b:/^\\.PHONY:/,e:/$/,k:{\"meta-keyword\":\".PHONY\"},l:/[\\.\\w]+/},t]}});hljs.registerLanguage(\"objectivec\",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,i=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:{keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},l:t,i:\"</\",c:[{cN:\"built_in\",b:\"\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+\"},e.CLCM,e.CBCM,e.CNM,e.QSM,e.ASM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]}]},{cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(e.QSM,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},{cN:\"class\",b:\"(\"+i.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:i,l:t,c:[e.UTM]},{b:\"\\\\.\"+e.UIR,relevance:0}]}});hljs.registerLanguage(\"shell\",function(s){return{aliases:[\"console\"],c:[{cN:\"meta\",b:\"^\\\\s{0,3}[/\\\\w\\\\d\\\\[\\\\]()@-]*[>%$#]\",starts:{e:\"$\",sL:\"bash\"}}]}});hljs.registerLanguage(\"erlang\",function(e){var r=\"[a-z'][a-zA-Z0-9_']*\",c=\"(\"+r+\":\"+r+\"|\"+r+\")\",n={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor\",literal:\"false true\"},a=e.C(\"%\",\"$\"),b={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},i={b:\"fun\\\\s+\"+r+\"/\\\\d+\"},l={b:c+\"\\\\(\",e:\"\\\\)\",rB:!0,relevance:0,c:[{b:c,relevance:0},{b:\"\\\\(\",e:\"\\\\)\",eW:!0,rE:!0,relevance:0}]},d={b:\"{\",e:\"}\",relevance:0},o={b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",relevance:0},t={b:\"[A-Z][a-zA-Z0-9_]*\",relevance:0},v={b:\"#\"+e.UIR,relevance:0,rB:!0,c:[{b:\"#\"+e.UIR,relevance:0},{b:\"{\",e:\"}\",relevance:0}]},f={bK:\"fun receive if try case\",e:\"end\",k:n};f.c=[a,i,e.inherit(e.ASM,{cN:\"\"}),f,l,e.QSM,b,d,o,t,v];var s=[a,i,f,l,e.QSM,b,d,o,t,v];l.c[1].c=s,d.c=s;var u={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:v.c[1].c=s};return{aliases:[\"erl\"],k:n,i:\"(</|\\\\*=|\\\\+=|-=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+r+\"\\\\s*\\\\(\",e:\"->\",rB:!0,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[u,e.inherit(e.TM,{b:r})],starts:{e:\";|\\\\.\",k:n,c:s}},a,{b:\"^-\",e:\"\\\\.\",relevance:0,eE:!0,rB:!0,l:\"-\"+e.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec\",c:[u]},b,e.QSM,v,o,t,d,{b:/\\.$/}]}});hljs.registerLanguage(\"powershell\",function(e){var t={keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\"},n={b:\"`[\\\\s\\\\S]\",relevance:0},c={cN:\"variable\",v:[{b:/\\$\\B/},{cN:\"keyword\",b:/\\$this/},{b:/\\$[\\w\\d][\\w\\d_:]*/}]},i={cN:\"string\",v:[{b:/\"/,e:/\"/},{b:/@\"/,e:/^\"@/}],c:[n,c,{cN:\"variable\",b:/\\$[A-z]/,e:/[^A-z]/}]},a={cN:\"string\",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},r=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:\"doctag\",v:[{b:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),o={cN:\"built_in\",v:[{b:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|New|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},l={cN:\"class\",bK:\"class enum\",e:/\\s*[{]/,eE:!0,relevance:0,c:[e.TM]},s={cN:\"function\",b:/function\\s+/,e:/\\s*\\{|$/,eE:!0,rB:!0,relevance:0,c:[{b:\"function\",relevance:0,cN:\"keyword\"},{cN:\"title\",b:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{b:/\\(/,e:/\\)/,cN:\"params\",relevance:0,c:[c]}]},p={b:/using\\s/,e:/$/,rB:!0,c:[i,a,{cN:\"keyword\",b:/(using|assembly|command|module|namespace|type)/}]},b={v:[{cN:\"operator\",b:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{cN:\"literal\",b:/(-)[\\w\\d]+/,relevance:0}]},d={cN:\"function\",b:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,e:/$/,rB:!0,relevance:0,c:[{cN:\"keyword\",b:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TM,{endsParent:!0})]},u=[d,r,n,e.NM,i,a,o,c,{cN:\"literal\",b:/\\$(null|true|false)\\b/},{cN:\"selector-tag\",b:/\\@\\B/,relevance:0}],m={b:/\\[/,e:/\\]/,eB:!0,eE:!0,relevance:0,c:[].concat(\"self\",u,{b:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",cN:\"built_in\",relevance:0},{cN:\"type\",b:/[\\.\\w\\d]+/,relevance:0})};return d.c.unshift(m),{aliases:[\"ps\",\"ps1\"],l:/-?[A-z\\.\\-]+/,cI:!0,k:t,c:u.concat(l,s,p,b,m)}});hljs.registerLanguage(\"typescript\",function(e){var r=\"[A-Za-z$_][0-9A-Za-z$_]*\",t={keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise\"},n={cN:\"meta\",b:\"@\"+r},a={b:\"\\\\(\",e:/\\)/,k:t,c:[\"self\",e.QSM,e.ASM,e.NM]},c={cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[e.CLCM,e.CBCM,n,a]},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:t,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},l={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},b={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};return o.c=[e.ASM,e.QSM,i,l,b,s,e.RM],{aliases:[\"ts\"],k:t,c:[{cN:\"meta\",b:/^\\s*['\"]use strict['\"]/},e.ASM,e.QSM,i,l,b,e.CLCM,e.CBCM,s,{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+e.IR+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:e.IR},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[\"self\",e.CLCM,e.CBCM]}]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/[\\{;]/,eE:!0,k:t,c:[\"self\",e.inherit(e.TM,{b:r}),c],i:/%/,relevance:0},{bK:\"constructor\",e:/[\\{;]/,eE:!0,c:[\"self\",c]},{b:/module\\./,k:{built_in:\"module\"},relevance:0},{bK:\"module\",e:/\\{/,eE:!0},{bK:\"interface\",e:/\\{/,eE:!0,k:\"interface extends\"},{b:/\\$[(.]/},{b:\"\\\\.\"+e.IR,relevance:0},n,a]}});hljs.registerLanguage(\"fortran\",function(e){return{cI:!0,aliases:[\"f90\",\"f95\"],k:{literal:\".False. .True.\",keyword:\"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then block endblock public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data\",built_in:\"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image\"},i:/\\/\\*/,c:[e.inherit(e.ASM,{cN:\"string\",relevance:0}),e.inherit(e.QSM,{cN:\"string\",relevance:0}),{cN:\"function\",bK:\"subroutine function program\",i:\"[${=\\\\n]\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},e.C(\"!\",\"$\",{relevance:0}),{cN:\"number\",b:\"(?=\\\\b|\\\\+|\\\\-|\\\\.)(?=\\\\.\\\\d|\\\\d)(?:\\\\d+)?(?:\\\\.?\\\\d*)(?:[de][+-]?\\\\d+)?\\\\b\\\\.?\",relevance:0}]}});hljs.registerLanguage(\"php\",function(e){var c={b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},i={cN:\"meta\",b:/<\\?(php)?|\\?>/},t={cN:\"string\",c:[e.BE,i],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:[\"php\",\"php3\",\"php4\",\"php5\",\"php6\",\"php7\"],cI:!0,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[e.HCM,e.C(\"//\",\"$\",{c:[i]}),e.C(\"/\\\\*\",\"\\\\*/\",{c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.C(\"__halt_compiler.+?;\",!1,{eW:!0,k:\"__halt_compiler\",l:e.UIR}),{cN:\"string\",b:/<<<['\"]?\\w+['\"]?$/,e:/^\\w+;?$/,c:[e.BE,{cN:\"subst\",v:[{b:/\\$\\w+/},{b:/\\{\\$/,e:/\\}/}]}]},i,{cN:\"keyword\",b:/\\$this\\b/},c,{b:/(::|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",c,e.CBCM,t,a]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},t,a]}});hljs.registerLanguage(\"haskell\",function(e){var i={v:[e.C(\"--\",\"$\"),e.C(\"{-\",\"-}\",{c:[\"self\"]})]},a={cN:\"meta\",b:\"{-#\",e:\"#-}\"},l={cN:\"meta\",b:\"^#\",e:\"$\"},c={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",relevance:0},n={b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[a,l,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},e.inherit(e.TM,{b:\"[_a-z][\\\\w']*\"}),i]};return{aliases:[\"hs\"],k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{bK:\"module\",e:\"where\",k:\"module where\",c:[n,i],i:\"\\\\W\\\\.|;\"},{b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import qualified as hiding\",c:[n,i],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[c,n,i]},{cN:\"class\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[a,c,n,{b:\"{\",e:\"}\",c:n.c},i]},{bK:\"default\",e:\"$\",c:[c,n,i]},{bK:\"infix infixl infixr\",e:\"$\",c:[e.CNM,i]},{b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[c,e.QSM,i]},{cN:\"meta\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:\"^[_a-z][\\\\w']*\"}),i,{b:\"->|<-\"}]}});hljs.registerLanguage(\"coffeescript\",function(e){var c={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",built_in:\"npm require console print module global window document\"},n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r={cN:\"subst\",b:/#\\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",relevance:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,r]},{b:/\"/,e:/\"/,c:[e.BE,r]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[r,e.HCM]},{b:\"//[gim]{0,3}(?=\\\\W)\",relevance:0},{b:/\\/(?![ *]).*?(?![\\\\]).\\/[gim]{0,3}(?=\\W)/}]},{b:\"@\"+n},{sL:\"javascript\",eB:!0,eE:!0,v:[{b:\"```\",e:\"```\"},{b:\"`\",e:\"`\"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",a={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:c,c:[\"self\"].concat(i)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:c,i:/\\/\\*/,c:i.concat([e.C(\"###\",\"###\"),e.HCM,{cN:\"function\",b:\"^\\\\s*\"+n+\"\\\\s*=\\\\s*\"+t,e:\"[-=]>\",rB:!0,c:[s,a]},{b:/[:\\(,=]\\s*/,relevance:0,c:[{cN:\"function\",b:t,e:\"[-=]>\",rB:!0,c:[a]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[s]},s]},{b:n+\":\",e:\":\",rB:!0,rE:!0,relevance:0}])}});hljs.registerLanguage(\"r\",function(e){var r=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[e.HCM,{b:r,l:r,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},relevance:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{b:\"`\",e:\"`\",relevance:0},{cN:\"string\",c:[e.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"autohotkey\",function(e){var a={b:\"`[\\\\s\\\\S]\"};return{cI:!0,aliases:[\"ahk\"],k:{keyword:\"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group\",literal:\"true false NOT AND OR\",built_in:\"ComSpec Clipboard ClipboardAll ErrorLevel\"},c:[a,e.inherit(e.QSM,{c:[a]}),e.C(\";\",\"$\",{relevance:0}),e.CBCM,{cN:\"number\",b:e.NR,relevance:0},{cN:\"variable\",b:\"%[a-zA-Z0-9#_$@]+%\"},{cN:\"built_in\",b:\"^\\\\s*\\\\w+\\\\s*(,|%)\"},{cN:\"title\",v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',relevance:0}]},{cN:\"meta\",b:\"^\\\\s*#\\\\w+\",e:\"$\",relevance:0},{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{b:\",\\\\s*,\"}]}});hljs.registerLanguage(\"elixir\",function(e){var b=\"[a-zA-Z_][a-zA-Z0-9_.]*(\\\\!|\\\\?)?\",c=\"and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0\",n={cN:\"subst\",b:\"#\\\\{\",e:\"}\",l:b,k:c},r=\"[/|([{<\\\"']\",a={cN:\"string\",b:\"~[a-z](?=\"+r+\")\",c:[{endsParent:!0,c:[{c:[e.BE,n],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/</,e:/>/}]}]}]},i={cN:\"string\",b:\"~[A-Z](?=\"+r+\")\",c:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/\\</,e:/\\>/}]},l={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/'''/,e:/'''/},{b:/~S\"\"\"/,e:/\"\"\"/,c:[]},{b:/~S\"/,e:/\"/,c:[]},{b:/~S'''/,e:/'''/,c:[]},{b:/~S'/,e:/'/,c:[]},{b:/'/,e:/'/},{b:/\"/,e:/\"/}]},s={cN:\"function\",bK:\"def defp defmacro\",e:/\\B\\b/,c:[e.inherit(e.TM,{b:b,endsParent:!0})]},t=e.inherit(s,{cN:\"class\",bK:\"defimpl defmodule defprotocol defrecord\",e:/\\bdo\\b|$|;/}),d=[l,i,a,e.HCM,t,s,{b:\"::\"},{cN:\"symbol\",b:\":(?![\\\\s:])\",c:[l,{b:\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\"}],relevance:0},{cN:\"symbol\",b:b+\":(?!:)\",relevance:0},{cN:\"number\",b:\"(\\\\b0o[0-7_]+)|(\\\\b0b[01_]+)|(\\\\b0x[0-9a-fA-F_]+)|(-?\\\\b[1-9][0-9_]*(.[0-9_]+([eE][-+]?[0-9]+)?)?)\",relevance:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"->\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[e.HCM,{cN:\"regexp\",i:\"\\\\n\",c:[e.BE,n],v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],relevance:0}];return{l:b,k:c,c:n.c=d}});hljs.registerLanguage(\"gradle\",function(e){return{cI:!0,k:{keyword:\"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine\"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage(\"css\",function(e){var c={b:/(?:[A-Z\\_\\.\\-]+|--[a-zA-Z0-9_-]+)\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/},{b:/\\(/,e:/\\)/,c:[e.ASM,e.QSM,e.CSSNM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\",c:[e.ASM,e.QSM]},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(page|font-face)\",l:\"@[a-z-]+\",k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",i:/:/,rB:!0,c:[{cN:\"keyword\",b:/@\\-?\\w[\\w]*(\\-\\w+)*/},{b:/\\s/,eW:!0,eE:!0,relevance:0,k:\"and or not only\",c:[{b:/[a-z-]+:/,cN:\"attribute\"},e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:\"[a-zA-Z-][a-zA-Z0-9_-]*\",relevance:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,c]}]}});\n\nexports.hljs = hljs;\n", "type": "application/javascript", "title": "$:/plugins/tiddlywiki/highlight/highlight.js", "module-type": "library" }, "$:/plugins/tiddlywiki/highlight/highlight.css": { "text": "/*\n\nOriginal highlight.js style (c) Ivan Sagalaev <maniac@softwaremaniacs.org>\n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n background: #F0F0F0;\n}\n\n\n/* Base color: saturation 0; */\n\n.hljs,\n.hljs-subst {\n color: #444;\n}\n\n.hljs-comment {\n color: #888888;\n}\n\n.hljs-keyword,\n.hljs-attribute,\n.hljs-selector-tag,\n.hljs-meta-keyword,\n.hljs-doctag,\n.hljs-name {\n font-weight: bold;\n}\n\n\n/* User color: hue: 0 */\n\n.hljs-type,\n.hljs-string,\n.hljs-number,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-quote,\n.hljs-template-tag,\n.hljs-deletion {\n color: #880000;\n}\n\n.hljs-title,\n.hljs-section {\n color: #880000;\n font-weight: bold;\n}\n\n.hljs-regexp,\n.hljs-symbol,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n color: #BC6060;\n}\n\n\n/* Language color: hue: 90; */\n\n.hljs-literal {\n color: #78A960;\n}\n\n.hljs-built_in,\n.hljs-bullet,\n.hljs-code,\n.hljs-addition {\n color: #397300;\n}\n\n\n/* Meta color: hue: 200 */\n\n.hljs-meta {\n color: #1f7199;\n}\n\n.hljs-meta-string {\n color: #4d99bf;\n}\n\n\n/* Misc effects */\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n", "type": "text/css", "title": "$:/plugins/tiddlywiki/highlight/highlight.css", "tags": "[[$:/tags/Stylesheet]]" }, "$:/plugins/tiddlywiki/highlight/highlightblock.js": { "title": "$:/plugins/tiddlywiki/highlight/highlightblock.js", "text": "/*\\\ntitle: $:/plugins/tiddlywiki/highlight/highlightblock.js\ntype: application/javascript\nmodule-type: widget\n\nWraps up the fenced code blocks parser for highlight and use in TiddlyWiki5\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TYPE_MAPPINGS_BASE = \"$:/config/HighlightPlugin/TypeMappings/\";\n\nvar CodeBlockWidget = require(\"$:/core/modules/widgets/codeblock.js\").codeblock;\n\nvar hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n\nhljs.configure({tabReplace: \" \"});\t\n\nCodeBlockWidget.prototype.postRender = function() {\n\tvar domNode = this.domNodes[0],\n\t\tlanguage = this.language,\n\t\ttiddler = this.wiki.getTiddler(TYPE_MAPPINGS_BASE + language);\n\tif(tiddler) {\n\t\tlanguage = tiddler.fields.text || \"\";\n\t}\n\tif(language && hljs.getLanguage(language)) {\n\t\tdomNode.className = language.toLowerCase() + \" hljs\";\n\t\tif($tw.browser && !domNode.isTiddlyWikiFakeDom) {\n\t\t\thljs.highlightBlock(domNode);\t\t\t\n\t\t} else {\n\t\t\tvar text = domNode.textContent;\n\t\t\tdomNode.children[0].innerHTML = hljs.fixMarkup(hljs.highlight(language,text).value);\n\t\t\t// If we're using the fakedom then specially save the original raw text\n\t\t\tif(domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tdomNode.children[0].textInnerHTML = text;\n\t\t\t}\n\t\t}\n\t}\t\n};\n\n})();\n", "type": "application/javascript", "module-type": "widget" }, "$:/plugins/tiddlywiki/highlight/howto": { "title": "$:/plugins/tiddlywiki/highlight/howto", "text": "! Supporting Additional Languages\n \nThe [[highlight.js|https://github.com/highlightjs/highlight.js]] project supports many languages. Only a subset of these languages are supported by the plugin. It is possible for users to change the set of languages supported by the plugin by following these steps:\n \n# Go to the highlight.js project [[download page|https://highlightjs.org/download/]], select the language definitions to include, and press the Download button to download a zip archive containing customised support files for a highlight.js syntax highlighting server.\n# Locate the `highlight.pack.js` file in the highlight plugin -- on a stock Debian 8 system running Tiddlywiki5 under node-js it is located at `/usr/local/lib/node_modules/tiddlywiki/plugins/tiddlywiki/highlight/files/highlight.pack.js`.\n# Replace the plugin `highlight.pack.js` file located in step 2 with the one from the downloaded archive obtained in step 1.\n# Restart the Tiddlywiki server.\n" }, "$:/plugins/tiddlywiki/highlight/license": { "title": "$:/plugins/tiddlywiki/highlight/license", "type": "text/plain", "text": "Copyright (c) 2006, Ivan Sagalaev\nAll rights reserved.\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\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of highlight.js nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, "$:/plugins/tiddlywiki/highlight/readme": { "title": "$:/plugins/tiddlywiki/highlight/readme", "text": "This plugin provides syntax highlighting of code blocks using v9.18.1 of [[highlight.js|https://github.com/isagalaev/highlight.js]] from Ivan Sagalaev.\n\n! Usage\n\nWhen the plugin is installed it automatically applies highlighting to all codeblocks defined with triple backticks or with the CodeBlockWidget.\n\nThe language can optionally be specified after the opening triple braces:\n\n<$codeblock code=\"\"\"```css\n * { margin: 0; padding: 0; } /* micro reset */\n\nhtml { font-size: 62.5%; }\nbody { font-size: 14px; font-size: 1.4rem; } /* =14px */\nh1 { font-size: 24px; font-size: 2.4rem; } /* =24px */\n```\"\"\"/>\n\nIf no language is specified highlight.js will attempt to automatically detect the language.\n\n! Built-in Language Brushes\n\nThe plugin includes support for the following languages (referred to as \"brushes\" by highlight.js):\n\n* apache\n* arduino\n* arm assembly\n* asciidoc\n* autohotkey\n* awk\n* bash\n* cmake\n* coffeescript\n* cpp\n* cs\n* css\n* diff\n* dockerfile\n* erlang\n* elixir\n* fortran\n* go\n* gradle\n* haskell\n* html\n* http\n* ini\n* intel x86 assembly\n* java\n* javascript\n* json\n* kotlin\n* less\n* lua\n* makefile\n* markdown\n* mathematica\n* matlab\n* nginx\n* objectivec\n* perl\n* php\n* plaintext\n* powershell\n* properties\n* python\n* R\n* ruby\n* rust\n* scss\n* shell session\n* sql\n* swift\n* toml\n* typescript\n* vala\n* vim script\n* xml\n* yaml\n\nYou can also specify the language as a MIME content type (eg `text/html` or `text/css`). The mapping is accomplished via mapping tiddlers whose titles start with `$:/config/HighlightPlugin/TypeMappings/`.\n" }, "$:/plugins/tiddlywiki/highlight/styles": { "title": "$:/plugins/tiddlywiki/highlight/styles", "tags": "[[$:/tags/Stylesheet]]", "text": ".hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n background: <<colour tiddler-editor-background>>;\n color: <<colour foreground>>;\n -webkit-text-size-adjust:none\n}\n\n.hljs-comment,\n.hljs-quote {\n color: #93a1a1;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-addition {\n color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-string,\n.hljs-meta .hljs-meta-string,\n.hljs-literal,\n.hljs-doctag,\n.hljs-regexp {\n color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-section,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-class .hljs-title,\n.hljs-type {\n color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-symbol,\n.hljs-bullet,\n.hljs-subst,\n.hljs-meta,\n.hljs-meta .hljs-keyword,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-link {\n color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-built_in,\n.hljs-deletion {\n color: #dc322f;\n}\n\n.hljs-formula {\n background: #eee8d5;\n}\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n" }, "$:/plugins/tiddlywiki/highlight/usage": { "title": "$:/plugins/tiddlywiki/highlight/usage", "text": "! Usage\n\nFenced code blocks can have a language specifier added to trigger highlighting in a specific language. Otherwise heuristics are used to detect the language.\n\n```\n ```js\n var a = b + c; // Highlighted as JavaScript\n ```\n```\n! Adding Themes\n\nYou can add themes from highlight.js by copying the CSS to a new tiddler and tagging it with [[$:/tags/Stylesheet]]. The available themes can be found on GitHub:\n\nhttps://github.com/isagalaev/highlight.js/tree/master/src/styles\n" } } }
{ "tiddlers": { "GettingStarted": { "title": "GettingStarted", "tags": "$:/tags/GettingStarted", "caption": "Step 1<br>Syncing", "text": "Welcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nVisit https://tiddlywiki.com/ to find out more about ~TiddlyWiki and what it can do.\n\n! Syncing Changes to the Server\n\nBefore you can start storing important information in ~TiddlyWiki it is important to make sure that your changes are being reliably saved by the server.\n\n# Create a new tiddler using the {{$:/core/images/new-button}} button in the sidebar on the right\n# Click the {{$:/core/images/done-button}} button at the top right of the new tiddler\n# Check the ~TiddlyWiki command line for a message confirming the tiddler has been saved\n# Refresh the page in the browser to and verify that the new tiddler has been correctly saved\n" }, "$:/config/SaveWikiButton/Template": { "title": "$:/config/SaveWikiButton/Template", "text": "$:/plugins/tiddlywiki/tiddlyweb/save/offline" }, "$:/config/Server/ExternalFilters/[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/library/sjcl.js]] -[[$:/core]]": { "title": "$:/config/Server/ExternalFilters/[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/library/sjcl.js]] -[[$:/core]]", "text": "yes" }, "$:/config/OfficialPluginLibrary": { "title": "$:/config/OfficialPluginLibrary", "tags": "$:/tags/PluginLibrary", "url": "https://tiddlywiki.com/library/v5.1.23/index.html", "caption": "{{$:/language/OfficialPluginLibrary}}", "enabled": "no", "text": "The official plugin library is disabled when using the client-server configuration. Instead, plugins should be installed via the `tiddlywiki.info` file, as described [[here|https://tiddlywiki.com/#Installing%20a%20plugin%20from%20the%20plugin%20library]]." }, "$:/core/templates/css-tiddler": { "title": "$:/core/templates/css-tiddler", "text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields. This version includes the tiddler changecount as the field `revision`.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` data-tiddler-revision=\"`<<changecount>>`\" data-tiddler-bag=\"default\" type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`" }, "$:/core/templates/html-div-skinny-tiddler": { "title": "$:/core/templates/html-div-skinny-tiddler", "text": "<!--\n\nThis template is a variant of the tiddlyweb plugin's overridden version of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields exclude='text revision bag' template=' $name$=\"$encoded_value$\"'></$fields>` revision=\"`<<changecount>>`\" bag=\"default\" _is_skinny=\"\">\n<pre></pre>\n</div>`\n" }, "$:/core/templates/html-div-tiddler": { "title": "$:/core/templates/html-div-tiddler", "text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields. This version includes the tiddler changecount as the field `revision`.\n\n-->`<div`<$fields exclude='text revision bag' template=' $name$=\"$encoded_value$\"'></$fields>` revision=\"`<<changecount>>`\" bag=\"default\">\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n" }, "$:/plugins/tiddlywiki/tiddlyweb/icon/cloud": { "title": "$:/plugins/tiddlywiki/tiddlyweb/icon/cloud", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-cloud tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><g><path d=\"M24 103C10.745 103 0 92.255 0 79c0-9.697 5.75-18.05 14.027-21.836A24.787 24.787 0 0114 56c0-13.255 10.745-24 24-24 1.373 0 2.718.115 4.028.337C48.628 24.2 58.707 19 70 19c19.882 0 36 16.118 36 36v.082c12.319 1.016 22 11.336 22 23.918 0 12.239-9.16 22.337-20.999 23.814L107 103H24z\"/><path class=\"tc-image-cloud-idle\" d=\"M57.929 84.698a6 6 0 01-8.485 0L35.302 70.556a6 6 0 118.485-8.485l9.9 9.9L81.97 43.686a6 6 0 018.485 8.486L57.929 84.698z\"/><path class=\"tc-image-cloud-progress tc-animate-rotate-slow\" d=\"M44.8 40a3.6 3.6 0 100 7.2h2.06A23.922 23.922 0 0040 64c0 13.122 10.531 23.785 23.603 23.997L64 88l.001-7.2c-9.171 0-16.626-7.348-16.798-16.477L47.2 64c0-5.165 2.331-9.786 5.999-12.868L53.2 55.6a3.6 3.6 0 107.2 0v-12a3.6 3.6 0 00-3.6-3.6h-12zM64 40v7.2c9.278 0 16.8 7.522 16.8 16.8 0 5.166-2.332 9.787-6 12.869V72.4a3.6 3.6 0 10-7.2 0v12a3.6 3.6 0 003.6 3.6h12a3.6 3.6 0 100-7.2l-2.062.001A23.922 23.922 0 0088 64c0-13.255-10.745-24-24-24z\"/></g></svg>" }, "$:/core/templates/javascript-tiddler": { "title": "$:/core/templates/javascript-tiddler", "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. This version includes the tiddler changecount as the field `revision`.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` data-tiddler-revision=\"`<<changecount>>`\" data-tiddler-bag=\"default\" type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`" }, "$:/plugins/tiddlywiki/tiddlyweb/readme": { "title": "$:/plugins/tiddlywiki/tiddlyweb/readme", "text": "This plugin runs in the browser to synchronise tiddler changes to and from a TiddlyWeb-compatible server (including TiddlyWiki 5 itself, running on Node.js). It is inert when run under Node.js. Disabling this plugin via the browser can not be undone via the browser since this plugin provides the mechanism to synchronize settings with the server.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/tiddlyweb]]\n" }, "$:/plugins/tiddlywiki/tiddlyweb/readonly": { "title": "$:/plugins/tiddlywiki/tiddlyweb/readonly", "tags": "[[$:/tags/Stylesheet]]", "text": "\\define button-selector(title)\nbutton.$title$, .tc-drop-down button.$title$, div.$title$\n\\end\n\n\\define hide-edit-controls()\n<$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"yes\" default=\"yes\">\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fclone>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fdelete>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fedit>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-here>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-journal-here>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fimport>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fmanager>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-image>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-journal>>`,`\n<<button-selector tc-btn-\\%24\\%3A\\%2Fcore\\%2Fui\\%2FButtons\\%2Fnew-tiddler>> `{\n\tdisplay: none;\n}`\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n<<hide-edit-controls>>\n" }, "$:/plugins/tiddlywiki/tiddlyweb/save/offline": { "title": "$:/plugins/tiddlywiki/tiddlyweb/save/offline", "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[[$:/boot/boot.css]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[prefix[$:/temp/]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n" }, "$:/core/ui/Buttons/save-wiki": { "title": "$:/core/ui/Buttons/save-wiki", "tags": "$:/tags/PageControls", "caption": "{{$:/plugins/tiddlywiki/tiddlyweb/icon/cloud}} Server status", "description": "Status of synchronisation with server", "text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/save-wiki\">> tooltip=\"Status of synchronisation with server\" aria-label=\"Server status\" class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/plugins/tiddlywiki/tiddlyweb/icon/cloud}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text=\"Server status\"/></span>\n</$list>\n</span>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/save-wiki\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SyncerDropdown]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$list>\n</div>\n</$reveal>\n" }, "$:/plugins/tiddlywiki/tiddlyweb/styles": { "title": "$:/plugins/tiddlywiki/tiddlyweb/styles", "tags": "[[$:/tags/Stylesheet]]", "text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\nbody.tc-dirty span.tc-dirty-indicator svg {\n\ttransition: fill 250ms ease-in-out;\n}\n\nbody .tc-image-cloud-idle {\n\tfill: <<colour background>>;\n\ttransition: opacity 250ms ease-in-out;\n\topacity: 1;\n\tdisplay: unset;\n}\n\nbody.tc-dirty .tc-image-cloud-idle {\n\topacity: 0;\n\tdisplay: none;\n}\n\nbody .tc-image-cloud-progress {\n\ttransition: opacity 250ms ease-in-out;\n\ttransform-origin: 50% 50%;\n\ttransform: rotate(359deg);\n\tanimation: animation-rotate-slow 2s infinite linear;\n\tfill: <<colour background>>;\n\tdisplay: none;\n\topacity: 0;\n}\n\nbody.tc-dirty .tc-image-cloud-progress {\n\topacity: 1;\n\tdisplay: unset;\n}\n\n@keyframes animation-rotate-slow {\n\tfrom {\n\t\ttransform: rotate(0deg);\n\t}\n\tto {\n\t\ttransform: scale(359deg);\n\t}\n}\n" }, "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs": { "title": "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs", "tags": "$:/tags/SyncerDropdown", "text": "<$button message=\"tm-copy-syncer-logs-to-clipboard\" class=\"tc-btn-invisible\">\n{{$:/core/images/copy-clipboard}} Copy syncer logs to clipboard\n</$button>\n" }, "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status": { "title": "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status", "tags": "$:/tags/SyncerDropdown", "text": "<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<div class=\"tc-drop-down-info\">\nYou are logged in<$reveal state=\"$:/status/UserName\" type=\"nomatch\" text=\"\" default=\"\"> as <strong><$text text={{$:/status/UserName}}/></strong></$reveal><$reveal state=\"$:/status/IsReadOnly\" type=\"match\" text=\"yes\" default=\"no\"> (read-only)</$reveal>\n</div>\n<hr/>\n</$reveal>\n" }, "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login": { "title": "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login", "tags": "$:/tags/SyncerDropdown", "text": "<$reveal state=\"$:/status/IsLoggedIn\" type=\"nomatch\" text=\"yes\">\n<$button message=\"tm-login\" class=\"tc-btn-invisible\">\n{{$:/core/images/unlocked-padlock}} Login\n</$button>\n</$reveal>\n" }, "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout": { "title": "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout", "tags": "$:/tags/SyncerDropdown", "text": "<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<$button message=\"tm-logout\" class=\"tc-btn-invisible\">\n{{$:/core/images/cancel-button}} Logout\n</$button>\n</$reveal>\n" }, "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh": { "title": "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh", "tags": "$:/tags/SyncerDropdown", "text": "<$reveal state=\"$:/status/IsLoggedIn\" type=\"match\" text=\"yes\">\n<$button tooltip=\"Get latest changes from the server\" aria-label=\"Refresh from server\" class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-server-refresh\"/>\n{{$:/core/images/refresh-button}} <span class=\"tc-btn-text\"><$text text=\"Get latest changes from the server\"/></span>\n</$button>\n</$reveal>\n" }, "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot": { "title": "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot", "tags": "$:/tags/SyncerDropdown", "text": "<$button class=\"tc-btn-invisible\">\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-download-file\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n{{$:/core/images/download-button}} Save snapshot for offline use\n</$button>\n" }, "$:/tags/SyncerDropdown": { "title": "$:/tags/SyncerDropdown", "list": "$:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs" }, "$:/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js": { "title": "$:/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js", "text": "/*\\\ntitle: $:/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js\ntype: application/javascript\nmodule-type: syncadaptor\n\nA sync adaptor module for synchronising with TiddlyWeb compatible servers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CONFIG_HOST_TIDDLER = \"$:/config/tiddlyweb/host\",\n\tDEFAULT_HOST_TIDDLER = \"$protocol$//$host$/\";\n\nfunction TiddlyWebAdaptor(options) {\n\tthis.wiki = options.wiki;\n\tthis.host = this.getHost();\n\tthis.recipe = undefined;\n\tthis.hasStatus = false;\n\tthis.logger = new $tw.utils.Logger(\"TiddlyWebAdaptor\");\n\tthis.isLoggedIn = false;\n\tthis.isReadOnly = false;\n}\n\nTiddlyWebAdaptor.prototype.name = \"tiddlyweb\";\n\nTiddlyWebAdaptor.prototype.supportsLazyLoading = true;\n\nTiddlyWebAdaptor.prototype.setLoggerSaveBuffer = function(loggerForSaving) {\n\tthis.logger.setSaveBuffer(loggerForSaving);\n};\n\nTiddlyWebAdaptor.prototype.isReady = function() {\n\treturn this.hasStatus;\n};\n\nTiddlyWebAdaptor.prototype.getHost = function() {\n\tvar text = this.wiki.getTiddlerText(CONFIG_HOST_TIDDLER,DEFAULT_HOST_TIDDLER),\n\t\tsubstitutions = [\n\t\t\t{name: \"protocol\", value: document.location.protocol},\n\t\t\t{name: \"host\", value: document.location.host}\n\t\t];\n\tfor(var t=0; t<substitutions.length; t++) {\n\t\tvar s = substitutions[t];\n\t\ttext = $tw.utils.replaceString(text,new RegExp(\"\\\\$\" + s.name + \"\\\\$\",\"mg\"),s.value);\n\t}\n\treturn text;\n};\n\nTiddlyWebAdaptor.prototype.getTiddlerInfo = function(tiddler) {\n\treturn {\n\t\tbag: tiddler.fields.bag\n\t};\n};\n\nTiddlyWebAdaptor.prototype.getTiddlerRevision = function(title) {\n\tvar tiddler = this.wiki.getTiddler(title);\n\treturn tiddler.fields.revision;\n};\n\n/*\nGet the current status of the TiddlyWeb connection\n*/\nTiddlyWebAdaptor.prototype.getStatus = function(callback) {\n\t// Get status\n\tvar self = this;\n\tthis.logger.log(\"Getting status\");\n\t$tw.utils.httpRequest({\n\t\turl: this.host + \"status\",\n\t\tcallback: function(err,data) {\n\t\t\tself.hasStatus = true;\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Decode the status JSON\n\t\t\tvar json = null;\n\t\t\ttry {\n\t\t\t\tjson = JSON.parse(data);\n\t\t\t} catch (e) {\n\t\t\t}\n\t\t\tif(json) {\n\t\t\t\tself.logger.log(\"Status:\",data);\n\t\t\t\t// Record the recipe\n\t\t\t\tif(json.space) {\n\t\t\t\t\tself.recipe = json.space.recipe;\n\t\t\t\t}\n\t\t\t\t// Check if we're logged in\n\t\t\t\tself.isLoggedIn = json.username !== \"GUEST\";\n\t\t\t\tself.isReadOnly = !!json[\"read_only\"];\n\t\t\t\tself.isAnonymous = !!json.anonymous;\n\t\t\t}\n\t\t\t// Invoke the callback if present\n\t\t\tif(callback) {\n\t\t\t\tcallback(null,self.isLoggedIn,json.username,self.isReadOnly,self.isAnonymous);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nAttempt to login and invoke the callback(err)\n*/\nTiddlyWebAdaptor.prototype.login = function(username,password,callback) {\n\tvar options = {\n\t\turl: this.host + \"challenge/tiddlywebplugins.tiddlyspace.cookie_form\",\n\t\ttype: \"POST\",\n\t\tdata: {\n\t\t\tuser: username,\n\t\t\tpassword: password,\n\t\t\ttiddlyweb_redirect: \"/status\" // workaround to marginalize automatic subsequent GET\n\t\t},\n\t\tcallback: function(err) {\n\t\t\tcallback(err);\n\t\t}\n\t};\n\tthis.logger.log(\"Logging in:\",options);\n\t$tw.utils.httpRequest(options);\n};\n\n/*\n*/\nTiddlyWebAdaptor.prototype.logout = function(callback) {\n\tvar options = {\n\t\turl: this.host + \"logout\",\n\t\ttype: \"POST\",\n\t\tdata: {\n\t\t\tcsrf_token: this.getCsrfToken(),\n\t\t\ttiddlyweb_redirect: \"/status\" // workaround to marginalize automatic subsequent GET\n\t\t},\n\t\tcallback: function(err,data) {\n\t\t\tcallback(err);\n\t\t}\n\t};\n\tthis.logger.log(\"Logging out:\",options);\n\t$tw.utils.httpRequest(options);\n};\n\n/*\nRetrieve the CSRF token from its cookie\n*/\nTiddlyWebAdaptor.prototype.getCsrfToken = function() {\n\tvar regex = /^(?:.*; )?csrf_token=([^(;|$)]*)(?:;|$)/,\n\t\tmatch = regex.exec(document.cookie),\n\t\tcsrf = null;\n\tif (match && (match.length === 2)) {\n\t\tcsrf = match[1];\n\t}\n\treturn csrf;\n};\n\n/*\nGet an array of skinny tiddler fields from the server\n*/\nTiddlyWebAdaptor.prototype.getSkinnyTiddlers = function(callback) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: this.host + \"recipes/\" + this.recipe + \"/tiddlers.json\",\n\t\tdata: {\n\t\t\tfilter: \"[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/library/sjcl.js]] -[[$:/core]]\"\n\t\t},\n\t\tcallback: function(err,data) {\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Process the tiddlers to make sure the revision is a string\n\t\t\tvar tiddlers = JSON.parse(data);\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\ttiddlers[t] = self.convertTiddlerFromTiddlyWebFormat(tiddlers[t]);\n\t\t\t}\n\t\t\t// Invoke the callback with the skinny tiddlers\n\t\t\tcallback(null,tiddlers);\n\t\t}\n\t});\n};\n\n/*\nSave a tiddler and invoke the callback with (err,adaptorInfo,revision)\n*/\nTiddlyWebAdaptor.prototype.saveTiddler = function(tiddler,callback) {\n\tvar self = this;\n\tif(this.isReadOnly) {\n\t\treturn callback(null);\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.host + \"recipes/\" + encodeURIComponent(this.recipe) + \"/tiddlers/\" + encodeURIComponent(tiddler.fields.title),\n\t\ttype: \"PUT\",\n\t\theaders: {\n\t\t\t\"Content-type\": \"application/json\"\n\t\t},\n\t\tdata: this.convertTiddlerToTiddlyWebFormat(tiddler),\n\t\tcallback: function(err,data,request) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Save the details of the new revision of the tiddler\n\t\t\tvar etagInfo = self.parseEtag(request.getResponseHeader(\"Etag\"));\n\t\t\t// Invoke the callback\n\t\t\tcallback(null,{\n\t\t\t\tbag: etagInfo.bag\n\t\t\t}, etagInfo.revision);\n\t\t}\n\t});\n};\n\n/*\nLoad a tiddler and invoke the callback with (err,tiddlerFields)\n*/\nTiddlyWebAdaptor.prototype.loadTiddler = function(title,callback) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: this.host + \"recipes/\" + encodeURIComponent(this.recipe) + \"/tiddlers/\" + encodeURIComponent(title),\n\t\tcallback: function(err,data,request) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tcallback(null,self.convertTiddlerFromTiddlyWebFormat(JSON.parse(data)));\n\t\t}\n\t});\n};\n\n/*\nDelete a tiddler and invoke the callback with (err)\noptions include:\ntiddlerInfo: the syncer's tiddlerInfo for this tiddler\n*/\nTiddlyWebAdaptor.prototype.deleteTiddler = function(title,callback,options) {\n\tvar self = this;\n\tif(this.isReadOnly) {\n\t\treturn callback(null);\n\t}\n\t// If we don't have a bag it means that the tiddler hasn't been seen by the server, so we don't need to delete it\n\tvar bag = options.tiddlerInfo.adaptorInfo && options.tiddlerInfo.adaptorInfo.bag;\n\tif(!bag) {\n\t\treturn callback(null);\n\t}\n\t// Issue HTTP request to delete the tiddler\n\t$tw.utils.httpRequest({\n\t\turl: this.host + \"bags/\" + encodeURIComponent(bag) + \"/tiddlers/\" + encodeURIComponent(title),\n\t\ttype: \"DELETE\",\n\t\tcallback: function(err,data,request) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nConvert a tiddler to a field set suitable for PUTting to TiddlyWeb\n*/\nTiddlyWebAdaptor.prototype.convertTiddlerToTiddlyWebFormat = function(tiddler) {\n\tvar result = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(fieldValue,fieldName) {\n\t\t\tvar fieldString = fieldName === \"tags\" ?\n\t\t\t\t\t\t\t\ttiddler.fields.tags :\n\t\t\t\t\t\t\t\ttiddler.getFieldString(fieldName); // Tags must be passed as an array, not a string\n\n\t\t\tif(knownFields.indexOf(fieldName) !== -1) {\n\t\t\t\t// If it's a known field, just copy it across\n\t\t\t\tresult[fieldName] = fieldString;\n\t\t\t} else {\n\t\t\t\t// If it's unknown, put it in the \"fields\" field\n\t\t\t\tresult.fields = result.fields || {};\n\t\t\t\tresult.fields[fieldName] = fieldString;\n\t\t\t}\n\t\t});\n\t}\n\t// Default the content type\n\tresult.type = result.type || \"text/vnd.tiddlywiki\";\n\treturn JSON.stringify(result,null,$tw.config.preferences.jsonSpaces);\n};\n\n/*\nConvert a field set in TiddlyWeb format into ordinary TiddlyWiki5 format\n*/\nTiddlyWebAdaptor.prototype.convertTiddlerFromTiddlyWebFormat = function(tiddlerFields) {\n\tvar self = this,\n\t\tresult = {};\n\t// Transfer the fields, pulling down the `fields` hashmap\n\t$tw.utils.each(tiddlerFields,function(element,title,object) {\n\t\tif(title === \"fields\") {\n\t\t\t$tw.utils.each(element,function(element,subTitle,object) {\n\t\t\t\tresult[subTitle] = element;\n\t\t\t});\n\t\t} else {\n\t\t\tresult[title] = tiddlerFields[title];\n\t\t}\n\t});\n\t// Make sure the revision is expressed as a string\n\tif(typeof result.revision === \"number\") {\n\t\tresult.revision = result.revision.toString();\n\t}\n\t// Some unholy freaking of content types\n\tif(result.type === \"text/javascript\") {\n\t\tresult.type = \"application/javascript\";\n\t} else if(!result.type || result.type === \"None\") {\n\t\tresult.type = \"text/x-tiddlywiki\";\n\t}\n\treturn result;\n};\n\n/*\nSplit a TiddlyWeb Etag into its constituent parts. For example:\n\n```\n\"system-images_public/unsyncedIcon/946151:9f11c278ccde3a3149f339f4a1db80dd4369fc04\"\n```\n\nNote that the value includes the opening and closing double quotes.\n\nThe parts are:\n\n```\n<bag>/<title>/<revision>:<hash>\n```\n*/\nTiddlyWebAdaptor.prototype.parseEtag = function(etag) {\n\tvar firstSlash = etag.indexOf(\"/\"),\n\t\tlastSlash = etag.lastIndexOf(\"/\"),\n\t\tcolon = etag.lastIndexOf(\":\");\n\tif(firstSlash === -1 || lastSlash === -1 || colon === -1) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\tbag: decodeURIComponent(etag.substring(1,firstSlash)),\n\t\t\ttitle: decodeURIComponent(etag.substring(firstSlash + 1,lastSlash)),\n\t\t\trevision: etag.substring(lastSlash + 1,colon)\n\t\t};\n\t}\n};\n\nif($tw.browser && document.location.protocol.substr(0,4) === \"http\" ) {\n\texports.adaptorClass = TiddlyWebAdaptor;\n}\n\n})();\n", "type": "application/javascript", "module-type": "syncadaptor" } } }
{ "tiddlers": { "$:/plugins/tobibeer/random/filter.js": { "title": "$:/plugins/tobibeer/random/filter.js", "text": "/*\\\ntitle: $:/plugins/tobibeer/random/filter.js\ntype: application/javascript\nmodule-type: filteroperator\n\na filter to...\n\n@preserve\n\\*/\n(function(){\"use strict\";exports.random=function(n,t,r){var e,o=[],a=[],i=parseInt(t.operand||\"1\");if(isNaN(i)){i=1}n(function(n,t){a.push(t)});while(i&&a.length){e=Math.floor(Math.random()*a.length);o.push(a[e]);a.splice(e,1);i--}return o}})();", "type": "application/javascript", "module-type": "filteroperator" }, "$:/plugins/tobibeer/random/readme": { "title": "$:/plugins/tobibeer/random/readme", "text": "The plugin $:/plugins/tobibeer/random provides:\n\n; random[]\r\n: a filter retrieving one or more random titles from the input set\r\n: `[tag[Plugins]random[3]]` — returns three titles tagged [[Plugins]]\n\n<br>\n\n; documentation / examples / demos...\r\n: http://tobibeer.github.io/tw5-plugins#random" } } }
This wiki now lives at https://youneedastereo.com/ ☺
Notes to Self – Phil
no
$:/themes/tiddlywiki/snowwhite
{ "tiddlers": { "$:/themes/tiddlywiki/snowwhite/base": { "title": "$:/themes/tiddlywiki/snowwhite/base", "tags": "[[$:/tags/Stylesheet]]", "text": "\\define sidebarbreakpoint-minus-one()\n<$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 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-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<<background-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<<background-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<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n" } } }
{ "tiddlers": { "$:/themes/tiddlywiki/vanilla/themetweaks": { "title": "$:/themes/tiddlywiki/vanilla/themetweaks", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/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<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n" }, "$:/themes/tiddlywiki/vanilla/base": { "title": "$:/themes/tiddlywiki/vanilla/base", "tags": "[[$:/tags/Stylesheet]]", "text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define sidebarbreakpoint()\n<$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\define set-type-selector-min-width()\n<$set name=\"typeLength\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\n\n\t.tc-type-selector-dropdown-wrapper {\n\t\tmin-width: calc(<<typeLength>>ch + 4em);\n\t}\n\n\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\n\t\tmin-width: <<typeLength>>ch;\n\t}\n\n</$set>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n outline-offset: initial;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tfill: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml, body {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n background-color: transparent;\n}\n\n\"\"\">>\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n\tfont-size: 2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n left: -50px;\n top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n right: -80px;\n bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n vertical-align: middle;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-results-button,\ninput[type=\"search\"]::-webkit-search-results-decoration {\n\t-webkit-appearance:none;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n::selection {\n\tbackground-color: Highlight;\n\tcolor: HighlightText;\n\tbackground-color: <<colour selection-background>>;\n\tcolor: <<colour selection-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n.tc-drop-down a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tcolor: <<colour foreground>>;\n\tfill: <<colour foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n \tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\n.tc-sidebar-lists button small {\n\tcolor: <<colour foreground>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\n\tbackground-color: <<colour primary>>;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 400;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tmargin-right: 3px; \n\tmargin-bottom: 1px;\n\tvertical-align: bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n.tc-tag-button-selected,\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour tiddler-background>>;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-topbar-right {\n\t\tright: 10px;\n\t}\n\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\n\t\ttransform: rotate(-90deg);\n\t}\n\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n font-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-sidebar-lists .tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\ttransition: min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\n\t}\n\t\n\t<<if-no-sidebar \"\"\"\n\n\t\t.tc-sidebar-header {\n\t\t\tmin-height: 0;\n\t\t\tpadding-top: 0;\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\"\"\">>\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n\t.tc-story-river.tc-static-story-river {\n\t\tmargin-right: 0;\n\t\tpadding-right: 42px;\n\t}\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-tiddler-info {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t\tmargin-bottom: .5em;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.35em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\tmargin-right: .1em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n height: 1.2em;\n width: 1.2em;\n margin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-background>>;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-body {\n\tclear: both;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: auto;\n}\n\n.tc-type-selector-dropdown-wrapper {\n\tdisplay: inline-block;\n}\n\n<<set-type-selector-min-width>>\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n.tc-edit-fields.tc-edit-fields-small {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name-wrapper input.tc-edit-texteditor {\n\twidth: auto;\n}\n\n.tc-edit-field-add-name-wrapper {\n\tdisplay: inline-block;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-edit-field-add-value {\n\t\twidth: 35%;\n\t}\n\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n width: auto;\n margin-bottom: 0px;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n\n/*\n** Centered modals\n*/\n.tc-modal-centered .tc-modal {\n\twidth: auto;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%) !important;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n display: block;\n width: 100%;\n text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n flex: 1 0;\n background: <<colour tiddler-editor-background>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n flex: 3 1;\n border-left: 0.5em solid <<colour muted-foreground>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Import table\n*/\n\n.tc-import-table {\n\twidth: 100%;\n}\n\n.tc-import-table svg.tc-image-edit-button {\n\tmax-width: unset;\n}\n\n.tc-import-table th:first-of-type {\n\twidth: 10%;\n}\n\n.tc-import-table th:last-of-type {\n\twidth: 30%;\n}\n\n.tc-import-table .tc-row-disabled {\n\tbackground: <<colour very-muted-foreground>>10;\n\topacity: 0.8;\n}\n\n.tc-import-table .tc-row-warning {\n\tbackground: <<colour diff-delete-background>>50;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n line-height: 0;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n font-size: 0.8em;\n margin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n align-items: center;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n margin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n padding: 2px 7px;\n font-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\n\tfill: <<colour background>>;\n}\n\n.tc-plugin-info-chunk {\n margin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n text-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.7em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n margin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n vertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n::-webkit-file-upload-button {\n\tcursor:pointer;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n \tlist-style-type: none;\n \tpadding-left: 0;\n \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n \tpadding-left: 1em; \n}\n\n.tc-tree button { \n \tcolor: #acacac;\n}\n\n.tc-tree svg {\n \tfill: #acacac;\n}\n\n.tc-tree span svg {\n \twidth: 1em;\n \theight: 1em;\n \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n \tcolor: lightgray;\n}\n\nselect {\n color: <<colour select-tag-foreground>>;\n background: <<colour select-tag-background>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}\n\n/*\n** Flexbox utility classes\n*/\n\n.tc-flex {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-flex-column {\n\tflex-direction: column;\n}\n\n.tc-flex-row {\n\tflex-direction: row;\n}\n\n.tc-flex-grow-1 {\n\tflex-grow: 1;\n}\n\n.tc-flex-grow-2 {\n\tflex-grow: 2;\n}\n\n/*\n** Other utility classes\n*/\n\n.tc-small-gap {\n\tmargin-left: .5em;\n\tmargin-right: .5em;\n}\n\n.tc-small-gap-left {\n\tmargin-left: .5em;\n}\n\n.tc-small-gap-right {\n\tmargin-right: .5em;\n}\n\n.tc-big-gap {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-big-gap-left {\n\tmargin-left: 1em;\n}\n\n.tc-big-gap-right {\n\tmargin-right: 1em;\n}\n\n.tc-word-break {\n\tword-break: break-all;\n}\n" }, "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": { "title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize", "text": "15px" }, "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": { "title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight", "text": "22px" }, "$:/themes/tiddlywiki/vanilla/metrics/fontsize": { "title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize", "text": "14px" }, "$:/themes/tiddlywiki/vanilla/metrics/lineheight": { "title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight", "text": "20px" }, "$:/themes/tiddlywiki/vanilla/metrics/storyleft": { "title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft", "text": "0px" }, "$:/themes/tiddlywiki/vanilla/metrics/storytop": { "title": "$:/themes/tiddlywiki/vanilla/metrics/storytop", "text": "0px" }, "$:/themes/tiddlywiki/vanilla/metrics/storyright": { "title": "$:/themes/tiddlywiki/vanilla/metrics/storyright", "text": "770px" }, "$:/themes/tiddlywiki/vanilla/metrics/storywidth": { "title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth", "text": "770px" }, "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": { "title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth", "text": "686px" }, "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": { "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint", "text": "960px" }, "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": { "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth", "text": "350px" }, "$:/themes/tiddlywiki/vanilla/options/stickytitles": { "title": "$:/themes/tiddlywiki/vanilla/options/stickytitles", "text": "no" }, "$:/themes/tiddlywiki/vanilla/options/sidebarlayout": { "title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout", "text": "fixed-fluid" }, "$:/themes/tiddlywiki/vanilla/options/codewrapping": { "title": "$:/themes/tiddlywiki/vanilla/options/codewrapping", "text": "pre-wrap" }, "$:/themes/tiddlywiki/vanilla/reset": { "title": "$:/themes/tiddlywiki/vanilla/reset", "type": "text/plain", "text": "/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\n:root {\n -moz-tab-size: 4;\n tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n margin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n font-family:\n system-ui,\n -apple-system, /* Firefox supports this but not yet `system-ui` */\n 'Segoe UI',\n Roboto,\n Helvetica,\n Arial,\n sans-serif,\n 'Apple Color Emoji',\n 'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Consolas,\n 'Liberation Mono',\n Menlo,\n monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n padding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n" }, "$:/themes/tiddlywiki/vanilla/settings/fontfamily": { "title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily", "text": "system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\"" }, "$:/themes/tiddlywiki/vanilla/settings/codefontfamily": { "title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily", "text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace" }, "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": { "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment", "text": "fixed" }, "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": { "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize", "text": "auto" }, "$:/themes/tiddlywiki/vanilla/sticky": { "title": "$:/themes/tiddlywiki/vanilla/sticky", "text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n" } } }
17px
24px
16px
22px
fixed-fluid
no
"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace
-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"
!! Specs * Silver * Backlit Magic Keyboard with Touch ID - US English * Three Thunderbolt 4 ports, HDMI port, SDXC card slot, MagSafe 3 port * 1TB SSD storage * Accessory Kit * Apple M1 Max with 10-core CPU, 24-core GPU, 16-core Neural Engine * 96W USB-C Power Adapter * 14-inch Liquid Retina XDR display * 32GB unified memory !! Thoughts after using it for one day: * First time I've had Touch ID on the laptop and now I'm dependent on it. * First time I've run a clean [[macOS]] without Migration Assistant in at least a decade. Feels great! Weird to see the home folder so empty. * The bass when playing music is incredible and shocking. * I like the non-sharp edges all around, although (unrelatedly) it has ever so slightly more flex in the case than the old 2014 MacBook Pro. I suspect that's because of the inherent rigidity in the gently sloping curved bottom of the old model, where this one is more just flat across the bottom. But the 2021 is still more solid feeling than any PC laptop I've ever been issued at work. * The ESC key is luxuriously big. * The 2014 MacBook Pro keyboard all of a sudden sounds and feels rickety, but I do prefer its deeper key travel. * I'm glad I waited until they had these with MagSafe. * I barely notice the notch. * It sucks a bit, knowing how dependent I am on [[Dropbox]]. I feel like I can't really work on a computer until Dropbox is running.
* Silver * 16-inch Liquid Retina XDR display * 140W USB-C Power Adapter * Backlit Magic Keyboard with Touch ID - US English * 32GB unified memory * 1TB SSD storage * Apple M1 Max with 10-core CPU, 24-core GPU, 16-core Neural Engine * Accessory Kit * Three Thunderbolt 4 ports, HDMI port, SDXC card slot, MagSafe 3 port
At some point in college, but definitely not the first year, I remember sitting alone in the WUVT-FM music office, listening to a [[Throbbing Gristle]] CD for the first time, maybe //Mission of Dead Souls// or //D.o.A: The Third and Final Report//, and poring over the liner art for it. It was one weird paragraph after another, seemingly pasted together for maximum disorienting effect. I was pretty swept away by the look and tone of it all: Genesis P-Orridge in his weird military outfits right next to the utterly normal-looking Chris Carter, writing about art like it's a government campaign. All that deliberately obscure, spooky stuff, ahead of its time. I even photocopied all the TG liner notes I could find so I could read them "later", and later never arrived amidst all the more urgent pressures of schoolwork. Also, that part at the beginning of //Mission of Dead Souls// where Gen says, "A stadium of dead souls..." is so ominous and sinister. I've never heard any other band with scarier music.
* the sun never came out today * had morning coffee while listening to Thelonious Monk "Underground" LP and Love "Forever Changes" LP w/Sarah #vinyl * discovered Ed Pavez Goye the photographer has a YouTube channel. Good episodes about making a photo zine and about the Olympus OM-2. * ate leftover spicy chickpeas for lunch w/Sarah * napped on couch w/Roger with the windows open in the light rain * Walked all the way to and around Belle Isle and back in the misty rain w/Sarah. Realized a yearning I have to log what I/we do each day in small bullet-sized chunks that are taggable, so I can look back and see all the "meal with friends" entries, or "beers with dudes" entries, or "went on a walk/hike" entries. I don't know. Maybe I just need to log what happens each day like I'm doing with this bulleted list in plain text. * started reading Kindle version of "Triggers" on the toilet instead of looking at my phone * got takeout Bhan Mi's and fries from The Answer * watched two episodes of Clatterford w/Sarah and drank beer * watched Dickey Betts & Great Southern playing "Jessica" on Rockpalast in 1978 * posted photo of ladies chatting on a blanket at Skydog show from 2016 * stayed up until 1am reading tweets and news about latest Brett Kavanaugh allegations (where he drunkenly pulled out his wiener at a dorm party). tagx: #vinyl, #photography, #nap, #exercise, #hike, #reading, #friedfood
I used to keep this in nvALT in Dropbox, but why not share it as I find stuff! <<list-links filter:"[tag[music]]+[tag[found]]+[!sort[title]]">> (would be better to transclude the content instead of it being a list of links..., but I don't know if that's possible...)
* 2019-01-30 ''Acid Dad'' - Mr. Major, on Vinyl Assault Vehicle 2019-01-30 * 2019-01-30 ''Sharon Van Etten'' - Jupiter 4, on Vinyl Assault Vehicle 2019-01-30 * 2019-01-30 ''Swervedriver'' - The Lonely Crowd Fades In the Air, on Vinyl Assault Vehicle 2019-01-30 * 2019-01-30 ''Priests'' - The Seduction of Kansas, on Vinyl Assault Vehicle 2019-01-23 * 2019-01-29 ''John Cale/Tony Conrad/La Monte Young/Angus Maclise/Marian Zazeela'' - B-flat Dorian Blues 28th/63 (excerpt), from Theater of Eternal Music, on Strength Through Failure 2019-01-24 http://wfmu.org/playlists/shows/83802 * 2019-01-25 ''Irma Thomas'' - Live Again, heard on Schitt's Creek * 2019-01-25 ''Angus Maclise'' - Tunnel Music #3, from The Cloud Doctrine, on Strength Through Failure 2019-01-24 http://wfmu.org/playlists/shows/83802 * 2019-01-25 ''Angus Maclise'' - The First Subtle Cabinet (excerpt), from The Cloud Doctrine, heard on Strength Through Failure 2019-01-24 http://wfmu.org/playlists/shows/83802 * ''[[2019-01-24 Joan Shelley on Mountain Stage]]'', from a tweet by Tyler Wilcox * 2019-01-23 ''RYLR'' - Vacancy, on Vinyl Assault Vehicle 2019-01-23 https://spinitron.com/WERA/pl/3699642/Vinyl-Assault-Vehicle * 2019-01-23 ''Chastity Belt'' - Seattle Party, heard @ Outpost RVA * 2019-01-17 ''The Fall'' - Hip Priest, from A Part of America Therein (1981), on Strength Through Failure 2019-01-10 http://www.wfmu.org/playlists/shows/83552 * 2019-01-16 ''Sitka Sun'' - Yes Yes Forward, from Sitka Sun, on Vinyl Assault Vehicle 2019-01-16 * 2019-01-16 ''Art Ensemble of Chicago'' - Prayer for Jimbo Kwesi, on Vinyl Assault Vehicle 2019-01-16 * 2019-01-16 ''Molly Burch'' - First Flower * 2019-01-16 ''Faust'' - Krautrock, on Strength Through Failure 2019-01-10 * 2019-01-09 ''Ex-Hex'' - Cosmic Cave (from new album to be released on 2019-03-22) * 2019-01-08 ''Schubert'' - Rondo in A, Opus 107, played by Artur & Karl Ulrich Schnabel, per [[Terry Teachout|https://twitter.com/TerryTeachout1/status/1082766016009129988]] on Twitter: ** Mrs. T and I got home from running a string of exhausting errands and turned on the TV in search of music. This work, the most divinely beautiful piece I know, was playing. Let me share it with you, especially if you're in need of something beautiful: https://www.youtube.com/watch?v=TMj-CEZmemc
found out how from Jack Baty
The [[Edit-CompText]] plugin turns on autocomplete and finds matching tiddlers after entering the `[[` trigger pattern in the text area of a tiddler. Here's info about the plugin: http://snowgoon88.github.io/TW5-extendedit/ # Dragged his plugin in. # In `$:/ControlPanel` -> Info -> Advanced -> Editor Type -> `text/vnd.tiddlywiki` you must chose `comptext` instead of `text`. You can get right to that tiddler here: [[$:/config/EditorTypeMappings/text/vnd.tiddlywiki]] Here's the [[Google Groups thread|https://groups.google.com/d/msg/tiddlywiki/ojCXpPWGTIY/MwZUm2uBGwAJ]] on it.
Started with this: https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520on%2520Node.js.html
I didn't know until now that you can add dictionaries to the Dictionary app under its Preferences menu. ''2019-01-15 Update:'' I'm switching to the Oxford American English dictionary. The actual British one has pronunciation things in it that I don't understand.
I was sad at first to see five archive folders of my entire iCloud Drive in my home folder, but after reading in a bunch of places, those are apparently copies of your iCloud Drive that get created when you turn off iCloud Drive (like I did over the past year to try to get Messages to sync up, which didn't work). It should be safe to delete them.
A few weeks ago, some wise person on Micro.blog recommended [[Feedbin|https://feedbin.com]], but in my initial euphoric rush of reading the timeline, I forgot to Favorite the post or make a note of who recommended it. My two-week trial just ended and I gladly paid up for a year of the service. It would be worth that if its only feature was the ability to [[read email newsletters|https://feedbin.com/blog/2016/02/03/subscribe-to-email-newsletters-in-feedbin/]]. On top of that, it's a wonderful feed reader and has made me like RSS all over again.
.tc-menu-list-item { margin-bottom: .5rem; }
.tc-titlebar h2 { font-weight: 400; }
Last night I found the 2006–2008 version of TiddlyWiki "Classic" I used to use. It was packed with old notes and was now a snapshot in time of that period before I had a smartphone, but it still worked 100% as well as it did then. Now that I'm coming back to the modern version of TW and have a copy of it pushed to my website, it occurred to me that I finally have the "online notebook" I always wanted. I love Micro.blog, but sometimes I worry about clogging up the timeline with stuff no one cares about. This wiki is perfect for half-formed thoughts and atomic little pieces of information. There's no pressure to make anything presentable. Over time I'll be able to see what I was working on and what info I was gathering (i.e. hoarding). Others may get value from it, but if they don't, that's fine.
Via [[@brucegodin|https://www.brucegodin.ca/2019/01/17/the-case-for.html]] on Micro.blog From [[Kottke|https://kottke.org/19/01/the-case-for-impeaching-donald-trump]]'s post about Yoni Appelbaum's Atlantic article making the case for impeaching Trump. This is a searing, accurate summary: > Reading this, I was struck by a real sadness. What a massive waste of time the Trump presidency has been. America has urgent challenges to address //on behalf of all of its citizens// and they’re just not getting much consideration. Instead, we’ve given the attention of the country over to a clown and a charlatan who wants nothing more than for everyone to adore and enrich him. Meanwhile, the US government and a populace bewitched by breaking news is stuck in traffic, gawking at this continually unfolding accident. And we somehow can’t or won’t act to remove him from the most powerful job in the world, this person that not even his supporters would trust to borrow their cars or water their plants while on vacation. What a shame and what a waste.
From [[Jack Baty|https://micro.blog/jack/1905865]]: > @canion I use Capture One Pro. I also like Alien Skin Exposure and Luminar. Some like On1 or DxO PhotoLab. There are free ones also, like Darktable or Lightzone. from [[Mayo Jordanov|https://micro.blog/oyam/1906509]]: > @canion I second what @jack said. I've migrated to Capture One Pro. It really depends on your needs. I've also heard good things about Raw Power (the founder used to be lead developer on Aperture), which also has an iOS counterpart. If you don't need the library portion of photo processing (use Photos, etc), I'm a big fan of Affinity Photo. --- 2019-06-18: A good new Micro.blog thread about [[Lightroom Classic]] vs. [[Lightroom CC]], and alternatives like [[Capture One]]: https://micro.blog/canion/4113500
from Stay Tuned With Preet, [[Sanctions, Secrets and Security (with David Cohen)|https://www.cafe.com/stay-tuned-01-17-sanctions-secrets-and-security-with-david-cohen/]], 2019-01-17 Paraphrasing: > We're close to eliminating the territory ISIS controls. ISIS is like an infection. We have work to do to apply antiobiotics and stay the course. But that doesn't solve the problem. Need to go after the ideology, which is harder. Unlike what Trump says, ISIS is not "defeated" as in "we no longer have to worry about them".
It's January 18 and I still feel like I've only narrowly escaped the holidays. They wore me out this time. As a friend said tonight, "during the holidays, I feel like all I do is eat cheese". That's what we did, and I came out of it feeling dumb, just in time for seasonal affective disorder to kick in. TiddlyWiki is the only thing that's keeping me going at this point. Sarah rolls her eyes (lovingly) when I talk about it, but she's done everything except full-on refer to it as "my new girlfriend". Still, it's making me notice things more, like when someone's quote keeps rattling around in my head for days. When I have an a-ha moment while reading something or listening to a talk or a podcast, I add a note to my [[buffer notes]] text file, either using Drafts or BBEdit, with just enough to remember the spark and expand on it later. When I get to the laptop, I break these out into tiddlers. At this rate, I'm going to have a completely unmanageable wiki in a very short time. Maybe I'm hoping it becomes sentient or something. Or maybe I'll accumulate enough notes that I'll eventually arrive at the serendipitous connections Mike Caulfield and Steven Berlin Johnson write about. I just can't believe I didn't do this in earnest years ago. It's like one tiny way I can cheat a short memory and finite time allowed on earth, like if I cram enough stuff in here, things will make sense for longer than otherwise.
Manton explained how here: https://www.manton.org/2018/11/21/photos-grid-on.html Here's how it works: https://github.com/cleverdevil/microgram
! A-HA!!! from https://tiddlywiki.com/static/Introduction%2520to%2520filter%2520notation.html <<< The simplest case is where you already know exactly which tiddlers you want. Type each title in double square brackets, with a space between each one and the next: > `[[Recipe book]] [[ScrambledEggs]] [[Mom's apple pie]]` You can omit the square brackets when a title doesn't contain any spaces: > `[[Recipe book]] ScrambledEggs [[Mom's apple pie]]` The double square brackets are actually a shorthand for this: > `[title[ScrambledEggs]]` ... which gives us the <<.def "general model">> for any filter: > `[operator[parameter]]` For instance, here's how to select all the tiddlers that have been tagged <<.tag Recipe>>: > `[tag[Recipe]]` <<< So, if I added a zettel (unique) ID as a tiddler field, I could eventually do something like this and refine this search to only search zettel IDs: `<<list-links "[!is[system]search[20190108T0948]]">>` But still, [[Do tiddlers have unique IDs?]]? Wouldn't need to add a zettel ID field if they do. And if I do link to individual unique IDs like this instead of by tiddler title, I don't think I get backlinks.
Why don't I care about posting film photos on Instagram anymore? For seven straight months, I posted one photo a day and had fun methodically listing the camera, lens and film used. I enjoyed all the likes, checked them too often, and enjoyed even more the written comments. And I was shooting all the time, so it just kept feeding itself. Will the joy come back? Is it just because it's cold outside and I haven't felt like taking cameras anywhere recently? There are still some photographers I've never met whom I regard as friends on Instagram: [[Paul Jones|https://www.instagram.com/mundane.profane.sublime/]], [[ourdaysofgold|https://www.instagram.com/ourdaysofgold/]] in all its incarnations, and [[Brett Wood|https://www.instagram.com/liminaltart/]]. We all like each others' photos as each one comes out. I don't know if it has to do as much with actually liking them (although I really do), as it is more of a wink, saying "yes, you're doing good, keep going". Those nudges remind me that there are real people behind those accounts. I miss them when I don't check in. Still, the lack of a "like" mechanism on Micro.blog has had the effect of short-circuiting my need for likes on other platforms. This is a //great thing//, and can only be appreciated once you've lived with it for a while. But I'm not leaving Instagram anytime soon. I don't want to think too much about Facebook owning them, because that will suck the joy out of posting. I do wish that all of my favorite photographers would just move over to Micro.blog. The supportive and encouraging film photography community would be a natural fit over here. All of this is probably less complicated than I'm making it out to be. My wife just summed it up by saying, "You're not posting on IG because it's cold out and this is how you operate—one obsession at a time [i.e. Micro.blog and TiddlyWiki — ok, two]. It'll come back when it's warmer. You don't need to be so hard on yourself." (Aside: This post probably wouldn't have been written if I hadn't innocently started it as just a "short" journal entry in the wiki. What a sneaky and delightful app TiddlyWiki is.) (And oh my goodness, I just found a brilliant tool called [[Paste to Markdown|https://euangoddard.github.io/clipboard2markdown/]] that I'm using to convert the HTML rendering of a tiddler (copied to the clipboard) to Markdown for easy posting to Micro.blog. Holy cow.)
Seeing [[@herself|https://micro.blog/herself/1898463]]'s post about her [[Flickr analog-only reboot|https://www.flickr.com/photos/jnickelsen/]] made me remember how nice Flickr is for looking at high-resolution photos. I want to get back to posting there, and I want photos to end up on Micro.blog + Instagram, too. So I need to make it easy to post from Lightroom to all three at the same time, or at almost the same time. Ideally, I could be in Lightroom and fire off all these exports: """ LR => local photo library on Dropbox ====> Flickr (via [[Jeffrey Friedl's Lightroom-Flickr plugin|Jeffrey Friedl Lightroom-Flickr plugin]]. ([[Jack Baty|https://rudimentarylathe.org/#Lightroom]] mentioned Jeffrey Friedl's plugins.) ====> IG (via [[LR/Instagram|https://www.lrinstagram.com]] plugin or [[Uplet|https://getuplet.com]]) -> Micro.blog (via [[OwnYourGram]]) """ Next to try: * https://jordanbrittley.com/blog/lightroom-to-instagram-export-settings - this appears to give a lot of control and also resizes to the IG-native dimensions right in Lightroom. I could export to a temp/IG-only folder in macOS, get the preset to share to Photos instantly (I guess?), and that would get it in iCloud Photo Library. * With the Brittley preset, for the text part, I could look into using an iOS-macOS shared clipboard. Though I like using BBEdit, I hate the process of composing my post on a scratch.txt file in Dropbox, opening Editorial on the iPhone, making sure Dropbox has synced, copying a portion of the file containing the post, opening IG, picking the last photo, pasting in the text, going back to Editorial to select the comment line (where I put hashtags), copying that, and hopping back over to IG to paste it in (although I could do that last bit on the website on the Mac). The shared clipboard idea would at least save me from having to flip to Editorial on iOS. Log: * [[2019-01-21 installed Copied app for macOS]] -- works great! * 2019-01-20 installed Friedl Lightroom-Flickr plugin * 2019-01-20 Tried [[Planoly|https://www.planoly.com]] and didn't like it. It's not worth much to me since I don't have a Business account on IG, so you still have to use your phone for the actual post. (The [[Buffer|https://buffer.com]] service/app has the same limitation.) And I don't trust their image compression/resizing. See also: [[2019-01-20 Mac photo browsing apps]]
Researching for a friend: https://forums.stevehoffman.tv/threads/wharfedale-diamond-10-2-or-denton-anniversary.477663/ https://www.stereophile.com/content/additional-considerations-speakers-small-room https://www.stereophile.com/content/integrated-and-speaker-suggestion
from Woody Guthrie’s Fan Letter To John Cage and Alan Hovhaness (1947) on [[Open Culture|http://www.openculture.com/2012/11/woody_guthries_fan_letter_to_john_cage_and_alan_hovhaness_1947.html]]: > I think that John Cage and Alan Hovaness [sic] have caught and handed over to us a whole forest and desert mountain full of these fine things that would be looked down on or looked over in bashful weakness by ninety nine out of a hundred second raters in every window. Linked to by Christopher Chelpka on Micro.blog: https://www.christopherchelpka.com/2019/01/19/woody-guthries-fan.html
I had forgotten how to do this: I wanted to make an action to open the Node.js instance of TiddlyWiki in Firefox only. You can make a Custom Trigger in Quicksilver that opens a URL in a specific browser (if you bookmark the URL in Safari first). Don't assign a keyboard shortcut to it. Once you activate Quicksilver with command-space, you can make that trigger show up in your list of available matches by typing the matching characters. What would be even better would be to //only activate// the TW tab in Firefox if it's already open, but I don't know how to do that yet.
from http://brettterpstra.com/projects/markdown-service-tools/ > Simply drag the Services you want to use into `~/Library/Services` (where `~` represents your user’s home folder). You will have to enable the Services manually in the Keyboard Shortcuts preference pane of System Preferences. Mapped `**bold**` to Ctrl-Command-B to use in Safari text areas. I used to have these before and don't know where they went in the meantime.
I want a cleaner/faster/nicer way to browse images I export out of Lightroom to the Dropbox/Photos folder. [[Xee|https://theunarchiver.com/xee]], suggested by [[Jack|https://micro.blog/jack/1972932]] [[Photo Mechanic|https://www.camerabits.com]], [[Jack|https://micro.blog/jack/1972932]]'s favorite and it looks like a pro-level tool (used by journalists) [[Spect|https://itunes.apple.com/us/app/spect/id1409975750?ls=1&mt=12]] on Mac App Store. $4.99. Trying this and it's nice! Ultra simple, almost like the Finder, but with giant thumbnails across the board, and it's easy to navigate, jumping in and out of folders and subfolders. And you can tab between the folder browser and individual images. [[Full Frame|https://inlandsea.cc]]
https://micro.blog/garciabuxton/1947221 Super-nice compliments from @smokey and @garciabuxton
(Pairing has to be turned on for [[Universal Clipboard|2019-01-21 How to use Universal Clipboard between iPhone and Mac]] to work.) This works for me when nothing else does: # Make sure any existing connections to the two devices are forgotten # Turn off Bluetooth on the MBP and iPhone # Turn on Bluetooth on both devices # Wait for the MBP to show up in the iPhone's list of available devices # Initiate the pairing process from the iPhone (doing it from the MBP always fails for some reason) # Confirm and finish the pairing request on the MPB
# Wi-Fi, Bluetooth, and Handoff have to be on # Devices have to be [[paired|2019-01-21 How to pair iPhone and MacBook Pro]]. 2019-01-21 Update: I'm giving up on this -- life is too short. I can't get Universal Clipboard to work. All the how-to articles on the web say to sign out of iCloud and I can't do that on the Mac while it thinks Photos are updating. Just bought [[Copied|Copied app]] to do the job.
Installed [[Copied app]] on iOS and macOS. It syncs through iCloud Drive.
Sometimes I think better away from a computer. This morning, I was feeding [[Roger|http://twelvety.micro.blog/2019/01/04/sarah-and-roger.html]] and then washing the French press, and thought, "This silence is nice, but it's been quiet long enough. Maybe I should turn on NPR news." I lasted about two minutes before realizing the story they were covering didn't mean anything to me. I turned it back off and kept washing at the sink. During the silent times before and after having the radio on, I was able to figure out some possibilities for [[streamlining posting to Instagram|2019-01-19 streamlining posting to Instagram, Micro.blog & Flickr]]. I should learn to enjoy the quiet moments for thinking, especially when I'm away from a laptop or iPhone. I don't always need to fill them up with podcasts or (especially) news. How many times have I been in mid-thought during the workweek and been frustrated at a spontaneous interruption from someone? Why would I give up the opportunities for those thinking periods at home just for the sake of multitasking? (I just realized: I think I was more aware of the loud vs. quiet because of this post from [[Sameer Vasta|https://www.inthemargins.ca/everything-too-loud]].)
https://micro.blog/jack/1972932 [[Jack Baty]]: > @twelvety Re: this tiddler, you might have a look at Xee as another decent, inexpensive option. The king, IMO, is Photo Mechanic @tgray: <<< @jack Photo Mechanic is the best. A cornerstone of my workflow for over a decade. Xee is my Swiss Army knife for opening almost anything. <<<
I wondered how much I had been playing with TiddlyWiki this month, so I checked RescueTime today. (This is a word of caution to people like me who gravitate towards an app like this.) I started playing with TiddlyWiki 5 on 2019-01-06. As of 2019-01-21, I've spent 18 hours, 35 minutes in Firefox in January, which can almost all be attributed to messing around in TiddlyWiki. That's 16 days, at an average of 1.16 hours/day. That isn't //so bad// by itself, except for the situation I get into on weekends where I just go for two to three hours straight and barely come up for air. It sure is fun, but I don't think that is good by itself.
Because I can't get enough of how other people use journals... Jack Baty updated his tiddler about [[Org-Journal|https://rudimentarylathe.org/#Org-Journal]] and listed some old related links to his blog: * [[Making org-journal more like Day One|https://www.baty.net/2018/making-org-journal-more-like-day-one/]] * [[Org-Journal May Replace My Daybook.org File|https://www.baty.net/2018/org-journal-may-replace-my-daybook.org-file/]] * [[A change to my Org Mode journaling|https://www.baty.net/2017/a-change-to-my-journaling-in-org-mode/]] I was especially interested in how he used Day One and found the [[Tinderbox to Day One|https://www.baty.net/2016/tinderbox-to-day-one/]] post from 2016-10-09: > Day One is nice when I’m out and about and want to include photos and location information. The Day One mobile app is great. and... > For logging travel, events, food, and people, Day One is great. <<< I use Tinderbox for all other entries. It’s my “Daybook”. Tinderbox lends itself to data analysis and text processing, so I put as much in there as possible. An example Tinderbox entry might be… > Ordered replacement filter for CPAP Boring, but useful. There’s no need for location information or a photo. I just want to record it so I can find it later. <<< I really like the idea of a "daybook". It doesn't seem as private as what goes in Day One, although I guess it would be the kind of non-computery personal/practical stuff that I wouldn't put in the public TiddlyWiki. And because it could capture so many other little detals, it seems like it could be wildly useful for reference later. I just need to figure out if I'm going to turn my Day One subscription back on or dive into Org-Journal. Or both! And if I do Org-Journal, would I turn on encryption? I don't know how I'd add stuff to it on the iPhone.
http://www.dougengelbart.org/content/view/209/448// Ghostery barfs on this page, but just click through it.
from https://www.emacswiki.org/emacs?action=browse;oldid=EmacsOnMacOS;id=EmacsForMacOS#toc2 `brew cask install emacs` which installs a pre-built package from https://emacsformacosx.com/ I see it finished and moved it right to `/Applications/Emacs.app`!
Tyler Wilcox [[tweeted a link|https://twitter.com/tywilc/status/1088483609944612864]] to [[Joan Shelley on Mountain Stage|https://www.npr.org/2019/01/22/687363660/joan-shelley-on-mountain-stage]]. I'd never heard of her, but I'm listening to her //Over and Even// album on Spotify and so far it's really good. Her voice sounds like something between Gillian Welch and Sarah Harmer.
TiddlyWiki as anti-aging remedy (a theory): # Makes me more curious about the world, more aware of what has my attention, and on the lookout for gems to add to the database # Helps me remember why and how I do certain processes (installing and configuring software, for example) # Encourages me to make connections with stuff I've previously entered # Potential for endless refactoring of tiddlers could be viewed as a project in itself, but my feeling is that it's like swirling hot chocolate around in a mug: By keeping everything visible and mixed in and active, the good stuff doesn't settle to the bottom where it can't be enjoyed.
from: https://ftp.gnu.org/old-gnu/Manuals/emacs/html_node/emacs_18.html There are two commands for exiting Emacs because there are two kinds of exiting: suspending Emacs and killing Emacs. Suspending means stopping Emacs temporarily and returning control to its parent process (usually a shell), allowing you to resume editing later in the same Emacs job, with the same buffers, same kill ring, same undo history, and so on. This is the usual way to exit. Killing Emacs means destroying the Emacs job. You can run Emacs again later, but you will get a fresh Emacs; there is no way to resume the same editing session after it has been killed. `C-z` Suspend Emacs (suspend-emacs) or iconify a frame (iconify-or-deiconify-frame). `C-x C-c` Kill Emacs (save-buffers-kill-emacs).
[[Fabio Roberti]] dedicated his entire [[January 24 "Strength Through Failure" show on WFMU|http://www.wfmu.org/playlists/shows/83802]] to the memory of Jonas Mekas. There was music related to Mekas projects and films, and a few snippets of him speaking in films and interviews. So good, and sad.
https://micro.blog/canion/2019841 @amit: > I see a lot of people exploring wiki, especially TiddlyWiki, as a way to capture thoughts these days. There must be some fun and efficiency in it for so many folks to enjoy it. I’m tempted to experiment a bit with it. But I am worried I may be sucked in for another project. [[Andrew Canion]] and @bradenslen weighed in with stuff about DokuWiki, too. I think we hooked @amit in the end.
Why would I want to write a note to myself about a TV show? Because this one is great, and inevitably, five years from now, we'll say to each other, "What was that incredible, slow-paced, Canadian show with the formerly-rich people in the motel?" We're on Season 1 and got a late start on it, but man is it good. You have to give it a couple of episodes to ramp up and get to know the characters. After that, it pays off again and again. [Before TiddlyWiki, I would never have written a quick note to my future self about the quality of a TV show. Wouldn't have done it in Day One, wouldn't have done it in journal.txt, nor in nvALT, nor in a blog. Something's different here. There's a chance I might actually see this note again someday.]
''[address the reply to @amit and Brad, and cc @eli, @canion and @jack when I reply]'' -- post it as "A Path to TiddlyWiki", which I stole from [[Jack|https://rudimentarylathe.org/#2019.01.25%20-%20Phil%20N%3A%20A%20path%20to%20TiddlyWiki]]. Responding to Amit and Brad on this Micro.blog thread. [[Amit said|https://blog.amitgawande.com/1548391699069]]: > I see a lot of people exploring wiki, especially [[TiddlyWiki|https://tiddlywiki.com/]], as a way to capture thoughts these days. There must be some fun and efficiency in it for so many folks to enjoy it. I’m tempted to experiment a bit with it. But I am worried I may be sucked in for another project. Hi Amit, I'm glad you're curious about TiddlyWiki! Here's my experience so far: Yes, be aware that it could become a project. I've spent [[arguably too much time on mine|http://twelvety.micro.blog/2019/01/22/hours-minutes-of.html]], but I'm managing to keep it in control, at least this week. (If you //really// want to surrender your life, learning Emacs seems like a [[great project|https://www.youtube.com/watch?v=FtieBc3KptU]], and I can already feel the pull myself.) Here's [[my wiki|https://twelvety.com/tiddlywiki.html]]. These various things led me to take a fresh look at TiddlyWiki after trying it out initially during 2005–2007: * Steven Berlin Johnson's [[article about DevonThink|https://stevenberlinjohnson.com/tool-for-thought-b12c170fcc24]]. I don't know if he still works this way, but it was illuminating and inspiring to see the process and results. * Seeing the examples in Federated Wiki from [[Mike Caulfield|https://hapgood.us/2015/10/17/the-garden-and-the-stream-a-technopastoral/]]. The idea of breaking things into tiny chunks for reuse is very appealing to me. Transclusion! Why doesn't everything have it?! * What [[Jack Baty|https://rudimentarylathe.org]] and [[Andrew Canion|https://andrewcanion.com/wiki/]] have done with their wikis. * Eli Mellen's [[Micro.blog wiki|https://m.b.wiki.eli.li/]] What sealed the deal: * Hearing Jeremy Ruston talk about the philosophy and history of TiddlyWiki on an old episode of the podcast [[The Changelog|https://changelog.com/podcast/196]]. He's a believer in making things that allow non-programmers to do that things that only programmers could do before. * The massive [[TiddlyWiki community|https://tiddlywiki.com/#Community]], including the [[Google Group|http://groups.google.com/group/TiddlyWiki]] and [[Google Hangouts|https://tiddlywiki.com/#TiddlyWiki%20Hangouts]] * The lovely look of the default TiddlyWiki installation * I don't worry so much about whether tiddler titles are filesystem-legal. I use the Node.js version and it handles converting characters like `:` and `"` in titles to `_` in tiddler filenames automatically. * This line from the [[TiddlyWiki documentation|https://tiddlywiki.com/#Future%20Proof]]: > TiddlyWiki is designed with the long term needs of its users in mind. Because it is OpenSource and needs no infrastructure, we can be confident that all we'll need to access a TiddlyWiki file even in the far future is an ordinary HTML browser. If you're starting to use TiddlyWiki at the beginning of your career you can be confident that it will carry you through to retirement. So, it turns out: * I had a TW-shaped hole in my heart for years and didn't know it. I almost went with [[DokuWiki|https://www.dokuwiki.org]] because of its ability (like the Node.js version of TiddlyWiki) to store tiddlers as individual text files, but the layout and flow of TiddlyWiki just suits my brain better. I almost always navigate my own TiddlyWiki instance with the Recent tab, which shows the most recently edited tiddlers at the top. * I tried using the Markdown plugin for a couple of days, but as [[Jack said|https://rudimentarylathe.org/#2018-10-23%20-%20Journal]]: > Markdown is great, but it's like swimming upstream using it with TiddlyWiki * I haven't regretted adopting the TiddlyWiki markup language. I even caught myself today using TW markup for `//italics//` in something I was capturing in Notepad on my work computer, which I knew I would paste into TiddlyWiki later at home. * I started with a [[standalone HTML version|https://tiddlywiki.com/#GettingStarted]], which is easy to do, and lasted all of two days before it started bugging me that the tiddlers weren't stored in individual text files. I followed Jack's example and got it running on Node.js and it's been smooth sailing ever since. * I was afraid I "wouldn't have enough to share" if i made my wiki public, but I have 117 tiddlers (not counting system tiddlers) in the public wiki right now. In contrast, I created a separate standalone HTML private TiddlyWiki on January 12 for stuff that I wanted to firewall away from public view. That wiki has //two// tiddlers in it as of today. I have stuff I want to put in it, but it hasn't been as fun as posting to the public one. What i use TiddlyWiki for: * Software installation notes, current discoveries in music/TV/film, a-ha moments, quotes, drafts of stuff I'll post on my blog, links to websites and videos, notes on books and podcasts, favorite poems, snippets of prose I want to remember, tiddlers imported from other people, and of course: meta-journal entries about how I'm using TiddlyWiki. I saw Jack and Andrew doing that with their wikis and realized it was a great way to note my ongoing questions and to see how my use of TiddlyWiki evolved. * Scratching the coding itch. I'm not a developer at work, but I've always been drawn to programming and have dipped my toe in it here and there. At my company, you're either a coder or you're not, and there's not much chance for me to play with languages other than occasional HTML and CSS tweaks. I've mostly had to limit my experiments with shell scripting, AppleScript, JavaScript, Unix/Linux/Raspbian sys admin, etc. to experiments at home. There is incredible power under the hood of TiddlyWiki, and it doesn't take much to tweak your own macros and make it do some amazing tricks. I have no ties to Jeremy or stake in TiddlyWiki other than hoping it stays alive and relevant, but I am a huge booster already. I wish everyone on Micro.blog would make and publicly host their own wikis. It's a fascinating way to keep tabs on what other people are interested in in real time. I put way more stuff in my wiki than I post on Micro.blog. I even used TiddlyWiki to create the draft of this response before I posted it on M.b. If you have questions or want to share what you're playing with, I'd love to hear about it! p.s. I even stole the "A Path to TiddlyWiki" title for this post from Jack, who had created [[his own tiddler|https://rudimentarylathe.org/#2019.01.25%20-%20Phil%20N%3A%20A%20path%20to%20TiddlyWiki]] linking to my draft of this response in my TW. It's bonkers how this works!
And so begins my descent.
I am super flattered that @jack [[linked|https://rudimentarylathe.org/#2019.01.25%20-%20Phil%20N%3A%20A%20path%20to%20TiddlyWiki]] to the draft version of my response to Amit and Brad. There's no bigger compliment than someone voluntarily visiting your wiki (b/c no RSS feed) and being excited enough by something I wrote that they would blog about it. This is //exactly how this is supposed to work!// Like Jack, I view my entire wiki as a draft, always morphing and refactoring. It may be more like a public hyperlinked Google Doc, never really completed. I want people to see the messy process of me working things out and thinking out loud. Also, like Jack, I'm tempted to put everything in it, at least first. There's just too much potential in transclusion and linking to put things anywhere else. (except for Daybook kinds of things—see [[Jack|https://www.baty.blog/2018/tinderbox-daybook-tour]] and [[BSAG|https://www.rousette.org.uk/archives/tinderbox-daybook/]]—which is a whole 'nother idea I'm now obsessed with.)
I love how Lawfare always eschews the most dramatic, sensational readings of Mueller's actions. They just use their experience and vast knowledge of national security law to point out matter-of-fact stuff. From [[‘Get Me Roger Stone’: What to Make of the ‘Dirty Trickster’s’ Indictment - Lawfare|https://www.lawfareblog.com/get-me-roger-stone-what-make-dirty-tricksters-indictment]]: > ...it’s no secret why Mueller’s team decided to execute an early morning raid, rather than allow Stone to surrender himself to authorities. The special counsel’s office made this very clear in its motion to seal the indictment and related warrants and motions, filed the day before Stone’s arrest: >> Law enforcement believes that publicity resulting from disclosure of the Indictment and related materials on the public record prior to arrest will increase the risk of the defendant fleeing and destroying (or tampering with) evidence. It is therefore essential that any information concerning the pending indictment in this district be kept sealed prior to the defendant’s arrest. And later: > According to CNN, the first hints were provided when a Mueller’s team told a grand jury witness to select a day for testimony other than Friday—an indication the special counsel’s office anticipated being busy. Then the grand jury was set to meet Thursday, instead of on the usual Friday. CNN reporters then observed Mueller’s prosecutors in the courthouse meeting with the grand jury and later saw one of those prosecutors wheeling a suitcase, suggesting plans to travel. CNN decided to send a team to stake out Stone’s house in case an arrest was imminent. In other words, this does not appear to have been a leak it all—just good reporting leading to a scoop.
[[Jack Baty wondered aloud|https://rudimentarylathe.org/#2019.01.26%20-%20A%20question%20about%20hate%20speech]]: <<< I have an honest question. Should the following statement be considered "hate speech"? "Fuck everything about that guy!" <<< No, absolutely not. And yes, you don't see much talk like that on M.b, but I'd rather it be allowed to happen, as long as it doesn't harm anyone and isn't rooted in prejudice + power like racism is. And if the f-word bothers anyone, they're welcome to not follow the person who said it.
Now that I have this space to put snippets, ideas, and discoveries, it's revealing that the pace at which I'm searching, seeking, finding and collecting is outstripping the speed at which I can read, process, and enter things here. My phone and laptop browsers are bursting at the seams with tabs about Emacs and Org-mode and Org-journal, Tinderbox, favorite threads on Micro.blog, a whole series of Karl Voit pages, Zettelkasten, etc. And my buffer.md file is another place where snippets and URLs go before being discarded or landing in TW. It's filled with more of the same and also with links to thoughtful, unread blog posts by real people on Micro.blog. THERE IS TOO MUCH.
from the Tutorial PDF: <<< It’s not very difficult to assign prototypes to newly-created notes, but we can ask Tinderbox to automate this by adding an OnAdd action to the School Stories container. 1. Select the Outline tab, and then select the container named “School Stories.” 2. Open the Inspector, and choose the Action Inspector. 3. Select the Action pane if it’s not already selected. 4. Enter the OnAdd action $Prototype="Story"; and then Press [return]. <<<
from http://forum.eastgate.com/t/love-hate-relationship-and-tinderbox-7/597/4 Brian Crane: > The new multi-select feature also makes cut-and-paste (a go-to export technique I use all the time!) much more powerful: select multiple notes and their Titles and Texts stack in the view window ready to be selected and copied.
The 2014 MacBook Pro has a Thunderbolt/Mini DisplayPort video output, but the MDP-to-HDMI cable I have doesn't work with the [[BenQ BL3200pt monitor]]. All of the stuff about HDMI vs DVI-D vs DisplayPort stuff is so confusing. I figured it's better to not have to do a bunch of radical conversions of the signal, so I ordered the AmazonBasics Mini DisplayPort to DisplayPort cable. Fingers crossed. https://www.amazon.com/gp/product/B013PWQN1Y
I didn't get to add anything to TiddlyWiki today except for this. A mandatory team lunch outside took away the time I'd usually spend with the MacBook in my safe zone in the cafeteria. That's probably good in the end, but man do I miss tinkering. There was lots of nice back and forth on Micro.blog today about journaling. Jack Baty sent his Tinderbox sample files and they are a //goldmine//.
I never had a LiveJournal account that I can remember, but I wonder if the journal entries in this wiki are the closest "modern-day" analogue to it. I feel so much freer to blurt things out here than I do on Micro.blog, where it's more of a commons. Which reminds me: Back to this whole [[2019-01-26 Rules about hate speech on Micro.blog]] thing: I keep turning this over in my head. The dude who started the original conversation is certainly free to write whatever he wants on the timeline, and we're all free to unfollow anyone who gets on our nerves. (I haven't unfollowed anyone yet.) Being able to post on M.b is not protected speech in that the government isn't shutting down people from speaking and there's no right to post there. It's a business/service. Manton and Jean are free to moderate all of our posts and set up whatever rules they think the community needs. But I also don't feel muzzled or restricted by toning myself down on M.b. It's actually good for me and my brain not to spout off there like I did on Facebook and Twitter for 2.5 years starting in the spring of 2016. I was a lot angrier about current POTUS and the state of things and I just wanted to shout to anyone who would listen, but it wasn't useful. I thought it was at the time. I confused posting and tweeting with activism. It didn't change anyone's mind and it just made me look crazy, even if the stuff I was commenting on was actually crazier. I'm still angry, but that [[You'll never be happy if you read the news all the time]] moment on Nerds on Draft was a turning point for me. That's when I stopped following the news so closely and started embracing hobbies again. Anyway, back to M.b: I think of it like a dinner party that's been going on for a year and I just knocked on the front door and everyone hugged me and invited me into the kitchen. If I went to an IRL dinner party, I personally wouldn't start a conversation by yelling about much of anything, especially politics. If someone brought up an issue and we had similar thoughts, I might chime in. If we had differing opinions, I might (but most likely wouldn't) engage in a friendly debate. But the thing about M.b is that the real people on there seem more real and more thoughtful, so why would I want to scare them away? Even though real people are behind most(?) Twitter accounts, tweeting feels like broadcasting to a bunch of Twitter clients and APIs. Twitter is still there if I want to retweet something aggravating, but I even do way less of that now, because it's just virtue-signalling and preaching to the choir. I have no desire to bring my old self to the M.b gathering. So, even if the community agrees with me that using the word "fuck" to vent about a president isn't hate speech, I don't know if any rules need to change or should change. (As for the word "fuck", Lord knows that a day rarely goes by when I don't say it at some point about something. What a great word.) When that post popped up, I raised my eyebrows like the old man I am, grinned, and scrolled past it. It seemed like an outlier in the grand scheme of things, and the statistical process control chart for M.b is still wholly within the limits of non-shouty. The fact that so many people engaged in a conversation about it is a testament to how different M.b is in the first place.
Last night I created a bunch of tiddlers, one for each song I had found over the past couple of weeks. Then saw [[Jack Baty echo h0p3's concerns about TW scaling|https://rudimentarylathe.org/#2019.01.29%20-%20h0p3%20asks%20about%20TiddlyWiki%20scaling]] and thought it would be better to list found music by month, like this: [[2019-01 found music]]. Could get out of control if it was one tiddler per song.
from https://stackoverflow.com/a/22220070 <<< Your current ''config-file'' should be stored in the variable ''user-init-file'': use `C-h (Control-h) v user-init-file RET` This will show whatever Emacs is using (it might be nil, if it is not using anything). <<< Which leads me to... [[2019-01-31 What is the RET key in Emacs?]]
from https://www.emacswiki.org/emacs/MetaKeyProblems#toc18 <<< When using native ''EmacsForMacOS'', the variables `mac-option-modifier`, `mac-command-modifier` and `mac-command-key-is-meta` are useful for changing the behavior of different modifier keys. <<< I see that my modifier key (referred to as "M" like in `M-x package-install org-journal`) in the GUI Emacs is already mapped to ''Alt''.
Why would you want to hurry up someone speaking about something interesting? See also: [[Stephen Dobyns: Each thing I do I rush through...]]
The more I use TiddlyWiki, the more I feel like it's an extension of my brain. Last night, I was looking into some notes I had written about [[Org-Journal]] and found stuff I had written //only a couple of weeks ago// that I had already forgotten about and served to remind me what I was thinking at the time. It's like, if it's not in the wiki, I don't actually know it, which sounds dramatic. But it's similar to when I first got into GTD and adopted the "Capture" step (which is the only step that's stuck after all this time; "Process" and "Review" and "Do" are where it gets difficult). From then on, I got ruthless about capturing tasks. If a task isn't captured, it's gone forever and can't be committed to. The wiki is starting to feel the same. Like, why research anything if I'm not going to record it in here? It's just going to float anyway otherwise. Also, I am completely at sea about which tiddlers get date prefixes and which ones don't.
Examples: * We always played the entire House of Cards intro, even though we had seen it 5,000 times. * I always listen to the entire "Mr. Giant Man" track in [[Strength Through Failure on WFMU]]. It's a ritual and a show of respect for the time put in to DJing a live radio show, and it gets my head in the right place for hearing everything after it. See also: [[Stephen Dobyns: Each thing I do I rush through...]]
from https://emacs.stackexchange.com/a/14944 <<< First, `RET` is not a physical (keyboard) key. It is a logical key -- the Emacs way of writing what your physical ''Return'' or ''Enter'' key typically sends to Emacs: a Control-M character (which Emacs also writes as `C-m`, when describing the ''Ctrl'' + ''m'' key sequence). And if your physical ''Return'' or ''Enter'' key sends something else, then Emacs writes that as the pseudo-function key `<return>`. And Emacs automatically maps `<return>` to `RET`, unless `<return>` is itself bound to a different command than `RET`. (Note that the ASCII control character Control-M is also called a carriage return character, and `C-m` is essentially another way of writing `RET`.) <<< I see this is all part of the Emacs hazing process.
[[Andrew Canion]], on [[Bliss Station|https://andrewcanion.com/wiki/doku.php?id=bliss_station]]: > Last night our family were at the shopping centre. At one point I sat down in the mall and, in between playing with my 3 year old boy, looked around, watched, and observed. Everybody on their phones, heads down, like so many zombies. We are giving ourselves up to these devices at times when we should be enjoying the experience that is life. There is no need to always try to fill time.
7 pm: The [[Slate Political Gabfest|https://slate.com/news-and-politics/2019/01/the-political-gabfest-discusses-howard-schultzs-threat-to-run-for-president-mitch-mcconnells-legacy-with-guest-charles-homans-and-performative-workaholism.html]] I heard in the car on the way home tonight had a segment on the depressing notion of "[[performative workaholism|https://www.nytimes.com/2019/01/26/business/against-hustle-culture-rise-and-grind-tgim.html]]", where people are I suppose compelled from within to work and strive and hustle and never stop. UGH. Not me, no thanks. I need downtime, white space in the calendar, quiet, etc. But it made me think: is this wiki in danger of (or already) becoming "performative"? Sure, I know a couple of people check in on this wiki fairly regularly and I'm lucky to have like-minded friends on the internet and I so appreciate it. And knowing that there's the potential for it to be used by, and benefit, others is part of what keeps me feeding it. But am I editing too much out of it knowing that others can see it? Am I prone to add things to it that I wouldn't add if I knew it was completely private, only for the purpose of showing off? Is this no better than Instagram or Facebook, and I curate the tiddlers in order to portray a geeky, well-rounded, inscrutable old man who makes pronouncements like "[[2019-01-31 People who skip intros on TV and radio shows are monsters]]" for the purpose of telegraphing a knowing wink to others, even if I really do feel that way? Am I being //authentic// with all this stuff? Ugh, again. 10:22 PM: Oh man the refactoring and gardening is fun. Few things in life are as satisfying as organizing information the way I want to.
I am totally flattered that Jack Baty saw my [[open-ended question about date prefixes|2019-01-31 Journal]] from yesterday and responded on his wiki with [[2019.02.01 - Wiki: When to use a date prefix|https://rudimentarylathe.org/#2019.02.01%20-%20Wiki%3A%20When%20to%20use%20a%20date%20prefix]]. I've stolen his tiddler: <<< ''If it matters at all when it was written, use the prefix.'' ''Use a date prefix'': Journal entries, log-type entries, links, and anything that could pass for a blog post. Those don't change over time, and are essentially "frozen" once written. ''Don't use a date prefix'': Main topics (Emacs, TiddlyWiki, etc), collections (Quotes, Words, etc), or //things// like Micro.blog. These things evolve over time so a date makes less sense. <<< I can't think of anything to add to it, other than: ''Consider whether the tiddler name is ever likely to change,'' and then figure out which direction to go from there — there is no right answer. Also, a date usually means the date I encountered a piece of knowledge, which is not always the date I put it into TiddlyWiki. It could have been originally entered in nvALT years ago, and that old date (if it matters) will be part of the title of the tiddler here. If I don't know the day, or the month, or the year, I can put an "x" on the digit(s) I'm unsure about. So, `199x-xx-xx` would mean "sometime in the 1990s".
from https://www.emacswiki.org/emacs/SetFonts To change the default font for new (non special-display) frames, put either of these in your init file: ``` (add-to-list 'default-frame-alist '(font . FONT )) (set-face-attribute 'default t :font FONT ) ``` I went with this: ``` (add-to-list 'default-frame-alist '(font . "IBM Plex Mono-16")) ```
These were in Things3 and became annoying, recurring daily items. On 2019-02-02, I took them out and stopped the recurrence because they either weren’t getting done or they were getting done without me looking at this list, and because the [[Momentum app]] on iOS is a better place to track habits: !!! Morning routine * stretch * Prep breakfast before shaving * Review Things3 Today & Inbox * Moisturize face * ~~REDACTED~~ * Make coffee !!! Evening routine * Kitchen zero * Make tomorrow's lunch * Floss * Review YNAB transactions & budget * Send today's diary tweet to self * Clean mouth guard for tonight * Empty and wash shaver * Prep Sarah's mug and coffee maker * Wash coffee-press thermos * Take Zoloft
from https://medium.com/urbint-engineering/emacs-doom-for-newbies-1f8038604e3b <<< !!! Emacs Key Binding Philosophy The three core concepts for Emacs key bindings are ''modifiers'', ''chords'' and ''sequences''. A modifier key is any one of the following. Anything else is a “non-modifer key”: [img[https://twelvety.com/philtiddlywiki_images/2019-02-02-emacs-modifier-keys.png]] A ''chord'' is made up of zero or more modifier keys pressed at the same time as a single non-modifier key. For example, “C-x” is a chord for pressing Ctrl and “x” at the same time and then releasing them. “C-s-v” is a chord for pressing Ctrl, Command (or Windows), and v at the same time. A ''sequence'' is a series of chords, pressed and released in a row. The most important command in Emacs, “C-x C-c”, is a great example of a sequence. You press “Ctrl” and “x” at the same time, then release them, then press “Ctrl” and “c” at the same time and then release them and voila, you are in the process of exiting Emacs. <<<
I kept seeing files like `2019-02-01.org~` in my `~/org/journal` folder. Turns out those are backup files Emacs makes, and you can [[change where they go|https://stackoverflow.com/a/151946]]: <<< If you've ever been saved by an Emacs backup file, you probably want more of them, not less of them. It is annoying that they go in the same directory as the file you're editing, but that is easy to change. You can make all backup files go into a directory by putting something like the following in your `.emacs`. ``` (setq backup-directory-alist `(("." . "~/.saves"))) ``` <<< [And in my case, I'm using `~/.emacs.d/init.el` instead of `.emacs`] I didn't set this in `init.el` yet. I just set the backup path in the variable inside Emacs by clicking on Customize on the variable page, and this is what's in the `init.el` now. I may change it later after I learn more about the variable: ``` '(backup-directory-alist (quote (("" . "~/.saves")))) ```
from https://apple.stackexchange.com/a/268929 <<< # Go to BetterTouchTool Preferences => Keyboard. # Click Add New Shortcut or Key Sequence button. # Assign new Keyboard Shortcut from Click to record shortcut #* for example, for Monitor-1 Control+Shift+1, for Monitor-2 Control+Shift+2 etc. # Then from Trigger Predefined Action dropdown menu, select #* Other Mouse Actions => Move Mouse To Position # A modal window will appear to capture your desired mouse position. Simply take your cursor to the desired position of a Monitor and Press Space to capture the position. Now Save the position in the Modal Window. # Repeat 2 to 5 for all your Monitors. Now you'll be able to jump your mouse cursor to Monitor-1 by pressing Control+Shift+1, to Monitor-2 by pressing Control+Shift+2 and to Monitor-3 by pressing Control+Shift+3. <<<
It's been so long since I paid attention to what I had in [[Things]], that actually going in and cleaning house—deleting recurring finished tasks out of the Logbook, emptying the Trash, and removing [[daily tasks that didn't need to be there|2019-02-02 daily tasks removed from Things 3]])—makes it feel like a whole new app. (All that and seeing all this on a big monitor for the first time.)
Been playing with Emacs all of two days and already have "Emacs Pinky". I mapped CapsLock to Ctrl by going to System Preferences > Keyboard > Modifier Keys.
I was a little confused about using Calendar to get around journal entries. From the [[Org-Journal docs|https://www.emacswiki.org/emacs/OrgJournal]]: <<< In calendar view: * `j` to view an entry * `C-j` to view an entry but not switch to it * `i j` to add a new entry * `[` to go to previous entry * `]` to go to next entry <<< While in the Calendar, you use `[` and `]` to select certain days, but if you press `j` it //switches you to// the buffer with the selected journal entry and then your cursor is in it, and then of course if you press `[` or `]`, those characters just end up in the entry. `C-j` is the way to //view// an entry but not actually //switch// to it.
Holy shit: from https://ianlunn.co.uk/articles/quickly-showhide-hidden-files-mac-os-x-mavericks/ <<< Since the release of macOS Sierra, when in Finder, it is now possible to use the shortcut: `CMD + SHIFT + .` Press once to show hidden files and again to hide them. <<<
The other day when I was poking around on the [[Tinderbox forums|http://forum.eastgate.com/t/love-hate-relationship-and-tinderbox-7/597/9]], this line jumped out at me: <<< So what to do if we lovehate Tinderbox, Scrivener, and the rest? Well, either hate it and stop. Or try to learn it by thinking simply about what @mwra always asks: > “What are you trying to do? Let’s think about how to do ''just that'' thing.” And then try to go a bit further with the next project, and then the next. I guarantee you – Mark Anderson did not buy a copy of Tinderbox and write aTbRef the next day. <<< It's why I have to catch myself when I think, "Oh, if I'm going to use [[Org-Journal]] or [[Tinderbox]] or whatever then I need it to be fully encrypted and I have to be able to at least view it on my phone, too, and blah blah blah." No, I don't, actually. It might actually be better if I can't get to it on the phone, because I might use the phone less. And I might not put the org files in the cloud, which could be fine for now, too. Just //one thing at a time//, grasshopper. And, what are you trying to do? Just learn how to do that one thing.
[[Jack Baty]] [[doesn't use timestamps|https://micro.blog/jack/2137027]] in Org-Journal: > @twelvety I don't use the timestamps in org-journal (`setq org-journal-time-prefix "" org-journal-time-format ""`) Timestamps in TW journal are something I'm trying as a way to differentiate "entries" but I may stop using them. I may do the same. It does seem to be overkill to timestamp every single entry in a day, since Org-Journal has nice summary headings by default for each entry.
https://www.youtube.com/watch?v=nCHvPfSArY0 I always forget this, but Ep. 11 ("Omega") is the Ark II episode with the obelisk/monolith (hilariously cribbed from //2001: A Space Odyssey//) that scared the shit out of me as a five-year-old.
I horked up my `init.el` last night by trying to do too much before understanding anything. Luckily, there was an `init.el~` in there to save my bacon. See also: [[2019-02-02 files ending in "~" are Emacs backups]].
(a.k.a. stole from [[Jack Baty]]) and later realized that the filled-in star image `$:/core/images/star-filled` was a system tiddler and you can set those in Tag Manager.
https://orgmode.org/worg/org-tutorials/org4beginners.html Now //this// looks comforting. First heading is: <<< !!! The absolute minimum you need to know about Emacs <<<
https://orgmode.org/manual/Easy-templates.html So for a blockquote, `<q TAB` expands to: ``` #+begin_quote #+end_quote ``` etc. See [[2019-02-03 OrgMode easy templates weren't working]] for a solution to making them work on my machine.
https://orgmode.org/manual/Structure-editing.html
http://space1970.blogspot.com/2010/12/re-post-ark-ii-1976.html I have this DVD around here somewhere, but I've never finished watching it all (for the first time since 1976). I didn't know Terry Lester died in 2003.
Found this: https://www.reddit.com/r/orgmode/comments/7jedp0/easy_templates_expansion_not_working/dr72k93 Added `(use-package org-tempo)` to my `init.el` and that seems to have done it.
from https://orgmode.org/worg/org-tutorials/org4beginners.html * `TAB / S-TAB` – (un)fold * `M-up/down` – move a headline up or down * `M-left/right` – promote or demote a headline * `M-RET` – insert a new headline * `C-x C-s` – save file * `C-h t` – Emacs tutorial Oh my GOD I totally get why people love OrgMode so much now. The power!!! Suddenly all those `...` at the ends of headings make sense. And: * `z i` – Toggle the display of inline images The Emacs tutorial at `C-h t` is actually very friendly to newbies and has tons of cool tricks in it. Also: * `C-c C-l` will prompt you to insert a link * `C-c C-c` - add a tag * `M-h` `(org-mark-element)` ** Mark the element at point. Hitting repeatedly will mark subsequent elements of the one just marked. E.g., hitting `M-h` on a paragraph will mark it, hitting `M-h` immediately again will mark the next one.
[[Jack Baty]] on [[Micro.blog|https://micro.blog/jack/2167721]]: > @twelvety Here's an org-mode rabbit hole for you :) http://doc.norang.ca/org-mode.html Oh HELL yes. So much here. I envy people who can put so much rigor into documenting their own systems.
I set `org-journal-time-format` to `""`. I'd rather add the timestamp with a `ts` snippet in TextExpander than have it in every entry by default and have to delete it when it doesn't matter. This is what I like about entries in [[Org-Journal]]—the ability to have an entry with no specific time. It's always bugged me in Day One that every entry has a time applied to it. I kept the `** ` in `org-journal-time-prefix` for now.
[[Jack|Jack Baty]], thank you for all the helpful [[answers about Org-mode|https://rudimentarylathe.org/#2019.02.04%20-%20Phil%20N%3A%20Org-mode%20answers]]! ''About tags:'' * Before seeing your post, I had set up `org-tag-persistent-alist` to do something similar across files, and I never quite found out what the difference was between that variable and `org-tag-alist`. I just tried it with the latter variable and it still works. Maybe it's better for my purposes? ''Regarding a shortcut to add a new journal entry: '' * Yep, you guessed it. I was looking for a from-anywhere-in-the-OS solution. [[Keyboard Maestro]] (or [[BetterTouchTool]]) it is! ''Selecting a bunch of words all at once'' > Good question. I usually end up grabbing the mouse :) * Nooooooooo... I was afraid of that. Since I'm trying to stick with "canonical" Org-mode behaviors, I'll resist the temptation to patch this with some kind of workaround yet. The shift-select muscle memory is deep, though. :) 20 years ago, when I first thought I wanted to be a developer (an idea I've abandonded since), it would have been great to have had access to a mentor or a professor with a public, hosted TiddlyWiki, updated constantly like yours and [[Andrew|Andrew Canion]]'s. You can glean all kinds of processes from watching someone work, troubleshoot and brainstorm over time. I can imagine a million ways that senior coders could mentor students just by inviting them to their TiddlyWiki!
Especially her song "I Saw an Angel Die" from //Ode to Billie Joe//. Via: https://twitter.com/tedgioia/status/1092926471566442497 > It looks like a Bobbie Gentry revival is underway (and it's long overdue). http://dld.bz/hq35a She's still alive, but hasn't performed since 1981. [img[https://twelvety.com/philtiddlywiki_images/2019-02-06-bobbie-gentry.jpg]]
* I'm becoming dependent on TiddlyWiki and I was hoping to use Fluid.app as a standalone instance dedicated to browsing/editing TiddlyWiki, but when I clicked the big checkmark to save an HTML copy of TW to Downloads (for Hazel to see and upload to twelvety.com), the HTML file never made it to that folder. It was going to be really nice because any external URLs I clicked on from a tiddler would open in Safari, and I could have just left Fluid running all the time, knowing TiddlyWiki was there, waiting. * I created a standalone HTML TiddlyWiki instance on my work computer, just to see what happens. * I'm slowly weaning myself off of the Today view in [[Things]] and learning to slot project tasks into Projects lists if they fit there. Since the Field Notes has a new, smaller list of stuff written out for each day (not rigorously, alas), it becomes the "next actions" list for the day. Not having a million things in Today that aren't really //for// today makes me look at the list of current Projects more. * TiddlyWiki is so good at capturing all the ephemera I love that I barely feel like posting on Micro.blog anymore. It's like something has to be really interesting to a lot of non-nerds for me to want to wade into it and put something there. Not saying it's a fault of M.b, just more of a strength of TW. * Sarah and I both teared up (she flat-out cried) at the sweet last episode of Season 3 of "[[Schitt's Creek|2019-01-24 watching "Schitt's Creek"]]" tonight. Thank god we haven't finished it all yet. What a funny, sweet, slow show.
Alan Alda had his old pals from //M*A*S*H// on his latest [[Clear + Vivid podcast|https://art19.com/shows/clear-vivid-with-alan-alda/episodes/10ea6bf9-6e18-44c1-9345-593a94cdcb39]]. What a treasure. I was in sixth grade when the last episode aired in 1983, so I'm the perfect age to have lost count of the number of times I've seen every episode. Those plots and scripts are so embedded in my brain that hearing these slightly-aged voices on the podcast just sounded like a bunch of old friends telling stories. My favorite part was right up front, [[around 3:55|https://overcast.fm/+NlapTbiHk/03:55]] (via Overcast): Alan Alda: > Something happened while we were doing //M*A*S*H// that really made a deep impression... it changed the way I worked as an actor, and it was the beginning of changing the way I even related to other people in real life, and it was the way we sat around in our chairs between shots, and didn't go back to our dressing rooms, and just sat there, for an hour sometimes at a time, making fun of one another and laughing. And often, we'd go over our lines together, but the most valuable thing to me was that relating that we did, and laughing together, and then we would walk — when the lighting was ready — we'd walk to the set, and the same connection that we had as people, carried over into the scene. And I remember times when we didn't even stop the kidding until right before the first person had a line to say. This is what I call a Desert Island Podcast Episode, where you [[download the mp3 and hoard it before it slips away|https://rss.art19.com/episodes/10ea6bf9-6e18-44c1-9345-593a94cdcb39.mp3]].
The man himself speaking at Google back in 2008! Even though it was almost 11 years ago, I didn't notice anything that worked differently than it does now. [[Emacs Org-mode - a system for note-taking and project planning|https://www.youtube.com/watch?v=oJTwQvgfgMM]] (YouTube) I got a ton out of this. Nothing like seeing these things in action.
Well, hell! I just thought that when downloaded PDFs of statements didn't shuffle off to their proper folders automatically, it meant that my [[Hazel]] rules had started to rot because vendors had changed their billing statement layouts. Nope. At some point over the last month, all of my Hazel rules disappeared. Luckily, the [[Backblaze]] backup from January 10 still had the rules in it. I used these instructions to get everything back: from https://www.noodlesoft.com/kb/restoring-hazel-from-backups/ <<< If you need to restore your Hazel settings and rules from a backup, use this procedure: * Quit System Preferences. * Launch Activity Monitor and find ''HazelHelper''. Quit HazelHelper. * Find ''cfprefsd''. Quit any occurrences that you can (some may be for other accounts and you can’t kill them). * Restore the following: ** In your `~/Library/Application Support` folder, the Hazel folder ** In your `~/Library/Preferences` folder, the files starting with `com.noodlesoft`. * Reboot. <<< The corollary is to manually backup your Hazel rules (using "Export All Rules" in the gear/settings dropdown) somewhere safe once you have them working like you like them. Backblaze doesn't save files forever, so you can't count on there being a good version there.
Sometimes you may catch yourself saying, "Oh, but we don't have a content strategy! Oh well! Let's just throw up our arms until we get one!" I don't think Mike Monteiro would approve. In the absence of an actual content strategy, one could always at least start with documenting all the things we have trapped in our heads about how things are right now. This would be like a content inventory, but more like a current-state process inventory, including: * SLAs about when things will get posted when they're submitted * which clients post what to where, and how often * what the conventions are for titles and audience * who approves what kinds of content * image guidelines * rules about title lengths * how often featured areas should get refreshed with new things There's plenty of stuff that's not written down anywhere that is begging to be captured. Once we have some details down, we could arrange it into scaffolding and at least know better what we've de facto committed to, and then we'd know better which parts to demolish and build up again.
* There's a lot of hue and cry about the not-totally-impossible prospect of [[Kirk Cox]] falling ass-backwards into being our state's next governor if enough people in the executive branch were to resign. I don't see it actually happening, but I'm sad to see so many people alarmed by the fact that it could be him, solely because he's a Republican and with little or no further discussion of his actual policies or his character. I'm a left-leaning centrist, or more accurately a center-leaning liberal, and Cox has a lot of views and beliefs I don't agree with. But I also remember when I had the good fortune to have him as my high school Government teacher when he was the ripe old age of 30 in 1987. He still ranks as one of the best teachers I ever had, ever, and I still regard him as a Good Man. He took a personal interest in steering me away from making D's in his class. We could certainly do worse in Virginia. * I am very humbled to get a mention in [[Jack Baty]]'s post about [[Daily Haunts|https://rudimentarylathe.org/#Daily%20Haunts]]. I also need to make my own [[Daily Haunts]] tiddler. (It will look eerily similar to his.) * It's probably good that I don't know more people with public wikis. Just like I don't need to remember to shower or brush my teeth every day, I don't need a reminder to check the various wikis I love checking in on every day. I may actually need to institute some kind of parental controls on my iPhone so I don't do it as much as I do! * I would dearly love it if [[BSAG - But She's a Girl]] would host a wiki. * My experiment with TiddlyWiki at work is already having a good effect. The good self-documentation habits I've picked up in this wiki have sprouted in the work wiki. I used it today to record an idea I had about how to remove one keystroke from my time billing process. Credit also goes to [[Org-Journal]] for that. It's making me pine for the no-friction ease of hitting `C-c C-j` to start a new journal entry in Emacs. //TiddlyWiki® — A Place for Productive Thinking// * I just [[switched from the WTF Just Happened Today newsletter back to Dave Pell|2019-02-07 switched from WTF newsletter back to Dave Pell]]. * I don't want to be all //that guy// about Google, but [[Gmail]] is feeling a little more gross all the time, even in the native iOS app. I know Google knows everything about me already, so even if I go with [[FastMail]] or something, it's not going to take me off the grid as far as Alphabet goes. It's just that I don't want to have to delete (or ignore) two "ad" emails //every time I open my email client//. I'd pay to make that go away. To do today: * Read more about Date Trees in [[Org-Journal]].
Saw [[Jack Baty]] [[mention|https://rudimentarylathe.org/#Newsletters]] Dave Pell's NextDraft. I used to subscribe and then didn't because I wasn't keeping up (probably because I was looking at FB and Twitter so much). At some point after Nov. 9, 2016, I signed up for the [[WTF Just Happened Today?|https://whatthefuckjusthappenedtoday.com]] newsletter. The name of that site and the From field in each day's email is starting to get annoying. It's like the rolling-eyes-looking-upward trend on 5 billion Twitter avatars. I don't need to pre-emptively sigh before I even open the email.
* ''I love the TiddlyWiki journal.'' This is like my Id. No one cares what goes in here. It doesn't spawn a bunch of discussion (but it's fine if it does). It lets me get thoughts out of my system. * Keeping a [[Daybook|https://micro.blog/twelvety/2035948]] is a really good adult habit that I wish I had started way sooner. * I am the guy who will walk towards the elevators, hear it ding from around the corner (which means someone is in the hallway waiting and about to get on), and then hang back until I can hear it open and close and leave, so I don't have to ride with anyone else. Total misanthrope. * I have bad problems with attention and focus, but it's really just about my own lack of willpower. I don't think people who aren't diagnosed with A.D.D. should say they have it. * """I will not peek at others' wikis until lunch. I will not peek at others' wikis until lunch. I will not peek at others' wikis until lunch. I will not peek at others' wikis until lunch."""
I should have known [[BetterTouchTool]] would have an action for this: ''Move Window to Next Monitor'' https://apple.stackexchange.com/questions/28569/is-there-a-keyboard-shortcut-to-move-a-window-from-one-monitor-to-another My shortcut is now: `ctrl-option-command-left` That post was a little old, so I didn't have to attach an additional action and again specify "Move Window to Next Monitor" as the action to make it work. The app must have been fixed in the meantime.
[[Andrew Canion]] on [[Micro.blog|http://www.andrewcanion.com/blog/2019/02/1265/]]: > It was an interesting thing to be doing some research, and then think, “Hmm, I’m sure @twelvety has written on that. Let me check his wiki.” And bang, there it is. This makes me deeply happy. A real-life example, like [[Steven Berlin Johnson: checking others' note libraries]]!!!
Ok, enough of all the random googling before I have a mental framework of what the hell is going on with Emacs. I need to start from a place of sanity, and I need to be able to work through a linear sequence of material, review what I've learned, and pick up where I left off. https://masteringemacs.org/book > When you have read this book you will understand Emacs Yes. Obviously, [[Mickey Petersen]] knows how well I respond to a confident personality.
My god, WHERE has this been all my life [[Ceremony of Dreams : Studio Sessions & Outtakes, 1972-1977|https://tompkinssquare.bandcamp.com/album/ceremony-of-dreams-studio-sessions-outtakes-1972-1977]] [img[https://twelvety.com/philtiddlywiki_images/2019-02-09-entourage-ceremony-of-dreams.jpg]]
* Actually started the [[Mastering Emacs|2019-02-09 Bought "Mastering Emacs"]] book. Sailed through the first 10 pages until I got to the link about the [[Editor Wars|https://en.wikipedia.org/wiki/Editor_war]] and then lost an hour looking up stuff about storage tubes and vi. Maybe I should arrange for an internet outage like [[Jack Baty has been graced with|https://rudimentarylathe.org/#2019.02.09%20-%20Journal]]... * How the HELL did I ever read a technical/programming book without something like TiddlyWiki to take notes with? * Mastering Emacs is really, really good. * I totally get why there's such an overlap between Unix/Emacs nerds and D&D: The chance to learn a ton about something that most of the population has no idea about, the wide body of arcane knowledge that you have to dig for, the rules, the conventions, the history, the strange terminology, the incantations, the beauty. * Well, I just checked eBay. Working [[Sony WM-DD series Walkmans]] aren't getting any cheaper. * "In Selection Compatibility Modes, I will explain how you can switch to modern clipboard keys, with certain caveats, and why you shouldn’t do that. Instead, I’ll show you why Emacs’s system is better for text editing." (from [[book: Mastering Emacs]]) * Made it through Chapters 1 + 2 in Mastering Emacs.
https://stackoverflow.com/a/4140815 <<< It means that your program code you write is also data which can be manipulated by a program. Take a simple Scheme expression like `(+ 3 (* 6 7))` You can regard it as a mathematical expression which when evaluated yields a value. But it is also a list containing three elements, namely `+`, `3` and `(* 6 7)`. By //quoting// the list, `'(+ 3 (* 6 7))` You tell scheme to regard it as the latter, namely just a list containing three elements. Thus, you can manipulate this list with a program and //then// evaluate it. The power it gives you is tremendous, and when you "get" the idea, there are some very cool tricks to be played. <<< See also: [[homoiconicity]]
https://en.wikipedia.org/wiki/Vi <<< vi was derived from a sequence of UNIX command line editors, starting with ed, which was a line editor designed to work well on teleprinters, rather than display terminals. Within AT&T Corporation, where ed originated, people seemed to be happy with an editor as basic and unfriendly as ed, George Coulouris recalls: > [...] for many years, they had no suitable terminals. They carried on with TTYs and other printing terminals for a long time, and when they did buy screens for everyone, they got Tektronix 4014s. These were large storage tube displays. You can't run a screen editor on a storage-tube display as the picture can't be updated. Thus it had to fall to someone else to pioneer screen editing for Unix, and that was us initially, and we continued to do so for many years. <<< See also: [[2019-02-09 link: storage tubes and the Tektronix 4010]]
https://en.wikipedia.org/wiki/Tektronix_4010 <<< Tektronix had originally developed their storage tubes in the late 1950s as a way to store images on oscilloscope displays for study, although the same system had already been used in radar displays. The basic concept uses a conventional CRT layout but with two sets of electron guns. One, the flood gun, provides a constant flow of low-energy electrons across the entire screen, causing it to glow slightly. The second, the write gun, is the normal gun of a black and white TV, and its beam was moved about on the display surface in the conventional fashion using electromagnets. However, this gun is set to a higher than normal energy. When its beam strikes the screen, it causes an effect known as photoemission that drives electrons out of the phosphorus towards the front of the display where they are picked up by a thin transparent electrode. This area now contains fewer electrons than normal, giving it a positive charge relative to its surroundings. This causes some of the electrons from the flood gun to be strongly attracted to that spot, which keeps it lit up. The display using this technique is instantly recognizable by the bright flash of the write gun beam as it moves about the display. Because the tube itself stores the image, there is no need for any sort of built-in computer memory, greatly lowering the cost of the terminal. The 4010 cost $3,950, almost two orders of magnitude less expensive than IBM's solution. This made graphics practical for a much wider audience. The Tektronix approach also has the advantage that there is no limit to the number of vectors that can be displayed, one can simply keep sending them to the display, whereas a solution like the IBM terminal had a fixed number of vectors it could display. Early computer aided design systems made by companies such as Computervision took advantage of this capability, and were able to display arbitrarily complex designs. The main disadvantage of storage tubes is that once the image is stored, it can only be removed by erasing the entire image. This makes this display unsuitable for working with scrolling text, animation, or any other display where portions of the image are changing. <<<
Someone somewhere mentioned that turning off the tabbed inbox (Primary vs. Social, Promotions, Updates, Forums) would get rid of ads masquerading as messages and dang if it didn't! Even worked on the iOS app. It's also way more calming to just see a straight reverse-chronological list of all the email that has come in. No more flipping between tabs to triage all the time. Just a list of email, dealt with or not dealt with.
Followed Jack Baty's method of [[manually creating a TOC page|https://rudimentarylathe.org/#Creating%20a%20Table%20of%20Contents%20in%20TiddlyWiki]]. I wouldn't have known this was possible otherwise. Per this page: https://tiddlywiki.com/#How%20to%20add%20a%20new%20tab%20to%20the%20sidebar # Added a "caption" field to the Table of Contents tiddler, with the value of "TOC" to make it appear that way in its tab in the sidebar. # Added a "list-before" field to the Table of Contents tiddler, with the value of "New" to make it appear before the "New" tab in the sidebar.
https://burningtreec.github.io/TW5-escapecss/ The [[Navigator plugin|https://burningtreec.github.io/TW5-navigator/]] depends on this being installed.
Ahhhhhhhhhhh, and now I can select tags from the dropdown with the keyboard. It does a lot more than just that, too. https://burningtreec.github.io/TW5-navigator/ I set these keyboard shortcuts in the Control Panel: * close-focused-tiddler: alt-C * edit-focused-tiddler: alt-E * navigate-story-down: alt-Down * navigate-story-up: alt-Up * sidebar-search: alt-F
* I keep thinking about how a public TiddlyWiki is for me an ideal place to store [[Zettelkasten]] notes, but the vast majority of things I've put in here so far are from publicly available sources like websites and podcasts. I have a very few book passages in here and want to add more, but I think that my full notes on any particular book may need to stay in either a private single-file TiddlyWiki or in [[Tinderbox]], like in this //amazing// series of videos by [[Beck Tench]], who is someone [[Andrew Canion]] pointed me to. I've used the [[Skim app]] to highlight 15 snippets in [[Mastering Emacs|book: Mastering Emacs]] already, and it would be wrong to re-post all of them, and all the notes to come, here. For sure, I can post about things I learned from it, and jumping off points that it takes me to, but I'm disappointed that I can't just throw it all in here. Still, $40 is not much to pay for a book that good, and Mickey Petersen deserves to have as many people buy it as possible. * Why has it been so long since [[Sphygmus]] posted anything in the wiki? * I became very concerned when I saw [[Jack Baty say|https://rudimentarylathe.org/#2019.02.10%20-%20Back%20to%20a%20single-file%20wiki]] that he was going back to a single-file, local wiki. But I was relieved to see that he's going to continue to sync it up to his server. Whew. I (selfishly) can't have my [[Daily Haunts]] going off the grid!
Oh my //god// this looks good. I haven't even read it yet. https://robertminto.com/against-forgetting/
* Getting groceries delivered by Whole Foods/Amazon is a //game changer//. It'd be worth it just to avoid the long drive out to the other side of town. It'd be worth it just to avoid merging onto I-64. * I finally read the [[Robert Minto: Against Forgetting|2019-02-10 link: Robert Minto: Against Forgetting]] essay and it just stopped me cold today. Like, everything else fell away once I started reading it. What a moment he describes, and what a better way to live. * I guess we're going to cry at approximately every other episode of [[Schitt's Creek|2019-01-24 watching "Schitt's Creek"]]. * I listened to the [[Beck Tench - Zettelkasten + Tinderbox lit review|2019-02-11 link: Beck Tench - Zettelkasten + Tinderbox lit review]] series of videos at work today. Even without watching the screen, I learned some things. Most important lesson: Try a bunch of things and see what works for you. Learn what works by doing it.
http://www.becktench.com/blog/2018/11/12/using-zettelkasten-and-tinderbox-to-document-a-literature-review [[Beck Tench]] does these so well, and she takes her time. No hurry. Most important lesson: Try a bunch of things and see what works for you. Learn what works by doing it.
https://www.baty.blog/2019/scaling-back-so-i-can-think I could have just pasted the whole post in here, but these two paragraphs really hit home: <<< Once the connection was restored, I was reminded that every idle moment brought with it a compulsion to reload the open tabs in my browser. Feed me, internet! That can’t be healthy, and it sure as hell isn’t productive. My own thoughts are pushed away by the constant influence of other minds. Blog posts, tweets, news articles, podcasts, audio books fill every gap with the thoughts of others. How am I supposed to think for myself? <<< Truth. Reminds me of when I followed the advice of the [[book: Make Time]] and disabled Safari on my iPhone for a while. It made me see how utterly addicted I was to it. Twitter is addictive, but it's nothing compared to the power and lure of a blank web browser.
After I've woken up, gone to work, crammed in some TiddlyWiki and [[Daily Haunts]] time at lunch, finished the workday, come back home, done the pre-dinner chores, made dinner (or "helped" make dinner), eaten dinner, watched an episode of something on TV or played a record, washed the dishes, gotten clothes ready for tomorrow, done some cursory stretching or exercise, and done the rest of the pre-bedtime ritual, there's maybe an hour or 90 minutes before bedtime. No matter which of the following things I choose, I always regret not doing all the others, as if there were even time for them all. The choices are: * Read in a Kindle book * Read in an actual book * Read or investigate any of the 1,000,000 new things I've saved today in [[Instapaper]] or in my `buffer.txt` file (where things go that ultimately end up here) * Read our neglected weekly print version of [[The Economist]] * Scroll through Micro.blog * Transfer stuff from today's page in Field Notes to [[Org-Journal]] in Emacs * Learn more about Emacs * Have another lightning round with TiddlyWiki * Respond to actual humans who have sent email * Review today's transactions in [[YNAB]] * Read email newsletters Seriously, I don't get how parents have any time left for anything else. We don't even have kids and I feel overwhelmed. We have one cat with three legs. How do others do it? ---------- I guess "scrolling through Micro.blog" and "adding more shit to TiddlyWiki" won out tonight. Zzzzzz...
[[John Dickerson]] on the latest [[Slate Political Gabfest]] mentioned this [[Kottke post|https://kottke.org/19/01/a-writing-shed-of-ones-own]] describing Roald Dahl's incredibly cozy writing shed. The [[video|https://youtu.be/nQkz_X1Rg60]] in it took me on a journey. Dickerson said, "It's just so perfectly what it is," which is 100% right.
Changed the value of `$:/config/DefaultSidebarTab` to `New`. It was `$:/core/ui/SideBar/Recent` before.
A dear friend emailed me the best possible question yesterday, out of the blue: She asked me "if I'd ever heard of TiddlyWiki." OMG did you come to the right place!! She'd like my help setting it up. I gave her instructions on downloading a blank wiki to her laptop and saving the normal way to an HTML file, but she'd like something more ambitious. In classic business analyst fashion, I collected these requirements: * Be able to access and update via any browser * OK for all the content in it to be publicly viewable * Public version should be read-only for everyone but her I don't want her to worry about running Node.js on a server, or keeping it running, especially since I know barely enough about that to run it on my own MacBook. And authentication would be a whole 'nother thing, and I don't want to risk ruining someone else's carefully tended content by overlooking something. Things to explore: * From https://tiddlywiki.com/#GettingStarted I see that there are some extension/plugins that can use PHP to allow writing to TiddlyWiki on a server, but doesn't that invite hacking? Last time I ran WordPress on Dreamhost, it got hacked to pieces. * ~~[[TiddlySpot]] may work, but it doesn't by default look like it can run TW5. I did see at least one mention in the Google Group about how it may be possible to upload and host a TW5 file in TiddlySpot, but I need to try this myself.~~ ** Gave up on this. Got a TW5 file to upload with the macOS desktop app, but couldn't get any of my browsers to save changes to the hosted file to anywhere but my local machine. * Oooo. [[TiddlyWiki Cloud]], specifically https://twcloud.github.io/tw5-dropbox/?type=apps# works. Now trying to connect it with flow.microsoft.com to copy a file from Dropbox to a web server via FTP. * From the Google Group: [[2019-02-13 TW: developments to check out]] Needless to say, whichever option works, a core piece of the puzzle will be to get her doing regular local backups of her stuff.
[[TonyM's response|https://groups.google.com/d/msg/tiddlywiki/PqwtL-EVoCw/uWI07tIGAwAJ]] to a TiddlyWiki Google Group discussion about "entering the Golden Age of TiddlyWiki" has some things I need to look at: <<< Perhaps this is true, the developments and possibilities are expanding at an incredible rate from a base that was already almost infinite in applications. I see this in * Additional Server options and static file hosting * Multi-access solutions like bob * PHP hosting * Timimi local file saving * Developing - InnerWiki, local storage and more * New filters like "kin" * A Strengthening community. <<<
* Grrrrr. I didn't get to put anything in here yesterday. Too busy doing other stuff. Need to catch up this weekend.
from https://www.skeptic.com/reading_room/the-sagan-file/ Joel Achenbach quoting Carl Sagan: <<< He didn’t think science drained any of the majesty from the universe, but quite the opposite. “The very act of understanding is a celebration of joining, merging, even if on a very modest scale, with the magnificence of the Cosmos.” <<< I archived the [ext[full article|x-devonthink-item://60968CAB-EC83-4F51-A354-2287B31DFDDC]] in DEVONthink.
* Micro.blog and all these wikis in my [[Daily Haunts]] are causing my Mac to slow down and chew through its battery faster, because I have approximately one million open tabs in Safari all the time. (Same goes for the phone.) Stuff keeps showing up faster than I can read and process it all. Good problem to have, I guess. * Had another installment of my periodic dream about nuclear war again last night. * How did the whole world and all these [[Emacs nerds|https://usesthis.com/interviews/dave.thomas/]] adopt Microsoft [[VS Code]] and I only just heard about it (via [[Jack Baty]] on Micro.blog) now? * My dear former mentor asked me if he could subscribe to my wiki. I would love to tell him how, but there's no feed for it, which is fine. But it makes me think that it might be a cool thing to get a free MailChimp account and hand-pick some things from the wiki at the end of every month and paste them into an email that people could sign up for. I looked at [[Revue]] for a minute, but the couple of sample newsletters I tried had tons of extra padding on the sides when viewed in mobile.
For years on my work PC, I've had the grave accent key [`] mapped to simulate a mouse left-click. Now that I'm using a mouse, keyboard and big monitor at home sometimes, I finally got around to setting this up in [[BetterTouchTool]]: * New shortcut: ''`'' * Assigned Action: ''Left Click'' And since I still need to type ` sometimes in various flavors of markup, I mapped Ctrl-` to paste in the ` character: * New shortcut: ''^`'' * Assigned Action: ''Paste Text: `'' You have to use the "Paste Text" option because the ` is of course by now already taken.
I did not know about this! From [[Andrew Canion|https://andrewcanion.com/wiki/doku.php?id=software:devonthink#annotation_pane]]: > The [[Annotation Pane script described on the DEVONthink forums|https://forum.devontechnologies.com/viewtopic.php?f=20&t=21707]] is quite amazing. It generates a linked annotation document, that can get you back the annotated document, or the source of the document itself. > > A useful tip is to manually highlight the text you want to capture/annotation using Cmd-Shift-L.
Notes on ''Clear + Vivid with Alan Alda:'' [[Dr. Helen Riess on Empathy and the Science of Emotion|https://art19.com/shows/clear-vivid-with-alan-alda/episodes/68b1af95-0384-4f4b-b514-24d0f92632ac]], originally published 12/03/2018. My notes: * https://overcast.fm/+NlaoBRAaQ/23:50 - Difference between cognitive empathy and emotional empathy * https://overcast.fm/+NlaoBRAaQ/30:35 - Difference between empathy and compassion. * https://overcast.fm/+NlaoBRAaQ/32:58 - Importance of meeting someone's gaze, trying to name their emotional state. Therapists are trained to name emotions in their notes with a person. "Mental status exam" is part of psychiatric training. Paying attention and being curious is where the big reward of rich conversations lies. * https://overcast.fm/+NlaoBRAaQ/35:51 - People have the greatest empathy when their tank is full. When you take good care of yourself, you have a full reservoir to be more receptive and attuned to people. Description: > Relating and communicating in the doctor’s office can sometimes be a matter of life or death. Clear+Vivid with Alan Alda is devoting a special series of three shows to doctor-patient relations and how better understanding can be achieved through empathy and deeper listening. First up is Dr. Helen Riess whose research has shown that not only is empathy important to the doctor-patient relationship, but that, when it’s lacking, empathy can be taught. Join us for this episode with Dr. Riess, followed by Dr. Karl VanDevender (available December 6th) and two experts in communication, Dr. Laura Lindenfeld and Dr. Susmita Pati, from the Alda Center at Stony Brook University (available December 8th).
From the NYT: [[Letter of Recommendation: Ronnie James Dio|https://www.nytimes.com/2019/02/12/magazine/letter-of-recommendation-ronnie-james-dio.html]] > “God and the devil are inherent in each of us, and it’s our choice to make,” Dio said in one interview, late in life. “The optimum way to go is to do the good thing.” I did some digging and the full quote comes from this [[uncut interview Sam Dunn did with Dio|https://youtu.be/U8Ln5GW-3as]] at his home in Los Angeles in 2004 for the documentary //Metal: A Headbanger's Journey about religion//. > “God and the devil are inherent in each of us, and it’s our choice to make. You can take the road to good and take the road to bad. But we have a choice. The optimum way to go is to do the good thing.” I love that final sentence, but it's important to see that in the context of the full quote, the emphasis is just a shade different, and it's not all wrapped up in a neat bow like it's presented in the NYT article. He was just getting going and talked for a long time after that.
* We watched another extremely uncomfortable and brilliant episode of [[PEN15]] this morning. So many topics they nail that I haven't seen touched in any other show. * Took a nap this afternoon and woke up to find a nice conversation on Micro.blog about my [[Rush-wiki|2019-02-17 Wikis are like the Rush of social media]] analogy. I'm adding some more things to it. * That feeling on a Sunday before a holiday Monday, when you've taken a nap, the evening is just getting started, and you know you're going to stay up really, really late. MMMMM. * Oh hell. [[Josh Sullivan]] just switched over to [[TiddlyWiki|https://joshisms.io/]] with a vengeance. I need to remember there are sites on the internet other than just wikis, but it's not easy. This is going to be a problem.
From a [[2012 Rolling Stone interview with Neil Peart|https://www.rollingstone.com/music/music-news/qa-neil-peart-on-rushs-new-lp-and-being-a-bleeding-heart-libertarian-248712/]]: > RS: I think that a lot of people are surprised to learn that you still take drum lessons. You’re seen as this drum master by most everybody. > > Peart: What is a master but a master student?
A response to a Reddit r/emacs thread called "[[Almost betrayed all of you|https://www.reddit.com/r/emacs/comments/8edp7h/almost_betrayed_all_of_you/dxvl36k]]", wherein the OP admitted trying out VS Code and Atom: <<< I feel an urge to state something here: Switching from a tool that does not fit your personal requirements to a different tool that fits your requirement much better is ''not betrayal''. Never. Somebody who is using a tool that is worse than an alternative one is a fool. Most people are fools related to this definition because most people do not care to think of their personal requirements and look out for a match on the tool-market. Most people just use what is pre-installed and that's it. Of course, "good" and "bad" have to be defined as well. And even those definitions differ from person to person. <<<
Listening to "Red Barchetta" by [[Rush]] this morning, for the 50,000th time, I started to realize all the ways that wikis are like Rush: Normal people see/hear them and think: * I've //heard// of them but don't really know them * Too much work * Too ornate * Incomprehensible * Ugly * Don't they have something to do with Middle Earth? Nerds who get them know this: * Finally, a home * This is the way I think * I don't care that no-one else likes it. In fact, that's part of the appeal. * I have room to stretch out and think here * There's always something to learn * All the choices are up to me * I could get a lot more people into it if they didn't mind me droning on about it * They reward repeated, sustained attention * The effort put into the finished product will never be appreciated by most of the world, which is totally fine * A complete thought can easily take 7½–13 minutes to get across [[[posted|https://twelvety.micro.blog/2019/02/17/wikis-are-like.html]]]
[[Beck Tench]] linked to [[The National Center for Faculty Development and Diversity|https://www.facultydiversity.org/tenuretimemanagementcw]] in a [[description of her academic workflow|http://www.becktench.com/workflow#time]]. The NCFDD has facilitators who run workshops with various groups, like this one done by Mindi Thompson, Ph.D., on [[Tenure & Time Management: How to Manage Your Time so You Can Publish Prolifically AND Have a Life Beyond the Ivory Tower|https://ncfdd-production-file-uploads.s3.amazonaws.com/media%2F59ead3dd-c1bd-4a48-aa42-20c733fa1cd5-TTM-UM+Medical+School.pdf]]. This slide about daily writing is especially great: |''3 Biggest Myths About Writing''|''What We Know From Research''| |I need huge blocks of uninterrupted time|The most productive writers write regularly, in small increments| |I must be inspired to write|No you don’t. You show up, the inspiration happens once you get started.| |Writing is what I do when I’m //done// thinking.|Writing ''//IS//'' thinking| That last line. That's what TiddlyWiki helps me do!
I had all these [[VS Code]] resources open in tabs on my phone, and this is a better place to keep them until I can deal with all of them. Some came from Jack Baty's wiki and some were from googling: [[Org Mode - Visual Studio Marketplace|https://marketplace.visualstudio.com/items?itemName=tootone.org-mode]] [[GitHub - vscode-org-mode/vscode-org-mode: Emacs Org Mode for Visual Studio Code|https://github.com/vscode-org-mode/vscode-org-mode]] [[Org-Mode for Visual Studio Code - Hacker News|https://news.ycombinator.com/item?id=16198369]] [[Customizing Visual Studio Code for Writing - DZone Integration|https://dzone.com/articles/customizing-visual-studio-code-for-writing]] https://github.com/VSCodium/vscodium binary releases of VS Code without MS branding/telemetry/licensing
Did this to install [[VS Code]]: * Go here https://github.com/VSCodium/vscodium * `brew cask install vscodium`
I played with [[VS Code]] last night and it is good. Very good, just like everyone says. The [[vscode-org-mode]] extension handles Org-Mode just fine, although I must have not enabled all the right keybindings, because I noticed that `shift-TAB` didn't expand the headings like I expected. I probably overlooked something. I installed a journal extension called [[vscode-journal]] and it is slick at Markdown-based journaling. It's about as fast to use as Org-Journal in Emacs, and the formatting fits better with how I think about events and time, so I may end up using that. But I never really got started with Emacs in a serious way! Am I missing out? Or am I getting most of the benefits without the extra hassle? VS Code is just so easy and visible at everything with so little configuration. The searching across files is easy to digest. And the access and filtering of all available commands is so frictionless. I know Emacs can get there, but every little thing requires changes to `init.el` and I don't know if I have the patience for it. Also, I can use `⌘-S` to save and `⌘-W` to close without any guilt that I'm not doing it properly. As someone on Reddit r/emacs said: [[switching tools is not betrayal|2019-02-17 switching tools is not betrayal]]. And "backdoors are not secrets!" ----- I think I'm getting sick. Staying up until 3am last night didn't help. I did just manage to close the //205// tabs I had let accumulate in Safari for the past three months.
https://www.reddit.com/r/emacs/comments/7cizu2/just_finished_reading_mastering_emacs/
Stolen from Josh Sullivan, who borrowed it from Jack Baty: To add a Favicon, drag an image to your wiki. Import it, the rename it $:/favicon.ico Source: [[Jack Baty's Wiki|https://rudimentarylathe.org/#Adding%20a%20favicon%20to%20TiddlyWiki]]
* That's it. In the spirit of keeping this thing rough and raw, I'm just pasting in unfinished notes I have on podcasts I've listened to. No need to make them perfect first. (See [[2019-02-17 Clear + Vivid: Empathy and the Science of Emotion]].) They're "stubs", so I may come back to them later. Or maybe not! * I'm not sick-sick, but sick enough that I went to bed for four hours right after getting home. I feel like everyone has been playing with their computers tonight and I've been missing the party.
https://tjaddison.com/2018/02/28/Keeping-a-work-journal-with-VS-Code He's not using [[vscode-journal]], but it's still interesting to read. Best thing about it was the link to the [[Peter Lyons - Your Work Journal|2019-02-20 link: Peter Lyons - Your Work Journal]] article.
Handy [[PDF TiddlyWiki Cheatsheet|https://jcs-wiki.s3.wasabisys.com/uploads/2019/TiddlyWiki-Cheat-Sheet.pdf]] (via [[Josh Sullivan|https://joshisms.io/#TW%3A%20Resources]] > [[Jack Baty|https://rudimentarylathe.org/#2019.02.19%20-%20Link%3A%20TW%20Cheatsheet]])
* I love love love how you can ⌘-click on a URL in a text or Markdown file in [[VS Code]] and it turns into a clickable link. * Seeing Josh's great [[TiddlyWiki on DigitalOcean instructions|2019-02-20 link: Josh on how to set up TW in DigitalOcean]] reminded me that I need to remember to put helpful things on Micro.blog instead of just dumping everything in here. Over the years, I've benefited from countless strangers on the web who took the time to document things that worked. It's good to return the favor. * The [[Diarly app]] looks nice, but the problem with any of these is that the better they are at encryption and password-protecting the contents, the more locked-in I would feel, especially if the app is authored/maintained by one developer. Plain-text journaling is inherently future-proof and portable, but without turning on encryption, it's just sitting there out in the open.
https://blog.joshsullivan.io/2019/02/20/creating-online-tiddlywiki [[Josh Sullivan]] knocked it out of the park (and had a lot of help from [[Jack Baty]], I see)! Expertly done. I've already shared it with a friend who wants a hosted TiddlyWiki.
https://peterlyons.com/leveling-up/#your-work-journal So good. This is just a bookmark to one section of the whole post, [[Leveling Up: Career Advancement for Software Developers|https://peterlyons.com/leveling-up/]]. The only part of the larger article I disagree with is "Use corporate speak." There's no reason to participate in murdering the English language any further by saying "move the needle" or using "leverage" as a verb, no matter how many other people do it. I love how software developers are obsessed with using simple systems to document every single thing, minute by minute: > Don't skip this one. This is a simple technique that can make a huge difference. Start a work journal - it can be nothing more than a simple text file. You should have one single journal for everything you do for your job. Organize it chronologically: do NOT try to make separate journal files for different roles or clients or projects. Put EVERYTHING in ONE BIG FILE. Don't try to organize it by category or client or anything like that. It is just a chronological journal with the first entry at the top of the file and the last entry at the end of the file. Make sure your text editor can be configured to instantly insert a timestamp, since you can use this to organize your journal. This is straightforward in most good editors, and there are even some OS-level utilities that can do this. also: > Over time, your journal becomes an awesome treasure trove of knowledge. Do NOT worry about managing it. I kept a journal steadily for 6.5 years and my final text file was 207,470 lines long and 5 MB uncompressed. It compresses with bzip2 down to 1.2 MB. Just keep the journal going essentially for ever. Be sure to back it up by including it in a source code management system that has remote backups (git) and/or email a copy of it to yourself periodically. archived the [ext[whole article|x-devonthink-item://BA63418F-A38A-40DB-9AF9-BB633FE1B37A]] in DEVONthink
To Andrew, Jack, Josh and Sphygmus, (I don't know how to let Sphygmus know of this wiki, but maybe s/he will see it one day!) My TiddlyWiki is, like your wikis, only a subset of my life. There's a ton that I don't share about work, mostly because we're forbidden from divulging anything technical in public, and that's fine. There's so much else here in the wiki anyway, and more stuff that I keep finding that I want to put in here, that it has grown beyond what I had envisioned! Besides work and obsessing about knowledge management software: I live in Richmond, Va. with [[my wife|https://www.instagram.com/heartsandneedles/]] and our one cat (Roger). My love for music has never subsided since I was two or three, but my tastes have changed regularly. I got my first stereo when I was 3-1/2. (I demanded an 8-track player until my parents gave in.) I annually become re-enamored with film photography and then regularly can't stand to take a camera anywhere. I don't know how anyone has time to read books, but I know it's all about priorities and time (''clarification:'' I'm almost 48 and still haven't figured out how to read consistently, though I would like to). I had a brief stint right after college as a Unix sys admin and still have a fondness for it. I fell into web-related jobs and am still in one, but I'm not a developer. I'm somewhere between IT and the "business" side, always translating between the two camps. I thought I wanted to be a developer for about 20 years, until 20 years went by and I realized that I hadn't made it a priority, so there was my answer! Seeing the truth in that was a huge relief. I am so with you, Andrew, on the "how many //tiddlers// will be left under my wiki tree today" feeling. I'm grateful that we all bumped into each other and have ideas to share and enough shared and un-shared interests to make it addictive. This is definitely a community like none I've ever experienced online before and I'm grateful to have the collective ear of you all. I thought Micro.blog was a pleasant surprise, but this is downright cozy! If any of you find yourselves in Richmond, Virginia, please let me know, because I'd love to meet you all in person. -Phil
Jack, Re: [[your journal entry about VS Code|https://rudimentarylathe.org/#2019.02.19%20-%20To%3A%20Phil%20N%20-%20Emacs%20and%20VS%20Code]], I appreciate you sharing your experience with VS Code and contrasting it to Emacs! From your M.b post about Dave Thomas, I feel like I saw a critical mass of people raving about VS Code in a very short period of time, and the theme with most of them was: "OMG I've loved Emacs but this new thing is so good I can't deny it!" And that was refreshing. I've always liked the idea that if, for example, Android evolved to suit my requirements better that I would allow for the possibility of switching from iOS to it. That hasn't happened yet, but I hope I'm keeping an open enough mind to know if it does. I don't think I've even spent 10 total hours in Emacs yet, but what I did learn in that time was fun. And it's been around long enough that if VS Code loses its luster, eLISP and init.el will still be there waiting. I just have weird guilt about leaving Perfectly Capable Tools, as if the tools cared if I use them. (I still feel a twinge of guilt at throwing out our perfectly capable 27" Sony Trinitron when 720p HD became a thing.) But you're right about the thought of "What would I use if no one would know what I use?" That's the right way to approach it. Now I just have to figure out the One Perfect Way to mold [[vscode-journal]] to my uses...
* Listened to the NY, LA, and "rough mix" versions of Rainbow's "Rising" album from 1976 on [[Spotify|https://open.spotify.com/album/3uIT4I4Dy7Pq1j0aSjzPW9]] this morning at work. Man, I had no idea how ahead of its time it was.
borrowed from [[Josh Sullivan]]: [[Variables, Parameters and transclusions|https://tiddlywiki.psat.com.au/#Variables%2C%20Parameters%20and%20transclusions]] <<< * This tiddler is a single page reference work, or cheatsheet that brings together some essential knowledge in becoming a TiddlyWiki expert. * Work is under-way to help introduce TiddlyWiki to new users, but this documentation comes as a result of someone at the end of that journey documenting essential facts. <<<
* Just installed [[vscode-markdown-preview-enhanced]]. Very convenient. But man, I never noticed how short the wait was for the second key after ⌘-K. If you're not ready with that next key right away, you lose the opportunity to finish the command. Must be a way to tweak that for old people like me. I'll check... * ~~TODO: post to M.b about Impossible Burger~~ * Conversations with my wife in 2019: "[[Jack Baty]] wrote me a tiddler about Rainbow!!!" "Awww, that's cute, babe." * Will I ever learn to [[touch-type|touch-typing]]? Will I always be just a high-functioning flail-and-peek-typist? * I want to lie down. * Whoa – [[@kordumb]] totally called out my wiki on his [[Daily Haunts|https://humdrum.life/daily%20haunts]]! I'm flattered by this! * I just told Sarah that Kevin included "[[cut nails|https://humdrum.life/2019/02/22/plan]]" as a (completed) task on his blog and she said, "OMG your soulmate". If he can include stuff like that, I can afford to go a little more granular and embarrassing here. * HOLY SHIT: [[h0p3]] [[knows I exist!!!|https://philosopher.life/#2019.01.26%20-%20Phil%20Nunnally%3A%20Quietly%20Watching]] I really had no idea. This is too much for one night. * Welp, I just got [[rickrolled|https://philosopher.life/#Music%3A%20Library]] by [[h0p3]]. * Y'ALL, I CANNOT KEEP UP WITH ALL THE NEW PAGES/LINKS/TIDDLERS. * If you guys are into all the weird crap I put in this wiki, well I've got 715 more text files in Dropbox that I haven't even begun to mine for information here. * If I vaguely refer to someone in TiddlyWiki without naming them, is that a "subtiddle"?
https://code.visualstudio.com/docs/getstarted/keybindings There is a LOT of stuff here!
http://freakonomics.com/podcast/meat/ They talked to the CEO of Impossible Foods, makers of the Impossible Burger. Between engineered food like this and the delicious Beyond Meat burger we've had, animal-based meats seem barbaric by comparison. (And I'm no vegetarian.) [[Posted about it on Micro.blog|https://twelvety.micro.blog/2019/02/24/freakonomics-radio-on.html]]
* Gratuitous napping is one way to avoid recreational eating, I guess? * To practice for helping a friend set up her public TiddlyWiki, I used [[Josh Sullivan]]'s instructions for [[setting up TiddlyWiki on DigitalOcean|2019-02-20 link: Josh on how to set up TW in DigitalOcean]] and I'm almost done. Everything is going great except I have to wait for the DNS record changes to propagate on Hover. I'll pick back up on the certbot part when that finishes. The longest part was the detour into setting up the actual droplet and switching to SSH instead of password-based authentication, but I had had practice with that on the Raspberry Pi, so I sort of knew the ropes. Once I get this going, it's going to be very tempting to move my wiki to it (instead of running it on the MBP on Node.js and copying an HTML file to my old server). * Cleaned up some duplicate tags and made a [[What some of the tags mean]] page, because I was having trouble remembering what some of them were for.
Jack, Re: [[Rainbow|https://rudimentarylathe.org/#2019.02.21%20-%20To%3A%20Phil%20N%20-%20Rainbow]] I'm glad to know you're a fellow Dio fan! Is there //any question// about whether that mention would merit its own tiddler? If Ronnie James Dio doesn't deserve it, who does? ;) Seriously, I've had a soft spot for him ever since "The Last in Line" in 1984, which was the first time I heard his music. My respect for him as an elder statesman of metal only grew over the years, but more as a musical "acquaintance". This [[long-ish video interview|https://youtu.be/U8Ln5GW-3as]] from 2004 brought him down to earth for me a little, and is what spurred me to listen to "Rising" for the first time (just this week). Which is to say, I'm still just learning his stuff, and boy do I love it!
* I just learned about `animation-fill-mode: forwards` in CSS while trying to get this loading screen to look better. * Because I am a HUUUUUUGE dork, I just wasted the entire day [[re-doing the loading message|2019-02-24 TW: re-did loading message]] to add a CSS animation. * Good lord, the world does not need a Rocketman movie about Elton John. Let the man's life and work stand on its own merits without the biopic filter being slathered on top of it. * I have to confess: I love it when I check in on a favorite wiki and the only thing new/modified today is one Journal entry. It reminds me that people have lives outside of maintaining TiddlyWiki, and it's also nice to think of them doing non-computery things. * Y'all, the [[vscode-markdown]] extension is //killer//. It'd be worth it just for the super-easy Markdown linkifier where you use ⌘-V to turn words into Markdown links from your clipboard. GOD.
https://github.com/abs0/wargames/blob/master/wargames.sh OMFG. Someone typed up all the back and forth between David Lightman and the W.O.P.R. and put it in a shell script. I'm not going to run this, but I sure am stealing from it.
[[Sphygmus]] in a [[Sept. 2018 letter|https://sphygm.us/#180904%20%E2%80%93%20h0p3%3A%20Pop%20%26%20Lock%3B%20draft]] to [[h0p3]]: > No need to apologize for taking your time to respond! I used to constantly obsess after I sent a message to someone, wondering when they would respond, if they were ignoring me, what the time delay meant, and on and on. Letting go of that anxiety is a continuing and surprisingly difficult process, but my intent is to extend everyone space, time, and trust in communication, extrapolating no latent meaning from time delays. A perfect expression of a lovely, graceful thought. Put this on my tombstone. That and "Safety First". Also, this from [[Nov. 2018|https://sphygm.us/#181113%20%E2%80%93%20To%20h0p3%3A%20A%20Title%2C%20A%20Name]]: > I'm doing something different with this letter - I hope you don't mind. I figure you check my site at least on occasion, so I'm not going to email a link. My hope is for this to emulate, in some sense, the travel delay time of physical letters and let you see it and reply in your own time. :)
Borrowed from [[Jack Baty|https://rudimentarylathe.org/#TW%3A%20Adding%20a%20loading%20message]]: <<< The more I put into this wiki, the longer it's going to take to render in a browser. I added a simple loading message (aka Splash Screen) by creating a tiddler named [[$:/jab/splashscreen]] (name isn't important) and tagged it with `$:/tags/RawMarkupWikified/TopBody` (important). The content of this tiddler is shown immediately before the full page renders. Mine is just text now, but I'll make it fancy later. ''Update'' The splash screen text was always being displayed at the bottom of pages. I found [[this comment by Thomas Elmiger|https://groups.google.com/d/msg/tiddlywiki/5D_i87ID8fI/D84wzL42DQAJ]] with a solution. I needed to include the `\rules only filteredtranscludeinline transcludeinline` line. <<<
In the new [[$:/jab/SplashScreen]] loading-tiddler, I wanted a "List Games" animation like the one in //WarGames//, and I wanted to do it without JavaScript. Making a bunch of lines reveal themselves sequentially using just CSS is surprisingly hard to do! Here's a demo of how the thing will look once this TiddlyWiki becomes bloated enough to allow the full animation to run while it's loading: * https://codepen.io/twelvety/pen/qvWOVO Here's a reference clip from the movie to get a feel for the typeface, color, glow, line spacing, and speed: * https://getyarn.io/yarn-clip/1f23aa95-4c06-4cee-a736-e992161b92f8 ''The craziest two things I learned were:'' # You have to set the `p` tag to `visibility: hidden` so that all the lines don't appear the instant the page loads. # You have to set `animation-fill-mode: forwards` on each animation to get each `visibility: visible` to stick at the end (so the lines don't disappear again when it's all done running). These two demos were very important to getting a grasp on how to do it: * Typing animation using CSS: https://codepen.io/rusjames/pen/uAFhE * CSS Typing Multiple Lines with Blinking Caret: https://codepen.io/Bojoer/pen/EZYgeO And here's all the other CSS animation stuff I found and learned from today: * CSS text-shadow property: https://www.w3schools.com/cssref/css3_pr_text-shadow.asp * CSS text shadow opacity: https://stackoverflow.com/questions/11549757/text-shadow-opacity * Understanding the CSS animation-fill-mode Property: https://www.sitepoint.com/understanding-css-animation-fill-mode-property/ * CSS visibility Property: https://www.w3schools.com/cssref/pr_class_visibility.asp * Keyframe Animation Syntax: https://css-tricks.com/snippets/css/keyframe-animation-syntax/ * The Difference Between :nth-child and :nth-of-type: https://css-tricks.com/the-difference-between-nth-child-and-nth-of-type/ * How to Use steps() in CSS Animations: https://designmodo.com/steps-css-animations/ * How to animate width and height 100% using css3 animations? https://stackoverflow.com/questions/29880369/how-to-animate-width-and-height-100-using-css3-animations
Ohhhhhh. I wish I had realized this tidbit about the nameservers on Friday night when I set up the domain for the DigitalOcean test droplet for TiddlyWiki. It's obvious now, but I didn't realize that the old nameservers I had in there from the previous registrar were not Hover nameservers. From Hover's Popular Questions section: <<< ''How long until the changes to my name servers or DNS records take effect? '' Changes made to your name servers can take up to 24 hours to take effect. This would be called propagation time or Time to Live (TTL). If your name servers have been set to Hover for at least 24 hours, changes to your DNS will take 15 minutes to propagate. However, if your name servers are not ns1.hover.com and ns2.hover.com, then the DNS changes you make in your account will not be reflected online. When transferring a domain to Hover, the name servers set at your previous registrar will carry over. If you intend to manage your DNS with Hover, you will need to update the name servers and allow the change to propagate over the next 24 hours. <<<
* I want to use [[Paprika]] or [[Yummly]] to auto-suggest meals/recipes and generate grocery lists. We have a binder full of printed recipes in sheet protectors, but I'm still a sucker for these apps. * I start every morning feeling smart, like I want to learn everything, all at once, right now. By lunchtime I've lost the fire. By evening I'm a slothful dullard. * I'm going to need to set aside an evening to read nothing else but the Stephen Wolfram article Jack Baty linked to. Holy moly. * If I had hired myself to come up with a journaling workflow, both the client and designer instances of me would have fired each other by now, because my requirements are never thought through and are always shifting as soon as a workable process crystallizes. * If I don't start meditating again soon, my propensity towards being irritated by everyone is going to turn inward and eat me alive or turn outward and be embarrassing.
[[Eli Mellen on Micro.blog Thread about Congested Web Pages|https://micro.blog/eli/2480389]] via [[Josh Sullivan]] <<< @jack enter lite.cnn.io and text.npr.org <<<
I love how [[Sphygmus]] uses "trail" at the beginning of tiddlers that lead to all kinds of emerging stuff. In that spirit... I did a Google image search for "org-mode diary" and need to look through these: * http://cachestocaches.com/2016/9/my-workflow-org-agenda/ * http://members.optusnet.com.au/~charles57/GTD/datetree.html * https://emacs-china.org/t/org-mode-agenda-include-diary-file-error/1383 * http://sachachua.com/blog/2015/02/learn-take-notes-efficiently-org-mode/ * https://orgmode.org/worg/org-faq.html
I saw this on [[Humdrum Life|https://humdrum.life/2019/02/26/some%20site%20thoughts]] and it's making me think, hard: > I’ve been trying to cut some of the ties that exist to my real name. I have no problem with people knowing who I am, which is why I’m not throwing everything away. If someone finds this site and can determine my name, that a-okay. What I’d like to avoid is someone, such as a potential employer, searching my name and coming up with a myriad of results, including this site. I don't know where I'll end up. I like having this wiki accessible through Micro.blog, which is hopelessly attached to my real name. But I also don't love the idea of my current (or a future) employer googling me and ending up here. Part of what makes this thing fun is writing stupid things in my Journal posts that I would never subject others to on the Micro.blog timeline or even on Twitter. I'm not changing anything yet.
* ''@kordumb'', If there was ever anything that made me feel like I've found my people, it's your [[post about the merits of various wiki nerds' date formatting patterns|https://humdrum.life/2019/02/26/date%20formatting]]. I said to my wife that Humdrum Life had a post comparing everyones' date formats and she said, "Oh, is that the 'cut nails' guy?" Oh, yes, yes it is. * Finally finished getting my test install of an authenticated TiddlyWiki running on a DigitalOcean droplet using the instructions from [[Josh Sullivan on how to set up TW in DigitalOcean|2019-02-20 link: Josh on how to set up TW in DigitalOcean]]. Worked like a charm! Now I just need to turn the notes I took on setting it up into something that my friend can use when she gets hers hosted. * I wrote this in response to something I saw on Humdrum Life yesterday: [[2019-02-27 having my name on this wiki]] * Got a haircut! * People on Twitter really seem to have it out for Maggie Haberman of the NYT. She will tweet one thing that will spur some jackass to comment on it and call her a Trump-enabler, and then like 47 people will pile on. It's like a Muppet peanut gallery all turning to each other and giggling "heh-heh-heh-heh-heh-heh what he said! heh-heh-heh-heh."
https://www.theguardian.com/music/2019/feb/26/musicians-on-mark-hollis-he-found-hooks-in-places-im-still-trying-to-fathom > He wanted one track to sound tentative, so we imagined we were drops of water that had waited thousands of years until, at last, we were to fall from a stalactite. Hollis was the leader of the band Talk Talk. //Laughing Stock// is the only CD of theirs I have. It is its own little world.
https://tiddlywiki.com/prerelease/static/WebServer%2520Basic%2520Authentication.html > To force a password prompt visit the route `/login-basic` (for example, http://127.0.0.1:8080/login-basic).
* Read last night that Mark Hollis (of Talk Talk) just died: [[2019-02-27 link: Musicians' quotes about Mark Hollis]] * Belatedly sad to learn that Carey Lander, keyboardist for Camera Obscura, died of bone cancer in October 2015. * I like [[Andrew Canion]]'s visual grid of journal entries! https://andrewcanion.com/wiki/doku.php?id=journal:start Reminds me of the David Seah Compact Calendar. * I'm tired of doing non-work things on a computer and reflexively thinking in the back of my head, "don't forget to log your start time for billing this next action". * I have renamed the "wikitown" bookmark group in Firefox into "daily haunts", because they're not all wikis. But they're so fun to visit, and can easily monopolize my attention, that I think I need to set up a "daily TCB" folder in Safari that I have to get all the way through //before// I load up "daily haunts". The "daily TCB" folder would have at least: 1. Gmail, and 2. YNAB. Because otherwise, those two will get habitually avoided in favor of more fun things.
For Stephen Wolfram's [[Seeking the Productive Life|https://blog.stephenwolfram.com/2019/02/seeking-the-productive-life-some-details-of-my-personal-infrastructure/]] post ([[via Jack Baty|https://www.baty.blog/2019/seeking-the-productive-life-stephen-wolfram]]), I had initially thought it would be cool to: * make a PDF of it with [[PrintFriendly]] * make annotations in [[MetaPDF]] * sync the PDF to Google Drive * share a public link to it (along with adding notes and quoting passages in text) in a tiddler * copy the PDF into DEVONthink for local storage. After looking at the [[Wolfram blog terms of use|https://blog.stephenwolfram.com/terms]], I can do all of the above except make the public PDF of the article, which is totally fine. ------- * A good habit for me is to open up my own TiddlyWiki and start adding stuff to it from my Field Notes and `buffer.md` temporary holding pens, //before// opening up all the other shiny wikis. Makes it more likely that I'll contribute something rather than just borrowing from others all the time. * Need to remember that it's perfectly OK to email a client that you're working on something they need, even if you're not ready to show them anything yet. Even better if you do that before they email you to ask about status. Sometimes that's all they need: to know that you're on the case. * That feeling when you've read all the new tiddlers/entries from the last 24 hours in your Daily Haunts is like when you eat the last Milk Dud in the box without realizing it was the last one.
[[via Jack Baty|https://rudimentarylathe.org/#Link%3A%20Smashing%20Magazine%20Walpapers]]. These are really good! <<< https://www.smashingmagazine.com/category/wallpapers Fun desktop wallpapers each month <<<
I always forget that you write "et al." with a period at the end. From [[Editing & Writing Services|http://editingandwritingservices.com/how-do-i-punctuate-et-al/]]: <<< It’s used, says [[Wikipedia|http://en.wikipedia.org/wiki/Et_al#et_alii]], similarly to et cetera (“and the rest”), to stand for a list of names. According to Chicago Manual of Style, 5.220, you say et al. with a period following “al.” This is the abbreviated form of et alii (“and others”); the others are people, not things. Since al. is an abbreviation, the period is required. <<< From [[Prof. Paul Brians at WSU|https://brians.wsu.edu/2016/05/25/et-al/]]: <<< “Et al.” is a scholarly abbreviation of the Latin phrase et alia, which means “and others.” It is commonly used when you don’t want to name all the people or things in a list, and works in roughly the same way as “etc.” “The reorganization plan was designed by Alfred E. Newman, General Halftrack, Zippy the Pinhead, et al.; and it was pretty useless.” The “al.” in this phrase needs a period after it to indicate it is an abbreviation of //alia//, but it is incorrect to put a period after “et.” <<<
10:50p: Earlier today I found a text file in [[nvALT]] called `logx - what I learned.md`. (The `logx` prefix was from a tip from Merlin Mann from years ago, as a way to use in-filename metadata to signal that this was a "log" file.) It turned out to be a local/private precursor to what I'm doing now in TiddlyWiki, full of datestamps and hyperlinks and pull-quotes, like a commonplace book. Neat! Although I like TiddlyWiki way better. ----- 10:43p: I posted about [[remembering what to do next|https://twelvety.micro.blog/2019/03/02/now-what-was.html]] before checking lists. ----- 10:05p: ''@kordumb'', I don't want to let my doubtlessly delayed response back to you delay me from letting you know now that the "cut nails" call-out is definitely meant in love and appreciation. When I saw that you bravely added that to your public to-do list, I immediately and gleefully let my wife know, because she's heard me announcing the same on my own to-do list a million times. She's just glad I finally have friends to share this stuff with. ----- 10p: I was tired of seeing the same "[[Hello world]]" welcome page every time I loaded my wiki, so I borrowed [[Jack Baty]]'s [[Most Recent Journal]] structure and added it here, so it shows up above Hello World. At least that way if strangers don't look at anything else, they might see something recent. If they're remotely curious beyond that, they might scroll down or even click on the [[TOC|Table of Contents]] tab. But they might not, and that's ok. I don't need to hold anyone's hand here. ----- 9:30p: I showed Sarah the [[Stephen Wolfram productivity blog post|https://blog.stephenwolfram.com/2019/02/seeking-the-productive-life-some-details-of-my-personal-infrastructure/]] and when we got to the animated GIF of him on the treadmill, she said, "Is he wearing pants?" I thought he was. ----- 8:30p: We had a first visit to the marvelous [[ZZQ|https://www.zzqrva.com/]] BBQ in Richmond with friends tonight. I had the chopped brisket sandwich, which was disastrously messy and great. Next time, though, I'm getting one of their giant slabs of barbecued ribs. They looked so good. ----- 4:00p: """ Me: "Fingernails cut! ✔️" Sarah: "Tell it to your friends." """ ----- 12:36a: Man, this is already a great day and it's only 12:36 am. In the space of a few minutes, I see very nice notes from [[Sphygmus|https://sphygm.us/#190301%20%E2%80%93%20To%20Phil%3A%20Hey%2C%20Hi%2C%20Hello!]] //and// from @kordumb on [[Humdrum Life|https://humdrum.life/2019/02/28/twelvety]]. It is so crazy that the more effort that's required to converse like this makes it even more rewarding (and humbling) to see these letters. It's like all of us wiki-owners live at the beach where time runs on a different clock than the rest of the world. We all walk down the dunes to the water every so often (sometimes more than that) to see what messages in bottles have "washed up on the shore", either for us or others or to the message writers themselves. (And I see that [[that song|https://en.wikipedia.org/wiki/Message_in_a_Bottle_(song)]] is //40 years old// now. Yikes.) And I am giddily excited about having todo's on [[my list|wiki – notepad]] to write back.
* I'm suddenly a reader again! A friend recommended the [[Serial Reader]] app last night when I whined about not having good book-reading habits. This genius app delivers a daily "issue" of a segment of a book, sized just right for people like me who get overwhelmed by anything longer than an article in //The Atlantic//. I subscribed to //[[A Portrait of the Artist as a Young Man|https://www.serialreader.org/56d5079351710127a075b44d/a-portrait-of-the-artist-as-a-young-man/]]// by James Joyce and got AND COMPLETED my first issue today.
This helped me feel better about not going to the one showing of this on a big screen in town today because we had too many other chores to do. from [[No, You Don't Need to See ROMA in a Theater|http://collider.com/roma-home-vs-theater/]]: > The key to watching ROMA is to tune out all distractions. Put your phone on silent and then put it in another room for two hours and fifteen minutes. Make your viewing space as dark as possible. Go to the bathroom before you start the movie. Basically, treat your viewing space as //if// it were a theater and that’s the best way to view the movie. The success of ROMA doesn’t come from going to a theater; it comes from giving the film your undivided attention.
https://scriptingosx.com/2017/10/on-the-shebang/ Start shell scripts in macOS with `#!/bin/bash` if you want them to use the default shell: <<< * the first line in a shell script starts with a shebang `#!` and tells the system which tool interprets the script * env should only be used in the shebang when the script needs to run in environments where you cannot predict the location of the actual interpreter. For admins this introduces an extra level of uncertainty * macOS administrators should use `/bin/bash` as the shebang <<<
Found this on Stack Overflow: [[macos - Where do you keep your own scripts on OSX?|https://stackoverflow.com/questions/18682413/where-do-you-keep-your-own-scripts-on-osx]] The common wisdom seems to be to put them in `$HOME/bin`, so I added that (spelled out as `/Users/phil/bin`) to the $PATH in `.bash_profile`.
The Brian Jonestown Massacre's new single, "Cannot Be Saved", from a new album coming out on 3/15/2019. https://soundcloud.com/brian-jonestown-massacre/cannot-be-saved This sounds encouraging!
* I'm listening to the [[entire Michael Cohen testimony|https://slate.com/news-and-politics/2019/02/michael-cohen-responds-to-questions-from-congress.html]] in all of its glorious, irritating 4-hour detail. I usually prefer to hear these things for myself rather than rely on all the hot takes. My hot take is that at 1 hour and 48 minutes in, every Republican I've heard on the committee so far has been a bullying, whiny baby, and has made Cohen look good by comparison.
The fridge ice maker isn't working. This video shows an insane infrared sensing system to tell the ice maker when to stop making ice. I don't think that's our problem, but it's pretty wild that it works this way. https://www.youtube.com/watch?v=4Lmpy--Rz2I
* No computer time at lunch today. Waaaaahhhhh. Had to do adult/work things that involved JavaScript (but that's ok, because it was a learning experience). * After work, we dropped Sarah's car off for a state inspection. I had missed that her last inspection expired at the end of February. I consider this a personal failure. I'm supposed to keep on top of stuff like that. What good are a million tagged lists of trivial things if I can't set up a leakproof system to remind me when boring but important things like this need to be done? No, the world didn't end, but aren't I supposed to be the workflows/reminders/shortcuts/scripts dude?
from [[Sphygmus]] in [[190131 – To Shp: It's An Onion|https://sphygm.us/#190131%20%E2%80%93%20To%20Shp%3A%20It's%20An%20Onion]], via an [[old tiddler|https://rudimentarylathe.org/#2019.01.31%20-%20It's%20an%20Onion%20-%20Sphygmus]] from [[Jack Baty]]: > h0p3's wiki, on the other hand? That's a useful model. You get to see //how// he structures it, how he goes about working in it, the sort of connections that are made; and the base components are obvious and replicable. I cribbed his Carpe Diem logs and his Wiki Review logs and they're the two invisible legs of my wiki as it stands now; before that, I was writing in a single tiddler every day and throwing anything and everything into it – thanks to the wiki, I was able to then return to those logs and see patterns and pull data out into a more meaningful structure. I feel like I need to level up and get to this level. Most of my TW is just dumping everything into a tiddler every day. I could stand to see some patterns and impose some structure to all this stuff.
[[h0p3]], Thank you for your [[letter on 2019-01-26|https://philosopher.life/#2019.01.26%20-%20Phil%20Nunnally%3A%20Quietly%20Watching]]! I only found it recently, figuring that I would be way under your radar, but I'm happy that I turned out not to be. You probably know by now that you and [[Sphygmus]] have spawned a host of admirers and tiddler-borrowers. I remember the moment in January that I ran across the first conversations between you and [[Jack Baty]], and thinking to myself that this was the first truly new thing I had seen on the internet in years — maybe the first new thing since RSS feeds burst onto the scene. And it's not because of some brand-new technological breakthrough, because TiddlyWiki has been around for literally well over a decade. But some pieces of cosmic flint knocked together in just the right way that this method of note-taking, recording, writing, refactoring, sharing, dusting off, editing, and re-shelving has clicked with a number of us. Strangely (or not?), the more that a wiki is written for the person writing it, the more interesting it seems to be, for me at least. Jack [[wrote earlier today|https://rudimentarylathe.org/#2019.03.05%20-%20Journal]]: > I've noticed that recently I've been organizing this wiki according to how //I// want to find things and less so that //other// people can find them. I'm unsure if this is a bad idea, but since I consider this place to be mostly for my records, it feels like the right approach. ...and I feel the same about your wiki (and mine)! So much of yours is inscrutable to me, and I'm still trying to decipher how the Wiki Audits and Wiki Reviews work, but that will become more clear over time. No rush to figure it out. I just don't know if I can/could be a good public self-modeler. I only put a sliver of my life and thoughts into my wiki, and just that small amount has grown far beyond what I thought it would when I started with an empty TiddlyWiki file and thought, "I wonder what I can do with this..." For me, for now, it's more than enough to know that a half-dozen people are interested enough in the minutiae I put in here that they come back more than once! I'm still surprised every day, honestly. I'm thankful that you had the confidence in the potential for slow back-and-forth (and in me) that you threw up a flare and would wait this long for me to see it. Such a different way of operating than the hyper-instant feedback loop of post something, someone else sees it in seconds, and then you see in a few more seconds that they saw it and liked it. [[Micro.blog|https://micro.blog]] broke me of that rewardless habit and I have no interest in returning to it. Regarding your [[Music: Library|https://philosopher.life/#Music%3A%20Library]], I //love// it. I'm compelled to do the same just out of appreciation for so many gems released into the world by artists. And I have to say I'm glad to see you organize your music list by the first letter of the artist's first name (when there is a first name). Apple ruined it for everyone with the artist sorting in iTunes, and I figure: Why fight it? But seriously, other than my attachment to physical vinyl LPs, it's hard to keep a physical attachment to music stored in digital media. I do have a pretty hefty library of FLAC files on a Raspberry Pi in the basement, and I can get to those anytime, but it's more interesting as I get older to record details about what music I found when, how I found it, and which music has stuck with me over the years. I'm about to unleash my "favorite songs ever" tiddler, which is similar to your Music: Library. Once you have practically endless hard drive storage, or the ability to stream almost anything you don't own, the value of all this music goes down. And then the attention and time it takes to listen to the music becomes the scarce thing. Take care, and please take your time responding, if you ever feel moved to. I'm sure not winning any awards for fast correspondence around here, and I never want anyone to feel pressured to reciprocate. """ I'm so glad to meet you (and all these nice people!)!, phil/twelvety """
* I'm losing my mind because I have this great, short instrumental song in my head from the early 90s, I think, and I don't think it's Pell Mell, and I'm not sure it's Shadowy Men on a Shadowy Planet, and I've scrubbed all the YouTube videos and Spotify tracks I can find for both of them and have come up empty. If it's in my iTunes library, I've missed it, because I've looked at every band name in there and can't remember who it is or what the song was called. * I finally played with the [[vscode-org-mode]] extension for [[VS Code]], and it's cool, but boy is it hobbled. It's a functional outliner, but without an agenda view, it just seems like, what's the point? I know it's because of the limitations of VS Code more than it is about the developer of the extension. Still, I was hoping it would be a full-on Org-mode experience and it is not that. * Sometimes I see something missing in my wiki when I'm away from my laptop and I can't fix it because the wiki is only editable from my laptop, and I just think, Oh well. It's probably a good thing in the end, not being able to fix everything instantly, having to practice patience. * I'm going to look for a script to convert Markdown URLs to TiddlyWiki URLs for those times when I have a reference text file stored in nvALT that I occasionally want to output into TW. I guess I could just do some regex/search+replace and that would do it. Don't know why I need to make it complicated.
From Anton Zuiker, [[The Coconut Wireless|http://mistersugar.com/2012/05/01/the-four-cs-of-inspiration-overlapping-networks-of-scienceonline]]: > But at night, when I wake up and my subconscious tells me I’m doing too much and I should be overwhelmed and wouldn’t it be nice to chill out for a year or two, I smile and think, somehow, I’ve plugged into a community of amazing people, and if organizing a conference and building a community gets me opportunity to converse with them, I’m not stopping. In my waking hours, I talk at every opportunity about the 4 Cs (refer 2 graphs above) and the power of overlapping networks and how my life has changed because of all that. If I had discovered Micro.blog and wikis (and the people behind them) two years earlier, would I have even been ready for them?
From Anton Zuiker, [[To give attention|http://zuiker.com/to-give-attention]]: > What a gift it is to send someone a well-written message to compliment someone’s writing, or a kindly note to commend someone for being kind, or a lovingly penned card to remind someone they are loved. To take the time to know another person, to reflect on that person’s value, and to take the time to tell that person why they are important. That’s an amazing feeling, whether you are on the giving side or the receiving side.
* I'm trying the [[VS Code]] Todo+ extension (a.k.a. [[vscode-todo-plus]] for today's tasks. It uses [[TaskPaper]] formatting, so I'm right at home. Still not sure if this will be any better than Org-mode tasks in this editor, but the outlining is less heavy, so that's good. It's a pain to have to type the dash character before each task, though. It doesn't fill that in automatically, but you can toggle between a task/non-task by pressing Ctrl-Enter.
* It can be nice, when the second beer is finished, to invite the brain to walk off its haze and settle back into the space between your ears. The younger me would be all like, "Man, I'm losing my buzz!", but as you get older, the buzz wears out its welcome faster than it used to. Clarity can be a relief. * While I was driving this morning, I had an idea for a new tiddler. Siri interpreted "Start a Current Projects tiddler" as "Start a current projects to Hitler". Oops! 😳
* I so wish I hadn't used `tiddlywiki.html` as the filename for the copy of this wiki on my public-facing server. It would have been better to call it `index.html` and put it in a folder of its own. Now that I have a DigitalOcean droplet set up for testing the Node.js version of TiddlyWiki (using [[Josh's great instructions|2019-02-20 link: Josh on how to set up TW in DigitalOcean]]), it would be great to move my old blog and this wiki to it, but preserve the old filename for anyone who has linked to individual tiddlers here. I know the Node.js flavor of TW has command-line options for rendering tiddlers as static HTML, but I want a full JavaScript-enabled single file called `tiddlywiki.html` just like the one you get when you click the Save Changes checkbox above the tabs and search box, but one that stays updated every time there are changes to the real/live Node.js wiki. I don't know if this is possible without some brute-force thing that just runs all the time and essentially does what [[Hazel]] does on my MacBook, laboriously uploading a standalone HTML file from the served Node.js wiki every time I click the Save Changes checkmark. Dang. * I'm trying to use [[vscode-journal]] to keep my daily journal/Daybook, but it's just not pretty, you know? It feels "cold" to write about my day in plain text, although maybe I should switch to a light theme and then it wouldn't seem so "codey". [[Day One]] is nicer looking, and I still use it for those few journal posts that I want encrypted, but anytime I use it, those entries are forked away from the 99% of other entries, stored in plain text in the [[vscode-journal]] river of life. If I want to search for something, like all the times I saw my friend Derek, or all the times we ate at that sushi place, I don't want to do it in both places. Ugh!
* I'm not "glad" to see [[Jack feel conflicted|https://www.baty.blog/2019/text-file-fatigue]] like I do about text file journaling, but I'm heartened to know he feels similarly. I had what I thought was a bright idea to turn on the Markdown preview in [[VS Code]] so I could feel like I was generating something prettier than plain text, but it lasted about 30 seconds and felt clumsy. There's no fooling my brain. * We met some new friends at dinner last night. They talked about bicycles and trails a lot. I had forgotten what a joy it is to hear people with deep knowledge and excitement talk and trade tips about a topic I don't know anything about! ([[Posted|https://twelvety.micro.blog/2019/03/10/we-met-some.html]]) * Helped my friend Catherine set up her wiki on DigitalOcean using [[Josh Sullivan]]'s instructions! I made a couple of //dumb// mistakes along the way where I didn't replace placeholders for usernames and domains with actual usernames and domains, but we got it done. I'll share my enhanced (meaning, dumbed down) instructions once I clean them up. I should always remember that anything I think will take "a couple of hours" will inevitably take closer to four when it's all done. * Now that I've gotten two DigitalOcean TiddlyWiki droplets running, I think I may port this wiki over to https://youneedastereo.com (a domain I bought and never did anything with and now sitting on DigitalOcean). I believe I've figured out some htaccess rules that I can run on twelvety.com which should theoretically pass any old anchor-link requests meant for this single wiki html file on twelvety.com to the new domain on DigitalOcean running the Node.js wiki. But it's too late to start that project tonight. * Posted on Micro.blog about [[positives and negatives of a wiki|https://twelvety.micro.blog/2019/03/11/positives-and-negatives.html]].
* Josh wrote a [[thoughtful response|https://joshisms.io/#2019-03-11%20-%20To%3A%20Phil]] to my blog post about positive and negative aspects of wikis! * Seeing Andrew and Jack include Flickr images in their Journal posts is making me want to do something similar. Otherwise, all my Journal tiddlers look the same! Also, this will nudge me into using Flickr more. It's just so nice to look at. * Since nothing else seems to work to make me keep this week's current (personal) projects in focus, I'm going to take a brave step and list them here, with progress listed underneath. The theory is that I'll be using a tool I like, I'll see that tiddler often in the course of adding other stuff, and there's some modicum of public accountability to it. It may not stick.
* New allergy pills for Roger ** 3/11 called vet, pills will be there Fri ** 3/15 Did not go to vet. Will do Monday. * [[book: A Portrait of the Artist as a Young Man]] ** 3/11 finished 4th reading session in [[Serial Reader]] ** 3/12 finished 5th reading session ** 3/13 finished 6th reading session ** 3/14 finished 7th reading session ** 3/16 finished 8th reading session * IKEA office organizer thing assembled * Birthday weekend ** 3/14 Things are planned in a way that would be overwhelming if it weren't all so fun. ** 3/15 Mid-afternoon lunch at The Little Nickel: Impossible Nickel Burger and Triple Crossing Falcon Smash. We split fries and cilantro rice as our sides. ** 3/16 We had dinner at Mary Angela's Pizza w/brother and his friend. Yum. Did not make it to Bottom's Up due to the insane number of early St. Patrick's party-time people in Shockoe Bottom. * James River Film Festival 2019 ** 3/11 Figured out stuff I want to see this week (~~all 16mm projections!~~) ** 3/15 Missed the 16mm projections because of beers at Final Gravity running long, but it's all good. ** 3/16 Saw one film by Betzy Bromberg and a couple by Jonas Mekas. * Trying this project focus/logging thing in TW ** 3/11 Created tiddler. Yikes. ** 3/12 Day 2! ** 3/13 Kept going! ** 3/14 Still at it. Feeling the heat! ** 3/15 This list definitely still helps. ** 3/16 I like this. I'm hooked. ** 3/17 Inspired by the notion of [[Semantic Line Breaks|2019-03-17 link: Semantic Line Breaks]], discovered I can separate project (1st-level) bullet points by a blank line in the markup, which makes them easier to read in the text area, but has no effect on the rendered tiddler. * Wiki correspondence ** 3/12 Started compiling things to ask Sphygmus about. * [[move wiki to DigitalOcean|2019-03-14 project: moving wiki to DigitalOcean]] ** 3/12 As more people miraculously link to this, the pressure is on to move it to its permanent home. ** 3/13 Learned about [[redirect vs. rewrite in .htaccess]] ** 3/14 Hit a brick wall. Learned that [[pound signs are not sent to the server|2019-03-14 pound signs are not sent to server]] (duh, this makes sense) when someone clicks on a link with a "#" in it. This will complicate things. ** 3/15 learned about [[How to Recover from Lost SSH Keys on DigitalOcean]]. * Letter to MCA re: off-center Kacey Musgraves LP * Vivo Barefoot shoes return ** 3/15 Bought a plastic mailer bag at Target. Hope it's big enough for shoes. * YNAB ** 3/16 Caught up on a bunch of transactions. At this rate I should be current by 2021. * Exercise ** 3/11 walked w/Sarah to store for bread and micro-greens ** 3/13 45 minutes of squatting, pulling ivy and trimming bushes around the house. ** 3/14 45 minutes of squatting, lopping, and hauling brush to the bulk pick-up spot. * ''DONE'' Ice maker repair ** 3/17 No shit, this started working again by itself today. I think the water supply line was too cold from the weather, and it was freezing right as it got into the freezer? Whatever. It's working now. * ''DONE'' Car brake light fix ** 3/15 bought lamps, replaced both brake lights, no tools required. Oh god this is getting out of control. No wonder I never look at my project list.
[[h0p3]] wrote about VPNs and work computers in the [[letter to KK|https://philosopher.life/#2019.03.04%20-%20Kevin%20Kovacs%3A%20Unfolding]]: > I am sure, even now, you are careful about how you use your work machines and work VPNs. That problem is going to grow further into our personal lives. It already has in my lifetime. I so badly want to have my wiki open all day long at work. It would be so much more fun to drop stuff in it when I'm thinking about it, but I just can't do it. Even ~~if~~ WHEN I move it to DigitalOcean and can write to it all day long, I have to firewall (heh, sorry) my wiki and personal stuff away from my work computing. I usually do this anyway, but I need to be even better about it. There are of course the attention, productivity, and integrity reasons, but also because there's just no need to litter my traffic at work with anything that looks remotely interesting to anyone else there.
* I know for a ''fact'' that I would not have read any of [[book: A Portrait of the Artist as a Young Man]] last night if it hadn't been on the publicly visible [[2019-03-11 this week's projects]] tiddler. I am that simple and shame-able. * Something I'm going to ask [[Sphygmus]] when I (finally) write back to her, is how much she atomizes/transcludes journal entries. I wonder how worthwhile it would be to break these little micro-status updates up into tiddlers. * It's not so much that I'm obsessed with TiddlyWiki as that I'm obsessed with getting stuff out of my brain where I can see it. * Actual LOL. The payoff for being a dedicated wiki reader is [[stuff like this|https://rudimentarylathe.org/#2019.03.11%20-%20Journal]] (Jack): > 12:32 I'm doing things to my workflow today that I'm going to be embarrassed to admit. * Joe Jenett sent me a link to his new TiddlyWiki and I love it! https://simply.tiddly.jenett.org (Also saw Jack Baty [[link|https://rudimentarylathe.org/#2019.03.12%20-%20Journal]] to it at the same time.) I love Joe's photos and haiku. This makes me realize that my wiki could be weirder and more freeform than it is, instead of so linear and orderly. * I am a little sad at how long it takes me to respond to long, kind letters here. I can't bring myself to draft responses in the wiki. It has to be in local text files and then //Boom// it's public.
* Started a project tiddler for [[moving this wiki to DigitalOcean|2019-03-14 project: moving wiki to DigitalOcean]]. I was feeling overwhelmed and unclear on what to do next, so I stopped frantically googling and sat down and thought through all the steps. That helped just like it does at work when I face an ominous project. It's also why I love writing up all the content + settings implementation steps when we do a release. * I used to wonder how people who blogged about what they were doing as they were doing it had the energy and discipline to keep going, recording all the details. Now that I have TiddlyWiki, I realize that it's about having the right tool for the job. Once you have that, you may find that you //can't help// but document everything, just so you can keep it straight yourself. The public wiki is just a nice by-product.
CRAP. I think I'll have to use JavaScript to redirect requests to tiddlers from this twelvety.com location to the new (upcoming) home at the different domain on DigitalOcean. from https://webmasters.stackexchange.com/questions/28722/htaccess-301-redirect-hash-tag-redirect > You CANNOT do that .. as hash tag is client-side ONLY and never sent to the server by browser. – LazyOne and <<< As LazyOne notes in the comments, URL fragment identifiers ("hash tags") are not normally sent to the server in an HTTP request, so they cannot be redirected — or processed in any other way — on the server. You can rewrite such URLs in JavaScript, if the user's browser supports it and has it enabled. <<<
I hope all of this is worth the hassle. Now that I have an [[empty wiki at DigitalOcean|https://youneedastereo.com/]] with authentication working, starting fresh with a non-twelvety domain droplet dedicated to the wiki seems cleaner than trying to retrofit my Dreamhost shared hosting account to a VPS and get Node.js and a cert working, which would all end up being about the same price as my current Dreamhost shared plan + the DigitalOcean droplet anyway. I've also wanted to try another host for years and this is a perfect opportunity. Here are all the steps I can think of, starting from this point: # ~~Copy all current content and system/hidden/shadow tiddlers from MBP to DigitalOcean droplet (youneedastereo.com).~~ #* ~~I hope that will be everything I need to copy to make the new wiki identical to the old one~~ #* ~~"Worked", except I couldn't press the `Return` key to create a newline in the textarea of a tiddler. Hmm.~~ #* ~~Nuked that first wiki on the droplet, started fresh, and imported the entire standalone HTML file and all the tiddlers came over fine.~~ # Test wiki in its new home, make sure a bunch of direct links to tiddlers work # Start editing from this new location and keep uploading tiddlywiki.html from here to twelvety.com until the redirects work # Write/steal javascript to redirect `twelvety.com/tiddlywiki2.html#foo` to `youneedastereo.com/#foo`. (`tiddlywiki2.html` is a copy of my wiki placed alongside the real wiki here just for playing with these redirects.) # Test JS redirect on `tiddlywiki2.html` and `tiddlywiki2.html#foo` links # Copy images from `twelvety.com/philtiddlywiki_images/` to `youneedastereo.com/images/` # Change image URLs in tiddlers to point to new location (thankfully there aren't many) # Tell wiki peeps about new URL # Fix favicon # Put up a message about impending redirect? Will the half-dozen people who know about this wiki care if they click on a twelvety.com domain and end up somewhere else? # Change JS rule to work with the real wiki on twelvety.com (`tiddlywiki.html`) # Change wiki link on my Micro.blog profile page # Change wiki links in my old Micro.blog posts # Change Hazel rule to upload external images to `youneedastereo.com/images/` # Get [[Retrobatch]] to make the image processing even easier 2019-04-08 Here's the message I just removed from the [[Most Recent Journal]] tiddler: <<< !!! ''Please change your bookmarks to [[youneedastereo.com|https://youneedastereo.com/]]'' That's where this wiki lives now and the old `twelvety.com/tiddlywiki.html` URLs will soon redirect there. Thank you for reading! - Phil, 3/18/2019 <<< ----- 2019-10-30 Whew. [[DigitalOcean]] emailed me to say they did an "emergency migration" for some reason tonight. It left me with a scary "502 bad gateway" error, so I connected to it remotely via the Terminal and had to restart the wiki like this: `forever start --spinSleepTime 10000 /usr/local/bin/tiddlywiki ~/apps/wiki/mywiki --listen credentials=users.csv "readers=(anon)" "writers=(authenticated)"`
* Installed [[Postbox]] after seeing [[Jack mention it|https://rudimentarylathe.org/#Postbox]]. I was going to start with [[Spark]] instead, but I haven't yet upgraded past Sierra. Grrr. And I would have just used Apple Mail instead of all of this, but I haven't trusted it with Gmail in years. Too many bad stories out there about folders and syncing problems and duplication. I've already submitted a feature request to ask for monochrome icons in the Postbox toolbar. Does this count as a "[[this week's projects|2019-03-11 this week's projects]]" project? Or just a distraction? Either way, it's nice to try a real app for Gmail instead of the increasingly Fisher Price-inspired Gmail web interface. * Apparently, it's all of a sudden become vitally important that I get rid of 15 years worth of unused Gmail tags and folders tonight, now that Postbox is revealing them in all their glory.
[[Josh|Josh Sullivan]], I'm with you on pretty much everything re: [[the wiki vs. blog thing|https://joshisms.io/#2019-03-11%20-%20To%3A%20Phil]]. I do feel like TiddlyWiki is a great incubator for thoughts, whether they languish in the wiki or graduate to fully-formed prose for the blog. Hell, it's more than an incubator. It's like fly-paper! > I prefer the current friction of subscribing to a TiddlyWiki, as it makes someone visit the site and possibly tumble down a rabbit hole, which happens to me daily on the wikis I visit and gives me immense joy. 100%. I haven't visited this many individual web pages over and over since, oh, 2004/2005, right before I learned that MyYahoo had a rudimentary feed reader. > For myself, I'm finding myself feeling less and less like my reactions are an intrusion on their day and more like a genuine conversation. An example is this letter, which started as a reply on M.b and evolved into a letter if only to avoid filling the M.b timeline with a wall of text. I go back and forth on this daily. When one of y'all posts something I identify with, do I respond on my wiki Journal? In the M.b timeline? On my own blog? I don't know! It's part of the fun, I guess. I'd rather have this question to wrestle with than the tyranny of follower counts and likes, for sure. Either way, I absolutely love getting questions or feedback about anything I've written, on whatever platform. It's never a burden for me to see people who are deeply, un-self-consciously interested in what I'm writing. For the first time in like, ever, I feel like I'm not writing into a void. > I've been increasingly interested in a solution to the feedback issue on tiddlers. But yeah, in-line comments would be nice. They work fine on the IndieWeb blogs that have installed them. I don't know enough about the mechanics of that to understand how to do it, but I wouldn't be surprised if we get there sometime. Take care! Phil
* ☘️ I still have a Facebook account, and now that I don't really post to it anymore (or look at it except for events), my evil plan of hiding my birthday date (combined with not letting anyone post to my wall) is working out perfectly! I've gotten a handful of text messages from friends who know the date, and no FB greetings from random high school acquaintances. Ahhhhhhh.
from https://sembr.org/ > When writing text with a compatible markup language, add a line break after each substantial unit of thought. <<< !! Why Use Semantic Line Breaks? For a ''writer'', semantic line breaks allow the physical structure of text to reflect the logical structure of the thoughts that produce them. For an ''editor'', semantic line breaks make it easier to identify grammatical mistakes and find opportunities to simplify and clarify without altering original intent. For a ''reader'', semantic line breaks are entirely invisible — no changes to the source text appear in the final rendered output. <<< Holy cow. I initially discounted this idea, but can see that it would be potentially very useful in Markdown. Could make the markup text uglier with very ragged edges, but also easier to comprehend and reorganize? Via https://hartl.co/contents/2019/03/17/10-33.html
.tc-subtitle .tc-tiddlylink {display:none;}
* Well, I imported all the tiddlers from the MacBook Node.js wiki to here on DigitalOcean. The only thing that sucks is that the Recent tab now thinks that I've edited all of the tiddlers in the wiki. But the New tab is still accurate, so it'll all work itself out eventually. I did this by following [[this advice from TheDiveO|https://groups.google.com/d/msg/tiddlywiki/5bN9yRacVXg/0alo3xC2N7IJ]] on the Google Group: > If you already have an "empty" TW5 server instance up and running then one way could be to navigate your browser to this server instance (localhost:8080). Then drag the file containing your single-file TW5 instance into the browser and follow the normal import procedure. You should then see the newly imported tiddlers getting synchronized as individual files with your local file system. If you have many tiddlers then you may want to organize them into subfolders. * Signed up with [[Updown.io]]. (Thanks for the [[tiddler|https://rudimentarylathe.org/#Updown.io]] about them, ''Jack!'')
""" Vibes High Fidelity Concert Earplugs https://www.amazon.com/dp/B018WPOQSG 2019-04-16: ordered """ """ Eargasm Smaller Ears Earplugs https://www.amazon.com/dp/B01LDSPSPO """ """ Eargasm High Fidelity Earplugs (I guess these are the normal/larger size?) https://www.amazon.com/dp/B019M576XW """ """ EarDial HiFi Earplugs https://www.amazon.com/dp/B00P2NTVPA/ """
* [[Research and buy hi-fi earplugs|2019-03-18 research: hi-fi earplugs]] for loud restaurants/bars/parties * [[Research and buy headphones/earphones|2019-03-24 research: the great 2019 headphone hunt]] for the Sony DAP * [[Research portable hi-res audio players|2019-03-20 research: portable hi-res audio players]], and buy one (and a card) ** 3/19 read about every hi-res DAP model out there, I think ** 3/20 narrowed search to Sony NW-A45; ordered * Back spasm ** 3/19 Nearly fainted from pain after dinner; went to bed early. ** 3/20 Ortho On-Call visit, picked up drugs, got referral to PT. ** 3/21 scheduled first PT consult for next week. ** 3/22 Mobility is about 90%. Took what I hope is the last painkiller. Would rather drink beer this weekend. * [[book: A Portrait of the Artist as a Young Man]] * IKEA office organizer thing assembled * Wiki correspondence * [[move wiki to DigitalOcean|2019-03-14 project: moving wiki to DigitalOcean]] ** 3/18 Successful import of all old tiddlers to new droplet! * Letter to MCA re: off-center Kacey Musgraves LP ** Found https://www.facebook.com/UMGNashville and https://twitter.com/UMGNashville. It's a long-shot, but wrote to them: [[2019-03-22 message to MCA Nashville re KM LP]] (yet another thing I wouldn't have made time for if the project weren't visible to "the world") * Vivo Barefoot shoes return * YNAB * Exercise * ''DONE'' New allergy pills for Roger ** 3/18 picked up pills from vet.
* Now that Birthday Weekend 2019 is over, I'm ready to put fried foods and cheese on the watchlist for a while. * I'm suffering wikithdrawal symptoms! Most of the computer time this weekend was focused on getting the DigitalOcean droplet debugged, and there wasn't much leftover for keeping up with others' wikis/sites. Boo. * Planning projects for the week is somehow fun in TiddlyWiki!
* FINALLY! Back on the computer. My own computer. Two days in a row of work lunches with other people is not a recipe for happiness. Last night, the weird thing I did to my back over the weekend came to a boiling point and knocked me out of commission right after dinner. I made it to work today with the help of Tylenol and then went to an Ortho OnCall emergency doc and got x-rays, which confirmed that it's just a muscle spasm. Now I'm just seeing who wins in the battle of wills between the muscle relaxant and my ability to stay awake doing fun stuff. * Went ahead and stopped arguing with reality: Thanks to Jack mentioning the [[FiiO M9|https://rudimentarylathe.org/#FiiO%20M9%20DAP]], the hunt for a portable hi-res player is now a [[This Week's Project|2019-03-18 this week's projects]], and has crowded out a bunch of other things. * Just ordered the Sony NW-A45/B + 256GB card + screen protector. Who knew reading wikis would be so expensive?
""" ''FiiO M9'' https://fiio.com/m9 """ * Has apps for lossless streaming, but I could live without those, since I don't subscribe to any of those services * USB-C connector * The one [[Jack Baty ordered|https://rudimentarylathe.org/#FiiO%20M9%20DAP]], and that started this hunt * Balanced 2.5mm headphone out, but I don't have any balanced headphones, and would mostly be using a player with the Sony MDR-7506 headphones, or the aux-in in the car. * Cold boot can take up to 40 seconds, per this [[YouTube review|https://youtu.be/8-SlKQsbwBo]]. Putting it to sleep helps wake it up faster later, but the sleep/power button can get hit accidentally. * Can do AirPlay if you upgrade the firmware --- """ ''Sony NW-A45/B Walkman'' with Hi-Res Audio, Grayish Black (2018 Model) https://www.amazon.com/dp/B0765ZVM6Y/ """ * No wifi, which is fine for me since I'll just dump my entire FLAC library (the parts that I care about) onto a 256GB SD card * Proprietary USB cable, not great * Looks like a Sony product, which is comforting From the Amazon reviews + Q&A: > UPDATE: I purchased the IVSO tempered glass screen protector. It ameliorates the lack of oleophobic coating on the screen and has both cut down on fingerprints as well as increased the ease of swiping. I highly recommend it. > Creating playlists will require you to use Sony's media software. You cannot create playliats [sic] from the device itself which is a shame. But once a playlist is created and copied to the device you can add and remove songs to the playlist from the device. > The USB connector is 2.0, which is plenty fast for most audio file transfers. Unfortunately, Sony went with a proprietary connector on the unit. This is a real pain, and I wish it had been USB-C (or at least micro). > Shuffle play for different albums is not supported. [[Reddit thread|https://www.reddit.com/r/headphones/comments/86ort5/sony_nwa45/]] [[Sony community thread about lack of line out|https://us.community.sony.com/s/question/0D50B00005CesNNSAZ/i-understand-that-the-nwa45-doesnt-have-a-line-out-does-anyone-feel-theres-a-sound-quality-compromise-in-connecting-the-headphone-output-of-the-a45-to-aux-input-of-a-stereo-amp-that-doesnt-support-ldac-or-bluetooth-thanks-for-your-help?language=en_US]] [[YouTube review|https://youtu.be/_EuP4BQBjEs]] by KLGadgetTV, showing how responsive (or not) the menus are --- """ ''Sony NW-A55'' 16GB High-Resolution Digital Music Player Walkman Grayish Black (International Version/Seller Warranty) https://www.amazon.com/dp/B07H2HXXJH """ * Hasn't been released in the US yet. "Seller Warranty" = basically a grey-market DAP being sold via Prime by an Amazon fulfiller. * Don't know enough about this one vs. the NW-A45. --- A well-regarded older model, for comparison... """ ''Sony NWZ-F886 review'' https://www.whathifi.com/sony/nwz-f886/review """
Weird and beautiful sequence of events: # [[Jack Baty]] gets TiddlyWiki running on a hosted Node.js instance # Jack helps [[Josh Sullivan]] figure out how to do the same for DigitalOcean (I think I have these first two steps right?) # Josh Sullivan posts process for [[how to set up TiddlyWiki in DigitalOcean|2019-02-20 link: Josh on how to set up TW in DigitalOcean]] # Catherine asks for my help setting up a TiddlyWiki she can post publicly # I at first tell her to try [[TiddlyWiki Cloud]] and I'll figure out how to use Microsoft Flow to sync it to FTP. I test it out and it works, but it's rickety. # I realize the Node.js wiki on DigitalOcean would be more reliable and fun for her. # I set up a proof-of-concept TiddlyWiki on DigitalOcean using a trial droplet, the only domain I have sitting around (this one), and Josh's instructions, only meaning to practice so that I can walk Catherine through the process. Surely I'll delete my droplet when we're done. # Catherine and I get her DigitalOcean TiddlyWiki droplet at https://casualbedlam.com/ running in an afternoon, and I see how fast and reliable it is. She takes to it instantly and I am jealous! # I pour my single-HTML file wiki (rendered from my Node.js MacBook instance) into the DigitalOcean droplet, and after some import/migration missteps, have a solid wiki running here, on a domain I never really intended for this purpose. And I only got here because the foundation had been laid by friends before me and I was helping out another friend! There's gotta be a lesson here about transistors and electrons and higher-level energy states and stuff.
I've been a fan of Dave Seah for so long. This has been out there for years and I only just found it: https://davidseah.com/node/the-fast-book-outliner/
Good god, this song: http://mommaband.bandcamp.com/track/sidewalk
Just writing this to note these observed steps: # Watched episode 3 of [[Shrill]], which used the "[[Sidewalk|2019-03-21 Momma - Sidewalk]]" track by Momma as background music in the cafe scene. # Downloaded Momma's "Interloper" album on Spotify. # Played the whole album in the car (still on Spotify) Tuesday night after seeing friends at Union Market. Remembered how fun it was to listen to music in the car. # Wanted to buy the FLAC version of the album. # Saw Jack Baty's post about the FiiO M9 (while my defenses were down). # Saw that 256GB SD cards are incredibly cheap for how much music they can store. # Thought, Now is a great time to finally buy a dedicated portable hi-res audio player (even though I use [[CloudBeats]] to play a small selection of FLAC files on the iPhone). # Sony had one that looked good for a low price. Ordered. # Bought the FLAC version of "Interloper" from Momma's Bandcamp. # In anticipation of the Sony arriving tomorrow, played a couple of the downloaded tracks in CloudBeats using wired Lightning earbuds and remembered how nice it is to hear lossless recordings played through analog headphones. Next: Fully expecting to feel compelled to search for artisanal wired earbuds with a 1/8"-stereo plug to use with the Sony.
* [[2019-03-21 helping yourself by helping others]] * [[2019-03-21 the path back to hi-res audio]]
(This started out as a quick tiddler for me to think through some things and try some stuff out. It ended up being a [[blog post|https://twelvety.micro.blog/2019/03/21/weekly-project-progress.html]]!) The best weekly status report format I've ever used was one I learned twenty years ago from a former manager (Richard Crowder). It was a simple Microsoft Word outline, with top-level bullets for projects and 2nd-level bullets for days of the week that you did actual work on the project, along with details about what you did. It looked a lot like what I have in [[2019-03-11 this week's projects]]. It was like this: !! Phil's projects, week of 3/18/2019 * Database enhancements ** 3/18: Requirements call with vendor. ** 3/20: Vendor visited and fixed things. ** Next: Get Graphics team to test fixes. * Intern on-boarding ** 3/20: Compiled possible projects for intern; to David for review. ** Next: Schedule welcome lunch w/team. * Mutual Funds video ** 3/19: Shot raw video; finished editing 1st segment. ** 3/20: 2nd segment edits; rendered; to Julie for review. ** 3/21: Published video to intranet. Etc., etc. It was good at these things: * Seeing progress on a project felt good and tangible. You could see actual stuff you had done under the major headings. * You could see at a glance which projects were being neglected for others. * If you were realistic about your time and capabilities, you most likely had enough projects to fill one page, but not more than that. * You didn't list every single action completed—only the major outcomes from each day. * You always knew what was next. * It was simple enough to update in real time, and to share with anyone, and they'd be able to understand it. No weird status codes or traffic lights or math. If your manager (or their manager) asked you mid-way through the week, "What are you working on?", you could print this and they'd know what you were doing. * Even if no-one asked you for it early, you knew that you had to send it to your manager at the end of the week. It pushed you to make progress on things that you might otherwise be lazy about. You didn't want to have a project stall out. You wanted to always show that you were worth keeping around. I've been trying to bring this format back, at least just for myself, even if no-one asks to see it. The one thing that it's not great at is giving me a quick visual of what I've done //today//. If it's 11:00 am on 3/21 and all I've done is published the Mutual Funds video to the intranet, it would be great to see this, where I get still technically get credit for all the stuff I've done this week, the Next things are medium grey to show me the way forward, and there are no illusions about what little has gotten done so far today, because it's the only task in black: !! Phil's projects, week of 3/18/2019 * Database enhancements ** @@color:lightgrey; 3/18: Requirements call with vendor;@@ ** @@color:lightgrey; 3/20: Vendor visited and fixed things.@@ ** @@color:grey; Next: Get Graphics team to test fixes.@@ * Intern on-boarding ** @@color:lightgrey; 3/20: Compiled possible projects for intern; to David for review.@@ ** @@color:grey; Next: Schedule welcome lunch w/team.@@ * Mutual Funds video - ''done'' ** @@color:lightgrey; 3/19: Shot raw video; finished editing 1st segment.@@ ** @@color:lightgrey; 3/20: 2nd segment edits; rendered; to Julie for review.@@ ** 3/21: Published video to intranet. So, there it is. The lack of a properly auto-formatting outlined list of my weekly progress and next actions is clearly what is holding me back. At least I learned that you can do easy CSS color formatting in TiddlyWiki by doing this exercise. Had no idea!
* I like how when I open up [[Postbox]], the new emails physically push the others down. It feels more real than the Gmail web view? * Fun! My vision is now so bad that dashes look like tildes.
2019-03-22 Here's what I sent to MCA/Universal Music Group Nashville through their Facebook Messenger. Tilting at windmills here, but someone has to fight for this stuff: > Hello! I recently bought the Kacey Musgraves "Golden Hour" vinyl LP. It's a wonderful album, but I was very disappointed to see that the disc was pressed significantly off-center, so that the last few songs on each side suffer from severe pitch wavering, making it hard to listen to. The advice I usually get in cases like this is to return the album to the store I bought it from, but I've had little success with that in the past. Can I mail my copy back to you and you send me a new copy from a different pressing batch? I've played the disc exactly one time. Thank you for your help! -Phil Nunnally, Richmond, Va.
* Note to self: Do not trust iTunes to leave ALAC encoded files alone. If you have lossless stuff you care about, manage it in good old files & folders.
Before I forget how I was doing this: * The canonical lossless music hard drive is the external `media_2018` drive that's usually connected to the Raspberry Pi for Plex. ** ~~For now, this drive has to be unmounted from the RPi and connected directly to the MBP until I can get Samba to allow writes to it over the network.~~ *** 2019-03-24 Well, after re-attaching the drive to the RPi, it auto-mounted, so that was nice. And I set the owner of all the media files to `phil`, group = `staff`, and 777 permissions, and somehow I can write to the drive over the Samba connection again. Maybe the APC UPS (which has been working great during the last two power outages) will keep it afloat and the permissions problems at bay. *** 2019-09-29 Lost ability to write to the Plex server's external drive over Samba again. To "fix" it: **** I shutdown the Plex RPi and connected the drive to the MacBook **** checked First Aid on it in Disk Utility and it said all was well **** For the "plex" folder on that drive, I did `chown -R phil *` and then `chmod -R 777 *`. **** Then did Get Info on the drive in Finder. I turned OFF the thing that says "ignore permissions on this volume", clicked the little lock icon, then unlocked the lock icon, then turned back ON the "ignore permissions on this volume". **** Unmounted the drive from the MacBook. **** Connected the drive back to the RPi and rebooted. **** Mounted that drive over the network in Finder. Tested dragging a file from the MacBook to it. No problem. Had write access again. **** Whatever. Who knows? *** 2019-12-12 Lost ability to write to the Plex server's external drive over Samba ''again''. Fixed by running the steps above. I cannot wait for the [[Intel NUC]] to arrive to be the new [[Roon]] server. ** New rips and purchases should get copied there first. ** Once files are there, they should be run through [[MusicBrainz Picard]] to clean up tags and add album art. New JPGs can be dragged right onto the cover art area in MusicBrainz, and I have the app set to replace cover art instead of appending it. ** I'm tagging as "red" in the Finder anything spoken-word, books on CD, or old bands I was in, as a flag that they aren't things I'll want to appear on shuffle when I'm listening to music. * Anything on `media_2018` can be copied to the microSD card in the [[Sony NW-A45 hi-res audio player]], connected through the Sony USB cable. ** Don't copy the "red" tagged folders to the Sony.
* Buying and downloading FLAC albums from Bandcamp is so much more //fun// than streaming stuff from Spotify. Need to remind myself of this! * If only all my powers for research and conspicuous consumption could be used for good.
* Koss KPH-30ik (ordered 2019-03-23, arrived 2019-03-24) * Koss PortaPro X on Massdrop (ordered 2019-03-23) * Sennheiser MX 365 Earphones (ordered 2019-03-23, arrived 2019-03-24)
* After a hotbrain-addled weekend of completely letting things slide and doing no chores except washing dishes, I'm ready to calm down and act like an adult again. * I did all that research and fevered buying of headphones and at work I've gone back to the Apple wired non-Lightning earbuds for the [[Sony NW-A45 hi-res audio player]]. The Sennheiser earbuds sounded good when they stayed in my ears. The Apple pair sound just as good and stay put much more easily. I can't be sealed off from everyone, so the Apple ones are (still) perfect for me. Plus, these have been well broken in after all the time I've spent with them.
| |!W |!Th |!F |!Sa |!Su | |eat a salad |x |x |x | | | |YNAB | | | | | | |walk up 18 flights|x |x |x |n/a |n/a | |PT homework | |x |x |x |x | |other exercise | |x | |x | | * [[Research and buy hi-fi earplugs|2019-03-18 research: hi-fi earplugs]] for loud restaurants/bars/parties * [[Research and buy headphones/earphones|2019-03-24 research: the great 2019 headphone hunt]] for the Sony DAP ** 3/25 Massdrop Koss PortaPro X headphones shipped yesterday! ** ''DONE'' * [[2019-03-26 research: portable headphone amps]] ** 3/26 collected a bunch of stats on FiiO and Topping amps. Stored them here, which allowed my brain to let go of the manic hunt for now. ** 3/26 A visit to the HackRVA Makerspace tonight (thanks, [[Catherine!]]) has me thinking that maybe it would be cooler to focus on an amp //kit// instead of just buying a manufactured one. ** 3/31 Realized that kit amps aren't necessarily as well shielded from mobile device EMI/RFI. Ordered the FiiO A5. * Back spasm ** 3/28 First PT consult. ** next: Keep up the evening PT homework habits. Always stretch after doing yard work or exercise. ** Kept this up every day since 3/28! * [[book: A Portrait of the Artist as a Young Man]] * IKEA office organizer thing assembled * Wiki correspondence * [[move wiki to DigitalOcean|2019-03-14 project: moving wiki to DigitalOcean]] ** next: Maybe this week I'll set up the redirect? ** 3/31 calling this "closed" for now. I'll make the redirect a separate mini project. * Letter to MCA re: off-center Kacey Musgraves LP ** next: Try to message them at https://twitter.com/UMGNashville since they're not responding to my FB message. * Vivo Barefoot shoes return
* Headphone amp hotbrain today. See [[2019-03-26 research: portable headphone amps]]. Maybe before I get too caught up in this, I should institute a [[cooling off period like Andrew does|https://andrewcanion.com/wiki/doku.php?id=cooling_off_period]]. * Hey, at least I'm only looking at //amps// and not //DAC+amps//! I suppose someday this will subside and I can go back to actually reading everyone's wikis, which I miss. * What was all that stuff I wrote about yesterday about being ready to "act like an adult again"?
I love the [[Sony NW-A45 hi-res audio player]], but its amp is objectively underpowered. I listened to it through my old Mackie mixer's headphone output this past weekend and was surprised by how much more capable and detailed the Sony sounded through it vs. without. So the hunt for an outboard headphone amp is on. At least if I collect all my research here, I can let it marinate for a while before buying yet another thing. * Topping NX3s ** Swappable op-amp! ** [[Head-Fi discussion|https://www.head-fi.org/threads/topping-nx3s.891339/]] about op-amp swapping * FiiO A3 ** This is dumb, but the only thing I don't like is the center-mounted volume control. It's probably more than fine for me, and the cost of it appeals to my need for immediate gratification. * FiiO A5 ** Definitely more powerful than the A3. But I'm not concerned with loudness so much as headroom anyway. ** [[Reddit discussion|https://www.reddit.com/r/headphones/comments/67da63/fiio_a5_portable_amp_impressions/]] * [[JDS Objective2 kit|https://jdslabs.com/product/objective2-diy-kit/]] ** Oooooooh, a kit! It's been too long. ** [[“Op-amp Rolling” in the Objective 2 Headphone Amplifier|https://www.headphonesty.com/2018/03/1667/]]
FLAC files served from Plex on the Raspberry Pi 3B+, played on my iPhone on the Plex app, streamed via AirPlay to the Airport Express, and converted with the Schitt Modi 2 Uber DAC sound great as far as I know, but: * I feel like FLAC support is not necessarily a priority for Plex. Ooooo but I did just find this, which would seem to put my mind at ease once I get a chance to try it: [[how to tell if Plex audio is transcoding]] * If that is inconclusive, I could always record the optical output from the Airport Express into my MacBook's optical audio in jack, capture in Audacity, and compare the result to the original ripped WAV/AIFF file of a track. If I invert one of those and add them together, I should get a big fat null waveform, or I suppose I may have to adjust the levels a bit, but that would tell me if the transmission is bit-perfect. Anyway, if those ideas don't pan out, I'll keep researching RPi music servers, like [[Rune Audio music server]]. For now, Plex is really nice to use. 2019-09-11 [[Rune Audio music server]] is not maintained anymore. Got [[Volumio]] up and running and it's great.
* Feeling a need for order and health, added a simple grid of daily habits to [[2019-03-25 this week's projects]].
Good lord that was annoying before I knew there was a setting for it. I submit that anyone who knows about `⌘Q` is computer-savvy enough to know when they really want to quit like they would with every other Mac app ever.
<<< Those who ignore yesterday's task list in Field Notes are doomed to rewrite it today. <<< Me * First PT appointment in 3–4 years. Good to be back! Not looking forward to the homework, though. * I saw a colleague's inbox today during a screen-sharing session. It had 7 new emails in it. This dude is notoriously efficient, smart, and helpful to any- and everyone. He's not a person who just reads and deletes email all day because he doesn't have real work to do. I don't know how he does it, but I'd like to be more like him. * [[Tiddler-hosted habit list|2019-03-25 this week's projects]], you are a cruel mistress!
* Last night was mostly walking, PT homework, chores, and tidying. The MBP didn't even come out of the backpack. * The salad I'm eating for lunch now would not have happened if the habit grid were not publicly visible on this wiki. To even things out, I ate a bagel with cream cheese for breakfast. * I've moved beyond simple ideological differences when it comes to the Republicans on the House Intelligence Committee. It's not just that they believe different things than me. They're just bad people—all of them. It's not just stupid but evil and wrong for them to call for Adam Schiff to resign, citing the only line we've seen from Mueller's report (via Barr's four-page summary), which says, “[T]he investigation did not establish that members of the Trump Campaign conspired or coordinated with the Russian government in its election interference activities." Who can dispute any of the evidence Schiff pointed out in his rebuttal?
* The eternal question: Jump in and start doing things, or step back and figure out all the things I need to do? * I'm sad because physical therapy is taking over my life (temporarily) and I have no idea what anyone in WikiTown is doing anymore. I'm not even wasting a bunch of time researching headphones anymore, because I have all the ones I need now (and an amp on the way). It's just chores and actual yard/house stuff that has to be done and the ever-present PT homework that's crowding out other more solitary stuff. * This wiki was more fun when I had time to do more than just update habits and project statuses in it.
| |!M |!T |!W |!Th |!F |!Sa |!Su | |eat a salad |x | |x |x | | | | |YNAB | | | | | | | | |walk up 18 flights|x |x | |x |n/a| | | |PT homework |x | |x |x |x | | | |other exercise |x | |x | |x |x |x | * [[Research and buy hi-fi earplugs|2019-03-18 research: hi-fi earplugs]] for loud restaurants/bars/parties * Back spasm ** 4/1 2nd PT appt. ** 4/5 3rd PT appt. ** next: Keep up the evening PT homework habits. Always stretch after doing yard work or exercise. * [[book: A Portrait of the Artist as a Young Man]] ** next: pick this back up * IKEA office organizer thing assembled ** next: What's the blocker here? I have a feeling it's shaped like a pair of headphones. * Wiki correspondence ** Embarrassing lack of progress. * Letter to MCA re: off-center Kacey Musgraves LP ** next: Try to message them at https://twitter.com/UMGNashville since they're not responding to my FB message. * Vivo Barefoot shoes return * DC trip ** next: make TaskPaper list
Well I just had no idea. Courtesy of Butch: https://en.wikipedia.org/wiki/Funky_Junction > Funky Junction were an Irish rock band formed in 1972 specifically to record a single album of songs made famous by British band Deep Purple, which was released as Funky Junction Play a Tribute to Deep Purple in January 1973. Among the band's lineup were all three members of the early 1970s incarnation of Thin Lizzy. <<< The project was brought about by a German businessman named Leo Muller, who contacted Irish group Thin Lizzy to record the album. Muller was in fact an alias used by Dave Miller, a record producer and proprietor of several budget music companies. The group members were not enthusiastic, as they were trying to forge their own style and identity, but they needed the money. Thin Lizzy's vocalist, [[Phil Lynott]], decided that he was unable to sing like Deep Purple vocalist Ian Gillan, so restricted himself to playing bass guitar and singing backing vocals. The band brought in Benny White, singer with the Dublin group Elmer Fudd, because they generally performed Deep Purple covers during gigs. Thin Lizzy drummer Brian Downey referred to White as "really an Ian Gillan clone". Thin Lizzy did not have a keyboard player in their lineup, so Elmer Fudd's keyboardist Dave "Mojo" Lennox, later in Blodwyn Pig, was also asked to participate. Thin Lizzy guitarist Eric Bell stated that White and Lennox were each paid "around £60" to travel to De Lane Lea Studios in London to record the album. <<<
!! 2019-04-05 Friday !!! Joe's Record Paradise * https://www.joesrecordparadise.com * Hidden, and junky in a good way. Not the best selection, but everything I bought was cheap and in perfect shape: ** The Woodentops: //Giant// *** https://www.discogs.com/The-Woodentops-Giant/release/1539461 ** Translator: //Everywhere That I'm Not - A Retrospective // *** https://www.discogs.com/Translator-Everywhere-That-Im-Not-A-Retrospective/release/2741946 ** Winter Hours: //Wait Till The Morning// *** https://www.discogs.com/Winter-Hours-Wait-Till-The-Morning/release/1534680 !!! Dinner at McGinty's * https://www.mcgintyspublichouse.com * Easily the biggest serving of fish & chips I've ever had. * Sticky Toffee Pudding was tasty. * Lit up so brightly outside that it looked like mid-afternoon at 10pm. !!! Returned to Kyle's crib * Watched //The Dirt// ** https://letterboxd.com/film/the-dirt/ !! 2019-04-06 Saturday * played by BJ: some tracks from Kadhja Bonet: //The Visitor EP// ** https://headcountrecords.bandcamp.com/album/the-visitor-ep !!! Left Kyle's crib * Met a neighbor lady's sweet little shaggy blind dog in the stairwell. !!! Breakfast at Tastee Diner * Excellent scrambled eggs, biscuits (two!), bacon, and home fried potatoes. Good OJ. Coffee was fine. Bathroom far away. Server was super-friendly. * per Butch: //Crabgrass Frontier: The Suburbanization of the United States// by Kenneth T. Jackson ** https://www.goodreads.com/book/show/745452.Crabgrass_Frontier * per Butch: //Edge City: Life on the New Frontier// by Joel Garreau ** This is the book Butch was really thinking of, though he still recommends //Crabgrass Frontier// above. ** https://www.goodreads.com/book/show/75353.Edge_City * per BJ: //Easy Rider// ** https://letterboxd.com/film/easy-rider/ * per Butch: //Easy Riders, Raging Bulls// by Peter Biskind ** https://www.goodreads.com/book/show/6793.Easy_Riders_Raging_Bulls * per Will: //Switched-On Eugene// Eugene Music Collective comp on Numero ** http://www.numerogroup.com/products/switched-on-eugene ** https://eugeneelectronicmusiccollective.bandcamp.com * per Butch: Mbongwana Star ** https://mbongwanastar.bandcamp.com * per Butch: John Carpenter: //Lost Themes// on Sacred Bones Records ** https://www.sacredbonesrecords.com/products/sbr123-john-carpenter-lost-themes ** https://johncarpentermusic.bandcamp.com/album/lost-themes !!! Record Exchange Silver Spring * https://www.facebook.com/recordexchangesilverspring * Pretty good selection, very friendly staff. * Bought: ** The Allman Brothers Band: //Eat A Peach// (on CD) *** https://www.discogs.com/The-Allman-Brothers-Band-Eat-A-Peach/master/17245 ** (per Will) The Steve Miller Band: //Brave New World// *** https://www.discogs.com/The-Steve-Miller-Band-Brave-New-World/release/4319907 !!! Outside Ben & Jerry's * I only got a bottled water. * per Will: //Never a Dull Moment: 1971 - The Year That Rock Exploded// by David Hepworth ** https://www.goodreads.com/book/show/26792278-1971---never-a-dull-moment * per Will + Butch: Bohannon: //Dance Your Ass Off// ** https://www.discogs.com/Hamilton-Bohannon-Dance-Your-Ass-Off/master/144771 !!! Whole Foods * per BJ: Whole Foods Market //Euro Classic Brioche Hamburger Buns// ** https://products.wholefoodsmarket.com/product/whole-foods-market-whole-foods-market-euro-classic-brioche-hamburger-buns-6-count-0e9af8 * per Phil: Beyond Meat //Beyond Burger// ** https://www.beyondmeat.com/products/the-beyond-burger/ !!! Walking back from Whole Foods * per Will: MC5: //High Time// is the best one. ** https://www.discogs.com/MC5-High-Time/master/63856 * Via email later, Butch said: ** I think all 3 MC5 records are different from each other and worth it in their own right. I think "High Time" is the most "progressive," while "Back in the U.S.A." is their attempt at Chuck Berry (and also has the gloriously-named "Human Being Lawnmower"!). !!! Back at Kyle's * watched "Lies The Motley Crue Movie Told You" ** https://youtu.be/UuHvN4l6amY !!! Just some dudes with groceries waiting for a Lyft <a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/33690661708/in/dateposted/" title="Untitled"><img src="https://live.staticflickr.com/7899/33690661708_0a9dce14e5_z.jpg" width="100%" alt="Just three dudes with some groceries waiting for a Lyft"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> !!! Cookout * Ate one Beyond Meat burger and a hot dog, chips, corn salsa, various beers, lemonade and water, and cookies. * played by Marc (I think), and owned by Peter: Turner and Kirwan of Wexford: //Absolutely And Completely// ** https://www.discogs.com/Turner-And-Kirwan-Of-Wexford-Absolutely-And-Completely/master/871968 * per Will: //Nothin' to Lose: The Making of KISS (1972–1975)// by Ken Sharp, Gene Simmons, Paul Stanley ** https://www.goodreads.com/book/show/13426328-nothin-to-lose * brought by Butch: Sunwatchers: //Illegal Moves// ** https://sunwatchers.bandcamp.com/album/illegal-moves * Al Stewart "Sgt. Al" poster in D & P's bathroom: ** https://myiesstore.com/alstewart/product/sgt-al-poster/ ** quiz: http://www.alstewart.com/publicfiles/Feb201-Poster-MAP_A_Stewart.jpg ** answer key: http://alstewart.com/publicfiles/Key_to_Poster.pdf * Gregg to Will: "So what's your favorite bro-type movie?" * per Will + Butch: Grand Funk Railroad: //Grand Funk// ** https://www.discogs.com/Grand-Funk-Railroad-Grand-Funk/master/93897 * per Butch + Will: The Who: //Odds & Sods// ** https://www.discogs.com/The-Who-Odds-Sods/master/68512 * per Will: The Who - "Little Billy" ** https://www.youtube.com/watch?v=igaH8WFywyM * per Butch: The Who - "Young Man's Blues", studio version ** https://www.youtube.com/watch?v=xrqUErQS69o ** there's also this slower and heavier version, but I think the playback pitch of this is wrong, because the whole band is playing in a lower key and this doesn't sound like any early, mid, or late Daltrey I've ever heard: https://www.youtube.com/watch?v=DSWLfNZwulc * Via email later, Butch said: ** The slow version I'm talking about of "Young Man Blues" is definitely the second, slower one. On the CD it's called "Alternate Studio Version." Soooooooo sludgy and brutal! I know you can't always trust the speed of things on Youtube, and it does sound a little weird, but an A-to-B on Spotify puts that one in the ballpark. So much slower than all the other versions. * played by Peter: Motorpsycho and Ståle Storløkken: //The Death Defying Unicorn// ** https://www.discogs.com/Motorpsycho-and-Ståle-Storløkken-The-Death-Defying-Unicorn/master/408342 ** Via email later, Butch said: *** For some reason I thought the members of Motorpsycho played in a bunch of other Norwegian bands, but it's only that they ended up on the EXCELLENT Rune Grammofon label like many others (though that label is still not prolific enough to contain them). https://www.discogs.com/label/1502-Rune-Grammofon * per BJ: Genesis triple pack = //Nursery Cryme//, //Foxtrot//, and //Selling England by the Pound// ** https://www.discogs.com/Genesis-Nursery-Cryme/master/29138 ** https://www.discogs.com/Genesis-Foxtrot/master/28853 ** https://www.discogs.com/Genesis-Selling-England-By-The-Pound/master/29224 * per Phil: Rush triple pack = //Hemispheres//, //Permanent Waves//, and //Moving Pictures// ** https://www.discogs.com/Rush-Hemispheres/master/7502 ** https://www.discogs.com/Rush-Permanent-Waves/master/7540 ** https://www.discogs.com/Rush-Moving-Pictures/master/7532 * per Butch: Led Zeppelin wasn't subject to the three-pack album arc theory because their catalog was so strong. Just get all of them. ** https://www.discogs.com/artist/34278-Led-Zeppelin * per Butch: Karl Hector & The Malcouns: //Unstraight Ahead// ** https://www.nowagainrecords.com/announcing-karl-hector-and-the-malcouns-unstraight-ahead-album/ * per BJ: Brian Johnson: //A Life on the Road// ** https://www.imdb.com/title/tt6740234/ (especially the Robert Plant, Roger Daltrey, and Dolly Parton interviews) !! 2019-04-07 Sunday * Watched a bunch of Cult videos * Favorite Hoodoo Guru's song was "Bittersweet" ** https://youtu.be/M3gTTrvf5Y0 ''OPEN QUESTIONS:'' * Need clarification on Peter's Genesis 3-pack.
* I'M BACK IN TOWN AND ON THE WIKI! Now I really feel at home again. * ~~The wiki is doing that thing again where I can't press `Return` in a textarea.~~ ** 2019-04-09 ''Update:'' Fixed per a recommendation from Josh Sullivan to disable the escapecss plugin (and also disabled the navigator plugin). Thank you, Josh! * All I accomplished today was listening to LPs I bought over the weekend, recording the music/media notes to the wiki, napping, PT homework, and dishes. And we finished watching The Ruins, which was fun.
| |!M |!T |!W |!Th |!F |!Sa |!Su | |eat a salad |x |x |x | | |x | | |YNAB | |x | | | | | | |walk up 18 flights|n/a|x |x |x | |n/a |n/a | |PT homework |x | |x |x |x |x | | |other exercise | |x | | | | | | * Dishwasher not draining properly - ~~''DONE''~~ ** 4/13: Utensils weren't getting cleaned all the way (always the first sign). Water was standing in the bottom of the washer after every cycle. Used auger on drain line from where it meets the disposal. Was some sludge in it. Raised the drain line up higher in the sink, per instructions from This Old House. Also pulled the food chopper out and cleaned around it but it didn't look too bad. Seems to drain fine now. Probably should do this once a year or so. ** 4/14: Not so fast. Hitting the Drain cycle by itself does get the water out. Running a full cycle does not, yet. Pulled out the flimsy rubber check valve near the food chopper. Cleaned gunk off of it, replaced. Ran a half a load of wash. No improvement -- utensils are still dirty. * Studio/house clean-up for end of April visit ** 4/14: Cleared a chunk of stuff away. Felt good. ** next: File away all the rest of the stuff off my desk. * [[Research and buy hi-fi earplugs|2019-03-18 research: hi-fi earplugs]] for loud restaurants/bars/parties * Back spasm ** 4/10 4th PT appt. ** 4/12 5th PT appt. ** next: Keep up the evening PT homework habits. Always stretch after doing yard work or exercise. * [[book: A Portrait of the Artist as a Young Man]] ** next: pick this back up * IKEA office organizer thing assembled ** next: All I have to do is assemble a drawer. * Wiki correspondence ** next: Begin at the beginning. * Letter to MCA re: off-center Kacey Musgraves LP ** 4/10 waiting: Tweeted @UMGNashville since they're not responding to my FB message. I don't expect this to work, but it's the principle. * Vivo Barefoot shoes return * DC trip - ''DONE'' ** 4/10: finished updating [[2019-04-05 DC trip music + media recommendations]] !! Things that tried to elbow their way into being projects * 4/13 Researching [[Ricoh GR]] digital cameras. I do not actually need one of these. No. Added it to the [[Cooling-off Period]] list. Whew.
* Lordy I have missed so much by not being able to dive into wikis the past couple of weeks.
* The only thing more engrossing than my own email inbox is the Recent tab in other peoples' wikis. * The dishwasher drain line is clogged again. I can tell by how the utensils aren't getting clean. Sure enough, there's a little bit of standing water in the bottom after the cycle finishes. Time for the plumber's snake. * Writing my scrambled thoughts down really does help: [[2019-04-11 Not making enough things]]
After a week of a surge of creative input from the works of other people (the Ex Hex/Moaning show, the Momma album, the re-released Autoclave album, the endless talk about interesting music from the peeps in D.C.), and then feeling a resonance with Jack's mention of "[[I have some awesome tools, what should I say with them?|https://rudimentarylathe.org/#2019.04.10%20-%20Journal]]", I'm keenly aware that I don't make enough stuff. I flit around between various streams and inboxes, dipping into micro-maintenance chores of fun things here and there, being distracted by every shiny new app, service, and tool, and essentially treading digital water with little to show for it except for this wiki. And I somehow wistfully wonder why I don't really //make// anything anymore. One solution is to Just Do It (ugh), except the problem is that that works for one evening, until the It changes to some other It the next day, and the first It loses steam and gets literally dusty before it's picked back up again. So I'll list the Making activities and separate them from the Consuming and Maintenance activities. !! Long-Term Making * Making noise and music on the Moog Mother-32 ** Noodling around to learn what it can do, recording snippets of things I come up with using only the gear I already have, turning those into something I can post somewhere. * Keyboard practice/learning ** I forgot most of what I learned about music theory. It would be great to feel chords start to form under my hands again. Drums = easy; Keyboards = hard. * 35mm photography ** Shooting, developing film, scanning, posting, printing. Camera collecting doesn't count! * Archiving Blacksburg audio ** This is sort of making, I guess. Sadly neglected. Transferring to digital, uploading to Archive.org, writing about the bands and shows on http://blacksburgmusicarchive.org/ (Jesus, I see it's been five years). But those boxes of tapes of live shows aren't getting any younger, nor are my friends who would enjoy hearing them. I literally do not have forever to do this. !! Short-Term Making * Cooking * TiddlyWiki ** Adding tiddlers, using it for journaling and correspondence. Maybe even reviewing and pruning (what an idea). * Blogging !! Learning and Higher-Level Consuming * Watching movies on The Criterion Channel * Reading books * Reading The Economist * Listening to LPs !! Maintenance (where life is worse when these aren't done) * Weekly reviews * Stretching, strengthening * YNAB * Bills * Document scanning * House cleaning, dishes, laundry, etc. !! Living Life Outside the House * Seeing people * Exercise in the fresh air !! Consuming Feeds That Make Me Smarter, or Don't Make Me Feel Bad * Instagram * Micro.blog * Some podcasts * Others' wikis !! Just Letting Shit Wash Over You and Bury You and Steal Your Time * Twitter * RSS * Washington Post * NY Times * Email * Some other podcasts * Most shows we watch on Netflix !! Effectively Banned * Facebook * CNN
Heard on Stay Tuned With Preet: [[Campaign “Spying” & the Ways and Means of Power (with Bob Caro)|https://www.cafe.com/stay-tuned-campaign-spying-the-ways-and-means-of-power-with-bob-caro/]]. Bob Caro [[at 23:02|https://overcast.fm/+MzRkrUtbg/23:02]]: > I sometimes use the computer to take notes, but, see, I try to slow myself down. My problem when I was young was I felt I wrote too fast. I didn't think things through. ... I remembered something that happened to me at Princeton. I took a creative writing course with an old, very courtly, soft-spoken southern gentleman – a very famous critic at the time named R.P. Blackman, and I handed in a short story to him (I took his course for two years — every two weeks I handed in a short story, he always said something complimentary). I was always doing these things at the very last minute, you know, an all-nighter. I was always pulling "all-nighters" is what we used to call them. And I thought I was fooling him. And then at our last session he says something nice to me and then he says (this is practically the last thing he said to me), he says, "But you know, Mr. Caro, you're never going to achieve what you want to achieve if you don't stop thinking with your fingers." (Posted to [[Micro.blog|https://twelvety.micro.blog/2019/04/12/bob-caro-stop.html]])
This is no longer a desk. It's a condition. <a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/47596647011/in/dateposted/" title="Untitled"><img src="https://live.staticflickr.com/7923/47596647011_095f5c464a_z.jpg" width="100%" alt="Untitled"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
* Fixed the dishwasher. * I was tired from fixing the dishwasher, and we both felt like the pollen was getting to us, so we took a very long afternoon nap with Roger. * Pizza dinner with friends at Billy Pie. I had a Precarious Beer Project Impossible Task IPA. Funky and foggy. Decent, not a favorite. Sarah and I split the arugula and fennel salad, which was great. I had the red margherita pizza and it was delicious. I ate the whole thing and probably shouldn't have. Should have saved half for later. * Did PT homework while listening to Back to Work. * Had a Fat Tire Amber. Not as good as I remembered.
''Whirlpool dishwasher model# DU1145XTPQ7'' !! To do * This lady had a similar problem with her utensils. https://www.youtube.com/watch?v=pHaMEhOECHo ** Unclog and clean sprayer arms with vinegar. ** Make sure dishwasher water supply valve under sink is all the way on. ** Clean bottom filter with vinegar. ** Check for gunk around that floater thing in the corner. ** Check drainage hose underneath, where it goes into the dishwasher. ** Make sure wire screen on water inlet valve underneath is clear. * If those don't work, there's good stuff in here about debris blocking the check valve underneath, but I don't know if it has one: https://www.ifixit.com/Answers/View/14915/Does+not+drain+the+water+at+the+end+of+cycle#answer14958 !! Checked * It does have this kind of check valve (accessed from the inside of the washer): https://www.youtube.com/watch?v=rOio5HaWeFU ** 4/15: Not sure if this is the problem, but I ordered a new check valve. It was relatively cheap in the universe of overpriced spare parts, and Amazon had it, so why not. https://www.amazon.com/gp/product/B0156NAYTC ** ''4/17: Installed new check valve and ran a load of dishes on high-temp. Everything seems clean and there was no water left in the bottom of the dishwasher! Between this new valve and the vinegar cycle, we may be good again.'' * 4/15: Ran a cup of vinegar through one cycle on the hottest, longest setting. * Made sure dishwasher water supply valve under sink was all the way on. * Sprayer arms. See Tip 1: Remove and Unclog Spray Arms: https://www.homerepairtutor.com/dishwasher-not-cleaning/ ** 4/15: Pulled the bottom one out and ran water through it just fine. It and the top sprayer both looked clear. * Pulled dishwasher onto its side and looked at drain hose. Seems ok, doesn't look filled with gunk, but it shouldn't yet anyway because I replaced it in September 2017. * Did not pull the floater off like the lady in the video. It seems like that may be a bad idea, but I could hear the relay switch when I lifted it up a little and dropped it back down, so that seems good. !! Notes * See this for links to water inlet valve, and center and lower wash arm assemblies: https://www.repairclinic.com/RepairHelp/How-To-Fix-A-Dishwasher/25--651010-/new/Dishwasher-not-cleaning-DU1145XTPQ7 * Video of inside of a Whirlpool dishwasher running. This is super cool. Made me think it was the lower sprayer arm, but now I don't think it is: https://youtu.be/xjlyWCShO80
Stolen from [[Catherine|https://casualbedlam.com/#Vulture%3A%2050%20Essential%20Movies%20to%20Watch%20First%20on%20the%20New%20Criterion%20Channel]]! <<< Vulture [[Link|https://www.vulture.com/article/criterion-channel-best-movies-streaming.html]] [[Criterion Channel|https://www.criterionchannel.com/]] <<< Yes, bi-monthly Criterion Channel night is a great idea! Gives me an excuse to make a bigger projection screen.
* Insane amounts of pollen can make a person feel like they're actually sick.
| |!M |!T |!W |!Th |!F |!Sa |!Su | |meditate | | |x | | | | | |eat a salad |x | |x | | | | | |Babbel Italian | | |x | |x |x |x | |YNAB |x!!| | | | | | | |walk up 18 flights^^*^^|n/a|n/a| | | |n/a |n/a | |PT homework |x |x | | | |x |x | |other exercise | | | | | | | | ^^*^^I'm not walking up 18 flights a day until the pollen subsides and I can breathe again. I feel like I have COPD. * 2019-04-19 Update to macOS Mojave > update Day One to v3 ** 4/19 This wasn't supposed to be a project this week, but we had to cancel stuff tonight because we didn't want to share germs, so I went ahead and started. * Dishwasher not draining properly - ''DONE?'' ** See [[2019-04-14 dishwasher draining/cleaning research]] ** 4/18: Cautiously optimistic that the new check valve helped. * Studio/house clean-up for end of April visit ** next: File away the rest of the stuff off my desk. * [[Research and buy hi-fi earplugs|2019-03-18 research: hi-fi earplugs]] for loud restaurants/bars/parties ** 4/16: Ordered the Vibes earplugs: https://www.amazon.com/gp/product/B018WPOQSG ** 4/18: Earplugs arrived. They seem to be like my Etymotics hi-fi earplugs, but less embarrassing. We'll see tomorrow night if they work in a loud bar. * Back spasm ** 4/15 6th PT appt. They keep adding exercises. ** 4/18 Canceled today's PT appt due to being out sick. ** next: Keep up the evening PT homework habits. Always stretch after doing yard work or exercise. * [[book: A Portrait of the Artist as a Young Man]] ** next: pick this back up * IKEA office organizer thing assembled ** 4/20: Built other drawer and one of the doors. ** next: Finish other door. * Wiki correspondence ** next: Begin at the beginning. * Letter to MCA re: off-center Kacey Musgraves LP ** next: Dammit, I'm not giving up. I'm going to find an email address. * Vivo Barefoot shoes return
I don't know why I hadn't signed up for the Roden newsletter earlier. Via https://humdrum.life/2019/04/08/reading from https://craigmod.com/roden/025/ <<< Goofy as it sounds: You are the average of the five people closest to you. I’ve found that the most powerful tool to achieving something is being able to look at someone nearby who has done something similar. This is why it’s misguided and, quite frankly, stupid, to say to folks who are down on their luck: “Hey, just work harder.” Not only is “working harder” tough in and of itself, but if you don’t have a single archetype of someone nearby to show you how to work smarter (working “harder” is an idiotic thing to say to people that have four jobs) it’s exponentially more difficult to fix your situation. This is also why encouraging inspiring, exceptional people to become public school teachers is so powerful …. It levels the playing field for access to influential archetypes. <<< and > “Bringing close mentors and friends who embody archetypes of who you want to become” should be a life-long activity. All the better — like investing in index funds — to start doing so earlier than later. Much like smart, early, financial decisions, the investment in your group will pay greater and greater dividends moving forward. The rich don’t only get richer, but the well-connected and interesting become even more well-connected and increasingly interesting.
* Actual pollen-induced sickness kept me at home today. No one at work would have wanted to be around this cough anyway. Slept more hours than I was awake. * When I'm sick, I resort to the lowest level of internet browsing: Twitter. Looking at it, I feel like the scolding and eye-rolling there is now worse than ever.
* Meditated for 14 minutes this morning for the first time in who knows how long. * Back at work, but still feeling sick. Attending all meetings by phone even though I'm physically here. Brain is 95% operational. * I almost need a whole separate TiddlyWiki to capture the undefined requirements, use-cases, fears, processes, inputs, and outputs of the One (or Distributed) Perfect Journaling System that doesn't exist. I'm in the middle of the [[Mac Power Users]] episode of [[Journaling with Day One|https://www.relay.fm/mpu/478]] and learning lots of new things (Activity Feeds? Who knew!!), but they put a lot of stuff in journals (like quotes) that doesn't work for me in journals. Anyway, it's making me more interested in Day One for more logging of things, but I also don't want to lose the dead-simple searching that's possible with plain text files where the content suits it. I'll think about it in [[Journaling and logging systems]].
Using [[Nerdtool]], I added this to the desktop. The source file is `~/Nerdtool files/todo at mac.txt`. The real list doesn't have all this line wrapping. I just showed it like this to post on M.b. [img[https://twelvety.micro.blog/uploads/2019/e22bc45299.jpg]] [[Posted|https://twelvety.micro.blog/2019/04/18/i-often-open.html]] on Micro.blog.
* Apparently I pushed it too far yesterday and relapsed last night. Canceled PT and called in sick to work and slept most of the day. * As I listen more to the Mac Power Users episode on Day One, I wonder if I might enjoy //listening to others talk about journaling// more than actual journaling. But as I look back at old entries in any journal, I'm always glad to have included more details than less. Still wish Day One didn't require an hour:minute timestamp on every single entry. * When I think back to the days where I had to drive to a laundromat to do laundry, it's totally ridiculous that I now will use any excuse (and the discovery of that last clean pair of underwear) to put off doing laundry in my own home one more night. * It's April and springy, which means I should be watching a bunch of old Dick Cavett shows again right now. I should just break down and buy the DVD set on eBay or somewhere.
Yoni Appelbaum in [[The Atlantic|https://www.theatlantic.com/ideas/archive/2019/04/mueller-report-impeachment-referral/587509/]]: > As I wrote for this magazine in January, impeachment is best regarded as a process, not an outcome. It’s the constitutional mechanism for investigating whether an executive-branch officer is fit to serve. It requires his accusers to lay out their evidence in public, provides the opportunity for witnesses to be cross-examined, and ultimately, forces the House of Representatives to decide whether to impeach—that is, to approve charges that will force a trial in the Senate—or to drop the inquiry, thereby clearing the accused. I used to be in the "don't impeach if you don't have the votes in the Senate" camp, but now I think we should just do it anyway. Make those Senate Republicans go on the record saying they effectively approve of the 10 counts of obstruction of justice outlined in the Mueller report and everything else gross that POTUS did.
* Back at work, again. Just barely well enough to not have to work from home. Still staying away from people, but I'm here. And the rains are coming. * Updated to Mojave. Seems OK so far. * Started watching [[Fleabag]] on Amazon. I wish I could be reincarnated as someone that smart.
* Over the past week I stopped writing down all of the food and drink I had, and that caused me to stop recording everything else I did during the day. It's not so much that I care about the food, but the food is a good wedge into logging more stuff. It's easy to remember what I ate over the last hour or two, and that makes it more likely that I'll remember what I did between eating. Also, the [[Field Notes]] has been neglected because of playing with [[Day One]], but I like using Field Notes as a primary logging tool. It's also good to get into the habit of using the Field Notes more often than the phone because my daily todo list is in the notebook. If I don't have a reason to write more stuff in it, it's more likely that I'll ignore the todo list. * I listened to Justin DiRose's ([[Micro.blog user|https://micro.blog/justindirose]]) [[Process podcast episode|https://process.productivityguild.com/13]] about his first impressions with going all in with the Bullet Journal. Good one! I'm going to try it at home and at work tomorrow, at least the Rapid Logging part. I don't see myself actually tracking full projects on paper, but Rapid Logging seems to be a natural fit for the Field Notes pocket notebook.
* 2019-05-17 Went down [[project planning in bullet journal]] rabbit hole * 2019-05-01 ** I really like putting tasks in the bullet journal as they occur to me, and I like completing them and crossing them off there before they have to go into Things or TiddlyWiki. But there's definitely some ambiguity and inefficiency around which direction things flow. Sometimes tasks are captured in the bullet journal, then moved to Things (but really, not all that often), and then written //back into// the bullet journal when it's time to actually do them. Because I'm just not that good at doing tasks that are shown only on the Today view of Things, I wonder why I put anything there ever. It's like the paper version makes them more real and pressing. * 2019-04-29 ** The ONLY problem with the bullet journal + [[Bellroy Field Notes Notebook Cover Mini]] is that now I generate and capture //even more// stuff daily that I want to put into TiddlyWiki, and no extra time to do it. * 2019-04-22 ** Well, dang if Bullet Journal rapid logging doesn't make for a really easy-to-maintain task list. I'm trying it in Field Notes for non-work stuff, and this morning I had the weird experience of not having to re-write my tasks for today. I just added a couple as they came to me, and the unfinished ones from yesterday are one page-flip away. I can always re-copy them to a more current page if they linger too long, but this is a nice change for now. ** One thing I cannot bring myself to do is use dots for tasks and empty circles for events. I still use tiny handwritten checkboxes for tasks. Tasks that are done are crossed through or I draw an arrow coming out of them to indicate they're moved forward. If I process a task into some other system, I'll put a dot in the box. <a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/40702947163/in/dateposted/" title="Bullet Journal experiments"><img src="https://live.staticflickr.com/65535/40702947163_3b90d3f68b_z.jpg" width="100%" alt="Bullet Journal experiments"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
* I like Rapid Logging!
* There's nothing like paying for a language app (Babbel) to make you stick to learning. If we go to Italy a year from now, I'm gonna be ready! * I wish people (across the political spectrum) would abandon the notion that any one president can "save" us. My dream candidate would be able to read and write above a 3rd-grade level, have emotional intelligence, and pledge to support our allies and just not fuck anything up.
| |!M |!T |!W |!Th |!F |!Sa |!Su | |meditate | | | | | | | | |eat a salad | |x |x |x | | | | |Babbel Italian |x |x |x |x | | | | |YNAB | | | | | | | | |walk up 18 flights^^*^^|n/a|n/a|n/a| | | | | |PT homework | | |x |x | | | | |other exercise | | | | | | | | ^^*^^I'm not walking up 18 flights a day until I stop coughing all the time. * [[Water heater possibly leaking?|2019-04-23 water around water heater]] ** 4/24: Saw some water standing around bottom of heater. ** 4/25: Plumber coming tomorrow AM. They said it's OK to use in the meantime if it's not leaking that much. ** next: Plan on having to replace it. * Studio/house clean-up for end of April visit ** next: File away the rest of the stuff off my desk. * Back spasm ** 4/22 7th PT appt. ** 4/25 8th PT appt. ** next: Keep up the evening PT homework habits. Always stretch after doing yard work or exercise. * [[book: A Portrait of the Artist as a Young Man]] ** next: pick this back up * IKEA office organizer thing assembled - ''DONE'' ** 4/20: Built other drawer and one of the doors. ** 4/24: Finished other door. * Wiki correspondence ** next: Begin at the beginning. * Letter to MCA re: off-center Kacey Musgraves LP ** next: Dammit, I'm not giving up. I'm going to find an email address. Or a physical address. * Vivo Barefoot shoes return
* 2019-04-23 Noticed water pooling around bottom of water heater. Doesn’t appear to be coming from the copper pipe over the plastic drain pan. This could be bad. * 2019-04-25 Water is definitely dripping 2-3 times per minute from the bottom of the tank. Called plumber to visit tomorrow. !! Research * [[2019-04-24 link: Five Reasons a Water Heater Can Leak]]
* Is every day of life just an endless exercise in prioritizing the most pressing things to the top of the stack, with occasional dalliances into frivolous joys, since there's no way to do it all every day?
http://toolsandtoys.net/reviews/the-bellroy-notebook-cover-review/ Super-detailed review.
https://www.thespruce.com/how-to-fix-leaking-water-heater-2719073
https://www.wellappointeddesk.com/2014/06/epic-refill-guide-rollerball-gel-and-ballpoints/ I'm hoping to find a slim pen that can take Pilot G2 refills.
* Sometimes I accidentally click on a "live" draft tiddler in the Recent tab of someone else's wiki and it's like I just barged in on them in the bathroom stall and I flail around trying to leave and close the tiddler without making things worse. * I've had this weird shame spiral where I thought I had to "catch up" on all the wiki action I've missed over the past month or so, and consequently I would never load all the bookmarks in the Daily Haunts folder because I "never had time to get through them all". That is just a bad way to operate. Much better to just dive in and see what everyone is up to for the past couple of days.
https://aquariumdrunkard.com/2019/04/25/john-coltrane-coltrane-58-the-prestige-recordings/ > The notes come out of him so quickly and with so much precision, he brings to mind an industrial sewing machine churning out a tapestry—only it’s creating the pattern while it’s doing the stitching.
* Had 50-gallon water heater installed today. Could have bought a [[Fujifilm X100F]] and had money left over for an extra hard drive with the amount of $$$$ it cost. Oh well. Hot water is nice. * Micro.blog is fun to read when people are ordering cameras I have no business looking at ([[Leica Q2]]). Sigh. * I'm utterly dependent on the [[Bellroy Field Notes Notebook Cover Mini]] now. Hopelessly.
* Right in time for spring, ~~photography~~ ''camera gear'' research is back on the brain.
https://yannickkhong.com/blog/2016/2/8/micro-contrast-the-biggest-optical-luxury-of-the-world
* I so would rather be eating popcorn and watching the Barr hearing right now. * I wonder: How much does the typically rigorous process of nailing down requirements before evaluating/soliciting software/services hurt businesses more than it helps? I didn't crystallize my own requirements for the [[bullet journal|2019-04-22 bullet journal experiment]] and [[Bellroy notebook cover|Bellroy Field Notes Notebook Cover Mini]] until I started actually using them together. By diving in and trying stuff, I discovered uses for them I hadn't anticipated. ([[Posted on M.b|https://twelvety.micro.blog/2019/05/01/i-wonder-how.html]]) * I will not will not will not click on this enticing headline until I finish some work here at lunch first. This is like Kryptonite for me: https://gabz.me/2019/05/01/reevaluating-my-task.html * Something Dreamhost did with the Ubuntu upgrade last night totally broke my old twelvety.com blog temporarily, but it seems ok now. * I would like to eventually get as good at my work as the guys who installed our hot water heater on Monday. Anyone should be able to look at the job they did and appreciate the craftsmanship that went into routing the pipes and soldering the connections and fittings. So clean, so fast, and they made it look easy. * I'm chasing my own tail a bit with tasks in the [[2019-04-22 bullet journal experiment]], but it's still so pleasant overall that I don't care. * We saw our cute niece dance in the [[Minds In Motion|https://www.richmondballet.com/mim/]] performance with hundreds of other Richmond students tonight. One of the segments had four excellent professional dancers from the Richmond Ballet. Made me want to see ballet in person again, especially something by George Balanchine. And I see that they will do "Theme and Variations" (Balanchine/Tchaikovsky) in [[September|https://www.richmondballet.com/newseason/]]!!
* Ahhhhhhhhhhhh. This was one of those weeks where I just had to keep going in whatever direction the next thing was. Finally catching my breath. * If I didn't have the Field Notes + [[Bellroy|Bellroy Field Notes Notebook Cover Mini]], 90% of this stuff just wouldn't get captured anywhere. * The ideal state of any task is "Done". If it's sitting on a list somewhere, it's not adding any value to anything. What happens to me with [[Things]] (though I still use it) is that as soon as I get all the tasks captured in it and assigned to their projects, everything looks so tidy and simultaneously overwhelming that I close the laptop and stop thinking about it all. Maybe tasks (like in the Bullet Journal) //should// be messy until they're done. The mess of them on paper makes me want to get them done more than any other system. But the mess is also not scalable! Maybe that's the point?
[[Henri Cartier-Bresson: Right on the button — The Independent|https://www.independent.co.uk/arts-entertainment/art/features/henri-cartier-bresson-right-on-the-button-9147598.html]] > Most of the subjects were surprised that he didn’t ask them to sit or stand this way or that. But it wasn’t his way. “Just talk to Adrian,” he’d say in the perfect English he’d learned from a year in Cambridge in his youth. “I’ll just stay in the background.” Which is what he did, almost invisible, a craft he revealed he’d learned from his time in the French Resistance during the war.
* Let's see. I could sign up for [[Setapp]] and spend the rest of the day on this couch trying out [[PDFpen]] and updating [[Marked]], [[iThoughtsX]], and [[MindNode]], or I could do something else. I wonder what on earth I will do. ''Update:'' Ooooo, it's only $8.99/mo if you pay annually! * It would be so great if there were a trainable handwriting-recognition app, where I could scan my [[bullet journal|2019-04-22 bullet journal experiment]] pages and be able to reliably search them without retyping anything in. I know we'll get there someday. For now, even the free version of [[Evernote]] still does a decent job at it. Doesn't catch everything, but the things it does understand are pretty incredible, especially with my pointy handwriting. I never got around to deleting Evernote or purging my data out of it, and I'm glad it's still there for stuff like this, which is totally icing-on-the-cake functionality. * I love how the [[Backlinks footer]] in TiddlyWiki shows such a nice list. As long as I remember to make tiddler hyperlinks in the tiddlers that reference other tiddlers, it lets me write whatever random thing about a tool or experiment in the Journal entries and I can see how I learned (or struggled with) things over time. Makes me wish [[Day One]] had a nice wiki-like markup ability and backlinking feature. Oh well. That is what wikis are for! * OMG [[Mojave]], yes, I want to allow all the apps access to all the files like I have for the past forever. * Had two new [[Michelin Premier tires]] put on the Fit this morning after blowing one on a pothole last weekend. I waited in the lobby and wrote a surprising amount of tasks, notes about car stuff, and random other things in the [[bullet journal|2019-04-22 bullet journal experiment]]/[[Bellroy cover|Bellroy Field Notes Notebook Cover Mini]]. Before having that, I would have been dancing around between a bunch of apps on the phone to accomplish the same things. Way more calming and restful to do it on pen and paper. A lot of those tidbits will migrate to digital, but most of that will happen on the laptop, where I can do a whole lot really fast without getting whiplash from iOS app-hopping. * Shit! We're five minutes into [[Dead to Me]] on Netflix and it looks really good and I cannot handle being hooked on //another show.// * What I NEED to do is stop listening to YouTube videos of Leica M3 shutter sounds and just put a roll of film in the [[Ricoh 500G]] and commit to Sunny 16 for the spring and summer and be done with it. * I am reluctantly coming to the conclusion that my love for beer is directly at odds with my desire to accomplish things in the evenings. Two beers tonight and my motivation to do anything but click on the trackpad is at about zero right now.
* Ordered [[book: The Bullet Journal Method]]. I am doing this! Also, starting today, I'm trying the canonical [[bullet journal|2019-04-22 bullet journal experiment]] symbols for at least a week. It's counter to my instincts, but it's worth a shot. Just need to train my brain about the < and > signifiers for Scheduled and Migrated tasks. I always want to reverse them. See also: [[2019-05-05 link: bullet journal migrated vs. scheduled tasks]].
https://www.reddit.com/r/bulletjournal/comments/4vp9fj/migration_vs_scheduled/ > ...I get a migraine thinking about what really is the difference between migrating a task vs. scheduling a task? It's kinda weird because I feel like they both are the same. Can someone help explain the nuances between the two functions?
https://en.wikisource.org/wiki/Moral_letters_to_Lucilius/Letter_101 > Every day and every hour reveal to us what a nothing we are, and remind us with some fresh evidence that we have forgotten our weakness; then, as we plan for eternity, they compel us to look over our shoulders at Death. Saw a shortened version of this one in the intro to [[The Bullet Journal Method|book: The Bullet Journal Method]] book: > Let us postpone nothing. Let us balance life's account every day. 8. The greatest flaw in life is that it is always imperfect, and that a certain part of it is postponed. One who daily puts the finishing touches to his life is never in want of time.
* I never got around to making a Project/Habits tiddler last week and I'm not doing one this week. Going to go all in with the [[bullet journal|2019-04-22 bullet journal experiment]] for managing that stuff and see how it works. My theory is that it'll also have the effect of making the wiki more fun and less boring/work. * Last night I used Apple's Notes iOS app to scan last month's entire [[Field Notes memo book]] to PDF. It is surprisingly easy and generates the best result with the least manual intervention of all the scanning apps I've tried on the phone. You can only scan 24 pages to one PDF at a time, but you can save multiple PDFs to one note. (I'm also going to stitch the PDF segments from Notes together to one PDF for the whole notebook and keep that in Dropbox.) I then copied the PDFs to [[ScanBot]] and exported them to images to the camera roll, because I am crazy and because I'm pasting in each day's rapid log images to [[Day One]]. To augment these images, I plan to type into Day One only searchable keywords for rapid log Events and Notes (e.g. "Carytown Sushi", "walk to lake", "Dad", "ordered Bullet Journal book", "Rear Window", "Sixpoint Resin", "Ricoh 500G HP5+ 400"), not type in any non-exciting food eaten, and not transcribe the captured Tasks. The other night I tried typing in the full text of Events/Notes and it was way too much effort for way too little benefit. In the future, if I get a hit on a search term, I'll go to that Day One entry and be able to pore over the scanned rapid log to get a sense of what was going on that day. Of course, I can always expand on anything in Day One if I want to write a proper journal entry. * ^ I only meant to type one short bullet but I see how that went. I transcribed these bullet journal meta-notes from May 6 much later: * 2019-05-06 ** I get a weird sense that the bullet journal brings a feeling of groundedness and connection to the passing of time. I already don't feel so unrooted anymore. I know this is all about getting older + feeling time pass + clawing for each minute to try to stave off death anyway. ** This crazy process of recording things on a mini paper notebook has stuck in a way that no app or habit-tracker or [[VS Code]] extension ever has. ** Do people carry their bigger-than-pocket-sized Field Notes bullet journals everywhere? ** I trimmed the bushes by the driveway tonight instead of letting it slide til tomorrow because I wanted to turn the task into a big ''X''!
* I figured out this morning that I'm going to need to incorporate the long-neglected [[Rhodia Webnotebook]] into the [[bullet journal experiment|2019-04-22 bullet journal experiment]]. I was really going to try to do it all with the [[Field Notes memo book]], but I want to give Collections a real shot for things I want to do more of. (See also: [[2019-04-11 Not making enough things]].) I suspect that there's going to be something good about having an actual paper page for each pursuit/practice/hobby that will result in good. I've been looking for an excuse to pick the Rhodia back up anyway. If I tried to make Collection pages in the Field Notes, the number of Collections I want to make right now would leave room for about nine days of rapid logging. Not a good use of the mini-size notebook for me. I expect the Collections pages will get converted to tiddlers as each of them fills up. Sooooo fun this is.
from [[Dark Imagery: The Journal of Mary Shelley - SpringerLink|https://link.springer.com/chapter/10.1057/9780230376441_4]] <<< Well, then, now I am reduced to these white pages which I am to blot with dark imagery. <<< Mary Shelley. Journal, 5 October 1822
* I suppose this wiki could just turn into a constant stream of [[bullet journal experiment|2019-04-22 bullet journal experiment]] status updates. If that's what you're into, you're in the right place! The [[Bullet Journal Method|book: The Bullet Journal Method]] book arrived last night and I've been skipping around it like a crazy person. It's soooooo good. There's a lot more to the system than what I had gleaned from reading the Bullet Journal blog. Last night I got the new [[Field Notes memo book]] all set up and working. I got a decent-ish desk lamp so I could see properly and wrote stuff and migrated stuff for a straight hour at my desk. Time slowed down and it was //quiet//. I hadn't handwritten that much in years! I'm hooked for sure. Can't wait to see what happens over the next few days. * Sarah calls my nightly bullet journal time "doing your scribes". * I'm all in with Ryder Carroll's One True Bullet Journal Symbol System. I was skeptical, but I'm in it now. Also used bullet journal format for the past two days in my notebook at work. It is amazing and refreshing to have to think an order of magnitude less about where notes and tasks go; they just go one right after the other. Meeting notes are grouped together, but they're still in sequence with everything else, and they don't require their own page anymore. I'm wasting less paper, and I'm less likely to lose tasks!
from https://www.mountvernon.org/library/digitalhistory/digital-encyclopedia/article/resignation-of-military-commission/ > Washington’s resignation was intended to emphasize the power of Congress, as is evident with the final stipulation, that “when the General [Washington] rises to make his address, and also when he retires, he is to bow to Congress, which they are to return by uncovering without bowing.” via John Dickerson on [[Twitter|https://twitter.com/jdickerson/status/1126067579871797248?s=20]]
from Butch on [[Vinyl Assault Vehicle 2019-05-08|https://www.mixcloud.com/squealermusic/vinyl-assault-vehicle-wbutch-050819-on-wera-lp-werafm/]]: > In the same way that Black Sabbath was "not cool" back in the 70s with critics or whatnot, Grand Funk was //way// "not cool". But now all the people who thought they were "not cool" are dead or whatever so it doesn't matter, and you can just decide for yourself, LIKE YOU COULD ALL ALONG.
* I'm going to stop putting `link: ` in titles of link tiddlers. Those are six precious characters to waste, and most of my tiddlers have links in them anyway. * I can't stress enough to myself how corrosive the daily re-writing of — and never finishing — a complete "today's tasks" list was, now that I've tried [[bullet journal|2019-04-22 bullet journal experiment]] rapid logging and leaving tasks undone until they're done. That daily exercise of the fresh page and the re-copied list sure felt good every morning when I was clear-headed and optimistic. And then it reliably turned into an unachievable burden that was rarely consulted again later in the day. By the end of the day, it was just depressing; another 24 hours of failure to add to the pile of thousands of others before it. And even though it never worked, I felt even more unmoored if I forgot or didn't make time to make the list in the morning! With the rapid log filled in as ideas come up, I'm always using and adding to the list, and also //referring to the list// just as often. I know I can't do everything that occurs to me on any given day, so there's way less (although not zero) pressure to get it done that day, and no feeling of failure. The feeling of accumulated failure may come at the beginning of the new month when I migrate the old undone tasks, but that's only if I don't cross out enough things, which by definition must not be that important if I just never got around to them in the preceding month. * [[Posted the above on M.b|https://twelvety.micro.blog/2019/05/10/finally-stopped-rewriting.html]] -- another thing that started out as a "quick journal bullet" here in TW and ended up being readable enough to share.
* I woke up at 6:55am today (a Saturday) only because I went to bed last night shortly after 10pm. Going to bed when your body says it's tired is not "giving up", although I'll never remember that when it counts. But dang, early mornings are too nice to waste on weekdays. * In the same way that I vastly underestimated the value of a public wiki, I write in this public journal way more than I do in [[Day One]]. I barely ever write anything "private" in that. I may as well keep dumping as much as possible in here until I bump up against the privacy/comfort limit. * Apparently I look kinda serial-killer-y when I mow the lawn with my big red ear protectors and safety goggles and wireless earbuds and plain white t-shirt and white socks and homemade khaki shorts and walking shoes. * I bought car washing fluid and car wax at Target tonight without researching them on Amazon. Actually I researched all that shit on Amazon months ago and never bought anything and realized recently that it's more important that you just //wash your fucking car// at some point with anything instead of trying to pick the end-all, be-all perfect combo of car wash + wax product. * The [[Zebra SL-F1]] is extremely good for putting a single vertical line beside a few important sentences in a paper book (my alternative to using a highlighter). I did this with the [[book: The Bullet Journal Method]] today and it totally worked. * Sarah and I went with my brother to [[Pupatella RVA]] for pizza tonight. I had the Classica DOC (fresh mozzarella, basil and olive oil) and it was delicious. My brother said it was like having pizza made of naan and he was right. * And now my body and brain are saying "go to bed, you ass".
* Mother's Day lunch at [[Tazza Kitchen Alverser Plaza|https://www.tazzakitchen.com/location/alverserplaza/]]. ** Hash bowl (with smoked brisket): Meh. Not my favorite. ** [[Three Notch'd Jazzfest Sugarcane & Pecan Ale|https://untappd.com/b/three-notch-d-brewing-company-jazzfest/1067694]]: YUM. * I think the [[bullet journal|2019-04-22 bullet journal experiment]] habit is slowing me down enough (in a good way) that it's dissipating a lot of nervous energy that would otherwise have been directed towards researching and buying things that I may or may not actually need. I'm still generating note entries for things I want, but nothing is loudly calling to me at this moment.
https://support.google.com/docs/answer/4492226?hl=en I just tried this in Chrome on the MacBook and it works amazingly well. I'm using it to transcribe just the factual highlights and keywords from the Daily Log in the [[bullet journal|2019-04-22 bullet journal experiment]] into a Google Doc, and then I copy and paste that captured text into the [[Day One]] entry for that day. It's so good that I can just skim over the daily log page(s) and read out loud without even looking at the screen. You can review everything and it'll underline the words it's not sure about, which you can correct, and I would assume it gets smarter the more you do it. I know [[Drafts]] does this on iOS, but this is more relaxed and accurate and less frustrating.
Good ideas in here! https://joshisms.io/#DEVONthink
* I need a do-over for today. I noticed at 10:20 this morning — in a staff meeting I couldn't leave — that I had dog poop on the bottom of my shoe, wedged right in, in that dead space between the heel and the rest of the sole. We don't have a dog, so it must have been someone else's dog (or cat) who went in our yard. I had been smelling something in the meeting, thinking, "Someone's coffee smells like poop", and it turned out it was me (my shoe). Hadn't happened to me that badly since I was in Electromagnetic Fields class in college. That time was a worse mess, but it was easier to leave the room and deal with. I took off my Converse All-Star, held it out in front of me, and walked right by the confused professor to the front door of the classroom and out to the nearest bathroom sink. GROSS. * I ate chicken tenders and fries at lunch for comfort.
From [[For Joseph Cotten’s birthday: Gaslight: His Listening Is Active - The Sheila Variations|http://www.sheilaomalley.com/?p=47286]] <<< Joseph Cotten never takes his eyes off Ingrid Bergman except for once or twice, and then it is very specific. He looks up at the lamp. He looks up at the ceiling. He thinks. Then he turns his focus back onto Bergman. It is a powerful thing. Listening like this. It is the most important thing in acting, and the most underpraised. All good actors are great listeners. There are no exceptions. Active listening makes everything possible. <<<
* I wrote this in the bullet journal today in an extremely agitated moment: ** Jesus Christ. I'm ready to move to the country and unplug my internet and delete my iMessage account and never talk to anyone again. No more meeting people for dinner, no more phone calls, no more working lunches, and most certainly no text messages. (This is not directed at anyone who has this wiki on their daily haunts, by the way, or anyone on Micro.blog.) * The [[bullet journal|2019-04-22 bullet journal experiment]] is making me more aware and picky about the things I spend time tracking. I could track and log a whole shitload of stuff in TiddlyWiki and in the paper journal that would prove I'm an eccentric, but that wouldn't really make life better. * Getting older is great because you get smarter about things, but oh my god the number of personal failures you can survey from any vantage point in time is just astounding and paralyzing. * I just heard a Wilco song I actually liked. I thought it was Neu! at first.
From https://en.wikipedia.org/wiki/Frankenstein: > Shelley started writing the story when she was 18, and the first edition of the novel was published anonymously in London on 1 January 1818, when she was 20. 20!!!
* The more I use these progressive lenses, are my eyes just going to get worse and worse?
* I washed and waxed my car today for the first time since I bought it 1.5 years ago. There was a lot of dirt to dislodge, so the whole combined operation took over 3 hours. The good part is that you really know your car after going over every inch of it (on the outside, at least), and it lengthens the life of the car's finish. The bad part is that it takes so long that you get the sense that the car owns //you// after it's all done. The AirPods made it go by pretty quickly, but I can't see me doing it more than 2x a year. Any more than that and I would pay someone to do it. But it would probably cost an arm and a leg to pay someone to do it in a way that wouldn't bother me. * I have now shot film on the [[Ricoh 500G]] for two straight days in a row! * I saw this [[Ian Brown video|https://youtu.be/YMRYIRnVhlE]] for a relatively recent new track from him. I don't care for the song, but man, it really hit me how many years have passed and how much older he looks since the first Stone Roses LP came out (1989). Man, we are all so gonna die someday.
Need one for my desk now that I'm actually hand-writing stuff in all these notebooks. Sarah's is 29.5 x 19.25, and mine needs to be smaller. """ Large Smoothly Adjustable (5 - Position) Slant Drafting and Sketching Board Table Easel for Drawing, Diamond Painting, Puzzle https://www.amazon.com/dp/B075R4XBB5/ Lucky Crown US Art Adjustable Wood Desk Table -Light Weight, Easel with Strong Support https://www.amazon.com/Adjustable-Light-Weight-Strong-Support/dp/B07C76N6XY/ U.S. Art Supply Large 18-1/2" Wide x 14-1/8" (A3) Tall Artist Adjustable Wood Drawing Board https://www.amazon.com/dp/B01MSDP7Z2/ref=sspa_dk_hqp_detail_aax_0?psc=1 """
A [[snippet|https://overcast.fm/+J1L8vh0vE/29:30]] from an incredibly deep and long interview with Debbie Millman on [[Hurry Slowly|https://hurryslowly.co/debbie-millman/]]: > ...People will be like, "But you have this wonderful legacy with your podcast." I'm like, "That's just one thing. And I don't even know that it's worth being considered a legacy." I actually still feel, and I feel this almost every day, almost all the time, that I am wasting my life. And that I'm not doing more important things that make a bigger difference. And I worry about that. I worry about, What if I die tomorrow? What a tragic life I'd have had, not having ever really manifested anything with meaning. When I heard this in the car, I was thankful that Jocelyn K. Glei just let this hang there for a second without trying to probe. I almost never hear people talk this frankly on podcasts. Strange and comforting to hear, especially from someone as accomplished as [[Millman|http://www.debbiemillman.com]]. ([[posted|https://twelvety.micro.blog/2019/05/24/debbie-millman-worries.html]])
* Every cell in my body wants to use plain text files or tiddlers for the "log" kinds of things I'm putting in [[bullet journal|2019-04-22 bullet journal experiment]] Collections. But I know that the Collections pages themselves are like magnets. They beckon, and they draw things into them that might not get attention or time otherwise. * I'm still not typically re-writing yesterday's undone tasks into today's Daily Log in the bullet journal, but yesterday (Sunday), I did pull forward a whole bunch of undone things to that day and it was perfectly ok. I knew I wouldn't get to all of it, but a day with many available hours in it needs to have some kind of direction to it, and I can keep picking off those migrated tasks this week. No shame. * On Saturday, [[Lightroom Classic CC]] (launched for the first time since the Mojave upgrade) popped up an ominous warning about how it needed to be optimized and wouldn't work in a future OS. I appear to be getting a preview of the Lightroom struggles that Jack has documented in his [[wiki|https://rudimentarylathe.org/]]. I don't want this!
Excerpt from [[Volodymyr Zelenskyy]]'s [[Inaugural Address — Official website of the President of Ukraine|https://web.archive.org/web/20220128022345/https://www.president.gov.ua/en/news/inavguracijna-promova-prezidenta-ukrayini-volodimira-zelensk-55489]], retrieved from Archive.org because the official website is unreachable: > My election proves that our citizens are tired of the experienced, pompous system politicians who over the 28 years, have created a country of opportunities — the opportunities to bribe, steal and pluck the resources. > > We will build the country of other opportunities — the one where all are equal before the law and where all the rules are honest and transparent, the same for everyone. And for that, we need people in power who will serve the people. This is why I really do not want my pictures in your offices, for the President is not an icon, an idol or a portrait. Hang your kids' photos instead, and look at them each time you are making a decision.
* Retroactively entered some journal notes into [[2019-05-06 Journal]].
* ANXIETY. Brain dump: So many thoughts, scattered attention. Constantly feel like I'm behind, not making "the most" of resources and time. Too many places to record things. Too much to record. Too many services we pay for and don't take full advantage of. Too many/too big hedges in our yard for two people to manage. My vision is getting worse. What do I want to be doing in 10 years? If I meditated regularly at all, would it keep this flood of thoughts at bay? I'm behind on listening to my favorite radio shows ([[Vinyl Assault Vehicle]] and [[Strength Through Failure]]). (At least we give them money.) I'm not using the [[Sony NW-A45 hi-res audio player]] enough. Why don't I write more on M.b? Isn't life too short to worry about Inbox Zero? I look old when I see my face in the mirror at the PT studio. Wouldn't life be better on the whole if I got to a point where I didn't have any data I cared about backing up? I feel less tired and more intelligent when I don't drink beer, but I didn't stumble into existence after billions of years of nothingness and millions of years of evolution to just not drink beer for the short time I'm here. I could/should sleep more, but that would leave less time for everything else. We're responsible for the upkeep on all the things we own. Our house is old and needs a lot of work before more time passes. Why does everyone else drive so fast? * 13:03 I'm doing marginally better now than when all of the above spilled out earlier.
* As much as I like (and continue to fill up) Collection pages in the [[bullet journal|2019-04-22 bullet journal experiment]], I really like Catherine's project progress format in [[this tiddler|https://casualbedlam.com/#ISTE%20Future%20Ready%20Librarianship%20course]]. It's obvious when all the entries were made, and I bet it builds in some feeling of accountability (Sorry, no pressure!). I might keep writing stuff with pen and then occasionally archive/update those things here. Oh lord, the process just gets more complex all the time. I sometimes wonder what a job description would look like if it were made up of all the duties involved with the weird tracking and logging and archiving I do with all these systems. No one would apply for that job.
* What I need is a clone of myself, like a full-time DEVONthink agent but with more smarts and autonomy, that can trawl through my email newsletters, Twitter, Micro.blog, [[Daily Haunts]], Instagram, and YouTube subscriptions, and show me the stuff that really grabs me, and the stuff that I don't realize I should read but ends up being like vegetables that I need. So I can, I don't know, sleep and do other stuff in the meantime?
* I left my bullet journal on the passenger seat of my car before work this morning, UNINTENTIONALLY. Ugh. I felt all at sea all day. Whenever I had a thought or a to-do, I had to write it on a post-it note. I admit, there was about a 5% feeling of freedom from being without it, but I still didn't know what I was doing or where to put things. From now on, when I take it out of my back pocket to drive, it's going straight into the backpack top pocket until I get to my desk. * Went to the annual Greek festival and ate about 60% too much food.
https://www.lawfareblog.com/lawfare-podcast-special-edition-muellers-last-word Ben Wittes, on why Mueller said that his report was his testimony, and how he'd deliver no new information if called to testify: https://castro.fm/episode/1MaMAs#23:18 > I think a huge amount of the message is directed at Congress, and it's a way of saying "Stop asking me to do your job for you", or "Stop asking me to make your job easier for you." ...which is a fair point, and suits the narrow scope that we're used to Mueller framing his role in. And then Quinta Jurecic made a great counterpoint: https://castro.fm/episode/1MaMAs#28:11 > ...As I said, and as we've all said, there's nothing new here. So, the fact that these short remarks have generated so much outcry and interest among opponents of the president, I think itself demonstrates, first off, that Mueller is right to be frustrated that no one has read the report, because clearly no one has read the report. And second off, that it actually makes a big difference for the special counsel to come out and just say what the report said.
Jack, thanks for [[your note|https://rudimentarylathe.org/#2019.05.30%20-%20Phil%3A%20Local%20images%20in%20TW]] about ideas for local image hosting in Node! I had no idea this was possible. I may do it, just to keep everything tidy and together, but I also don't want to cripple the single-file download of the wiki, on the off chance I have to use it. (Optimizing for the unlikely? Maybe...) Anyway, thanks for letting me know about it!
* All I've accomplished tonight: buying lawnmower gas and adding field watches to [[Pinterest|https://pin.it/rb3wdkbw6njmr5]].
I'm fascinated by websites, forums, and podcasts about people who've given up drinking or drastically reduced it. Not that I want to give it up, but there comes an age (for me, sometime after turning 40), where one's body stops being able to recover as quickly as it used to; where even two beers start to dry you out, slow you down and keep you from doing things. I'm there. I'm interested in reducing my intake because I want to get better sleep more often, absorb fewer beer calories, and have more time. There is never enough time. https://www.oneyearnobeer.com/better-oynb-podcast-009/ Rubin actually didn't talk specifically about stopping drinking during most of the episode. Most of it was about habits and triggers, and whether people lean towards being "abstainers" or "moderators" (whether it's sugar, screen time, or alcohol). But she did talk later in the episode about how being pregnant was the catalyst for her deciding that she mostly wouldn't drink anymore. She never enjoyed it that much when she did it and she found that it made her natural combativeness even worse. She'll still have the rare glass of champagne at a wedding or similar, but she mostly just skips it entirely and doesn't miss it.
https://learntocodewith.me/podcast/assistive-technology/ Humbling and inspiring interview with Judith Lung, a blind rehabilitation counselor and programmer. Learning to code is hard enough for sighted people — I can't imagine doing it without being able to see. And she uses //Emacs//. Another thing hard enough for people who //can// see.
* I think I'm going back to regular beef burgers at [[Burger Bach]]. Their Beyond Meat patties get too cold too quickly and end up too mealy. * The One Beer Experiment is going great! Had one yesterday and then didn't want another. Made it easier to go to sleep. Had one earlier at dinner tonight and am unusually calm now for a Sunday evening.
I feel a little silly even saying this, but for anyone who has this wiki in their [[Daily Haunts]], I'll be laptop-less with no way to update the wiki until this Friday. I'll be back then for the regularly scheduled documenting of minutiae and over-thinking things. Bye!
We spent a couple of nights at Sandbridge beach this week, staying in a house with some old and new friends. I made a conscious decision to leave my wristwatch off, not look at the news or Twitter, and mostly not update the [[bullet journal|2019-04-22 bullet journal experiment]] while we were there. I just let it all fall away and it was wonderful. I realized how tightly wrapped-up in the bullet journal I had gotten (which I still love, of course), and I suddenly had the space to look at it with a little bit of distance. I was still there, alive and well, and the notebook and the wiki and all the other things were more obviously just //systems// to support life and make it easier. They are not actually life. Instead, I visited with people, read [[Tape Op magazine]] at the beach — complete with itchy sand getting lodged between pages — and in the remaining hours delved into a bunch of YouTube research about the [[Teenage Engineering PO-16 Factory]] synth, TE's new modular gear, and iOS tape delay apps. I felt like I was 14 again! When we got back, I of course recorded as many thoughts, observations, funny moments and todo's as I could remember by using [[Otter.ai]] and just spewing out details during lunch. That was all I needed to do to feel like I captured the right amount of stuff. It's good to take a vacation from yourself every so often.
I found out last night that the iOS [[Logic Remote]] app can remotely control macOS GarageBand. I could load the latest version on my iPhone 8, but not on the ancient iPad 2 we still have (and haven't yet sold to Apple for $27 for some reason). Someone had a similar problem on Reddit and a kind soul posted this super-helpful solution, which actually worked for me on the iPad after I downloaded the newer app on the iPhone: https://www.reddit.com/r/jailbreak/comments/8sxntx/question_where_can_i_find_an_older_version_of_the/e13cals?utm_source=share&utm_medium=web2x <<< OK heres the thing with older apps that not a lot of people are aware of. If you have already downloaded that app before on your account, then go to the app store, find the “Purchased” tab and search for the app you want. In your case Logic Remote. Hit the download button and it will ask you “Do you want to download the last compatible version?” Hit download and voila! If you haven’t downloaded it before then find a device that is on latest version of iOS and download it onto that. Then go back to your older iOS device and use the above method. <<< I just had to make sure to click the cloud/download button beside the app name in the Purchased Apps list, and not the download button listed on the app's description page.
* Last week at the beach, I read this line quoted in [[The Bullet Journal Method|book: The Bullet Journal Method]] about [[Warren Buffett's 5/25 prioritizing method|2019-06-13 Warren Buffett's 5/25 prioritizing method]] and it's been haunting me ever since: "Everything you didn't circle just became your Avoid-At-All-Cost list. No matter what, these things get no attention from you until you've succeeded with your top 5." This is simultaneously the most brilliant thing I've ever read about focus and attention, and also the most unworkable thing I can imagine. I would be way better off using this philosophy, for sure, but it would pain me to ignore so many fun, impractical things I spend time on. ** Speaking of Buffett's model, "Health" and "Mobility" and keeping up routine finances are not projects/goals, because they will always be required and they will always be //there//. I need to separate them from this top-5 idea somehow. * I found last night that I have 172 tabs open in macOS Safari. 172. I make digital and physical messes faster than I can clean them up. * I don't need a life coach, but I do an information architect for personal stuff. An organize-all-the-shit-in-your-brain-and-stop-thinking-about-it coach. * Using Inter-App Audio on iOS is amazing, but using it is like building a ship in a bottle. Or like buying a bunch of lumber and bringing it home one board at a time in a Honda Fit. * I spent all of lunch yesterday migrating a bunch of notes from past Daily Log entries in the Field Notes pocket [[bullet journal|2019-04-22 bullet journal experiment]] into the bigger Rhodia notebook. I kicked and screamed the whole time just because I knew it would have been faster to type them into tiddlers or text files. But I'll be damned: I actually felt calmer by the end of lunch.
from https://jamesclear.com/buffett-focus Emphasis added by me: <<< !!! The Story of Mike Flint Mike Flint was Buffett's personal airplane pilot for 10 years. (Flint has also flown four US Presidents, so I think we can safely say he is good at his job.) According to Flint, he was talking about his career priorities with Buffett when his boss asked the pilot to go through a 3-step exercise. Here's how it works... STEP 1: Buffett started by asking Flint to write down his top 25 career goals. So, Flint took some time and wrote them down. (Note: you could also complete this exercise with goals for a shorter timeline. For example, write down the top 25 things you want to accomplish this week.) STEP 2: Then, Buffett asked Flint to review his list and circle his top 5 goals. Again, Flint took some time, made his way through the list, and eventually decided on his 5 most important goals. Note: If you're following along at home, pause right now and do these first two steps before moving on to Step 3. STEP 3: At this point, Flint had two lists. The 5 items he had circled were List A and the 20 items he had not circled were List B. Flint confirmed that he would start working on his top 5 goals right away. And that's when Buffett asked him about the second list, "And what about the ones you didn't circle?" Flint replied, "Well, the top 5 are my primary focus, but the other 20 come in a close second. They are still important so I'll work on those intermittently as I see fit. They are not as urgent, but I still plan to give them a dedicated effort." ''To which Buffett replied, "No. You've got it wrong, Mike. Everything you didn't circle just became your Avoid-At-All-Cost list. No matter what, these things get no attention from you until you've succeeded with your top 5."'' <<<
* [[Posted|https://twelvety.micro.blog/2019/06/14/the-new-bill.html]] about the beautiful new Bill Callahan LP that came out today. Went down a rabbit hole looking at and reading about [[Brian Beattie|http://www.brianbeattie.com]], his multi-talented engineer. I've always loved the way Bill C's albums sound.
I think it's some sort of Casio G-Shock. From the close-ups in these videos, it definitely has a front-button on it: * https://youtu.be/oGT0huvuM0M?t=109 * https://youtu.be/v2yE9x--1cg?t=225 It looks pretty dark except for the dial hands, so I think it's this one (and want it to be this one): * https://www.amazon.com/G-Shock-Mens-GBA800-1A-Black-Size/dp/B079XYJQKK If not, it may be one of these: * https://www.amazon.com/Casio-G-Shock-GA800-1A-Japanese-Quartz/dp/B07DKNGPSR/ * https://www.amazon.com/Casio-Shock-Quartz-Resin-Casual/dp/B01LEEENQW * https://www.amazon.com/dp/B075JLQCD8 It could also be one of these, although I don't think so, because they don't have the front button: * https://www.amazon.com/dp/B00OAY60ZQ * https://www.amazon.com/dp/B003WPUU0U Based on these photos: [img[https://twelvety.com/philtiddlywiki_images/2019-06-15-callahan-the-guardian.jpg]] from [[The Guardian|https://www.theguardian.com/music/2019/jun/13/bill-callahan-i-cant-die-life-is-too-good-it-cant-end#img-2]] [img width=100% [https://twelvety.com/philtiddlywiki_images/2019-06-15-callahan-the-guardian-crop.jpeg]] Crop from The Guardian [img[https://twelvety.com/philtiddlywiki_images/2019-06-15-bill-callahan-stereogum.jpg]] from [[Stereogum|https://www.stereogum.com/2047415/bill-callahan-live-performance-kutx/video/]] [img width=100% [https://twelvety.com/philtiddlywiki_images/2019-06-15-bill-callahan-stereogum-crop.jpg]] Crop from Stereogum
* In a totally impractical moment of materialism, I ordered what I believe is [[Bill Callahan's wristwatch|2019-06-15 Bill Callahan's wristwatch]] yesterday. The [[GBA-800|https://www.amazon.com/G-Shock-Mens-GBA800-1A-Black-Size/dp/B079XYJQKK]]. I couldn't help it. Even if I guessed wrong about what he wears, it just looks so cool in a none-more-black kind of way.
* With props to Jack for the [[inspiration|https://www.baty.blog/2019/meta-no-longer-automatically-cross-posting]], I [[deleted|https://twelvety.micro.blog/2019/06/18/not-feeding-this.html]] my Micro.blog hosted blog feed from my account profile so it won't show up on the M.b timeline anymore. Ahhhhh. * My willpower to eat salad at lunch is wholly up to whether the cafeteria salad chef is making salads that day.
from this thread: https://micro.blog/jack/4028958 > Liking things by default rather than disliking everything by default is life-changing. At first this seems like such a simple statement, but it has caused me to realize how many times I scowl, sneer, loathe, avoid, and judge during the day. This can happen, like, a LOT of times before I even eat breakfast. This is something I need to work on. Also, this, from [[Sameer Vasta|https://micro.blog/vasta/4097455]] in that same thread: > My life has been guided by this principle, with the added clause: "Like things by default; if they are not for you, relish in the fact that others like them, and that their joy is yours, too." Makes life so much more pleasant and joyful.
""" ''Alesis Nitro Mesh 8-piece'' https://www.guitarcenter.com/Alesis/Nitro-Mesh-8-Piece-Electronic-Drum-Set-1500000219380.gc Can't believe it's only $350. Hi-hat may be flimsy. """ """ ''Alesis Command Mesh Kit'' https://www.amazon.com/dp/B078SB645L $700 """ """ ''Roland TD-11KV'' https://www.amazon.com/dp/B00AKQVUSA Insanely good, but costs about as much as my original Pearl set did in 1987. """ """ ''Roland TD-1DMK'' https://www.amazon.com/dp/B07HC2ZMN4 Mesh heads, coaching function, but does NOT come with a kick pedal. Still, they really hit you where it hurts: "If You Used to Play Drums, It’s Time to Come Back" $700 + ~$70 for a kick pedal. Hmm. 2019-06-23 This is going to be the one, whenever I pull the "trigger" (ha!). """
* Man, the difference in speed and focus when I'm sitting at my desk with paper, notebooks, a pen, a Bluetooth keyboard, mouse, and big monitor attached to the MBP is like night and day compared to sitting slumped on the couch with only the laptop. (The desk wins.)
Now that I'm using the [[bullet journal|2019-04-22 bullet journal experiment]] regularly, I still don't know what my weekly review process is, and I haven't quite figured out how to coordinate it with iOS/macOS apps and digital stuff. I'm making it up as I go along every week, and that adds a whole layer of dread and "where-do-I-start?" friction to it. I do better when I have a checklist, so here goes. I'll probably occasionally re-make this list in the future in separate dated tiddlers so I can see what changes over time. (2019-07-21: Or not, apparently.) # get out a blank sheet of paper where i can scribble down anything that derails me during this process. write the date on it. (Today's journal tiddler also works for stream-of-consciousness ramblings that inevitably bubble up. As long you have a release valve of some sort.) # in the Rhodia larger notebook, make a new ''Week of m/dd/yyyy'' page (with the first date being this Monday's date) and add/update current projects in it (and drop the dead ones). and/or write the days of the week for things that need to happen on certain days. # make a new "weekly review YYYY-MM-DD" heading in the [[org-mode]] master outline file to list short-term projects for this week or this week's outcomes for the longer-term projects ## see [[2019-06-13 Warren Buffett's 5/25 prioritizing method]] for what goes in here. ## to be clear, i never really limit life to five projects at a time, but it would be nice to get there ## It's fine (actually, maybe even preferable) if the things listed here are Outcomes instead of Projects. # review calendar for next few weeks # sync up calendar with SH # Review [[Things]] inbox and Today lists # Review `master outline.org` file (this is where I keep a project backlog) # Check [[Reminders]] for anything lingering (or coming up) # scan Gmail inbox for anything on fire that I've missed in the last week. ''Note:'' Do not get derailed into processing/answering the emails you haven't caught up on in the last few days at the expense of finishing the weekly review. Keep your eyes on the prize. If you don't get anything else done tonight but the weekly review, that is ok. ## Starred items ## Spam ## everything else # review the [This Month] log in Rhodia for any projects/tasks to start or migrate # review Future Log spread in Rhodia for any projects/tasks to start # in pocket bullet journal: ## review undone tasks entered in the last week ### Migrate the ones that still matter to the [This Month] log in Rhodia. Overwhelmed already.
from https://www.newyorker.com/magazine/2016/10/17/leonard-cohen-makes-it-darker and quoted in [[book: The Gentle Art of Swedish Death Cleaning]]: <<< At a certain point, if you still have your marbles and are not faced with serious financial challenges, you have a chance to put your house in order. It’s a cliché, but it’s underestimated as an analgesic on all levels. Putting your house in order, if you can do it, is one of the most comforting activities, and the benefits of it are incalculable. <<< Leonard Cohen (posted more on [[the blog|https://twelvety.micro.blog/2019/06/26/putting-your-house.html]]) See also, [[Get your house in order]] and [[Get Your Shit Together]]
* Man, I still love the [[bullet journal|2019-04-22 bullet journal experiment]], but it has revealed the crushing amount of supposedly obligatory tasks that I dream up when my brain gets 30 seconds of idle time. You either do them, cancel/cross them out, migrate them forward, or... WHAT. Put them in a DMZ list where they can't harm anyone further? It's the same exercise we go through with the refrigerator except tied up with exponentially more shame and emotion. I have no idea.
There are a ton of outliners, mindmapping apps and text editors which handle outlining, many of which I already have access to. Org-mode in [[Emacs]] and [[VS Code]], various mindmappers in [[Setapp]], Typora, BBEdit with Markdown outlines, etc., etc. I'm trying to do a comprehensive brain-dump and am going to try [[MindNode]] (included in Setapp), and [[Checkvist]] (on the web). I remember [[Gabe Weatherhead]] always talked about Checkvist, and it feels like the kind of outliner I don't have to think about, which is neat.
2019-06-29 Just compiled and refreshed these for a friend looking for a ~$400 projector. This is based on much, much longer research I did back in November 2018: """ The one we got: [[Epson Home Cinema 2150]] This one is probably very good: ''BenQ MH530FHD'' https://www.amazon.com/BenQ-MH530FHD-Lumens-Theater-Projector/dp/B071VT7LPC/ $449 This is a cheaper Epson with a bit less resolution, but probably also very good: ''Epson VS350'' https://www.amazon.com/dp/B073L8YH6R/ $400 Also great, and I almost got this instead of the one we got: ''BenQ HT2050A'' (this was The Wirecutter's cheap projector pick) https://www.amazon.com/dp/B077TG22H3/ref=cm_sw_r_oth_api_m019BbSX5560W $636 This is the one we bought and returned, but it's still a good projector: ''Epson Home Cinema 1060'' https://www.amazon.com/dp/B073S4TS4G/ $650 """
* A loud cafeteria really, really stresses me out. Jesus. * I don't know if I'm figuring things out or if they're just bothering me more. ([[posted|https://twelvety.micro.blog/2019/07/02/three-things-somehow.html]])
from [[‘This doesn’t look like the best economy ever’: 40% of Americans say they still struggle to pay bills - The Washington Post|https://www.washingtonpost.com/business/economy/this-doesnt-look-like-the-best-economy-ever-40percent-of-americans-say-they-still-struggle-to-pay-bills/2019/07/04/855c382e-99b5-11e9-916d-9c61607d8190_story.html]] Sobering: > Half of U.S. jobs pay less than $18.58 an hour and more than a third pay less than $15, which makes it difficult to save or invest for a better future. Found the supporting data here: https://www.bls.gov/oes/current/oes_nat.htm#00-0000
* It's Saturday and I've already spent 34 minutes on Twitter today. I should just cut it off right there.
via https://micro.blog/RianVDM/4408460 from https://www.creativeboom.com/features/frank-chimero/ > It’s really easy to think that not working full bore is somehow failing your teammates or that withholding effort is poor work ethic and moral weakness. That thought is worth interrogating, though, and it all seems kind of ridiculous once you get it out in the open. There should be no guilt for refusing to work hysterically. Also: > I’ve had two mantras in the last couple of years. The first is: "The simple things are worth doing well because they happen every day." That dovetails into the second, "Be grateful for every chance to do something right."
* I //love// Jack Baty's idea and process for a [[digital print archive|https://rudimentarylathe.org/#Digital%20Print%20Archive]]. I've done something like this with Dropbox for a couple of years, but it's been very scattershot and I have no idea where I've left off. But it is a more lightweight, less onerous browsing experience to flip through folders in Dropbox than to fire up Lightroom, and I don't need any special software to view the JPGs. * Oh sure, 10:30pm on a Sunday is a great time to start a weekly review. Bound to be super-sharp and focused at this time of night. * I have legit been sitting here for five straight minutes trying to decide whether to start a new Field Notes or not, knowing that I have 2.5 empty "spreads" left in this one before it's full. I suppose I could use the remaining pages for daily logs and put this week's project spread in the larger Rhodia, but, but, but... what if I choose the wrong thing??
* I'm naturally drawn to outliners, so I'm going to try doing a this-week's-projects list in [[Dropbox Paper]]. (See [[2019-07-07 Journal]] for the genesis of this conundrum.)
* If I'm always behind in processing past pages of the [[bullet journal|2019-04-22 bullet journal experiment]], how can I take time for a proper [[Weekly Review]]? But how can a weekly review even be a complete, valid review if there's all this //stuff// hanging around? Is a review just supposed to be "good enough", as in, any imperfect review is better than a perfect one that never starts? * Someone needs to come along and take away all my digital tools and leave me with one notebook and a pen.
Saw this post in Reddit [[/r/bujo|https://www.reddit.com/r/bujo/comments/car68g/excited_to_get_away_from_doing_preplanned_weekly/?ref=share&ref_source=link]] and it was what I needed to unstick my brain about where to write [[bullet journal|2019-04-22 bullet journal experiment]] tasks for the week (i.e. not in the Field Notes pocket notebook). This person's layout is so dumbly simple (a page of tasks + goals for the week on the left side). Yesterday I actually tried this in the Rhodia — even though //I felt as I started that it wouldn't work// — and by the end I felt calmer. It was better than making the same list digitally. The pocket-sized notebook is great for capturing on the go, but too constraining for longer-term (longer-than-1-day) thinking. Another case of "Actually Doing Is Better Than Reading About". Some things can only be evaluated by testing.
Everything around this house stops during Wimbledon weekend. "Everything", meaning my brain and anything creative or practical. No regrets! Tennis is "just hitting a yellow ball back and forth" in the same way that Led Zeppelin was just vibrating air molecules on stage. I never get tired of seeing a player win Wimbledon their first time. Always causes tears.
Holy moly. It's like I've been rubbing sticks together to make fire. I didn't realize it was so easy to slap multiple takes into one track. """ Reaper Tutorial: How to use Takes in Reaper DAW https://youtu.be/0Hrr5QrjgqM """
!! Requirements * Max of 60" inches diagonal. * Aspect ratio of 16:9 to match the [[Epson Home Cinema 2150]]. * Lightweight and paintable. * Should be able to lift it off its mounting brackets and move it to another spot in the room easily. !! Screen Could use a stretched canvas if I can find one with the right aspect: * Arteza 36x48” Stretched White Blank Canvas ** https://www.amazon.com/Stretched-Painting-Acrylic-Professional-Painters/dp/B0722LPLVX ** 36" x 48" - $65 (for two, but I only need one) ** 4:3 aspect ratio * Level 1 Back Stapled Canvas by Artist's Loft ** https://www.michaels.com/artists-loft-back-stapled-canvas/M10015472.html ** 36" x 48" - $47.99 ** 4:3 aspect ratio * Level 3 Gallery Wrapped Heavy Duty Canvas by Artist's Loft ** ''2019-08-03 getting this one today'' ** https://www.michaels.com/artists-loft-gallery-wrapped-heavy-duty-canvas/10240779.html ** 30" x 48" - $79.99 ** 1.5" thick (Sarah says this is good) ** 1.6:1 aspect ratio (close enough to 16:9 ratio of 1.78:1) Or a studio wood panel: * https://www.dickblick.com/products/blick-studio-wood-panels/#07045-3648 ** 07045-3648 Gallery Cradle Panel 36" × 48" 1-1/2" $65.41 ** 4:3 aspect ratio MDF panel: * https://www.homedepot.com/p/MDF-Panel-Common-1-2-in-x-4-ft-x-8-ft-Actual-1-2-in-x-49-in-x-97-in-M31240849097000000A/202332602 ** 1/2 in. x 49 in. x 97 in. - $15.93 ** could cut it down to whatever aspect ratio needed For comparison, this is the roll-up one by "LYH" that I bought in a panic when Wimbledon 2019 was about to start and I wanted a bigger, good-enough screen. It's pure white, but it's fine. Totally worth $22: * https://www.amazon.com/gp/product/B07B2T3LCT ** 52" x 30" viewing area (60" diagonal) $22 ** roughly 16:9 aspect ratio !! Mounting Bricks are between 2-1/8" and 2-1/4" high. These brick clips should work: * https://www.amazon.com/gp/product/B01F0QTHD4
* New rules for the [[Weekly Review]]: *# Sometimes it won't work to do it on Sunday. In those cases, it has to happen on Monday. *# Whichever day it happens on, it gets ''one'' day to finish and no more. However far you get with it will have to be enough until next week. * Today, I //will not// get caught up in doing rediscovered tasks at the expense of completing the review itself. * I made that project outline in [[Dropbox Paper]] seven days ago and promptly ignored it. I looked at the [[weekly tasks in Rhodia|2019-07-10 weekly tasks in Rhodia = good]] list slightly more often, so I just added a row for it on the habit tracker in the [[Field Notes]] to remind me to consult it daily. If I were in front of my own laptop all day, everywhere, every day, a digital outline would work better, but I'm not, so I guess paper will do. * I saw a sweet demo of some digital asset management software at work today and now I just wanna go through my own Lightroom and tag and organize everything properly. * I do a lot more entering of stuff in this wiki than actually referring back to it, but I hope I'm getting close to the point where all this stuff actually becomes useful in unexpected ways.
* Sarah yesterday: "You're allowed to have cheese on your salad. Eating a salad isn't punishment." * Whatever Sony RX100-series camera Venus Williams was shooting with from the player's box during Wimbledon was cool looking and I want one.
from: [[Perry Mason TV Series Wiki / Show20|http://www.perrymasontvseries.com/wiki/index.php/TriviaPages/Show20]]: > Note the intercom on Perry’s desk (also in other episodes the first season or so). It’s a Rauland Amplicall Intercom. The case is made of brown swirled bakelite and contains a tube amplifier and speaker. The handset is a Kellogg brown model. Front panel controls include push-to-talk bar, on/off/volume, pilot lamp and 6 station selector switches. It would be hooked to the PBX so the operator could make the connections. See [[Telephone Curiosities|http://www.paul-f.com/curious.htm]] for these details and pictures. Submitted by billp, 12/30/2008.
I had a 10-minute episode of this again today. Happens to me 3 or 4 times a year, and I can't do anything while it's going on except watch it play out. from: [[Has anyone else had this happen? When I remember an older dream, a sudden flood of old dream memories overcome me. - Reddit|https://www.reddit.com/r/Dreams/comments/3b7lhb/has_anyone_else_had_this_happen_when_i_remember]] > It will usually start with a random trigger that reminds me of a dream that I've not thought about for a long time, or to my recollection NEVER recalled consciously. This will trigger a string of tangential connections to similarly seldom/never recalled dream memories. from: [[What is the scientific term for unexpected, spontaneous dream recall? - Psychology & Neuroscience Stack Exchange|https://psychology.stackexchange.com/questions/2034/what-is-the-scientific-term-for-unexpected-spontaneous-dream-recall]] <<< I'm interested if there's a term for spontaneous dream recall. I will try to define the phenomenon I'm talking about. Over 10 years ago, I started to notice that I can spontaneously recall dreams, and clearly label them as dreams. I may recall 3 dreams from the past night, then more dreams from weeks or months ago. Some of these dreams I have written down, others were "forgotten" upon awakening, only to be recalled much later. That's a lot of dreams. When in this state of spontaneous recall, I can consciously guide the recall process once the original dream is recalled and recall a number of additional dreams that may or may not be loosely connected to that one. <<<
According to the [[Library of Congress|http://www.loc.gov/preservation/care/record.html]]: > Storage boxes should be made of acid- and lignin-free paper stock; avoid storage containers that retain static charge So: * [[Audiocassette Storage Box - Brodart|http://www.shopbrodart.com/library-supplies/archival-supplies/archival-storage-boxes/Archival-Media-Storage-Boxes/_/Audiocassette-Storage-Box/]] ** 3"H x 12 1/2"W x 9 1/2"D ** holds 36 tapes ** deep telescoping lid ** $9.90/box ** $9.95 shipping ** 2019-07-20 ordered 5 of these * [[Gaylord Archival Audiocassette Box|https://www.gaylord.com/Media/Gaylord-Archival&%23174;-Audiocassette-Box/p/ASB9123]] ** shallower lid than the Brodart, but looks like a more snug fit around two columns of tapes ** they won't calculate the shipping in your cart, so that's not great And I blame/thank the [[Ephemeral]] podcast for all this. All of a sudden it has become //vitally important// to organize and preserve the untold number of audio tapes downstairs in the basement.
My gorgeous 2002-era [[Sony MDS-JB940 MiniDisc deck]] still plays discs OK, but no longer loads or ejects them without help. Appears to be a tired loading belt. ----- 2019-07-27 Belt arrived yesterday from Encompass. Now I will try to use these links/videos to fix the deck. Some of these aren't strictly for the JB940, but the disc transport shown appears to be the same. ''Update:'' Fixed! Much easier than I thought it would be. Opened the deck, disconnected and removed the transport. Used a hook made from a paperclip to pull the old belt off and put the new one on. Deck has been working fine ever since. Service manual: https://www.minidisc.org/manuals/sony/service/sony_MDS-JB940_service_manual.pdf http://forums.sonyinsider.com/topic/29584-minidisc-deck-disk-eject-fix/ https://www.robert-puskas.info/2018/05/fixing-mindisc-deck-ejection-issue.html https://www.youtube.com/watch?v=qJ6XUMYMg2o https://www.youtube.com/watch?v=xlRsN04-ZFw This discussion http://forums.sonyinsider.com/topic/29965-c13-error-a-new-twist/?tab=comments#comment-194380 has a great video by a Russian dude who shows how to lift the top tray off the mechanism for easy access to the belt: https://youtu.be/qazETinoDSI -- BUT it could also be bad if you don't line up the teeth exactly right when you put the top tray back on. Probably better to leave the whole transport assembled while it's outside the deck, and try to slip the new belt on through the front hinged door, using a paperclip. ----- 2019-07-21 This is the right belt by one of the authorized parts sellers, according to Sony: * [[4-227-025-01 Sony Belt - Encomass.com|https://sony.encompass.com/item/4049561/Sony/4-227-025-01/]]
* I (reluctantly) have to be an adult about what I let in my brain every day. For my own good I can't allow myself more than 15 minutes of Twitter a day. I want more. When I'm down and/or tired, Twitter is all I have the energy for, and it will gladly deliver nutritionless morsels for as long as you want it to. And the more mental snacking I do, the less energy and brain power I have, and it never ends.
I need to remove my non-existent lunchtime willpower (a frequent point of failure) from the daily 12pm equation. If I have to choose between making my own salad at the boring salad bar every day vs. eating two slices of pizza or getting a prepared sandwich or a heavy, chicken-centric chef-prepared salad, I'm going to choose badly 4 days out of 5. I need to get back to the habit of making a bunch of salads for the work-week, at home on Sunday, all at once, and then take one to work each day. Yes, it's a pain to wash dishes. Yes, it's a pain to make all those salads. But the health costs of doing anything else are worse. I don't see any other way to do it.
* First home-prepared weekday lunch salad in probably 12 months. I feel virtuous! Just need to do this 200 more times per year. * Project research goes in [[nvALT]], TiddyWiki or [[Dropbox Paper]], so that's a bit of a mess. * I'm still struggling with where project steps/plans go, as in, "in a way that I'll actually use them". The [[bullet journal|2019-04-22 bullet journal experiment]] is //great// for planning weekly outcomes, which are not next actions. They're mini-goals along the way. When I need to focus and mentally stretch out and plan a bunch of steps out, I do better with a text file (one file per project), an outline (Markdown or something that makes real outlines), or a mindmap (seldom, really). But I'd rather all the project steps for All The Projects be in one place, so it's easier to bang through them in the [[Weekly Review]]. [[Things]] is naturally good at projects and tasks, but I don't want to leave things in there too long. And I go blank when I see too many things in Things. (Heh.) I don't know. Just thinking out loud.
While watching [[Easy Rider]] alone last night while Sarah worked, I had the thought that a movie like this on a nice projector and a decent-sized screen is too good an experience to keep to myself/ourselves. Need to share this with others and make it even better and more fun. A whole list of potential movies comes to mind. Once I get a more permanent [[projector screen|2019-07-13 research: DIY projector screen]] in place, we are going to do a somewhat regular movie night with peeps. With props to [[Catherine|https://casualbedlam.com/#Vulture%3A%2050%20Essential%20Movies%20to%20Watch%20First%20on%20the%20New%20Criterion%20Channel]] for the idea, of course!
A few recent and not-recent things (a tweet from an old friend announcing his vegetarianism, the "[[73 Cows|https://mailchimp.com/presents/film/73-cows/]]" documentary, reading about the bad things that happen to sea animals dealing with human-made trash, getting older, spending time with Roger the cat) are making me re-think whether I want or need to eat beef/bacon/chicken. (Inconsistently, I don't revere fish the same way, so I'm gonna keep eating them.) This Quartz essay about a [[philosopher who has been trying to answer the meat-eating ethics question|https://qz.com/1102616/an-oxford-philosophers-moral-crisis-can-help-us-learn-to-question-our-instincts/]] for years is the opposite of the hot-take blog post I've been running into. There are some logical frameworks behind this that are more nuanced than I can fully appreciate, but the interesting thing is that this philosopher realized that he eventually landed on intuition more than anything else: <<< He made his decision after reading a Boston Review article in which a Buddhist man describes humanely raising, then killing and eating, pigs. The descriptions portray the pigs as social, intelligent creatures, with pleasures in their lives and real relationships with humans. “There are these moments of insight where he says, ‘This seems wrong to me,’” said McMahan. “And then he just killed them.” Though he hasn’t finished thinking through the theoretical reasoning, one man’s description has persuaded McMahan that rearing and killing animals is not ethically permissible. Having started our conversation with McMahan stressing his willingness to abandon moral intuitions, we end it with his acknowledgment that, really, you can’t do moral philosophy without them. “Intuitively, whatever the arguments are, reading the article had that effect on me. I was so glad I read it,” said McMahan. “I thought, ‘Now I know.'” Our instincts can lead us astray. But nothing would truly matter were it not for our deeply-felt, potentially irrational, emotional responses. The problem that McMahan and moral philosophy must face is how to integrate such intuitions into a solid theory. And for those of us facing ethical decisions in everyday life, we must tackle the same potentially unanswerable questions as McMahan, testing both our intuitions and our logic. <<< The [[article about the Buddhist|http://bostonreview.net/arts-culture/jose-maceo-vega-frey-pigs]] has some vivid descriptions of a guy trying to raise and then kill pigs so he'd know what it was like to kill what he ate. I won't quote any of it because it's more than I can read twice, but it doesn't nudge me towards wanting to eat meat. I've been vegetarian a few times before and dropped it periodically. I'm not saying I'll never have a hamburger again, and it's probably mathematically silly to look at a pile of crispy, delicious bacon and think that my not eating a strip will have any material effect on the life or death of any future pig. But for now I don't have any taste for any of it like I used to. I can at least remove myself from the equation for a while. Really, it was that 73 Cows documentary that did it. I know it was probably meant to be emotionally manipulative, but it worked on me.
* Attempting to add to this wiki from my phone. * Seems to work a lot better in Mobile Safari than Chrome. * I’m sad that Americans are so desperate for a president who claims they’ll fix all of our problems that that becomes the bar by which every presidential debate is measured. Isn’t that how we got into this mess in the first place? * When am I going to get my shit together for this week? Emails and todo’s are spiraling out of control and I’m just going forward in whatever direction I’m pointed moment to moment.
* It's funny to watch how long people will stare at whatever I'm currently working on/writing/viewing on my screen when they come over to my desk to talk. LOOK AWAY. * My car is PAID OFF!!
* Catherine, it's so heart-warming to see a tiddler called "[[Zettelkasten|https://casualbedlam.com/#Zettelkasten]]" in your wiki. :) :) :)
If you want to transclude a tiddler and keep all the block formatting specified in that tiddler's tables, headings, and lists, use the ''TranscludeWidget'' and set the ''mode'' to ``block``, like this: ``<$transclude tiddler="Epson Home Cinema 2150" mode="block"/>`` Learned about it on the [[TranscludeWidget|https://tiddlywiki.com/static/TranscludeWidget.html]] page: <<< !! Parsing modes TiddlyWiki parses text in two modes: * ''inline'' mode recognises character formatting such as emphasis, links * ''block'' mode recognises all the ''inline'' formatting, and adds block formatting such as tables, headings and lists <<<
via GS from [[Why Being Bored Is Good — The Walrus|https://thewalrus.ca/why-being-bored-is-good/]] > Boredom is never just the property of imagination-poor teenagers or overimaginative philosophers. When we ourselves become the product we consume, the notion of work has decisively shifted. In the past, work was recognized for its colonizing power, expanding to fill and dominate time itself such that there might exist no clear line between work hours and nonwork hours. Our current condition is worse. The Interface, leveraging boredom, makes us all into unpaid workers for the advertisers who support those apparently cost-free platforms. We ought to recall that there is no such thing as a free transaction. In this species of transaction, you pay with your individuality, freedom, and happiness.
* I'm supposed to be doing a [[Weekly Review]] but I'm just reading about [[X|https://en.wikipedia.org/wiki/X_(American_band)]] and [[The Decline of Western Civilization|https://letterboxd.com/film/the-decline-of-western-civilization/]]. * What the hell is wrong with me that I haven't bought the first two X albums before now? Note to self: FLACs are on [[Bandcamp|https://xtheband.bandcamp.com]].
via [[@dancounsell|https://www.dancounsell.com/2019/06/30/if-you-cant.html]] from [[Jack White has never owned a mobile phone, and says people’s “addiction” is driven by “competition, voyeurism and jealousy” - NME|https://www.nme.com/news/music/jack-white-mobile-phones-gig-ban-addiction-interview-2511304]]: > “If you can’t choose to stop drinking for a day, it’s got that much of a hold on you, that’s a sad thing,” said White. “So the same thing with that, if you can’t just put that down for an hour and experience life in a real way, that’s sad. And it’s maybe even sadder that you had to be told to do it. That you didn’t naturally want to do it on your own.” I wonder what I would see if I could graph the number of creative projects I've done or been a part of since I first got an iOS device back in 2008, and compare it to all my years before then.
* Getting me to start a [[Weekly Review]] is like PULLING TEETH.
I'm trying to pay attention to a bunch of influences as they pop up, so I can remember how I got here. * 2019-08-07 Cal Newport on [[Dan Harris/10% Happier|https://podcasts.apple.com/us/podcast/188-digital-minimalism-cal-newport/id1087147821?i=1000439037079]] in May 2019 talking about Digital Minimalism * [[2019-08-06 Jack White has never owned a mobile phone]] * 2019-08-03 David Sparks on [[Mac Power Users #488|https://www.relay.fm/mpu/488]] mentions not using his phone for email and doing it only on his laptop. * [[2019-08-03 Why Being Bored Is Good]] So, I'm on Day 2 of: * Not using the phone for email. It's great. Laptop only. Faster, higher resolution, full keyboard, batch processing, less opening the same email over and over and not doing anything with it. More likely to actually see new things when I do drag the laptop out. More likely to deal with emails fully. Easier to unsubscribe. Easier to make filters to send newsletters to [[Feedbin|2019-01-16 subscribed to Feedbin]]. * Completely stopped using the phone while sitting in [[the smallest room in the house|https://www.goodreads.com/quotes/594343-i-am-in-the-smallest-room-of-the-house-i]]. (I know! TMI!) Huge amount of time saved. I will leave imagining other benefits as an exercise for the reader. Also: * Leaving the phone far away from me when we have coffee on weekend mornings, when watching [[Wimbledon]], when watching movies on [[The Criterion Channel]]. * Back to using the [[Forest]] app when my phone is beside me at work. Shocking how often it intercepts me.
Things I feel bad about, and worse about as time goes on: * Not having properly responded to the nice people who have written to me on their respective wikis * The copy of [[Under the Big Black Sun: A Personal History of L.A. Punk|https://www.goodreads.com/book/show/25898106-under-the-big-black-sun]] that I borrowed from a co-worker and haven't read * The copy of [[This Is All a Dream We Dreamed: An Oral History of the Grateful Dead|https://www.goodreads.com/book/show/23848110-this-is-all-a-dream-we-dreamed]] that I borrowed from a co-worker and haven't read * The copy of [[1491: New Revelations of the Americas Before Columbus|https://www.goodreads.com/book/show/39020.1491]] that I borrowed from my mentor at work and then she died shortly thereafter * The emails from current (living) mentors that I haven't responded to * Our basement of stuff * An old friend I re-connected with over email years ago and then he emailed me back and I let it languish * The last few unused frames of Fujicolor C200 in the [[Olympus Infinity Stylus]] * I hope [[Old School Photo Lab]] doesn't take my lack of fresh rolls personally. I haven't found a new lab. I just don't have anything to send yet. * Thank-you notes. So many unwritten thank-you notes.
* I finished an actual book today ([[The Gentle Art of Swedish Death Cleaning|book: The Gentle Art of Swedish Death Cleaning]]). I don't remember the last time I finished a book. * This whole not-using-the-phone-in-the-bathroom thing is becoming my competitive advantage. * I rather like Jack Baty's [[inline journal titles|https://rudimentarylathe.org/#2019.08.09%20-%20Journal%3A%20TiddlyWiki]]. * I wish the Screen Time thing in Catalina were available in Mojave. It'd be cool to limit myself to 20 minutes of [[Gmail]] a day. In the meantime, there's [[LeechBlock NG]].
<a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/48511458806/" title="An Event Apart mousepad"><img src="https://live.staticflickr.com/65535/48511458806_faed3ec7aa_z.jpg" width="100%" alt="An Event Apart mousepad"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> Ran across this in an old bag of AEA goodies. I forgot how nice it is to use a mousepad!
<<< smile at people, wave thanks to cars, say something nice, be generous with whatever you can - make a daily effort to plant seeds of positivity and also to plant literal trees bc DEATH LOOMS <<< [[Chelsea Peretti|https://twitter.com/chelseaperetti/status/1161294404872617984]]
* I love when I read the first two pages of this week's [[The Economist]] and some little blurb makes more sense because I learned something about that topic in last week's issue. It's also always enlightening in those pages to see how much more is going on in the world outside the U.S. than what rises to the surface of the headlines in other news sources over the past week. * How many more times will I need to click on the edit button of [[Most Recent Journal]] tiddler by accident before I move it down on the main page of this wiki? * Realized that I need to be able to spend time adding to and maintaining this wiki just a little every day in order to be happy. I feel all at sea if I don't get to roll around in it. * I would put more stuff on my Micro.blog hosted blog, but the more I put here, the less I have to worry about remembering where I put it. And the searching is so good in TiddlyWiki, too. * Heard old episode of [[Back To Work]] ([[#424|http://5by5.tv/b2w/424]]) where Merlin talked again about the importance of sleep and going to bed at a regular time, the surprising effects of keeping it going for a few nights in a row, and how alcohol can mess with all of it. I've heard variations of all this so many times and yet it'll never be enough. * Someone in this house spilled a glass of water on the rag rug in the living room, so we had to move the coffee table (that houses the projector) while the rug aired out. Therefore, no TV tonight, which was fine with me. It always makes the night longer!
from [[Have Smartphones Destroyed a Generation?|https://www.theatlantic.com/magazine/archive/2017/09/has-the-smartphone-destroyed-a-generation/534198/]] | The Atlantic > All screen activities are linked to less happiness, and all nonscreen activities are linked to more happiness. Eighth-graders who spend 10 or more hours a week on social media are 56 percent more likely to say they’re unhappy than those who devote less time to social media. Good stuff in here, although I don't trust the headline.
Josh, thank you for the [[TW link AppleScript|https://joshisms.io/#2019-08-11%20-%20Journal]]! I'm using it inside [[TextExpander]] via a really ugly chain of nested snippets that are triggered by a [[BetterTouchTool]] shortcut, but it works. I have the world's biggest running list of links-to-process in a file called ``buffer.txt`` that grows geometrically faster than I can deal with anything in it. Your script has already made things easier to get from there to here. Thanks again!
from [[The Amazon is approaching an irreversible tipping point - The Economist|https://www.economist.com/briefing/2019/08/01/the-amazon-is-approaching-an-irreversible-tipping-point]] <<< The Amazon is unique among tropical rainforests in that it produces a lot of its own rainfall. As moisture travels from the Atlantic to Peru, the Amazon’s trees recycle some of it; around half the forest’s rain is reused this way. Rainwater is pulled up from the roots to the canopy, where it is released back to the atmosphere to fall as rain again. Not only does this provide moisture to the region, the evaporation off the leaves also has a local cooling effect. This is what has led to worries about tipping-points. In an influential paper in 2007 Gilvan Sampaio and Carlos Nobre of Brazil’s National Institute for Space Research forecast that, were 40% of the forest to perish, the loss of water-recycling capacity would mean very little of the rest would have enough rainfall to survive. <<<
* I never regret listening to music in the car after I've done it, but it takes willpower to not just queue up the endless list of podcasts as soon as I get in the driver's seat. I'm in the middle of Sonic Youth's [[Daydream Nation|https://www.discogs.com/Sonic-Youth-Daydream-Nation/master/9768]], but the Spotify version //suuuuuuuuuccccckkkks// — even the "high-quality" mp3 they use. So I'm downloading the [[FLAC|2019-08-15 merits of different versions of Daydream Nation]] as we speak. Life is too short not to. ** And it sounds fantastic. I'm listening on wired earbuds as God intended. I feel pure gratitude. There's nothing like getting a stream of accurate numbers in both ears 44,100 times per second. ** That's the thing people don't get about lossy encoding. Even if it's throwing away "only" the low-level stuff that's masked, that you theoretically can't hear, the butchered and smeared end result is the loss of the glue that carries the peak of one wave to the trough of the next one. And with it, the joy of music that sounds like it was performed by humans. * In two hours, I'll be [[in the same room|http://www.jamesriverfilm.org/2019/06/sonic-youth-30-years-of-daydream-nation/]] as Steve Shelley. * The "New" tab in TiddlyWiki shows the owner's notes for the day. The "Recent" tab is like View Source for their brain. I always look at the "Recent" tab.
Well, you can't just go buy the first "Daydream Nation" FLAC you see. I didn't have even my own CD of this record (I have a cassette dub of my brother's CD), so it was time to fix that. From https://forums.stevehoffman.tv/threads/different-versions-of-daydream-nation.149640/ > The deluxe is a lot louder than the DGC CD, I personally prefer the DGC. I don't actually know which is better. But this Remastered edition //seems// less messed-with than the Deluxe Edition, which has a ton of extra tracks I don't want. And the Deluxe Edition seems newer, and newer typically means more compressed, so that's bad. So here's what I'm buying: https://www.onkyomusic.com/US/artist/sonic-youth/release/daydream-nation-remastered-original-album
* I would trade many things to lose the ability to hear a poorly-pressed LP drift in and out of pitch with every revolution.
* OK, [[Weekly Review]]. Let's try this again. * Just changed all the references to "Things 3" to [[Things]]. * I do wish [[Things]] had a way to do a fresh start like (I think) [[OmniFocus]] had when I used to use it. It would be great to dump everything out of it like pulling out a kitchen drawer and turning it upside down to empty it out, and then only put back the things I actually need. Alas, because of the cloud syncing and all that, I don't think they make such a process easy. I fear I would have to hard-delete everything and start all the way over, and I'm way too much of a data-hoarder to do that. * I can go without meat, easy. Beer, no way. * [[TiddlyWiki]] is such a great analogy for my life. Toiling in obscurity, scattered, content to stay out of the fray, [[out of step|http://minorthreat.bandcamp.com/track/out-of-step]] with the world, but deeply interested in those who do the same. * //I'm supposed to be doing a [[Weekly Review]] right now.// * Note to self: Doing a [[Weekly Review]] (1) at home, (2) at my desk, (3) with a large monitor and proper keyboard, (4) with more than 45 minutes to think, is the //only// way for me to do a weekly review. I don't know why I try to cram it into a lunch period more often than not. Having TiddlyWiki open while I do it makes it less productive, but a hell of a lot more fun. * All this reduced screen-time on the phone and reading more is helping tremendously with [[anxiety|2019-05-22 Journal: anxiety]]. There's less of a swirl of input and disjointed thoughts and more time to visit slightly deeper lakes of thinking. I'm not solving the world's problems or anything, but it's better than it was before.
* I noticed during last night's [[Weekly Review]] that when I flipped through previous [[bullet journal|2019-04-22 bullet journal experiment]] pages to migrate tasks forward, the number of completed and already-migrated tasks gave me a little boost. Like, "yes, I occasionally do accomplish or prune things". Haven't encountered that with all the many digital task-tracking tools I've tried. * This morning I was back down to the same weight I was when I started tracking weight again on 7/30/2019, after some upward zig-zagging in the meantime. Keep going. Salads work. * 30 years ago today I moved into the Virginia Tech dorms with my friend from high school. I've barely figured anything out since then.
1st and 2nd screens as of 2019-08-20. More thought was put into how to upload these screenshots than to which apps go where. Don't laugh at my [[Instapaper]]. [img width=50% [https://twelvety.com/philtiddlywiki_images/2019-08-20-screen1.png]] [img width=50% [https://twelvety.com/philtiddlywiki_images/2019-08-20-screen2.png]]
* I just checked my list of goals for this week and nowhere on there did it say "Research non-sealed audiophile earbuds".
* I can either go slowly insane from imagining music playing in a loop in my head while I work, or I can give in and play an actual album (FLAC) all the way through on headphones. * I want to be able to wear regular over-the-head headphones at work, but I'm too self-conscious about it and too vain (because it leaves a valley in my hair). The [[Sennheiser MX 365]]'s are great for being flat earbuds with a foam cover, but I'd rather have the few extra millimeters of buffer that real headphones give you. It's just unnatural to have drivers as close to your eardrums as they get with any kind of earbud. I've looked for behind-the-neck headphones and there don't appear to be any good ones for under $100. * Yesterday I cut holes in the centers of the foam pads on the Sennheisers so the drivers would have that much less standing in the way, obscuring the highs. It seems to have helped. Those earbuds are now tolerable through the [[Sony NW-A45 hi-res audio player]] + [[FiiO A5 headphone amp]]. * It's amazing how the ears adjust to any given pair of headphones/earbuds in just a few minutes. It appears to be better to pick a decent-enough pair and commit to it. * ...although I'm also looking at the [[Sennheiser HD 100]]'s, but those may have to be for home. They still have a headband.
* Up one whole pound this morning from yesterday. I shouldn't obsess about what I eat, but it is interesting how objective the scale is. And predictable. ** Not that this has anything to do with anything, but my first Impossible Whopper at Burger King last night was absolutely delicious. They have nailed it. It's a shame about the fries, though. * My eyesight is now at a point where I can't sit or stand close enough nor far away enough to clearly see my monitor at work. Maybe they have near-field progressive lenses I can get for working at a computer? * It poured for an hour tonight, and the basement flooded, again, in parts. And again, we Shop-Vac'd the water. It wasn't as bad as it was a couple of weeks ago, but it would almost be a relief if everything besides the hot water heater would just get ruined enough to throw away and be done with. There are boxes down there we haven't opened since we moved in nine years ago. * I should just [[take DEVONthink out of the rotation|https://rudimentarylathe.org/#2019.08.22%20-%20Journal]] like Jack has, but that would imply that I've used it enough to take it out of the rotation. Maybe I should come to grips with the fact that I admire and appreciate DEVONthink as a tool, but I don't launch it enough to say I "use" it. Maybe that means it hasn't earned its place? * This would be feature-creep, but I would really like it if [[Micro.blog]] had a "lists" function like Twitter does. I keep following nice and interesting people on there, but every new person I add makes it less likely that I'll see updates from the core groups of old friends I really want to keep up with there. A "list" could serve as a nice way to zoom in on what nerdery is being discussed within a small subset of folks.
* Just turned my regular hosted [[Micro.blog]] feed back on as the source for my timeline. The filtered feed I was sending was nice, because it allowed me to pick and choose which things would flow through, but it caused problems when I included images or hyperlinks. I don't think I'm in danger of polluting the public timeline anytime soon. * Just googled ``bbedit org mode``: [img[https://twelvety.com/philtiddlywiki_images/2019-08-23-bbedit-org-mode.png]] * I think if I had about 5–6 hours of uninterrupted non-working alone time with my laptop every day, I could do all the stuff I want to do, which would mainly involve just logging things and moving things around. It wouldn't even be making anything new. So it's probably good that I don't have that. * I did get a chuckle out of Jack's blog being in two out of three of the results for the Google search above. I had had a random thought about how much I had forgotten I liked [[org-mode]] (prompted by [[Jack's link|https://jackbaty.tumblr.com/post/187189524227/uses-this-paul-ford]] to the [[Uses This - Paul Ford|https://usesthis.com/interviews/paul.ford/]] piece), but I was always butting heads with [[Emacs]]. And I thought it would be so nice if [[BBEdit]] could handle org-mode, but I didn't find any leads. Maybe I'll cheat and try [[Spacemacs]]?
I found this [[Reddit thread|https://www.reddit.com/r/getdisciplined/comments/1q96b5/i_just_dont_care_about_myself/cdah4af/]] about five years ago. I don't remember who pointed me to it, but this particular answer from [[ryans01|https://www.reddit.com/user/ryans01/]] has echoed in my brain ever since. I periodically re-read it when I feel like I'm going through stretches without accomplishing anything: > Rule numero uno - There are no more zero days. What's a zero day? A zero day is when you don't do a single fucking thing towards whatever dream or goal or want or whatever that you got going on. No more zeros. I'm not saying you gotta bust an essay out everyday, that's not the point. The point I'm trying to make is that you have to make yourself, promise yourself, that the new SYSTEM you live in is a NON-ZERO system. Didnt' do anything all fucking day and it's 11:58 PM? Write one sentence. One pushup. Read one page of that chapter. One. Because one is non zero. You feel me? When you're in the super vortex of being bummed your pattern of behaviour is keeping the vortex goin, that's what you're used to. Turning into productivity ultimate master of the universe doesn't happen from the vortex. It happens from a massive string of CONSISTENT NON ZEROS. That's rule number one. Do not forget. Also, this part: > Last rule. Rule number 4, is the easiest and its three words. exercise and books. that's it. Pretty standard advice but when you exercise daily you actually get smarter. when you exercise you get high from endorphins (thanks body). when you exercise you clear your mind. when you exercise you are doing your future self a huge favour. Exercise is a leg on a three legged stool. Feel me? As for books, almost every fucking thing we've all ever thought of, or felt, or gone through, or wanted, or wanted to know how to do, or whatever, has been figured out by someone else. Get some books max. Post to reddit about not caring about yourself? Good first step! (nonzero day, thanks younger me for typing it out) You know what else you could do? Read 7 habits of highly successful people. Read "emotional intelligence". Read "From good to great". Read “thinking fast and slow”. Read books that will help you understand. Read the bodyweight fitness reddit and incorporate it into your workouts. (how's them pullups coming?) Reading is the fucking warp whistle from Super Mario 3. It gets you to the next level that much faster.
* We went on a low-stress urban hike around Belle Isle just now. Those outings, and the changing light, never fail to get me thinking about the idea (and ideal) of "One Camera". Do I already have it and not know it? It would need to be unassuming enough to grab for any situation, with one versatile lens, but also good enough to where it didn't feel like it was filling the everyday/everywhere role just because it was easy to carry. I don't need this right now, but I imagine I do. I'll just quickly check for [[one of these|Olympus Zuiko 35mm f/2.8 OM-mount prime lens]].
I've been listening to the podcast version of this Jack White interview (with Larry Crane) in Tape Op from 2011: https://tapeop.com/interviews/82/jack-white-iii/ > JW: When I designed my studio I made a rule that no one is allowed to surf the Internet in there. You have to be part of it! There's no walking away; we're all here and we're all working. We're all part of every moment of it. > > LC: What about cell phones? I feel clients have become distracted with them while I'm working. > > JW: Well, I don't own one so there's your answer! [laughter] You really have to get out of that mindset. There's nothing worse than working in the studio and you come around and everyone is on laptops or cell phones and no one even heard what you recorded. Then you're not working on something together, you're just doing it piece by piece.
* Try as I might, I just can't get away from having/making/using a straight, dumb bulleted list of tasks for the workday. I include minimal info about which project is associated with each task, and it turns out to be enough. But attempting to add searchable checkboxes to tasks under separate project headings is too much for me to navigate throughout the day. If I do that, I don't trust it and I go blind to it all. I end up not knowing what's "now" and what's "next", hour-by-hour and minute-by-minute. It just has to be a super-fast, super-dumb list for me to stick with it, even if that list is messy and imperfect. I have to be able to slide the Very Next Task up to the top of the list for my brain to relax and let go. * The [[2019-08-27 Jack White in Tape Op]] thing is becoming a problem/blessing. Because life is short, here's the plan: Eventually, in the basement, set up (on the IKEA desk) the [[Tascam TSR-8]], [[Nakamichi DR-3]], [[Mackie MS1202]], [[Moog Mother-32]], monitor speakers, and [[Focusrite Scarlett 2i4]]. Regular basement dust is less harmful than the cat litter dust upstairs, so stop beating my head against the wall and just use the voluminous space in the basement as long as I can find a lightweight dust-proof cloth I can drape over everything between working sessions, and then pull it off of all the gear in one motion (like a magician) when I'm ready to use it again. All that equipment wants to be together and it's too much for the smaller desk upstairs, and cat litter dust is death for anything with wheels and belts and gears and oil.
* What list did I put "Replace gutters" on? A Someday/Maybe in [[nvALT]]? A Google Doc shared with Sarah? A page in an old paper journal? God forbid it's in a mindmap somewhere. * Even the law enforcement dudes know I sit in the same seat at lunch every day. * I would like to start learning Spanish in order to speak more easily with a bunch of people at work, and because it would just be cool, but now is not the time. Needs to be one of those backlog projects until the porch steps are replaced. I need a project manager for my life.
* The [[Koss KSC75 headphones]] mounted on the cheap headband from Parts Express are a DELIGHT. I feel like I have tiny speakers on either side of my head. And I can //feel// the vibrations of music on the outside of my ears again. * I turned off all the sharing/social stuff in my Spotify account. It's somewhat interesting to see what friends of mine are listening to, but overall the whole aspect of broadcasting a track-by-track status of your listening is corrosive (for me). And it makes playing music on the [[Sony NW-A45|Sony NW-A45 hi-res audio player]] feel like it doesn't "count", which is precisely wrong. Who on earth gives a shit what's in my current queue? Who was I trying to impress? Can't listening to music just go back to being a non-performative pleasure for its own sake? How about this for a radical idea: If I have a band or an album I want a friend to know about, //I can tell them in person or email them.// * It's eternally shocking how the [[2019-04-22 bullet journal experiment]] is (1) still going, and (2) single-handedly tricking me into journaling at a level and with a frequency I never thought possible. Weaving together the lightweight and unintimidating micro-logging of "what is happening right now" with a continuously-unfolding task list is the secret recipe to making me stick with it. It's like the difference between fitting journaling into life, and fitting life into journaling. * Sometimes even supposedly emotionally "intelligent" people screw up.
https://css-tricks.com/dont-overthink-flexbox-grids/ Chris Coyier to the rescue again. Found after googling "3 column flexbox".
* Well one really good goddamn reason to keep your tasks in plain text files is that when you get off your ass and pick a creative project back up //four years later// you have some prayer of getting a hit in the Finder and seeing where you left off. * Podcasts about anything other than audio archiving and production are having to fight for a spot in the [[Castro]] queue. * Ooooooh. I either forgot or never realized that the ``[[note filename]]`` construct in [[nvALT]] caused it to treat whatever was in the brackets as a search term, and thus can be used to link straight to other notes but without having ugly filesystem-dependent hyperlinks. It even auto-completes possible note filenames once you start typing the first two left brackets. I could use this to keep individual projects in their own text files, but have meta-lists of Current or Backlog projects that link to those individual files. Oh wow.
Changed the [[Backlinks footer]] so that individual backlinks are each on their own line instead of separated by `` || `` and being a single-line indecipherable mess. Man, why didn't I do this a long time ago?
!! Drivers !!! Milwaukee https://www.homedepot.com/p/Milwaukee-M18-18-Volt-Lithium-Ion-Brushless-Cordless-1-4-in-Impact-Driver-Kit-with-Two-2-0-Ah-Batteries-Charger-and-Hard-Case-2850-22CT/305968526 !!! Makita https://www.homedepot.com/p/Makita-18-Volt-LXT-Lithium-Ion-Cordless-1-4-in-Compact-Impact-Driver-Kit-with-Two-2-0-Ah-Batteries-Rapid-Charger-and-Hard-Case-XDT11R/206025687 * ''2019-08-31 Ordered this one'' from Home Depot to pick up today. > The XDT11R has the variable speed controlled by the trigger, from 0-2,900 RPMs. You can regulate the torque by trigger feel only. If you are looking for better torque control, you should upgrade to the Brushless, XDT14Z model. It has a 3-speed power selection switch that provides precise fastening control for a wide range of applications. !! Bits !!! Milwaukee https://www.homedepot.com/p/Milwaukee-SHOCKWAVE-Impact-Duty-Driver-Steel-Bit-Set-50-Piece-48-32-4024/301024189 https://www.homedepot.com/p/Milwaukee-SHOCKWAVE-IMPACT-DUTY-Driver-Bit-Set-44-Piece-48-32-4067/302045936 https://www.homedepot.com/p/Milwaukee-SHOCKWAVE-IMPACT-DUTY-Driver-Bit-Set-40-Piece-48-32-4022/301024174 !!! Makita https://www.homedepot.com/p/Makita-Impact-Gold-Steel-Driver-Bit-Set-26-Piece-B-46919/206284602 * ''2019-08-31 Ordered these'' from Home Depot to pick up today. !! Articles https://www.finehomebuilding.com/forum/impact-driver-vs-drill-for-deck-screws <<< An impact driver for deck screws is the best thing you will do for your wrists. I have several impact drivers, a Panasonic and a Makita, and when installing decking, I alternate drivers with the chargers cooking the batteries. <<< <<< My Makita 12V impact driver usually just chews up the phillips driver bit, I've never had one shatter. Had a few screw shanks snap, though. As an aside, I've found that the torx recess (also called star drive) screws are the best with the impact driver. No cam-out at all. <<< <<< Got a Bosch 14.4 impacter. Couldn't believe how great it was and bought a second one. <<< <<< The impact driver hammers it in as it spins. Almost no torque is transmitted back through your wrist. The hammering also helps to keep the screw driving bit locked to the screw. <<< https://www.washingtonpost.com/news/where-we-live/wp/2016/10/04/why-an-impact-driver-should-be-among-your-top-five-tools/ <<< My favorite impact driver is made by Milwaukee. It’s got a brushless motor, a 1/4-inch hex drive and three torque settings, the latter of which range from 200 to 1,600 inch-pounds of torque. <<< <<< The hex drive system allows you to use the tool with any number of fasteners. Imagine if you need to drive Phillips-head screws. How about hex-head screws? Do you have to drive Torx screws or square-drive fasteners? Each of these can be expertly driven into wood, steel or any other material with precision using a high-quality impact driver and an assortment of hex-shaft bits. <<< <<< When using an impact driver, it’s really important that the bit you’re using is a perfect match for the fastener. If there’s the smallest amount of slop in the fit, either the bit or the fastener will almost always get rounded and ruined as the tool spins rapidly while the fastener doesn’t. <<< https://www.finewoodworking.com/forum/do-i-really-need-an-impact-driver <<< An impact driver is a waaaaay different tool than an ordinary driver/drill, IMHO. In many cases, it can eliminate the need to drill a pilot hole (though if wood splitting is a hazard, that still needs to be done). It drives screw very quickly and cleanly, leaving the head in good shape. Another benefit is how much easier it makes it to dismantle something -- a structure that's been exposed to moisture, screws might have rust, impossible to get apart with a regular driver, zips apart quickly with an impact driver. You may find you like it better for the lag bolts, too. I've not gone there yet, so no opinion. <<< > I also use it often and almost daily around the shop on something. If I did a lot of decks.. etc. I would opt for the larger 18 V or a 1/2". BTW... the Makita is everything people say about it with the Lithium batteries.
I really needed a short list like this: https://www.johndcook.com/blog/2017/08/09/selecting-things-in-emacs/ |''Unit''|''Command''|''Key binding''| |word|mark-word|`M-@`| |paragraph|mark-paragraph|`M-h`| |page|mark-page|`C-x C-p`| And don't forget that `C-g` will cancel the selection.
* Oh man. I just looked //again// for Markdown-based outliners, and there just aren't any good ones. I haven't seen anything that comes close to what Emacs can do with outlines in [[org-mode]]. So I'm trying to get back into it, and learn the proper ways to select text and navigate headings and subtrees. Shift-selecting text is going to have to be something I let go of if I want to use Emacs and org-mode properly. Must learn the canonical ways. Not that I have time to do this right now. Sarah just looked over and asked what I was doing and I told her and she said, "Well, you can't help but have 10 things going on." :/ * But it is Labor Day weekend, so no time like the present! * Shit, just five minutes ago I was obsessed with audio archiving all over again. How did [[Emacs]] worm its way back in? * Dang, [[Sacha Chua|https://sachachua.com/blog/2019/08/weekly-review-week-ending-august-23-2019/]] goes //all in// with making her [[Weekly Review]] results public. * [[Non-zero day log 2019]], you are a cruel mistress.
https://www.gnu.org/software/emacs/manual/html_node/emacs/Moving-Point.html God help me I just tried `C-f` and `C-b` and they felt weird at first and then I tried using them after the cursor keys and I now I understand why the cursor keys feel "slow". |`C-f`|Move forward one character.| |`C-b`|Move backward one character.| |`C-n`|Move down one screen line. This command attempts to keep the horizontal position unchanged, so if you start in the middle of one line, you move to the middle of the next.| |`C-p`|Move up one screen line. This command preserves position within the line, like C-n.| Etc.
https://orgmode.org/manual/Checkboxes.html
https://sachachua.com/blog/2008/01/outlining-your-notes-with-org/ Oh my god there is so much good stuff here. |Command|Key binding| |create a new headline at the same level as the one above it, or a first-level headline if the document doesn’t have headlines yet|`M-RET`| |Move a subtree up|`M-up`| |Move a subtree down|`M-down`| |Demote a subtree|`S-M-right`| |Promote a subtree|`S-M-left`| |Demote a headline|`M-right`| |Promote a headline|`M-left`| |Collapse or expand a subtree (while on headline)|`TAB`| |Collapse or expand everything|`S-TAB`| |search forward|`C-s`| |search backward|`C-r`| |open at point (open a link/search)|`C-c C-o`| Hyperlinks: > You can also use hyperlinks to keep track of your current working position. For example, if you’re working on a long document and you want to keep your place, create a link anchor like `<<TODO>>` at the point where you’re editing, and add a link like `[[TODO]]` at the beginning of your file. See also: [[2019-09-01 org-mode checkboxes]]
2019-09-02 Projector worked fine earlier today. Now when I turn it on, there's no display (lamp isn't lit) and the fan goes full-speed after less than a minute. """ Power light = off Status light = flashing blue Lamp light = orange Temp light = off Per the owner's manual: """ <<< Lamp or lamp cover has a problem * Check to see if the lamp is burned out, broken, or installed incorrectly; reseat or replace the lamp as necessary * Check that the lamp cover is installed correctly * Clean or replace the air filter * If operating the projector at high altitude, turn on High Altitude Mode * If the problem persists, unplug the projector and contact Epson for help <<< Tried a different power outlet. Vacuumed air filter, it's fine. Removed lamp, it looks fine. Reseated it. Still no picture, still the same status lights as listed above. Started a support ticket online with Epson. ----- 2019-09-03 Called Epson after getting an email from a tech support rep with instructions about how to start an exchange. For all the horror stories I read about Epson support, the person I got was ready to help and took care of all of it in 10 minutes. New unit should be here on Thursday or Friday and then I'll send the bad one back to them.
* I realized yesterday that this wiki instance has now been around long enough that it was extremely helpful this past weekend when I wanted to get back into [[Emacs]] and [[org-mode]]. With a couple of quick searches, I could see what I had learned and when, and I was reminded of all kinds of helpful things I had picked up back in February (and then had forgotten in the meantime). But also, how many different lists of the same keyboard shortcuts do I need? At least a few. ** [[2019-02-03 OrgMode keyboard shortcuts]] ** [[2019-09-01 Sacha Chua: Outlining Your Notes with Org]] ** [[2019-09-01 John D. Cook: Selecting things in Emacs]] * Now if only I had referred to it as "org-mode" everywhere instead of "OrgMode" and "Org Mode".
* I was thinking I needed a nice [[org-mode]] editor on iOS and re-found the [[Beorg app]]. But maybe I don't really need that as much as I think I do. Maybe I should avoid opening org-mode files on the phone and that will force me to open them in [[Emacs]] more often, which is where they want to live anyway, and where org-mode is the most fluid and powerful. * Why do I only ever get 5- to 10-minute windows of time to organize my thoughts? * Omni has a [[new album|https://omniatl.bandcamp.com/album/networker]] coming out on Nov. 1! * Is the non-functioning [[Dual 1219]] psychically weighing me down? Am I just an audio equipment hoarder?
A whole universe unto itself. Extremely powerful. from https://orgmode.org/manual/Motion.html |`C-c C-j`|(org-goto)| Jump to a different place without changing the current outline visibility. Shows the document structure in a temporary buffer, where you can use the following keys to find your destination: |`TAB`| Cycle visibility.| |`DOWN / UP`| Next/previous visible headline.| |`RET`| Select this location.| |`/`| Do a Sparse-tree search|
Ohhhhhhh. Much easier than collapsing, cutting and pasting to move [[org-mode]] subheadings to other headings. https://orgmode.org/manual/Refile-and-copy.html |`C-c C-w`|(org-refile)|Refile the entry or region at point.|
Jack, thanks for your [[note|https://rudimentarylathe.org/#2019.09.04%20-%20To%3A%20Phil%2C%20Org-mode]]! (And thanks for reading, in general.) Yes, my whole renewed interest in [[Emacs]] and [[org-mode]] has caught me a little by surprise. Other than a dalliance with [[VS Code]], I don't know why I ever stopped. But that's how I do with a bunch of things. One thing knocks me off track and then I get back on the trail months later. I appreciate your gentle reminder to not get too far in over my head. It really can be too much all at once, but when I see those videos of people hopping around and doing tricks with text that I don't understand, it can also be so enticing. You nailed it with "the joy of using Org-mode". Besides the utter speed and precision, one of the most alluring things about it is that I can //think// and spill out details in the midst of tasks or outlines and not worry about it. I'm not likely to lose any notes or forget they're in there like I can with other apps. And I don't have to do anything extra to reveal all that detail again when I'm ready to see it (other than hit `TAB`). [[TaskPaper]] is elegant and was the closest I ever got to that idea, but org-mode is the only thing I've seen that looks good and allows freeform writing inside an outline structure, and also imposes no penalty for a giant file. It's so easy to go from an exploded view to a collapsed view to that one tiny piece you know is buried in there somewhere. I know you know all that, though. But it's great to know that you're cheering me on. I'm gonna check out [[organice]] next. Thanks and take care, Phil
* Sarah is out tonight, so I'm sitting here drinking beer, eating pizza, watching [[2019-02-06 Video: Carsten Dominik on Org-mode at Google]]. Let the staycation begin!
* OK, new rule: I have to match each hour of reading about [[org-mode]] with actually //using// org-mode for something real.
* Man, if [[Dropbox Paper]] had the smart hiding/collapsing/finding/expanding of headlines that [[org-mode]] does, and if it could also handle mega-giant outlines, I would probably end up using it instead (and periodically exporting to [[Markdown]] for safety). (BLASPHEMY!) It's so good. But I'm only going to use it for individual projects where I need to embed images amidst text, and luckily, that's rare (like when rebuilding steps). And I'll enjoy every second!
from https://busterbenson.com/blog/2017/05-28-seek-endarkenment/ <<< If enlightenment is the desirable end state where everything has been brought into perfect clarity, endarkenment is the moment when we become comfortable in the darkness, in the lack of perfect clarity, when we’ve realize that we’re moving backwards, that we were wrong about a whole lot of things. Where we open our pupils, exposing ourselves to possible additional damage, but even so confidently seek the help of others because we need them. Even with everything going on in the world with Trump, and hate, and backwards progress, in the spirit of seeking endarkenment I feel like my only path forward is to accept that we messed up. We became so obsessed with progress, and advancement, that we didn’t get everyone on the wagon. Not by a long shot. A huge chunk of the world isn’t progressing, isn’t advancing, even amongst the people we have around us, and it’s our fault for leaving them behind. ''Instead of spending hours every day reading about the latest terrible thing Trump has done, let’s instead start thinking about how we begin to include the people who have had the same salary for 20 years, even while everything has gotten more expensive and more inaccessible.'' Let’s seek endarkenment on this and see where it goes. <<< Emphasis mine
* We worked on our porch steps yesterday and made a wrong move that required a trip to Patient First. Everyone is ok, but moments like that — literally dropping everything to get in the car really fast — have a way of suddenly focusing the mind (of course), and for me, make obsessing over [[bullet journaling|2019-04-22 bullet journal experiment]] feel like an inordinate waste of time and priorities. I know I love to wade around in minutiae and will pick it all right back up tonight, but, hoo boy. * One of my favorite things about [[TiddlyWiki]] is that any one tiddler could be a super-high-level bird's-eye tiddler encompassing a bunch of others inside it, or it could be the most atomic low-level tiddler that supports a bunch of others, or it could stand on its own, sitting dusty and forgotten in a corner until it's popped open again and refreshed. * Did not expect to turn the [[Continuous Publishing]] tiddler into its own blog entry, but that's how this works!
This will do nothing but: * Connect to the local network * Use [[Volumio]] to read [[FLAC]] files straight off the RPi 3 B+ attached drive (or the [[Plex]] server running on that box) * Send decoded audio via an I2S audio HAT with S/PDIF coax to the [[Schiit Modi 2 Uber]] DAC. Not using USB because apparently using an I2S HAT with S/PDIF takes some load off the RPi processor. Shopping list: * Raspberry Pi 3B+ or 4B ** I always believe in buying the newest kind of computer, which would be a 4B, but in this case, the server with all the files is a 3B+, so does it really even matter? Probably not, but if I want to be at all forward-thinking, I should just get the 4B. Maybe I'll eventually get some DSD decoded files to play through it. ** A-ha! The RPi 4-compatible version of Volumio just came out as an [[experimental build on 2019-07-13|https://forum.volumio.org/experimental-volumio-build-for-raspberry-t12640.html]]. That's too green for my blood, so I'll go with an RPi 3B+: [[https://www.adafruit.com/product/3775]] * [[JustBoom Digi HAT]] for S/PDIF out: https://thepihut.com/products/justboom-digi-hat based on these articles: ** https://darko.audio/2017/08/a-better-sounding-raspberry-pi-with-justbooms-digi-hat/ ** http://archimago.blogspot.com/2018/12/measurements-justboom-digi-spdif-hat.html * heatsinks: Had a spare pair of these lying around from when I ordered one too many last year! https://www.amazon.com/gp/product/B018BGRDVS/ * power supply: ** https://thepihut.com/collections/raspberry-pi-power-supplies/products/raspberry-pi-official-universal-power-supply-5-1v-2-5a-black * microSD card for OS: https://www.amazon.com/gp/product/B06XWN9Q99/ * cheapo RPi UPS * case: https://thepihut.com/products/justboom-dac-hat-case-red-laser-cut ** This is ''not'' the correct case for my JustBoom Digi HAT. I didn't know it at the time. This is the case for the JustBoom DAC HAT, which is similar, but not exactly right because of the difference between RCA jacks and Toslink jacks. No big. A Dremel will fix that. * decent S/PDIF coax cable: https://www.amazon.com/gp/product/B01D5H8TS4/ ** Upon receipt, this is a ''very'' nice cable. Dang.
* I have now gone over 48 hours without putting anything in the [[bullet journal|2019-04-22 bullet journal experiment]]. Ryder Carroll says to just pick up wherever you are, but I can't work like that, so I want to "catch up", which is my whole problem. * Ryder Carroll also describes the notion of "Break-Sprints" in [[The Bullet Journal Method|book: The Bullet Journal Method]], where you get a rush from doing a short little project that you can start and finish when you've hit a wall or lost steam with whatever likely more important, long-term project you should be working on. Break-Sprints are pretty much all I ever do, and I just chain them together. See: [[2019-09-11 Volumio Raspberry Pi]].
* At lunch/dinner tonight, we saw a lady at a nearby table using a ThinkPad. I couldn't see what OS was running, but I told Sarah of my longstanding craving to get one, //just because//. I don't actually need one. I have a million more projects I'd rather get to first (and spend money on first) before buying one and putting Linux on it, but boy does it look like a nice device.
* One by one, I'm knocking out all the tiny little tweaks that have been bugging me in my [[Emacs]] setup. Ahhhhhhhh. * There was no massive outpouring of grief for Eddie Money's passing. I just did my part on [[Micro.blog|https://twelvety.micro.blog/2019/09/14/two-eddie-money.html]]. I can attest that for a drummer, "Two Tickets to Paradise" is one of the top 5 funnest songs in the world to play. * It's amazing how a few minor tweaks to [[Emacs]] can make it blossom into what feels like your very own text editor. Now I just have to keep my curiosity about [[Helm]] at bay until I can get a handle on the basics in front of me. * I pulled off all the treads from our fucking front porch steps this afternoon. There's no way I'm going to let them win after the injury to Sarah's finger. Putting on the new boards tomorrow will be the relatively easy part. I have a Makita impact driver and I can do this. * Now that I'm in [[Emacs]] more often, there's less friction and I feel [[Org-Journal]] trying to sink its hooks into me and lure me away from [[Day One]], but aiiiiiiigggggghhhhhh. Whyyyyyyy. * My experiment with using the iPhone (and not reading anything printed) all week while using the smallest room of the house during this staycation has resulted in me knowing too much about what's going on in the world, wasting time, feeling less relaxed, and dumber. So, that's a data point. * It's been so long since I did a proper [[Weekly Review]] that I've built it up in my head as a monster I can't slay. I don't know where to start, and I'm afraid something awful will rear its head if I crack open the Rhodia and calendar and try to figure out what's going on for the next week.
https://orgmode.org/manual/Plain-lists.html I could just quote the whole page, but the part about turning a plain list item into a headline with `C-c *` is really great.
* I'm moonlighting this week as a front-porch-staircase carpenter. I'm learning with each riser and tread how to do the next row better than the last. Gives me a whole new appreciation for that craft, and there is nothing like stepping on a solid new tread where there was only rotten wood before. * Day 3 of "Just What I Needed" by the Cars on continuous loop in my aurally hallucinatory brain. Sad about Ric Ocasek, but also newly sad about Benjamin Orr (and he's been gone since 2000). * Keeping an undifferentiated mess of events, deadlines, reminders, tasks and projects in [[Google Calendar]], [[Reminders]], [[Things]], [[org-mode]], a [[Field Notes memo book]] //and// a [[Rhodia Webnotebook]] is just no way to run one's life, no matter how nice each individual tool is. But here I am. And don't even get me started on where I put things after they happen.
* Every time I get close to ditching [[Day One]] in favor of simplifying and using a text-only journal/diary, I randomly run across a long-forgotten Day One entry with a photo and a paragraph about a moment or a day, and then I'm reminded of how those two things add to each other. * Any heavy rock/metal album that's engineered and produced in a way that's cleaner than "A Light in the Black" by Rainbow is recorded wrong if you ask me. I think recording technology may have peaked in 1976.
* Jack, what on earth does [[this mean|https://rudimentarylathe.org/#2019.09.19%20-%20Journal]]? ''"Lit a match this morning and held it up to my process/system/workflow."'' Your nerdiest readers are curious and honestly can't wait to find out in case we learn something. I remember that a few years ago, when I was still on [[OmniFocus]] and a good friend texted me to say he was ditching OF to move all of his project/task planning to [[Evernote]], we had to have an "emergency call" to discuss what it all meant and how he had gotten to that point. Our wives thought that was hilarious. * I FINISHED REBUILDING OUR FRONT PORCH STEPS TONIGHT. Until today, I have never made something that big and sat on it and drank a beer. It's pretty good, even though I'm far, far from being a "craftsman". * I have determined that either something is wrong with the [[Spaceline]] package, or Emacs on Mojave, or my perennially messed up [[Emacs]] install in general, and I'm gonna try [[Christian Bäuerlein's customized Dracula theme]] instead and see how far I get. * [[org-mode]] is //so good// for keeping a bunch of random half-thought-out shit in a giant file that you can pick right up with whenever you want, but when you first open it, it looks all calm and unassuming. //Swoon//
Jack, thanks for the [[thoughtful reply|https://rudimentarylathe.org/#2019.09.20%20-%20To%3A%20Phil%2C%20Re%3A%20lighting%20matches]]! I am always here for the ramble. I periodically feel the electronic fatigue, too, and have the urge to go all-paper every so often. After all, if it was good enough for every human before personal computing was a thing, what makes me so special? But then I learn some new [[org-mode]] trick I didn't know about and Pandora's box opens and down the rabbit hole I go. As much as we like to //seemingly// randomly refactor our setups, I think that occasionally flipping the table and picking up the pieces that work in the moment is a good thing. I think of it like emptying the fridge of moldy food. I have to do the same with old, neglected project "content" in whatever system(s) I'm using. But I also have to go one level higher every so often (yearly? twice a year? quarterly?) and toss out the platforms and systems themselves and keep what works, or at least whichever is the now most interesting and full of promise. I'll never find the One True Way, but it's fun to keep trying. I'll watch and read along as you figure it out again!
* Just back from an overnight end-of-summer cookout in D.C. I think I-95 may have finally jumped the shark, and I don't know if driving it is worth it anymore. I think we'll do the train+metro next time. * It's one thing to read about the [[org-mode]] table editor, but it's another to actually try it. It's spooky effective.
* I'm still not sure if [[org-mode]] is going to store what I'm actually "doing" or just what I hope to do eventually. I think it's going to be both, which will be gloriously confusing. Hopefully, I can steer it clear of one-off quick tasks that aren't tied to a project. Those should really stay in the [[bullet journal|2019-04-22 bullet journal experiment]]. * If I wait until things are "calmer" before I start learning Spanish, I'll be waiting a long time.
"Journaling" is a loose term for all the ways I log stuff. I'm trying to figure out which systems are best suited for: * things I don't want to forget * things I want to remember * things I want to be able to find if needed * moments and mindsets I want to re-visit * lessons learned Some systems are good at more than one, based on how easy they are to capture to or retrieve from, how much they surface related entries, and how private or public they are. BTW, during the course of writing this, I ran across this where I was collecting and thinking out loud: [[2019-01-22 keeping a daybook journal]].
This is the only article I've seen that goes into this much detail. This is a lot more tangible to me than just "aid to Ukraine": https://www.washingtonpost.com/opinions/this-isnt-just-another-spat-trump-compromised-our-security-for-his-gain/2019/09/24/b3eb24ae-df09-11e9-be96-6adb81821e90_story.html <<< Forget the political jousting between Trump and Biden, and consider the Ukrainian soldier in the field fighting to save his country. He has a nightmare communications problem because he can’t talk reliably with his commanders. Russia has been hacking or jamming Ukrainian military communications since it seized Crimea and began supporting the separatists in 2014. The United States wanted to help fix this battlefield communications disaster. One item in the $391 million package Congress appropriated is a secure system made by L3 Technologies, a unit of Harris Corp., that could allow the Ukrainians to maintain contact despite Russian interference. The L3 equipment was ready for delivery in July when the company was told no, there was a hold, the equipment couldn’t be shipped, according to a congressional source. L3 and other companies supplying Ukraine contacted leading Republican members of Congress, such as Sen. Lindsey O. Graham (S.C.) to find out why there was a delay. The members of Congress made inquiries and learned that the Office of Management and Budget had stopped the shipments, on orders of the White House, to conduct “due diligence” about corruption and the newly elected Zelensky, according to one knowledgeable source. But Graham warned the White House: “You can’t send a signal that we’re going to back out of the deal,” the source said, adding, “It’s one thing to do ‘due diligence’ and another that we’re changing our posture.” These national security arguments eventually prevailed, and the Ukraine assistance was finally released on Sept. 11. <<<
* I'm glad to see [[Jack is trying Dracula|https://rudimentarylathe.org/#2019.09.24%20-%20Journal]]! It's lovely, especially with [[org-mode]] document titles. Only thing I don't like about it is the default garish yellow that creeps into Lisp code. * Life would be a lot easier if I could just have my Mac on at work all day with my main [[org-mode]] document open.
* A quick search of "org-journal" in this wiki will reveal all the times I've mentally gone in circles about formatting and dates and what I'm doing this for. Anyhow, here's what I'm thinking about [[Org-Journal]] today: ** Do I want to be able to reconstruct a day, or all the entries for a particular restaurant, or a particular doctor/vendor, or a beer, or whatever? Seems like the desired end result should dictate how I structure this mess. ** What about encryption? All these files are just plain text right now, but I'm torn between the security of encryption and the danger of losing access to things if I lose the key. ** What about the paralysis of knowing where the "proper" place is to put a thought/event/detail? ** I know this is all a self-inflicted, optional dilemma. ** This is totally what [[Memacs]] is made for, but I don't know if I want to go down that rabbit hole.
* Ordered an [[Olympus Zuiko 35mm f/2.8 OM-mount prime lens]] from a camera store online today. I'm not saying where, because I don't want to jinx it until I know more about it. There was no information about the condition of the lens, but the price was so good I couldn't afford not to order it. Sometimes I need to buy something I //don't// actually need, just to light the fire again. And right after that, I loaded a roll of Ilford HP5+ 400 in the [[Olympus Infinity Stylus]] and took 12 shots on a walk around Belle Isle. * My god [[Killing Eve]] Season 2 is astounding. And the music choices are as solid as ever. * The [[Volumio Raspberry Pi|2019-09-11 Volumio Raspberry Pi]] with [[JustBoom Digi HAT]] feeding into the [[Schiit Modi 2 Uber]] is just a goddamn delight at playing music. We're listening to the Bill Evans Trio "Waltz for Debby" at 96 kHz/24-bit and it's like honey dripping from the ceiling every time he plays a note on the piano.
She's devastatingly smart. So much wisdom in this interview with Preet Bharara: https://cafe.com/stay-tuned-transcript-ukraine-brazen-power-with-samantha-power/ <<< One of the things that I did, which hadn’t been done before, kind of weirdly, is a very simple step of deciding that I was just going to go and visit with each of the other 190 plus UN ambassadors. When I would say this at the time to friends or colleagues, they gasped. You’re going go to 190 countries? No, just go traveling around Manhattan. They have offices in Manhattan. This is not a major thing. And yet, I’d say 50, 60 of the missions to the United Nations from these other countries had never been visited by the US ambassador to the UN in the entire history of the country. And on a number of occasions, the ambassadors got choked up, and they’d have these ceremonies. And I’d be there kind of between negotiations or about to fly down to Washington for a cabinet meeting. But I would go and I would just show up on their turf. Traditionally, they would come to the United States, because we’re the host country, we’re the most powerful country. And often the US ambassador to the UN didn’t feel they had the bandwidth to even see the representative, let’s say, of a small island state in the Pacific that might be now getting submerged underwater because of climate change that isn’t on any important UN body, but that still exists as a country in the world, and longs for a little bit of America’s time or attention. I did that, and I went in with no asks, which was very hard for me because I always wanted things from other countries. And I would just ask them about their lives, about how they got into diplomacy. Many of them were the first in their families to get educated, especially those from developing countries. An individual who I found frightfully dull counterpart who I was going to visit, I was thinking, how am I going to get through this courtesy call. The reason he was dull was he was always just reading his country’s talking points. Never been updated. He had no feeling about any issue that it seemed that came before him. But when I asked him about his life, it turns out, most of his family had been murdered by the Khmer Rouge. He described what it was like to live on just a few grains of rice for many months, or watching his sister getting executed before him. And just to think of why that would close somebody up, and then how he had decided to join his country’s government and become, and eventually land in what was a prestigious post representing Cambodia at the United Nations. To get a lens into their countries, just by hearing their own stories, but also what matters to them. What are they trying to get done at the United Nations on behalf of Cambodia? <<<
* The eternal question with no satisfying answer: Log what I did yesterday, or plan today? I know it's not either/or, but when you have to pick what to do... * I admit that some of the appeal of [[Emacs]] and [[org-mode]] to me is the inherent learning curve, arcane documentation and configuration, and obscurity. It's like playing D&D but with notes and tasks instead of characters. But if [[Things]] was a new app and the instructions came with keyboard shortcuts as weird as the ones in Emacs, I'd be like WTF are you talking about there's no way I'm using this crap. * Note to self: when you have other shit to do, //do not visit// https://www.reddit.com/r/orgmode/.
* Added some stuff to the [[Beorg app]] tiddler. It's bonkers how often this wiki has reminded me of things, sometimes just three weeks after I write something or decide something. I even used it the other day when I couldn't remember what app I had found months ago for CD ripping. There it was in the wiki in the [[XLD]] tiddler.
It helps to have specific definitions for this stuff, and Kelly Magsamen is great and not liable to overstate things. From https://www.washingtonpost.com/outlook/2019/09/29/i-helped-classify-calls-two-presidents-white-house-abuse-system-is-alarming/ > Most of these memos are classified as “secret,” by default. To reach “top secret” classification, they’d have to involve information the unauthorized disclosure of which would cause the United States “exceptionally grave” national security harm. “Code word” status is reserved for the absolutely most sensitive subset of information within the top-secret category. These classifications are made purely to protect national security, never for political reasons.
* I keep chipping away at the endless task of buying, organizing, and playing FLAC files on a local filesystem because it gives me one way to slow down the digital onslaught. It's one tiny thing I can control. * The [[Olympus Zuiko 35mm f/2.8 OM-mount prime lens]] arrived today (sooner than I expected) from [[Looking Glass Photo & Camera]]! It's in perfect shape and that focal length feels right at home. I'm gonna shoot with it tomorrow!
* Like work expanding to fill the amount of time available to do it, obsessing about [[org-mode]] takes up all the available free time when I could be making other things, but it's fun, so who cares!
Remnick is the editor of //The New Yorker// and this is from his recent appearance on [[Stay Tuned with Preet|https://cafe.com/stay-tuned-devils-bargains-with-david-remnick/]]. The whole interview was nourishing, and this part in particular was what I most needed to hear: <<< ''Preet Bharara:'' ...In this age, where everything seems to be quick, quick, quick, and fast editing, and nobody has an attention span, tweeting is the favored form of communication by a lot of people, including the President of the United States of America, and from what I understand, //The New Yorker// is very, very successful at the moment, as successful I think as it has ever been: what accounts for the success of that long form in this age of no-attention-span? ''David Remnick:'' Because I don't believe that it's an age of no-attention-span. Look, I live in the same world you do. We're all in the subway and seeing everybody on their phones. We all have the experience of reading something and in the back of their minds, you're wondering, what's on my phone? There's no question that life is faster and more frenetic and distracted now than it was. And I think the phone and all that comes with it has — not to be too dramatic about this — has engendered a change in consciousness. The way human beings think from minute to minute is not uninfluenced by the presence of this little black square in front of me and the one that's over there in front of you. There's no question about that. But I also think that there is an absolute human hunger to know, and know more deeply, your world. <<< He goes on about the history of //New Yorker// articles on global warming, and then: > You cannot learn about your world sufficiently — whether it's the world of foreign affairs or the cultural world — in little snippets. And when I first started going to....meetings and conferences and sessions about this new thing called the internet, there were things that people said that turned out to be right about the future, and things that turned out to be nonsense. And one of the nonsense things was: no one will read anything long on the internet; the attention spans have changed, and no one's interested, and it's got to be 500 words or less, and on and on and on. And that turned out to be nonsense.
* I sat down at the desk tonight to do a [[Weekly Review]] and decided... to work on //cleaning// the desk instead. Actually, just decluttering the desk. And no, I wasn't just procrastiworking. No weekly review worth anything is going to happen at a desk in that state. I didn't finish the cleaning, but I made a dent by relocating things that were there that should live somewhere else, and that has put my mind at ease a little and has made enough room to actually do a real review tomorrow.
[[Steve 'Doc' Baty on Twitter|https://twitter.com/docbaty/status/1179283546281840640]]: > I have a hard time reconciling the idea that UX is about every interaction a person has with your org - digital and/or physical - with this focus on UX designers learning to code. Why code? Why not 'write a call centre script'? Why not 'lay out a service centre'? or a store?
https://twitter.com/20korg/status/1156418925053251586?s=20 > Interesting sound fact thanks to [[@TechConnectify|https://twitter.com/TechConnectify]]. Thanks to the Americans with Disabilities Act, elevators ding once if it's going up, and twice if it's going down. I had no idea! https://youtu.be/48hW-K7fQTM I had no idea, either. Sure enough, ours at work are up to code.
Last night I disconnected the water intake hoses off the washing machine, pulled out the metal mesh screens, and cleaned the sediment out of them so the water would flow normally. I logged it in a "Home maintenance" doc, where a million other things are listed in reverse chronological order. That doc also told me that I last did that in June 2017. But what if I made a spreadsheet of a bunch of periodic things we do, with one routine on each row, and listed the Next Due date for the thing, along with the Last Done date? Like: |''Routine/process''|''Next Due''|''Last Done''| |clean washing machine water intake screens|10/6/2020|10/6/2019| |change A/C filters|10/30/2019|9/30/2019| I could even cluster them by area of focus and turn on conditional formatting for dates that are coming up or past due.
* Just canceled the Italian course on [[Babbel]] and switched it to Spanish. Maybe this one will stick? * I'm planning a trip and am really, really tempted to use [[Dropbox Paper]] for all the travel/hotel notes, but I'm going to try sticking with [[org-mode]] since [[Beorg|Beorg app]] is so nice on iOS, if I need to get to anything away from the computer.
* I am utterly at sea as to whether I should take my laptop on an upcoming work trip (traveling by train), or use that time to, I don't know, read books and stuff. I could get major, major [[org-mode]] learning and practice in if I take the laptop. But there are so many variables and questions: ** how do I leave my seat to go to the restroom on a train and know my laptop is safe? ** does the hotel room have a safe? is said safe reliable? ** would the laptop be safer in the safe during the day or in a backpack when i'm in the city? ** is taking a laptop asking for trouble? ** how did i get to be so fearful? ** don't lots of people travel with laptops every day? ** since i don't have a viable iPad, shouldn't i just buy a cheap Android tablet to use for that trip for fun and for vaguely laptoppy kinds of things (but i wouldn't count on being able to use anything like real org-mode)? I mean, who cares if I lose it? NO. NO NO NO. * I know that handwriting recognition software is eventually going to get good enough to index and search all my handwritten [[bullet journals|2019-04-22 bullet journal experiment]], so I don't know why I worry about trying to transcribe anything from them to digital, but I so do.
From https://rudimentarylathe.org/#2019.10.09%20-%20Journal > There are a _lot_ of people doing more and better work than I while using simple, basic tools. Oooooof. And I mean oooooof. This is going to haunt me for days. Is my obsession with ever more complex systems just because of a vacuum of making actual stuff? Just the other day I saw the lyrics for "[[Brakhage|https://genius.com/Stereolab-brakhage-lyrics]]" by Stereolab. The first verse is: <<< """ We need so damn many things To keep our dazed lives going Many things to keep our lives Lives going, so many things We need so damn many things To keep our stupid lives going Many things to keep our lives Lives going, so many things """ <<<
* It freaks me out when people in this cafeteria sit at a table with no other people, no laptop, no phone, no reading material at all, no writing implements, no notebooks, and just EAT and look around, like they're waiting for something to happen. * Third day in a row of Spanish lessons on [[Babbel]]. I signed up because I can feel my brain starting to atrophy and I wanted to do something challenging. And because Spanish is just so incredibly practical and handy to know.
* I may be hosting a light case of carpal tunnel. Four or five times yesterday and last night, my right hand/forearm went suddenly weak and a little numb, each time for 5 seconds. Happened three more times today. Emailed the doctor and she said it's probably not anything like a stroke (no history of hypertension), and is more likely carpal tunnel. So I guess I'll get a vertical mouse at work. Maybe a wrist brace. It's always something. * I felt the pull of [[Things]] today (for ease of navigation, for speed, for ubiquity) but I just can't give up the ability to think without limits that [[org-mode]] allows for. Something can start out as a TODO and morph into a note, or a grouping of stuff, or its own heading. And you can go back and forth in any direction with total freedom as you refactor what you're working on. And there's no fear of losing a note or any information when you mark something as "done".
* Nothing surfaces my latent anxiety like planning for a trip.
* [[posted on M.b|https://twelvety.micro.blog/2019/10/12/i-kind-of.html]]: I kind of hope [[nvUltra]] never gets out of beta, because it's going to totally upend all my [[Emacs]]/[[org-mode]] stuff.
* I am back from NYC! The speed of that town is 180 degrees different from my normal pace, but it's totally fun to try it on for a few days. Walking out the front door of the hotel was like getting on an amusement park ride. You just have to drop in and go with it and know that everyone is going to carve out their own path in the sidewalk. And even though it's tiring, the people-watching is off the chain and I loved seeing the endless stream of restaurants, bars, coffee shops, and every other kinds of store along the way. My hotel was almost four miles from the conference, so I rode the MTA bus each each way for $3 a trip. For me, that is an infinitely better way to move around the city just because of all you can see out the window. I look forward to going back before too long!
* Started writing about [[WorkFlowy]] in this tiddler and ended up accidentally writing a [[blog post|https://twelvety.micro.blog/2019/10/18/workflowy-for-quick.html]]. * Now, what if I put //two// Field Notes notebooks in the [[Bellroy Field Notes Notebook Cover Mini]] — one for a Daily Log and one for the Weekly Projects and longer-term planning? Because I burn through the Daily Logs really fast, but it would take a much longer time to burn through one with Weekly Projects at stuff, and having the larger [[Rhodia Webnotebook]] as a separate thing has become a bit of a point of friction (because I am a lazy ass). I don't know. It would make the Bellroy much thicker, but also much more useful. Of course, my ultimate fantasy is to just have the Rhodia Webnotebook as Daily Log + Weekly Projects + longer-term planning + whatever Collections, but there's realistically just no damn way I'm carrying that thing around all the time.
* The [[Spotify]] plugin on the [[Volumio]] install is just great. Even though Spotify is inherently lossy and all, having the Volumio box tune itself directly into the stream without any iOS or [[AirPlay]] involved is about the best way to go. * An old friend posted that he's always been in the Paul McCartney camp (which is in direct opposition to my John Lennon camp). So now I'm reading and listening to everything I can find that digs into that debate (and of course looking for evidence to support my opinion). It's a stupid thing to argue about — like choosing between air and water. The Beatles wouldn't have existed without the two of them together. But I think I'm finally willing to admit that Paul has the ear for more commercially successful music, is a harder worker (apparently keeping the Beatles together when they would otherwise have imploded), and is most likely a better player at more instruments. But I think my final answer is that John just had better taste and was annoyed by the same goofy Paul-isms that I am. * I can't get New York City out of my head. I wouldn't want to live there for any length of time, but there is something about it. Like cranking the Sharpness filter up in Lightroom. * I installed our bidet attachment tonight! (TMI.)
For if/when I ever upgrade to Catalina. Good lord, could they make this any harder than it already is: from [[Jack Baty|https://micro.baty.net/2019/10/19/ive-been-unable.html]]: <<< I’ve been unable to save or open files to the Desktop folder in Emacs since upgrading to Catalina. I knew it was some new permissions thing, but where’s the dialog when you need one? Turns out I had to grant full-disk access to /usr/bin/ruby. Totally obvious, right? <<<
* I'm in one of those periods where everything is hitting all at once, not in a great way. It makes me want to just hunker down and GTD and TCB and not lift my head up for anything fun or frivolous, but I know I'll still do that, too, even when I don't really have time. * We got [[Sling TV]] a few months ago and have been watching CNN and MSNBC for "fun" at nights. I don't know how people make cable/TV news their primary news source. MSNBC and CNN are barely any better than Fox. It is 90% awful, with preachy, smug "anchors" shaking their heads and repeating the same things over and over, just to make their audiences mad. I don't even need "objectivity", but all these liberal TV personalities (whom I generally agree with in principle) don't leave any room for nuance or subtlety. It's all so, so bad. "The Daily Show" would be better, because at least then it would be funny. No wonder we're in such trouble.
Oooooo. Really interesting [[conversation on M.b|https://micro.blog/hjertnes/6183236]] that evolved/devolved into the age-old dilemma about what's polite and expected/tolerated in the M.b timeline vs. what people would like to feel free to post on their blogs. I don't have a firm opinion either way, but this from [[@Cheri|https://micro.blog/Cheri/6182168]] nails it for me: > The norm that //only certain content// is welcome on MB has influenced my decision to spend more time on Wordpress and Twitter, compared to MB. I'm //very// fond of the community here and I respect it. But the tone is kinda //dinner at Grandmas// and I didn't want to distress ppl with my swearing and memes and politics. I've never had consistent success with sending only a subset of posts to my M.b timeline, so I turned off that feature. It's probably better for me to not be my past angry-posting self anymore, so the M.b norms of civility are probably good for me in the end. But I self-edit a //lot// on my blog because of the timeline.
I'm filling out a bunch of PDF forms for our accountant. There's no way I was going to print a 53-page form to paper and then scan it back in just so we could add our signatures and add checkmarks to a bunch of non-interactive boxes in the form. [[PDFPen]] (included with [[Setapp]], yay) to the rescue! First, I didn't know the [[Library menu is where the stamps are|https://smilesoftware.com/iphone/entry/pdfpen-tip-for-the-day-stamps/]]. Second, I didn't know you could use the Scribble tool to make a hand-drawn checkmark, select it, and then add it to the Custom tab in the Library.
* Sometimes I have so much mental and emotional inertia weighing me down that I can't bother to pick up the [[bullet journal|2019-04-22 bullet journal experiment]] and I wish I was logging 100% of everything in apps and files. But then I definitely wouldn't log nearly as much and a lot would be lost. Also, it's fall and everything on the trees is dying and why bother? The holiday season looms.
* After doing a bunch of unglamorous financial paperwork and document scanning last night: ** The `YYYY-MM-DD` format for dates in filenames really pays off. I've never regretted adding it. ** If it's not in the Finder/filesystem, it may as well not exist for me. * Where the hell would I optimally file such a "thought" (as above) in this wiki if I don't name it as its own proper tiddler? Am I going to have to start tagging my journal entries?
* That thing where you're stressed out and in too many meetings in a row and pressed for time and it kills your willpower and you make bad food choices? It is totally a real thing.
* This wiki died tonight after [[DigitalOcean]] did an "emergency migration". See [[moving wiki to DigitalOcean|2019-03-14 project: moving wiki to DigitalOcean]] for details about how I got it running again (not hard, but ugggghhh).
* Doesn’t the idea of switching RAW photo editors just make people go into a cold sweat? When I think of the rickety workflow I made in [[Lightroom]] for the [[Panasonic GX1]], and the import presets I bought and relied on to fix the color, there’s no way I could open those files in another editor and count on them to look right. It’s enough to make a person want to set their camera to just take JPEGs (if they have a camera they can trust to take good JPEGs). * Well, after getting that thought out, it seemed like a fun thing to post on [[Micro.blog]]. Sometimes I forget that posting things there (where people may actually see them) can expand the [[conversation|https://micro.blog/jack/6315976]] and make [[everything richer|https://micro.blog/canion/6324037]]. Sometimes I think I don't want a back-and-forth, but it's a great thing when it happens! * I have so many mental open loops right now that I can't make sense of them. The logical thing would be to open a blank page in the notebook, or a new [[org-mode]] heading, or... just //something//, and start getting it out. It's everything from mundane little next actions, to mid-term goals, to big/weighty projects, and I cannot deal with it. * And then there's the holidays. It's time to get into the foxhole and defend the compound against them. If you had told me when I was eight years old that the holidays would be the most dreaded time of the year by the time I was 48, I wouldn't have believed you. * Posted: [[Listening to Angel Olsen, Stereolab, One Last Wish, and Broadcast|https://twelvety.micro.blog/2019/11/01/listening-to-angel.html]]. God, music reviews are the fucking //worst//.
* I went and did the brain dump I was thinking of in [[2019-11-01 Journal]]. On paper. It helped. I was carrying a lot of stuff in the noggin and it needed to be let out. * Either the [[Plex]] Raspberry Pi forgot how to talk to its hard drive, or the Samba connection died. I restarted both the drive and the RPi and everything is working again. This is another thing people who only play CDs don't have to worry about, and with all the trouble, it's still better than dealing with CDs. * I went to the [[Capital Audiofest|http://capitalaudiofest.com/]] with Sarah's uncles and their friend Clement (of [[Stereo Times|http://v2.stereotimes.com/]]) yesterday. This was my third trip, and the biggest difference I saw from past ones was that instead of it being 99% old white dudes, it was only about 90–95% old white dudes this time, which is a trend in the right direction. I heard only about three systems that sounded better enough than my own to make me want to upgrade things. There were $60,000 amps, $100,000 DACs, and $4,000 headphones, all of which is inconceivable to me. I'm basically fine with my modest $100 DAC, $250 speakers, and used $200 amp. The only thing I've decided I "need" after yesterday is a [[subwoofer|2019-11-03 research: subwoofers]]. * JFC if I had a dollar for every time I close a modal popup on a website I'd have a lot of dollars. * Sometimes you open [[Micro.blog]] to waste two minutes and you have no idea it's going to make you cry. Sending strength to [[Greg and his sweet dog|https://micro.blog/Agiletortoise/6355181]].
!! Requirements: * Polarity-reverse switch * Stereo (not just mono) RCA/line-level inputs * Small enough for Sarah to tolerate * Available in white !! Nice to have * Remote volume control. Not required since this is driven from the [[Yamaha AVC-50]]'s rear outputs and there's a control for those on the Yamaha remote. * Low-pass/EQ/crossover control * Auto-on/off * High/speaker-level inputs !! Found these * Jamo S 808 SUB ** + Jamo is owned by Klipsch. ** + white! ** - Grrrr. It has a line-level but only mono input. * Dayton Audio SUB-1000L ** - not available in white ** - Doesn't look as nice as the Jamo or the Cambridge Audio. * [[Cambridge Audio Minx X201|https://www.cambridgeaudio.com/usa/en/products/speakers/minx-x201]] ** + white! ** + has stereo RCA inputs, phase knob, crossover knob, auto-on ** + in the wild: https://www.instagram.com/p/Bb-ORbqh2Y8/ ** + I've always loved Cambridge Audio ** Height: 8-5/8" ** Width: 8-1/4" ** Depth: 10-1/16" ** I think this is the one. In the meantime, I'm doing a proof-of-concept with the meager subwoofer from the old Cambridge SoundWorks computer speakers set. I connected two 8-ohm power resistors to where the small satellite speakers would go, since I'm using the [[Wharfedale Diamond 10.1]] pair as satellites, driven by the [[Harman/Kardon PA 2200]] amp. The sub isn't a perfect match for the Wharfedales, but it's good enough that when I turn it off, there's a giant bass-shaped hole in the sound. Guess I asked for it. * 9:12 PM OMG I am completely ruined by all the bass I've been missing. The Cambridge SoundWorks toy subwoofer is barely audible but when I turn it off, half of the presence of the music is gone. Comparison really is [[the thief of joy|https://rudimentarylathe.org/#Quote%3A%20Roosevelt%20on%20comparison]], but it can also point me towards joys I didn't know I was missing. The [[Cambridge Audio Minx X201]] is on the shortlist for Black Friday.
* [[Posted to m.b|https://twelvety.micro.blog/2019/11/05/if-i-continue.html]] about captured tasks getting lost in the [[bullet journal|2019-04-22 bullet journal experiment]] vs. getting forgotten (but still findable, I guess) in [[org-mode]].
* If everyone else would just switch to paper and stop using computers and phones to do work and generate things for me to process and consume, I might have a prayer of keeping up with daily life with only pen and paper. I was born at the exactly wrong and exactly right time. * Oh my GOD [[Fraidycat|https://fraidyc.at/]] (via https://rudimentarylathe.org/#Fraidycat). I'm sure I'll still visit wikis in person, but my eyes are almost welling up with tears about this thing.
2019-11-06 Since starting a fresh mini [[Field Notes]] the other day, I added my regular habit grid at the back. But this time, instead of listing all the same habits from the last notebook, I'm only listing things after I've completed them at least one time in this new batch. It's already spurred me to pick back up on things I haven't done consistently or at all in weeks. We'll see how it goes over the next month.
* Here's the thing about [[Micro.blog]] and the timeline: There's a huge difference for me between //following// someone in order to see them in the timeline because they may occasionally post something interesting, vs. //subscribing// to their blogs (like in an RSS reader) because you don't want to miss any of their posts. I think this is what keeps me from posting frivolous, ephemeral, fun music/art/film/TV stuff to my blog as often as I think I should. I haven't looked at the new ways to slice and dice the M.b feed you send to the timeline, and maybe that will help. But I just don't think everyone in the timeline wants to see all the Tumblr-like noise that would emanate every time I find a fun mid-1970s rock video from The Midnight Special on YouTube. And those are the things that I think would work better in a blog than here in a wiki.
* Inspired by Jack's latest post about his [[photo workflow|https://copingmechanism.com/2019/bringing-my-photos-in-from-the-cloud/]], I fired up [[Lightroom Classic]] today for the first time in months, adapted his steps to my files and folders, and actually imported, edited and posted a [[photo|https://www.instagram.com/p/B4sIsg6HW0h/]]! It also helped that Sarah needed me to bring the [[Panasonic GX1]] out of storage for taking nice photos for a work project, so I'm re-learning that. Also ties in well with [[the urge to organize everything]].
https://emacsredux.com/blog/2013/04/02/highlight-current-line/ This is the variable: `global-hl-line-mode`
* Maybe the [[Weekly Review]] //is// the [[trusted system|https://twelvety.micro.blog/2019/11/11/maybe-the-weekly.html]]? As with most things, I would much rather think and write //about// the weekly review, rather than just start one!!
* By the end of lunch today, I had finished almost all of a proper [[Weekly Review]] for the first time in a long time (I didn't start it until last night). Amazingly, I stayed focused and didn't get drawn into email, Twitter, wikis, or news. I'm using [[org-mode]] more now, and added a twist where I use one of the first headings in the outline as a substitute for the "weekly goals/spread" that I was using (i.e. ignoring) in the Rhodia. I can have one paper notebook and one computer open at one time, but I cannot have two paper notebooks and one computer open. It's too much friction. I still use the Rhodia for a [[bullet journal|2019-04-22 bullet journal experiment]] "future log", where I have headings for six months spread across two pages. It's at just a high enough level to remind me to do things, but there's not enough room to overwhelm any particular month. * I so wish I could be one of those people who manage all of their stuff with one bullet journal and a ton of collections, but I'm too wrapped up in digital. * I'm now so used to this wiki that I have no idea how people just freeform write into regular blogs.
* I am totally going to indulge in keeping up with the news and looking at Twitter as long as these impeachment hearings are going on. I was a toddler when Watergate happened and I remember hearing "Watergate, Watergate, Watergate" on TV, but not knowing what it was. That word has a weight to it that I think you can only get if you lived through it. Whatever this ends up being called someday, I want to absorb it while it's unfolding.
* I keep seeing stuff about "BI" (business intelligence) and dashboards and things at work. Why don't we have similar systems at home? How can I make the logging + record-keeping + reminders + due dates more automatic for me and Sarah? Adding more manual processes and routines to keep everything straight is unsustainable. Maybe I could have one master Google Sheet that bubbles up various due dates that live in lower-level Sheets?
* Hell. I basically haven't looked at the "this week's goals" heading I made in [[org-mode]] during the [[Weekly Review]] on Monday night. Maybe I have to set up a weekly spread in the [[Field Notes]] [[bullet journal|2019-04-22 bullet journal experiment]] or [[Rhodia Webnotebook]], again. Uggghhhh. Didn't someone say something about "your trusted system has to work even when things get crazy?" It's crazy right now and I don't trust myself with this system. * ''If I check back in with myself a year from now and I'm still struggling with balancing where to capture tasks, where to log things, where to review tasks, and all the places I feel like I have to "maintain", I'm going to need to seriously re-evaluate.'' * [[Posted to M.b|https://twelvety.micro.blog/2019/11/15/password-and-vc.html]] about [[1Password]] and their VC funding announcement. The one good part of the hate-tweets is that I'm learning about other possible apps to use ([[Secrets]], [[Bitwarden]]) if things ever go sour, but I don't get all the outright hysteria. * The thing about asking me about how work is going is: I don't care about yours, you don't really care about mine, and I don't want to answer and dredge up any feelings I may be having about work at the moment. I'm not going to brag about anything that's going well, I don't want to waste time complaining (that's what this wiki is for), and the only interesting stuff to share is drama, and you should know by now how much I want to avoid drama.
2019-11-16 Holy moly what a quest. I found this positively amazing [[Adam Savage article about how he uses checkboxes|https://www.wired.com/story/adam-savage-lists-more-lists-power-checkboxes/]] (actual checkboxes, either blank or half filled-in or fully filled in, and how it was good enough for ILM so, there you go) and it's one of those articles that I want to keep forever, and I want to put it in [[Polar]] so I can do incremental reading on it and really let it sink in. And every possible way I try to turn it into a PDF leaves out crucial in-article illustrations of checklists. Tried [[Instapaper]], [[PrintFriendly]], saving from a PDF on the iPhone, or printing to a PDF from Safari or Firefox or Chrome on the Mac. Everything wasn't right in some way. Until I remembered turning on the clutter-free layout in the "Add to [[DEVONthink]]" item in the share sheet in macOS. You can select the PDF/paginated format and it creates a PDF in DEVONthink and it happened to keep all the right stuff and get rid of the rest.
Excerpted from his book, //Every Tool’s a Hammer// https://www.wired.com/story/adam-savage-lists-more-lists-power-checkboxes/ <<< When I arrived at ILM, the checkbox was already a piece of institutional practice. I noticed it one day early in my tenure, looking over the shoulder of my boss, Brian Gernand, as he went down his to-do list for me that day. Next to every item on his list, down the left-hand side, he’d drawn little boxes. Some of the boxes were empty, some were colored in, others were only partially filled in. I asked him about it when we were done and he explained it very simply: * If a task was completed, he colored in the corresponding box on the list. * If a task was halfway or mostly complete, he colored in half its checkbox diagonally. * If a task hadn’t been started or measurable progress had yet to be achieved, that box stayed empty. Brian is one of the best supervisors I have ever worked for. I’ve seen him manage anywhere from a half dozen to hundreds of builders in the ILM model shop. On a big project like a feature film, each one of those builders works from daily, weekly, and sometimes monthly to-do lists, for production periods lasting sometimes up to a couple of years. The number of tiny details captured in those lists is immense. On a Star Wars picture, it is positively gargantuan. It is easy to see how a supervisor like Brian, whose job it is to oversee all that, could drown in the details. And yet, this three-part checkbox technique allowed him to see instantly where he was in any project, at any given moment, on any given day. <<< ... <<< The checkbox allowed me to cross something off my list, to see clearly //that// I’d crossed it off, and at the same time retain all its information while not also adding to the cognitive load of interpreting the list. The checkbox also resolves some of the tension inherent to my physics-related approach to creativity. In my mind, a list is how I describe and understand the mass of a project, its overall size and the weight that it displaces in the world, but the checkbox can also describe the project’s momentum. And momentum is key to finishing anything. <<< ... [emphasis mine] > ''There’s something about not just capturing and riding momentum in a project, but building more of it, that keeps me racing back to my shop in the morning, day after day, with my feet planted firmly on the ground, and my mind and my project pointed in the right direction. It sounds funny to say, but I’ve trained myself to be my own momentum propaganda machine that way. It’s something every maker should learn how to activate for themselves, I think, because you can’t count on external sources of motivation to be there when you’ve hit a wall with a project, or you’re in the dead days halfway through. You will need to create your own motivation to keep going, and the momentum that springs from a checklist that is more filled in than not can be just the thing to fuel your fire.''
* The only way I'm going to know if the [[Adam Savage checkbox method|2019-11-17 Adam Savage on Lists, More Lists, and the Power of Checkboxes]] works for me is to actually try it. Reading about it won't be enough. * I loaded the above article into [[Polar]], started reading, got 1/3 of the way through and then set a "pagemark" so I could go make breakfast, and felt instantly relaxed knowing that I could see exactly how far I had read and could come back to that point when I was ready. Maybe [[incremental reading]] is how I'm supposed to read stuff? * Well dang! By making the [[Weekly Review]] consist of mostly the [[Field Notes]] and the [[Rhodia Webnotebook]], with some occasional glimpses into the [[org-mode]] master outline and [[Google Calendar]], I started the review today and finished by 9:00 pm. And feel more calm because of it.
* I'm hooked on the [[Adam Savage checkboxes|2019-11-17 Adam Savage on Lists, More Lists, and the Power of Checkboxes]] (as if he invented them). Sarah is a convert, too. Apparently I had more of a not-feeling-like-doing-things problem than a task-management problem, and the filled-in checkboxes on paper are what I needed.
* Some people meditate in the morning. I review yesterday's [[to-do list of checkboxes|2019-11-17 Adam Savage on Lists, More Lists, and the Power of Checkboxes]], migrate or cross out the unfinished tasks, and plan the rest of the day. It's turning into a game, and not even a new one, but it seems to feel better and less pointless this time. It only takes 15 minutes, and it's even making me want to wake up on time so I don't miss it.
Michael Andrews on [[Twitter|https://twitter.com/storyneedle/status/1196762367490744321]]: <<< A simple test of whether you need a new CMS: If you need lots of spreadsheets to document what your CMS is supposed to be doing, you need to change your CMS, <<< A good point, and refined by Karen McGrane in a [[reply|https://twitter.com/karenmcgrane/status/1196811974585331717]]: > This is mostly true, but a lot of the time the problem is with the way the CMS is set up, not with the product itself. I have wished for a Reddit-style “Am I the Asshole?” that would determine whether your problem is your CMS… or you
* Even though the iOS Camera + [[Apple Notes]] is the quickest, dumbest way to take a photo and add text to it when we make a meal that I want to remember to make again, [[Paprika]] would surely (I guess) be better at actually keeping recipes and ingredients in. But I don't see a [[Shortcuts]] action to put things into Paprika, other than the one that grabs a Safari URL. And that one isn't available in Notes. I could probably plan 20 meals in the time it's taking to work out this non-problem. * Just used [[Drafts]] to write two rather lengthy email responses to old friends. It takes the pressure and urgency out of composing text in a fragile web browser window. I used to email with friends all the time, but it's rare these days. I know I can bring it back! ([[posted on M.b|https://twelvety.micro.blog/2019/11/23/just-used-drafts.html]])
* My goodness the [[Adam Savage checkboxes|2019-11-17 Adam Savage on Lists, More Lists, and the Power of Checkboxes]] are just //magical//. It's so unfortunate that I'm so interested in task management apps, because they are proven not to work with my brain. The only way I can actually muster the will to do things, apparently, is to have them written on paper first. But whatever. I'm going to ride this wave as long as it lasts. I haven't felt this productive + unstressed + content in like, years. * Also: laundry hampers. They work. People need to know about these (ha), and how they keep clothes from piling up on the floor, and if you get decently big ones, they just swallow up dirty clothes until you're ready to wash them. I'm 48 years old and still learning how to not live like a teenager.
Well, [[Adam Savage responded to my tweet|https://twitter.com/donttrythis/status/1198827740410986496?s=20]] last night, so my work on the internet is done. There were also a lot of nice replies to his tweet! [img[https://twelvety.com/philtiddlywiki_images/2019-11-24-adam-savage-tweet.jpg]]
* On Sunday, I had what I thought was a new thought about what all kinds of music gear need to live in the basement on a dedicated audio/music desk. Well, it wasn't a new thought after all. (See: [[2019-08-27 Journal: audio desk]]) Before I had this thinking-out-loud wiki tool, how many thousands of times have I conceived, forgotten, ruminated, and re-thought the same things without doing anything about them? * On the days when I get more than half of my planned [[checkbox tasks|2019-11-17 Adam Savage on Lists, More Lists, and the Power of Checkboxes]] done, it's partially because I was on top of things and mostly because I wasn't over-ambitious with piling up the day's task list. * I need like a straight month alone with my work computer and no new requests, messages, meetings, or emails and then I could figure out what the hell is going on and where I'm at and then we can decide what needs doing next. * When people say, "so, what's new with you?", it doesn't seem like it's an option to answer, "well I found this amazing new task planning/doing process based on checkboxes and it's changing everything".
* Last night I packed up a pair of rolls of 35mm film to send to [[Old School Photo Lab]] for the first time since January of this year. I guess partially because the new/old [[Olympus XA]] is here and I need to process old shots before making new ones. But dang, where did the year go? How can it have been that long? * I have never figured out how I want to use a blog, but I sure have figured out how to use [[TiddlyWiki]], at least for me.
* [[Apple Smart Keyboard Folio for 12.9-inch iPad Pro (3rd Generation)|https://www.apple.com/shop/product/MU8H2LL/A/smart-keyboard-folio-for-129-inch-ipad-pro-3rd-generation-us-english]] ** no protection for the top, bottom, and right edges ** do we really need a keyboard anyway? * [[OtterBox Symmetry Series 360 Case for 12.9-inch iPad Pro (3rd Generation)|https://www.apple.com/shop/product/HMKL2ZM/A/otterbox-symmetry-series-360-case-for-129-inch-ipad-pro-3rd-generation]] ** [[Wirecutter's top pick|https://thewirecutter.com/reviews/best-ipad-pro-cases/#what-about-the-apple-smart-folio]] ** covers the edges and corners ** works with the Apple Pencil ** "Case has a bit more heft, but in a way that feels reassuring rather than heavy. The rubber borders offer a good level of shock protection..." ** "The volume and power buttons depress well through the case but feel a little mushy, so if you like a crisp click, you may be disappointed. And you can’t tuck away the Pencil flap while you’re using the iPad Pro, so it just kind of dangles over the top edge when you have the tablet in stand mode." * [[Zugu Case The Muse Case (2018 iPad Pro 12.9-inch)|https://www.amazon.com/dp/B07K1M4PHY]] ** [[Wirecutter's 2nd choice|https://thewirecutter.com/reviews/best-ipad-pro-cases/#what-about-the-apple-smart-folio]] ** "the buttons are super clicky, which makes them pleasant to use" ** works w/Apple Pencil, a bit less elegantly than the OtterBox Symmetry ** "rubber bumper around the outside edges" ** "One additional small touch we liked is how the cover nestles neatly into the lip around the tablet’s screen—and stays in place—thank to magnets. A small tab above the right speaker makes it easy to lift out but the lid will otherwise stay in place."" ** Reddit: [[Ditched Logitech Slim Folio Pro for Zugu Muse Case + Anne Pro 2|https://www.reddit.com/r/ipad/comments/c65y4t/review_ditched_logitech_slim_folio_pro_for_zugu/]] ** [[YouTube review|https://youtu.be/HRW_MQ-aqo0]] ** ''2019-11-30 Update:'' This is the one I ordered and it's totally the right one. The magnets definitely add weight to the iPad, but it feels solid, I've had no problems charging the pencil through it, and the front cover magnets turn the iPad on and off when you open and close it.
Ryuichi Sakomoto, from the gorgeous [[Moog One - A Meditation On Listening|https://youtu.be/wdhzVFZlKsM]] video: <<< Urban people, like you and I, live in an environment surrounded by electronic, or rather digital sounds. But as humans — our bodies are natural. They're not man-made. Our ears and brains yearn to hear more natural sounds. It must be some kind of reaction. Sounds transmitted by analog synths feel more natural than those of digital synths. The late Isao Tomita, a leading figure of synths who I was also acquainted with said: "Electronic sounds, like thunder, are also natural sounds", and I agree. <<< [img[https://twelvety.com/philtiddlywiki_images/2019-11-27-ryuichi-sakamoto-moog-one.jpg]]
* We picked up the iPad Pro 12.9" today. Wow! iPads have come a long way since our last one from 2012. This thing is huge, and also thin. I played with the [[Minimoog Model D app]] plugged into the [[Yamaha KX76]] for a while and made an extremely accurate Rush/Tom Sawyer lead sound (of course). That app is extremely well done. And Sarah has immediately taken to [[Procreate]] and the [[Apple Pencil]], but it's over my head and I feel like an old person when I try to use it. Also, I have no feel for all the gestures to get around on an iOS device with no button.
* Saw [[Jojo Rabbit]] tonight. Perfect all around: set design, plot, writing, acting. Admirable job of turning disturbing subject matter into a funny, touching, and horrifying film. ⭐️⭐️⭐️⭐️⭐️
After a long weekend of eating and shopping and looking at news and Twitter too much, I could feel my brain shrinking. I managed to read a little from the long-neglected [[bullet journal book|book: The Bullet Journal Method]] this morning, and avoided getting too sucked in by news and tweets. I re-started my Russian subscription on [[Babbel]] and made it through one whole lesson at lunch. I might should have just started over from the beginning, but I did as they recommended and jumped back in where I had left off. I remembered more than I thought I would! One habit at a time...
* Yesterday I woke up too late to make my day's to-do list in the [[Field Notes]] and I didn't feel right all day.
from https://slate.com/news-and-politics/2007/02/the-genius-of-dick-cavett.html > A small, handsome man with an incongruously deep voice, Cavett was deadpan in the sense that he had no special face to signify a funny remark. He just said it, the way that the best conversational wits always do. He was by far the wittiest of the American television talk-show hosts, most of whom have always been dependent on their writers. I think the reason I never watched any Dick Cavett before the age of at least 35 is because I wouldn't have been ready for it any earlier.
* Looking at the [[Volumio]] [[bug reports section|https://forum.volumio.org/bug-reports.html]] of their forum is dang depressing. Amazing this software works for anyone.
* Two days with no wiki updates means I'm really busy or just obsessed. In this case, the latter, because of [[Roon]] and [[RoPieee]]. * I listened to part of an old [[Accidental Tech Podcast]] [[episode|https://atp.fm/episodes/350]] where Siracusa talked about [[Letterboxd]], and it reminded me that I don't use it enough, or often enough. I should go through my bullet journals and note in it all the movies we watched this year. * I wrote so, so many things in the "today" to-do list, and have cheesed out on 95% of them. Other than [[Roon]] stuff, we took a nap on the couch today, had friends over, I did 18 minutes of yoga, ate leftover pizza, used denatured alcohol to rub some old sticky rubber paint off of a [[Squeezebox]], and now I'm just done. No [[Weekly Review]] today, maybe tomorrow. It's like Christmas break is starting early but I still have to go to work tomorrow.
* Did not expect to cry before coming to work this morning. But when Big Bird dies and you see the old video of him after Mr. Hooper died, well... (h/t to [[Andy Baio on Twitter|https://twitter.com/waxpancake/status/1203761267493634048?s=20]]) * I am a lazy, attention-addled adolescent cleverly disguised as an adult.
* Huh. I wonder what correlation there is between my total inability to keep on top of projects and my new [[Roon]] obsession.
* So, setting up a [[Volumio Raspberry Pi|2019-09-11 Volumio Raspberry Pi]] leads to buying the [[JustBoom Digi HAT]], which makes the [[Schiit Modi 2 Uber]] DAC sound amazing, until [[Roon]] comes along and makes it all sound even better, which makes me realize what I had been missing, and so I'll need an [[Intel NUC]] to run Roon on all the time, and reading about Roon upsampling leads to the discovery of [[R-2R/ladder DACs]] and how they were supposedly so great, and it's too bad no one makes those chips anymore, except the [[Schiit Modi Multibit]] kind of does have those in it and I won't have any money left if I don't stop this. I mean, I'll be sitting in a meeting at work, supposedly paying attention to a spreadsheet on a screen on the wall, but actually thinking about how [[R-2R/ladder DACs]] are laid out.
I bought the Bridget St. John [[Dandelion Albums and BBC Collection|https://www.qobuz.com/us-en/album/dandelion-albums-and-bbc-collection-bridget-st-john/bjdek9jkt4cva?qref=dpa]] 4-disc set from [[Qobuz]] and copied it to the [[Plex]] Raspberry Pi, and then fired up [[Roon]]. Some tracks were missing and I couldn't make Roon find them, so I "deleted" the album from Roon and was going to try to re-import it. I checked the folder in the Plex RPi hard drive and found that for some reason, the files that Roon wasn't seeing just never made it to the RPi in the first place. I wiped that whole album from the RPi drive, re-copied it from the MacBook's Downloads folder one "disc" at a time, made sure all the tracks copied, and then restarted Roon and it found the 4-disc set just fine.
* Currently in the middle of this [[AudioStream Podcast interview|https://www.audiostream.com/content/rob-darling-roon-labs-audiostream-podcast-no6]] with Rob Darling of [[Roon]] Labs. Lots of stuff about his background in studio recording. Haven't gotten to the Roon part yet.
* I managed to not look at any news at all today, so I have no idea what's going on out there. It feels great! * Done today ** Helped Sarah's mom with her new phone ** Ripped some old CDs to FLAC and updated the [[CD-ripping process]] ** Hunted unsuccessfully for the Squirrel Nut Zippers "Christmas Caravan" CD in the basement. Was ready to just buy a FLAC of it somewhere but they are not to be had anywhere. ** Read about the [[Cambridge Audio DacMagic 100]] that I ordered last night, to convince myself (as usual) that I bought the right thing. ** Washed a bunch of dishes ** Prepped a bunch of lettuce for the week ** Put an old [[Squeezebox]] in the kitchen and hooked it up to the [[AirPort Express]] and it saw the [[Roon]] core immediately. Wow. Hats off to those dudes. ** Made an actual salad for tomorrow's lunch ** Planned family Xmas Eve dinner (w/Sarah) * Not done today ** [[Weekly Review]] ** Laundry ** [[bullet journaling|2019-04-22 bullet journal experiment]] ** scrub the bathtub ** email * At this point I'm ready to have [[Roon]]'s baby. Please, please, please don't get bought by some other company and disappear.
https://www.audiostream.com/content/ted-smith-%E2%80%93-ps-audio-legend-audiostream-podcast-no8 > Which digital connection delivers the best sonic rewards? Is USB inherently flawed as an audiophile socket? Can an Ethernet cord make a difference in sound quality? Ted Smith of PS Audio tackles some of high fidelity’s biggest digital questions in this extensive interview recorded at the unveiling of his new flagship Obsidian Series Ted Smith Signature DAC at the AXPONA 2019 audio show in Chicago. This is one of those podcast interviews that will fire me up for months. His description of how the [[PS Audio DirectStream DAC|https://www.psaudio.com/directstream-dac/]] works is inspiring. Converting all incoming PCM to DSD for an easier, more elegant D/A render is such a simple idea I wish I had thought of it. I'll never be able to afford one. It's just nice to know it's out there.
I always hear about how much better DC-powered phono preamps and DACs sound when powered by a battery than when running on the dirty power from switched mode supply wall warts. I could get a rechargeable battery pack and run the [[Cambridge Audio DacMagic 100]] from it, but who wants to worry about charging the batteries all the time? I could get a 12V DC solar panel, mount it in the basement window (which gets some amount of sun), run a wire through the floor to the stereo, send the trickle of power from the solar panel to some conditioner/charger thing, and continuously charge a battery connected to the DAC. I'd have to have a regulator to keep it at a steady 12V, but it doesn't seem too hard.
The [[Cambridge Audio DacMagic 100]] arrived yesterday and I hooked it up. It sounds glorious. It's tiny, and it feels dense and well made, and I love that I can verify the sampling rate with the front panel LEDs. Comparing it to the [[Schiit Modi 2 Uber]], I can't honestly say it's more detailed or expansive, but it does have a midrange presence that the Modi doesn't have. Vocals on the Modi always sounded just a tad absent because of its scooped-out mids. The DacMagic 100 sounds more like the whole picture. But I was surprised by how good the Modi still sounded. The only thing I'd do differently if I had to buy it again would have been to get the silver version instead of black. Based on YouTube videos, I thought the LEDs would be easier to read on the black, but they're so dark that they don't really announce themselves from across the room. No big deal. I generally only send things back if they're defective, not just if I realized I picked a sub-optimal color. Two more reasons: I don't want to be without it now that I've heard it, and Crutchfield doesn't need me whining about a return. They have enough going on at this time of year. All in all, I picked the right thing! I think I'd have to spend many hundreds of dollars more to hear anything better, and even then, there are other things in my system that would need upgrading before then.
Good lord, I hope I can remember enough of this to help in the future: I have this 500 MB USB thumb drive from 2010, which last night I flashed with the [[Roon]] ROCK image. So it had a FAT partition and a Linux partition. But I wanted to erase it and put the latest [[Intel NUC]] BIOS on it instead, but [[Disk Utility]] wouldn't erase it. After a lot of research, I was able to do this in Terminal: `diskutil list` and that showed the internal SSD paritions and also this for the USB drive: ``` /dev/disk3 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *523.8 MB disk3 1: Apple_HFS 209.7 MB disk3s3 2: Linux 208.7 MB disk3s2 ``` And someone somewhere said to do this: `diskutil unmountDisk disk3` which returned: `Unmount of all volumes on disk3 was successful` and then I did: `sudo gpt remove -i 2 disk3` to try to kill that Linux partition. But I got: `gpt remove: unable to open device 'disk3': Resource busy` So then I found that I had to kill the process tying up that parition. To find that process ID, I did: `sudo lsof | grep disk3` and waited... and then it returned: ``` ufsd_ExtF 1947 root 3r CHR 1,11 0t0 679 /dev/rdisk3s2 ``` So I did this to kill the process: `sudo kill -9 1947` And right away the Mac popped up a window saying a device attached to the Mac wasn't recognized, so I clicked "Initialize" and told it to do it as FAT and I think was given an option to say "Master Boot Record". And that finally worked!
* Shit. Our bank called last night to say that someone tried to use our credit card to order something online. Thankfully they were on top of it and denied the charges. * Man, this impeachment debate is fascinating but hard to listen to. I know he won't be removed, but I look forward to the House calling the bluff of all of his supporters in the Senate and making each of them cast a vote that will hang over them like a shadow forever. I hear over and over how "impeachment will tear this country apart", but I don't see it in day-to-day life. At least not anything worse than the chasm that's been there for years already.
https://darko.audio/2019/12/darko-audios-product-s-of-the-decade-2010-2019/ > Make no mistake: [[Roon]] has revolutionised how many of us interact with our digital audio libraries in the high-end audio space to bring the UI on par with Spotify, where mainstreamers live. This is a staggering achievement given Roon Labs’ decentralised approach to software development, its dozen or so staffers are scattered around the globe. Our fifth and final Product of the Decade: 2010-2019.
* A conversation this morning: ** Me: Well now [[Jack Baty]] is back on [[Roam]] and not updating [[TiddlyWiki]]. ** Sarah: Should I be worried about our marriage? ** 😛 * My struggle this week with the [[Roon Intel NUC]] would have been much less of a struggle if I had been more aware of my reflexive need to search the [[Roon]] forums for answers about why the NUC wouldn't get on the network, instead of going back to basic engineering troubleshooting principles before doing anything else. I should have known to make the system as simple as possible and, 1.) Make sure it has power (done), 2.) Make sure it has a data connection (not done). Part 2 is where I failed. Instead of using the old homemade Ethernet cable that ran through the basement and is segmented into at least two parts (joined by a cheap female-to-female adapter), I should have immediately moved the NUC to the router and connected them with a known-good 3-foot patch cable. Instead, I went through an elaborate forensics and documentation exercise, ''seeking tons of input'' about what a possible cause could be, instead of ''focusing on what we know'' about the physical state of the device. * I cannot stop comparing the sound of native 16/44.1 vs. 16/44.1->24/88.2 upsampling in [[Roon]] on the [[Cambridge Audio DacMagic 100]]. I think I'll end up with native only because it's not adding any extra digital filtering to the process, and because the difference is so subtle. I think there's just a touch more high-end with native, and even if that's just distortion, it's what my aging ears need to be fooled into thinking they hear detail. Plus, I'd rather not worry about whether I've picked the right upsampling filter or not.
https://kb.roonlabs.com/FAQ:_How_do_I_create_a_smart_playlist%3F_How_do_I_save_a_Focus%3F Ah! <<< !!! Smart Playlists Many people use "smart playlists" to keep track of specific content in iTunes dynamically, such as all your albums with the genre "Rock", or all your AAC files. In Roon, this type of dynamic filtering is done using Focus. !!! Using Focus In Roon, you can filter your collection in all sorts of ways with Focus, which is available in the Albums, Tracks, Artists, Composers, and Compositions views. For example, you can focus on Blues from the 60's and 70's. You could also add the MP3 format, and ''click it a 2nd time'' to exclude MP3s. <<< <<< !!! Saving Focuses If you create a Focus you love, or if you have certain views you want to come back to frequently, you can always save the current view by clicking the Bookmark icon in the upper-right, next to Filter. Click the bookmark icon, then click Save Bookmark to save the current view. <<<
* I love that [[Jack noticed|https://roamresearch.com/#/app/jackbaty/page/WACaJ7sUV]] that I noticed him using [[Roam]]. My record of the [[conversation with Sarah|2019-12-21 Journal]] yesterday was posted somewhat in jest, but it was also 100% verbatim. She knows how obsessive I get with this stuff. I am extremely thankful that Jack and others are kicking the tires on Roam so early and thoroughly (see [[Jack's recent post|https://baty.blog/2019/roam-and-tiddlywiki/]]). I'm sure that within a month a from now, I'll have switched over myself. For now, keeping tabs on Roam is like watching the birth of a star in space. So fun and exciting. * Assuming my cold doesn't get worse, I need to be cleaning the house and buying gifts and prepping for hosting Xmas Eve family activities, but apparently all I care about is wikis and [[Roon]] and [[Raspberry Pi heat sinks|2019-12-22 research: Raspberry Pi heat sinks]].
The heat sink I was using in the [[RoPieee]] [[Raspberry Pi]] is 14mm W x 14mm D x 10mm H, and thus, too tall to use underneath the [[JustBoom Digi HAT]]. Need a lower-profile heat sink. Hopefully 7mm is a good height, so I ordered this Easycargo aluminum one: https://www.amazon.com/gp/product/B079FV2RH3/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1
[[My semester with the snowflakes~ — Medium|https://medium.com/@james.hatch/my-semester-with-the-snowflakes-888285f0e662]] This whole essay is great, and these parts really grabbed me even more than the rest of it grabbed me: > One young woman made a very big impact on me. She approached me after class one day and said; “I am really glad I can be here at Yale and be in class with you. My grandfather came to Yale and when WWII started, he left for the Navy and flew planes in the Pacific theater. After he came home, he came back to Yale, but he couldn’t finish. He locked himself in his room and drank and eventually had to leave, so I feel like I am helping him finish here at Yale and I’m doing it with a veteran, you.” ... > I challenge any of you hyper-opinionated zealots out there to actually sit down with a group of people who disagree with you and be open to having your mind changed.
* I'm sick with some kind of bad cold and a slight fever. I managed to work from home today, and I thought I was getting better as the day went, but the body had its revenge once work was over. So we're not hosting Xmas Eve, at least not //on// Xmas Eve. * Sarah has been so good to me today, and brought me all of the below things. I need to remember to be at least this good to her when she's sick next: ** water ** a big pillow ** green tea ** ginger ale ** extra blankets ** thermometer ** aspirin ** tissues ** honey ** gloves to keep my hands warm ** dinner (pasta and vodka sauce) * Listened to [[Roon]] on the iPhone for a bunch of the workday. As predicted, I heard songs I forgot that we had. I was a little sad to see that there's no Focus feature on the iPhone, but it does have access to the Bookmarks, and you can save Focus views to that, so no big. People sure do get uptight in the forums about how disappointed they are that that feature isn't on the phone. I'm just glad it tells you the full signal path just like the iPad and macOS versions. * I think that one thing that's nice about [[Roam]] (compared to [[TiddlyWiki]] is that (I guess?) you don't have to worry as much about whether something is a hyperlinked "page", because every bullet has its own ID and is hyperlinked by default. On TW, I'm always wondering whether something merits being its own tiddler or not.
[[Adding an Internal HDD once an Intel NUC has already been setup - Roon Labs Community|https://community.roonlabs.com/t/adding-an-internal-hdd-once-an-intel-nuc-has-already-been-setup/46874/9]] The main takeaway from that link above is: # Install the new SSD in the 2.5" bay. # Verify that the NUC BIOS sees the new drive. (You have to reboot and press F2 to get to the BIOS screen. If the monitor or projector doesn't see the video signal after the machine boots, unplug the HDMI connection and plug it back in.) # When ROCK sees a new storage drive, it will present the Format option on the ROCK Web UI page. Follow that to format the drive. # Follow the steps in this KB article: [[FAQ: How do I move my collection to a new folder, hard drive or NAS, Will I lose my edits?|https://kb.roonlabs.com/FAQ:_How_do_I_move_my_collection_to_a_new_folder%2C_hard_drive_or_NAS%2C_Will_I_lose_my_edits%3F]] The Raspberry Pi file server ~~is~~ was fine, but this is where I ended up. See also: [[Goodbye NAS, hello USB drive - Roon Labs Community|https://community.roonlabs.com/t/goodbye-nas-hello-usb-drive/88959/51]]
* Everything [[Roon]]-lovers say about it being a more analog- or LP-like experience is totally true. I remember when I thought [[Volumio]] was going to be the answer and it was free and who needed to pay $10/month for this stuff. But Roon actually makes me care and pay attention to what I'm listening to. It's the best $10 month I spend on anything. I'll probably never spring for the lifetime plan because I want them to keep going as long as possible. Take my money!!! * Well, now I'm playing with upsampling in [[Roon]] from 44.1 kHz to 192 kHz and I think it sounds pretty damn good. I wish I knew more about the internal filtering of the [[Cambridge Audio DacMagic 100]], but theoretically playing at that high a rate gets the low-pass filter way out of the way of the audible spectrum. I don't know. I can never decide anything.
* I hope [[Jack Baty]] doesn't stress too much about abandoning his [[TiddlyWiki]] for [[Roam]]. I'll keep reading his stuff wherever it ends up!
[[The hi-fi show conundrum — Darko.Audio|https://darko.audio/2019/11/the-hi-fi-show-conundrum/]] > If we as attendees let go of hi-fi shows as places to audition gear, exhibitors might be less concerned with trying to woo us with sound quality from a fixed hardware configuration and turn their attention to meaningful A/B comparisons, about which consumer spending pivots. How about a €1K DAC vs. a €10K DAC? Or a €5000 digital front end vs. the same money spent on a vinyl front end? Or a €2K system vs. a €20K system? It could even be a simple as amplifier A. vs amplifier B. This is so head-smackingly obvious now that I've read it, and experienced the lack of it in person. I have never, ever seen a demo of "this" vs. "that" at any show. It's always, "check out all this shit playing together and good luck figuring out which part is worth buying".
* I realized I could use the [[Sony NW-A45 hi-res audio player]] as an outboard USB DAC for the iPhone playing [[Qobuz]], and it sounds really, really good. Like, I can listen to it on headphones for hours, which I can't do with the app playing straight out of the iPhone's Lightning port -> 1/8" headphone dongle. May have something to do with the [[Sony S-Master HX digital amplifier chip]] and the elegant job of D/A it does through PWM. * Using Qobuz through [[Roon]] is so much nicer than just the Qobuz app. Roon did a nice job of making it easy to add Qobuz albums to your "library". * Holy crap it is so fun and addictive to just add album after album to the [[Roon]] library in [[Qobuz]] on the Mac. It keeps suggesting great albums and I keep adding them! And it all sounds so good! [[Spotify]] never sounded like this. * Man, I am setting myself up for a huge fall when the buying spree ends in January. * I have changed [[Roon]] to upsample from 44.1 to "only" 88.2 instead of 192. I'd rather never hear a dropout, ever. I suspect the [[Roon Intel NUC]] only has so much horsepower. * The great thing with lossless audio (even at 44.1) is that every time a drummer hits a crash cymbal, it sounds right, like an actual cymbal instead of just noise.
At this point I don't know whether I'm depressed, having a bit of seasonal affective disorder, or having post-Christmas-partum depression. I feel like Christmas didn't even happen, and I wasn't expecting much from it anyway. More than anything, I'm just relieved it's OVER. Finally I can settle in with notebooks and wikis and metadata, if only I could find the mental energy to do any of it.
* Here's my pattern: eat unhealthful food > get no exercise > use my phone as a pacifier > stay up too late > stop wearing the night guard (to prevent teeth grinding) > sleep too much > wake up feeling like a slug > take gratuitous naps > repeat repeat repeat. If I stop that pattern at any step, I have a prayer of breaking the cycle, but it takes willpower and discipline, which are the two things in short supply when I get into this rut. * I wonder if I could commit to shooting at least one frame of 35mm every day in 2020? Other than that, I don't think I can make any resolutions or new starts that are tied solely to the change in the calendar year. My track record from past attempts is underwhelming.
* Canceled [[Sling TV]] for now * Canceled [[Spotify]] Premium indefinitely because of [[Qobuz]] * My only other "resolution" is to not try to catch up on [[bullet journaling|2019-04-22 bullet journal experiment]] when I fall a day or more behind. I'm just going to pick back up wherever and whenever I'm at. It becomes too much of its own barrier when I think I have to reconstruct the night before. * We walked to our neighborhood bar for beer and terrible onion rings and nachos this afternoon, and then we stayed in all night and watched [[Top Hat]] for probably the 10th time. I don't think I can ever go out for NYE again. * I want to start using [[Roam]] but there are so many dozens of things left undone in our actual house right now. But when has that stopped me before? * By not looking at the news for a few days, I was unaware of the current troubles in Iraq and the unbelievable spread of wildfires in Australia. With all the obsessing over the perfect digital audio listening experience, how self-absorbed can my wiki possibly get? * And here we go with the motherfuckers and their celebratory NYE gunfire and fireworks. * Listening to so many [[Darko.audio]] podcasts about the jitter problems with TOSLINK optical digital connections, and the noise that coax S/PDIF cables transmit, and the hopeless mismatch of the USB standard with the real-time needs of digital audio — all of it makes me wonder why we don't just dispense with all of it and just use Ethernet? I mean, this has been a solved problem for computers for a long-ass time. Use gigabit Ethernet to transfer one song at a time from whatever media server to whatever endpoint and hold the whole 50 MB or whatever in memory for as long as you need to until the song finishes, and then go grab the next one. Bit-perfect transfers, full confidence, no guessing, no interpolation. Boom!
* Oh. I see that ⌘-A selects the current line in [[Roam]], just like in [[OneNote]]! But that doesn't seem to be documented in any keyboard shortcuts list I see.
from [[Battle of S/PDIF vs USB: which is better? — Audio Science Review|https://www.audiosciencereview.com/forum/index.php?threads/battle-of-s-pdif-vs-usb-which-is-better.1943/]] <<< I think most of you know my opinion on this. But just in case, I believe USB to be a superior and more "correct" interface for audio. Problem with S/PDIF is that it makes the source the "master," forcing the DAC to chase its timing. This means that if the source S/PDIF signal is not very clean, it can impact target DAC performance. Fortunately over the years S/PDIF interface has been perfected a lot and even in low cost implementation it can be excellent. Still, there is no reason to have this antiquated architecture. Using asynchronous mode USB, the DAC can set the cadence using a high-performance clock and force the source, in this case a computer or streamer, to follow it. Yes, there is some risk of noise here as USB is a much more complicated interface than S/PDIF. Dedicated processors are used to implement it and if not isolated from the sensitive DAC analog circuit (including its clock), we can still get polluted output. Fortunately this has also been sorted out for the most part and in high performance DACs it simply is not an issue. <<< ...a bunch of measurements and graphs... > As seen from pure measurement point of view, there was no case where USB was worst [sic] than S/PDIF. Indeed the reverse was true in that S/PDIF was noisier in some DACs. So the default assumption that somehow S/PDIF has some advantage over USB is simply false. I love Amir.
Rankin is the first dude who made asynchronous USB audio a thing. from https://darko.audio/2016/05/gordon-rankin-on-why-usb-audio-quality-varies/ <<< To summarise: the problem with USB Audio is that Isosynchronous USB frames are not error correcting. Therefore the sonic outcome of any USB system is dependent on the host to device differential. Twelve years ago, I pretty much thought as many people do today: that USB was the answer to our S/PDIF quandaries. In some ways it is a good deal better. We have Asynchronous Isosynchronous so the device and host know about sample rates, bit rates, clocking options and a host of other things. But cables make a difference, computer brand and quality make a difference and even the device makes a difference. I will try and capture some data errors on the Tektronix. The problem is that it does not accumulate errors. It also does not stop on errors. I have to actually push a button capture it and then pipe that to my screen. What this is showing is the event table or the decoding of the USB Bus as seen by the Tektronix scope. We are using a Tektronix Differential Probe and their USB Analysis package. I made a little Male/Female HS USB board and that is plugged into a MacBook Air. I am using the Faber Acoustics Signal Scope Pro to send a 1KHz Sine wave to a Wavelength Crimson DAC @ 176.4K sampling rate. This is a program I use to test basic DACs of all kinds. This is also a pretty basic setup compared to audio transmission. As per the above, a packet sent by the host to the Crimson has a CRC16 error. You can see that in the error column. <<<
* Switched the [[Cambridge Audio DacMagic 100]] to use USB out of the [[RoPieee]] [[Roon]] [[Raspberry Pi]], mainly after reading about [[Gordon Rankin on USB for transmitting audio|2020-01-02 Gordon Rankin on USB for transmitting audio]] and how Amir says [[asynchronous USB is better than S/PDIF|2020-01-02 Amir Majidimehr on S/PDIF versus USB]]. With async USB, the DAC is in charge of the clock. With S/PDIF, the transmitter is driving the DAC, and you better hope you have a solid, clean transmitter. Now, whether I can hear any change is an entirely different question.
* Today is the last day of Staycation. Sarah and I hate routines, but we realize we thrive on them. This has been about a 10-day span of weird eating and drinking, random naps, skipping chores, no real exercise, and hanging out with friends and family. We have zero motivation because we've been able to mostly do whatever we want, other than some holiday obligations. I'm paralyzed at the prospect of going back to work tomorrow. It won't be so bad once I get there, but it's like three Sundays' worth of dread all piling up on a Monday here. Oh, and how many to-do's did I write for myself today in the [[bullet journal|2019-04-22 bullet journal experiment]]? //24.// I've done two. * Jack Baty on [[his blog|https://baty.blog/2019/roam-and-tiddlywiki/]]: "//Roam feels a little like using a modern spin on Orgmode in the browser.//" <<< THIS is what I've been thinking. How much more will I ever use [[org-mode]] now that I've been spoiled by [[Roam]]? * At this time last year I was steeped in [[Micro.blog]], but now I barely ever look at it, or even post to it. Maybe I'm following either too many or too few people. But it's probably mostly because I'm so at home in [[TiddlyWiki]], as disconnected as it is.
[[@LorenRaeDeJ|https://twitter.com/LorenRaeDeJ/status/1213851093689602049?s=20]] on Twitter: > Warren rightly called Soleimani a murderer. She also condemned assassination as a reckless act. The first point makes the second stronger. The US does not kill evil men simply because it can. Rule of law makes us better. Responsible use of our military makes us stronger.
[[@andy_matuschak|https://twitter.com/andy_matuschak/status/1211487900505792512]] on Twitter: <<< One way to dream up post-book media to make reading more effective and meaningful is to systematize "expert" practices (e.g. How to Read a Book), so more people can do them, more reliably and more cheaply. But… the most erudite people I know don't actually do those things! There's a funny response curve: folks who are super-diligent about note-taking practices or building simulations seem to generally end up with less insight than their somewhat-less-diligent neighbors. Maybe it's a explore/exploit thing? Or maybe just a wonk/gestalt thing? The best theory I have is something like: it takes so much effort to do these "expert" reading practices now that such readers burn their willpower and mental energy on running those processes, rather than on the ideas themselves. But I don't know! Gives me pause! <<<
* Oh man, I'm losing it. After just a few days of using [[Qobuz]], I find missing the calm little lake I had created with my local music server in [[Roon]], and my little tea ceremony ritual of ripping each CD one at a time, and how the whole thing is now more of a swirling tornado of local music and Qobuz streamed music. Qobuz may be better for me to use only at work, away from home. One of the big use cases for Qobuz (for me) was going to be able to play stuff at home that I hadn't gotten around to ripping from CD yet. But //even though I own the CDs//, listening to them on Qobuz (when I'm home) feels like cheating. What the hell? It's just bits and bytes. They don't care where they're coming from. The [[Roon Intel NUC]] certainly doesn't care. Maybe it's just my limited attention. I feel overwhelmed by everything when I see all those hundreds of albums from Qobuz in the Roon library. I guess I can always disconnect Qobuz from Roon and turn it back on if I miss it. I am crazy. * I see that Iran fired over a dozen missiles at two of our bases in Iraq.
* God bless [[TiddlyWiki]] but I swear it feels like rubbing sticks together to make fire after having watched a bunch of [[Roam]] videos.
From a [[Conor White-Sullivan]] comment on [[Hacker News|https://news.ycombinator.com/item?id=21443940]] from a couple of months ago: > [[Roam]] does allow you to export all your data to an org-mode file (the emacs outliner), we're working on other import/export options, and want to get to the place where there is a close to plain text representation of your Roam workspace on your file system that syncs both ways. All I see is [[Markdown]] and JSON exports. I mean, yeah, if you change the extension to ".org", the Markdown one opens in [[org-mode]], but...
https://youtu.be/Hw2kJF_kxjE Tiago Forte is the Building a Second Brain guy, and [[Conor White-Sullivan]] is the founder of [[Roam]]. I saw a mention of this a couple of weeks back on Twitter, and then again when I was catching up on Micro.blog where Adam Procter and Jack Baty were chatting: https://micro.blog/adamprocter/7622421 But dangit now I see ([[via Jack on M.b|https://micro.blog/jack/7665067]]) that Roam is likely to be $30/month: https://twitter.com/Conaw/status/1214867422496165888
* I'm evenly split between being depressed that [[Roam]] will likely be ~$30/month and fascinated by the soap opera unfolding on Twitter in response to [[Conor White-Sullivan]]'s announcement about the pricing. There is nothing like deep-nerd drama that presses the buttons of both the users and the founder. Interesting to watch it all play out. Also, I know that the pricing model thing works both ways: if I did manage to pay $30 for it, I'd for sure end up using it a whole lot more every day to get maximum value out of it. * And even with the uncertainty about the price and ETA for charging for it, I //still// want to keep putting stuff into it. * One thing I could do with this wiki to make it more useful and fun would be to add one of those random tiddler widgets so that every time it's loaded, I (or whoever) would see a random tiddler from a while back. I've already forgotten most of what I've written in here and it can be surprising to see some of it again. * Here's another thing I wonder about [[Roam]]: No question that the founders are brilliant guys with a clear vision about how to make an app/service the world needs badly. But as they scale up, will their talent at designing and coding this product translate to running a company with the number of people required to support Roam as it grows? I remember that dude who ran [[Evernote]] for a while, who was a passionate leader and loved the product and had great ideas for it, but maybe wasn't as good at actually running a company. I may be mis-remembering that. I don't know; maybe the Roam guys will be great at management, too. I just wonder. * Listening to //Foxtrot// by [[Genesis]] and I hear again how [[Phil Collins]] at 21 years old was a far, far better drummer than I'll ever hope to be.
https://www.nateliason.com/blog/roam Looks really good.
* Here's what I just wrote to [[@adamprocter|https://micro.blog/adamprocter/7688550]] on [[Micro.blog]] about [[Roam]]: ** I hear you! 48 hours ago I was in the "$30 no way in hell" camp, but heaven help me, since then I've caught myself coming up with theoretical ways to cancel other things in hopes of justifying the price for Roam. $30 is more than I pay for any other software, but it's nowhere near what I waste (without thinking twice) on eating out multiple times a month. Another example: Over the span of four days I spend more than $30 buying breakfast and lunch at work. If I brought food from home more often, I could spring for Roam and still come out ahead compared to what I've been doing. And don't even get me started on the dubious value we get from Sling TV for $30/mo. * But, this all does make me realize: I'm not a researcher, writer, economist, or a doctor. I don't //need// the world's best outliner/notetaker/journal/brain, and if I pay for [[Roam]] when it starts costing $, that's going to be a $360/year hobby. I know for certain that I'd use a private database, and I'm pretty sure I'd still keep [[TiddlyWiki]] because I like sharing a big chunk of notes and findings there, so there would always be tension between time spent on Roam vs. TW. But even that may not stop me. The lure of Roam is so strong and it really feels like The App We've All Been Waiting For. * This waffling back and forth about $30/mo may turn out to be like my initial resistance to using [[Roon]]. In retrospect, Roon is a no-brainer. It's worth way more than $10/mo. Sure, [[Volumio]] was free and //could// do the job at some level, but life with Roon is a couple of orders of magnitude better, so the money doesn't even matter. * [[Jack wrote this|https://rudimentarylathe.org/#Friday%2C%20January%2010%2C%202020]] and it is 100% what I was thinking: ** If TiddlyWiki would implement just //some// of the backlinking features of Roam it could be a compelling, free, open alternative. Give me a macro that displays a (collapsible) list of backlinks and the sentence/paragraph they're in and I'd have a decision to make. * I'm going to start dropping date prefixes from all tiddlers except for Journal entries. Thinking of how [[Roam]] links work (and seeing Jack's wiki with fresh eyes as a result) with everything in tidy titles without a bunch of dates just makes so much more sense. * [[Neil Peart]], RIP. Thank goodness [[Roam]] came along so I can copy and paste a metric shit-ton of celebrity tweets of Peart remembrances into it. So far have listened to [[Moving Pictures]], [[Permanent Waves]], [[Hemispheres]], and [[Fly By Night]] on [[Roon]]/[[Qobuz]] tonight.
* Ooooo. I just used [[Roam]] to log the names of some new neighbors we just met during a walk today. I tagged the entry with `#neighbors`. * I've been using [[Roam]] deeply for about one full day and already [[Day One]] seems impossibly compromised by the inability to hyperlink names of people. Like, why the hell would I put any text in it that won't automatically backlink itself? Sure, you can manually pluck out links to other individual //entries//, but it's precisely nothing like Roam.
* I’m at that point with [[Roam]] where I want to fast-forward six months to where I know more of what I’m doing and how to structure things better, but I know there’s no shortcut to getting there. It’s like how when I look back at my earliest tiddlers in [[TiddlyWiki]] and they look so gangly and awkward as I was trying to figure things out, but eventually things settled down. I am impatient! * I can’t bear to even skim the news anymore. It’s all too awful. * The answer to the question of “Does this go in [[Roam]] OR [[TiddlyWiki]]?" seems to be: "Yes, Roam first, then //also// in TW if it would be worth sharing." * Using [[Otter.ai]] to transcribe podcasts and then copying and pasting my favorite parts into [[Roam]] is just a joy. * Poor neglected [[org-mode]].
* Don't tell [[Conor White-Sullivan]], but I am totally invested in [[Roam]] now. * I still want to be able to press ⌘-S to save, though.
* I don't think I'll paste in whole articles into [[Roam]]. I don't want to clutter it up with that much text. But I will liberally steal multiple paragraphs that stick out at me and plop them in there. * Today I was listening to [[Permanent Waves]] by [[Rush]] and I swear to god I heard something new in "The Spirit of Radio": On the long tumble-down-the-stairs fill right before the straight ahead pre-verse riff kicks in, [[Neil Peart]] hits a bunch of toms from high to low, hits the cymbals twice—I knew all that—and then plays the toms //from low to high, ending with the snare// (and cymbal), which starts the riff. I don't know if I just never listened closely enough before, or if it's the combination of [[Qobuz]] and the [[Cambridge Audio DacMagic XS]] revealing details I never caught in 36 years of listening. It's weird when your whole world is turned upside-down.
* Now how can I obsessively put stuff in [[Roam]] if it happens to be down at the moment? Can't even reach https://roamresearch.com :( The Roamcult nerds on [[Slack]] say they have pinged [[Conor White-Sullivan]]. Two days of obligatory work lunches with other people and now I'm free. Oh well. * I finally posted a properly long [[remembrance|https://twelvety.micro.blog/2020/01/16/neil-peart.html]] of [[Neil Peart]] last night. I am such a slow writer.
* +52°F ⛅️ Partly cloudy (but mostly clear) 🙁 * Colonoscopy prep day! No solid food. 🙁 * I stopped using [[Unite]] for [[Roam]] because: ** With all the recent warnings about the potential for data loss, I like to open my database in another browser tab before closing my laptop, to make sure all the data is in there. ** Now I'm doing daily downloads of the [[Markdown]] and [[JSON]] Roam exports for safety, and I could never get those downloads to work in Unite.
* +35°F ☀️ Sunny * Had the [[colonoscopy]] today. Needle for IV was no big deal. Yesterday's prep was way worse. Drug they gave me was excellent and fast. All the nurse ladies were super nice. I'm still dragging from the whole thing. Not quite right yet. Only thing I have energy for is messing with [[Roam]]! * I'm attempting to "change" my [[Roam]] database name by exporting this current (dumbly-named) database to [[JSON]], using the secret invite link (https://roamresearch.com/#/secretinvite) I saw in this [[Slack]] [[thread|https://roamresearch.slack.com/archives/CN5MK4D2M/p1579023497176300?thread_ts=1578984876.156500&cid=CN5MK4D2M]] and just creating a better database name/URL, then importing that JSON back in to the new database. ** bugs found *** Got this error when trying to import a JSON file in [[Safari]] on [[macOS]] **** [img[https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fmy_database%2Fvy7tzoO7TN?alt=media&token=7a02d79c-573e-4f2e-9b61-a99456fbc18e]] **** Successfully imported the same JSON file using [[Google Chrome]] instead after seeing this guy in [[Slack]] had the same problem and [[Chrome worked for him|https://roamresearch.slack.com/archives/CN2L1UUHY/p1577421721018600?thread_ts=1577421339.018100&cid=CN2L1UUHY]]. **** I'm not reporting this one since it's already in [[Slack]]. *** On the All Pages view, the "Created" and "Updated" dates for all imported pages (from a JSON export of a previous database) all show the date I did the import, not the days when they were created/updated in the database they came from. The JSON has that data in it as [[Unix epoch timestamps]]. Why not use it? **** reported the bug here: ***** https://roamresearch.com/#/app/metaroam/page/WVZJcOIpE ***** and on [[Slack|https://roamresearch.slack.com/archives/CN2L1UUHY/p1579568049022600]] *** On the new database where the JSON is imported, the calendar icon doesn't show a future date page tag (Feb 17 2020), even though that future-date page was imported from the old database and exists. Future date page tags only show up in the calendar in the new database when they're created within the new database. **** reported the bug here: ***** https://roamresearch.com/#/app/metaroam/page/tmz8K-lzk ***** and on [[Slack|https://roamresearch.slack.com/archives/CN2L1UUHY/p1579564405021800]] ** How do I delete all the stuff in this new database I made? I don't want to keep this import. I'll stick with the old database until they let us change the db names properly. *** Looks like you can only delete pages one at a time. ☹️ *** Filed a feature request here: https://roamresearch.com/#/app/metaroam/page/raVb4prJj * I know I'm old, but the [[Roam]] guys' method of bug-reporting and feature-requesting in the public Roam database and in [[Slack]] is a pain and makes it hard to know who reported something, whether it was fixed or rejected, and whether it was closed. Why don't they just use [[GitHub]] issues?
* Ah! Corrected the [[Navigating dropdowns with the keyboard in Roam]] tiddler based on what Jack noted [[in his wiki|https://rudimentarylathe.org/#Tuesday%2C%20January%2021%2C%202020]]. Shows you how much I've kept on top of my [[Emacs]] now that [[Roam]] is on the scene! * Realized these two things about [[Neil Peart]] today: ** When Rush recorded [[Permanent Waves]], Peart had only been in the band for just over five years. ** He'd been in the band for just over 1.5 years when they recorded [[2112]]. * One thing I did //not// expect [[Roam]] to do is make me actually post //more// stuff to [[TiddlyWiki]] than I had in a while. * [[Roam]] is like [[microblogging]] for your notes. You don't have to have a title for each thought; you can just keep adding bullets. It makes even [[TiddlyWiki]] look like too much work when you have a random thing you want to add, but TiddlyWiki is way better for distilling the messy Roam stuff down for public consumption. ([[posted|https://twelvety.micro.blog/2020/01/21/roam-is-like.html]])
* +29°F ⛅️ Partly cloudy * Researched toilet seats to go with the (wonderful) Luxe bidet. Ordered the [[Kohler K-4648-0|https://www.amazon.com/dp/B000TF0WMM/ref=cm_sw_r_tw_dp_U_x_-bqkEbFXKBJ45]] Stonewood Molded-wood with Color-matched Plastic Hinges Round-front Toilet Seat, White * Ordered an [[Evans Realfeel 2-Sided Practice Pad]] and a pair of Promark 5A unlacquered hickory drumsticks. I need to get back to my roots. Maybe even learn a rudiment. * I'm a little spooked by the alarming number of [[Roam]] users on Twitter reporting losing data when they close their browser tabs. I'm now opening the Roam database in an entirely separate browser before closing out, just to make sure everything is synced. * [[Terry Jones]] of [[Monty Python]] died yesterday. 😔
* It is killing me not to be able to enter stuff into [[Roam]] all day at work. I generally try to keep the personal stuff out of my work PC's browser. Plus there is the matter of getting paid to be here to like, focus on work. Still... (I seem to remember saying something similar about [[TiddlyWiki]] once before.) * The more places I read from and "check in" on, the more notes I collect. How many do I need? To what end is all this recording and [[notetaking]] and annotating? At the end of my life, will I have this incredible pile of notes at the expense of making anything new?
* Trying [[JetBrains Mono]] in [[org-mode]]. I think I like it better than [[IBM Plex Mono]]? * I want to do an [[org-mode]]-style brain dump of tasks and projects into [[Roam]], but I don't trust it enough yet. If it barfs and loses some of my reference notes and bookmarks, that would suck, but I would easily survive. The thing I can't afford to lose is tasks and projects and due dates. I'm sure Roam will get there someday, but for something that I leave running in the background a lot and jump in and out of, I cannot be worrying about whether my data is saving every time I make an edit or addition. * Damn. I just tried [[Dynalist]] for about 10 minutes and almost got sucked in by how nice and "clean" of an [[outliner]] it is. Until I pasted in a few headlines from [[org-mode]] and realized that as "ugly" as my crazy color scheme of nested headline levels is in [[Emacs]], it is a lot more usable than all the headings in Dynalist being the same typeface/weight.
* I'm stuck. I just cracked open the other half of the [[bullet journal|2019-04-22 bullet journal experiment]] system — the orange [[Rhodia Webnotebook]] — because I haven't done a [[Weekly Review]] in weeks. I should set up a Future Log and get some things down on paper, but I can't start. I flip through it and see pages and pages of never-started tasks and projects. That's when my brain wants to just go digital with everything, but I seem to be stuck there, too. I have all the tools I need and none of them seem right. The way out of this is usually to pick an app or a notebook, start using it, and test whether it works instead of trying to theorize and predict whether it might or might not work. * Maybe I stopped trying with [[Dynalist]] too quickly last night. Maybe we're supposed to embrace the idea of "zooming" into a bullet (a node in the outline), where it looks like a new page, like what happens in [[Roam]] and [[Workflowy]] when you tap on a bullet. Maybe we're not supposed to load up and browse around an entire expanded outline if it's too long and ambitious. But how can I justify bringing another app/service into this hellscape of a computer? Aren't all these sufficient already? (I don't even use all of these anymore, but there are still zombie orphans stashed in all of them.) ** [[org-mode]] ** [[Things]] ** [[nvALT]] ** [[TaskPaper]] ** [[Roam]] ** [[iOS]] [[Reminders]] ** [[Google Calendar]]
* I used [[Dynalist]] at lunch today (on the laptop) to make a dumb list of home/personal projects, each of them with a few indented next actions. It was delightful! And it helped calm me down from yesterday. I was wasting too many cycles carrying it all around in my head. ** I think that for me, the deal is that I can track projects digitally, but I still live by the [[Field Notes]] [[bullet journal]] day-to-day for next actions, and can sync between the two as often as I need to. But I can't manage and think through multi-step projects on paper in the [[Rhodia Webnotebook]] and sync those to the Field Notes. That just makes me nuts. ** This afternoon, the [[Dynalist]] [[iOS]] app survived its first test of "oooh, let me dump in a project/action that I just remembered needs to happen". ** The funny thing is, the two things that I love most about Dynalist are the "move-an-item-to-anywhere" (a.k.a., [[org-mode]] Refile) command, and the [[Roam]]-like instant linking to existing other bullets, anywhere. ** Also, when you press `⌘-S` in [[Dynalist]], it does a save and a little "sync" icon does an animation. ❤️ *** (and i totally [[tweeted about this|https://twitter.com/twelvety/status/1222359523891056640?s=20]] using their invite link.)
* I just accidentally tricked myself into doing most of a [[Weekly Review]] with [[Dynalist]]. It was great, in the same way [[org-mode]] is great (and I would go all org-mode if I were on the Mac all day, but I'm not). I end up typing notes and question and tasks, one bullet after another. It's why I can't plan multi-step projects or "think out loud" in [[Things]]. I just hope Dynalist doesn't turn into a "scorched earth" thing like in the [[Reading about people with ADHD]] tiddler. * Ok, I have now witnessed first-hand how long it can take [[Roam]] to sync local changes back to the server. Right after I finished typing the above bullet with a block reference (in Roam), I opened today's dated page in another [[Safari]] tab. I saw as it "caught up", almost character-by-character, with what I had typed when I was doing the autocomplete to find the block reference. It got there after less than a minute, but it's unsettling. Jack, on his [[wiki|https://rudimentarylathe.org/#Wednesday%2C%20January%2029%2C%202020]] 🤣 > [[Org-mode]] is the [[Hotel California]] of task/information managers. (You bet I linked "Hotel California".) * [[Fantastical]] just announced that they're moving to subscription pricing. For many things that I use and love, I'm happy to pay a subscription. But Fantastical at its new discounted annual price is $3.33/month ($40/year). None of the features I care about are in the Premium plan, and I only use the iOS version, so I'll stick with the free one. * Watching these questions in the [[impeachment]] hearing is making me despair for the future of our country and for humanity. A full-on embrace of [[authoritarianism]]. * Why didn't I start using the [[LaunchBar]] clipboard manager sooner? It's sooooo great!
* An update from [[Dave Gifford]] about [[TiddlyBlink]]! From [[Twitter|https://twitter.com/giffmex/status/1222715195161600000]]: > For those who followed my recent tweets to @RoamResearch and @TiddlyWiki, I made the necessary changes and fixes to @TiddlyBlink. See it at https://giffmex.org/gifts/tiddlyblink.html and an example file at https://giffmex.org/gifts/tiddlyblinkexample.html * Ah! [[Dynalist]] Pro can back up its documents in [[Dropbox]] every day! ** https://help.dynalist.io/article/136-daily-auto-backup > Dynalist Pro users can set up their [[Dropbox]] and/or [[Google Drive]] for daily automatic backups. The backup happens around midnight Eastern time.
* +41°F ⛅️ Partly cloudy * Today's slew of new tiddlers brought to you by [[Roam]].
* This insane goal I have to ultimately log all of my food in [[Roam]] or [[org-journal]] or wherever has just got to go. It's got to be enough to log it in the [[bullet journal|2019-04-22 bullet journal experiment]], and then if it never makes it out of paper format, who cares. * The girl behind the register at [[WPA Southside]] this morning was singing along to "Operator" by [[Jim Croce]]. I said I loved that song and she said it was one of her top 10. She credited her dad with introducing her to him. * On the way to the airport to pick up Sarah's mom, we heard an episode of the [[TED Radio Hour]] about [[slowness]]. They talked to a dude who was part of producing [[Norwegian Slow TV]] videos of train trips across Norway. Here's one that I just got sucked into: https://www.youtube.com/watch?v=3rDjPLvOShM
* +66°F ⛅️ Partly cloudy * One undeniable good thing that will come out of Trump's inevitable acquittal is that the trial will be over and there won't be any more of it to watch. It was totally optional to follow it as closely as I did, and it's my own fault for doing it. But just the presence and spectacle of it had definite toxic effects on my mood, willpower, ability to focus, eating, sleeping, etc.
* +41°F ☁️ Overcast (it was 20 degrees warmer earlier today) * Just sitting here waiting for [[Roam]] tab #2 to sync up to Roam tab #1. ** I suppose if I just don't close either of them they'll eventually get there. * A [[Micro.blog]] conversation I've been having with [[Christopher Wilson]], [[Jack Baty]], [[Pete Brown]], and [[Ron Guest]] about [[journaling]] and [[notetaking]] over the last couple of days at https://micro.blog/ChrisJWilson/8145040 * [[Kirk Douglas]] [[died]] today. I wasn't a major fan, but it's one of those deaths where you read the headline and go "whoa".
Somewhat ominous Intercom message from [[Conor White-Sullivan]] when I opened [[Roam]] just now: > Roam is currently not synching - we suggest not using the app at all for the rest of the day, if you have important notes you've written this session, export your db right now Ok then. But I do appreciate their warning us. I know this temporary [[depression]] is just that: temporary and environmental (due to weather, eating badly, not sleeping, and because Sarah has been sick). It just makes every spare minute I have to do anything feel like the garbage compactor in [[Star Wars]]. The walls are always closing in and you can't win. I've been using a single-page outline of home projects and tasks (as sub-items) in [[Dynalist]] for 11 days now, and while I'm not really much more productive than I was before, at least I'm not trying to keep as many moving parts solely in my brain anymore. Also, at just about the same time, I've started using a well-known app at work to keep next actions and waiting-fors in work projects straight in a similarly dumb outline, and I'm wondering why I didn't do it sooner.
* So there's no built-in way to delete a checklist item in [[org-mode]]? Apparently not: ** https://emacs.stackexchange.com/questions/54605/is-there-a-command-to-delete-items-from-an-org-list * Learned today that [[Anthony Hopkins]] has played piano his whole life. * Bought the [[Elvis Costello and the Attractions]] "Blood & Chocolate" [[FLAC]] from [[Qobuz]] after seeing a note from last week that Sarah loved the song "I Want You". This album was produced by [[Nick Lowe]]. It's so good. Why haven't I listened to it before?
* I turned off the "Auto-focus on first item" option in [[Dynalist]] after realizing that it prevents the `⌘-left` and `⌘-right` shortcuts from allowing for back and forward navigation between different documents. * I just copied into [[org-journal]] an email from [[The Economist]] confirming that we canceled our subscription and it feels like I just carved it in stone. Mmm. No waiting for that tidbit to sync anywhere.
2020-02-09 It's time to clone that old [[2019-06-23 weekly review - process]] and start fresh(er) to account for [[Roam]] and [[Dynalist]]. # Keep [[Roam]] open to scribble down anything that derails me during this process. Paper, Roam, [[TiddlyWiki]], whatever release valve it takes. # ~~in [[Dynalist]], make a new ''week of yyyy-mm-dd'' document (with the first date being this Monday's date) and add/update current projects in it (and drop the dead ones). This should list short-term projects for this week or this week's outcomes for the longer-term projects.~~ # In [[Dynalist]], we'll use a page called ''Current projects'', and add/update current projects in it (and drop the dead ones). This should list short-term projects for this week or this week's outcomes for the longer-term projects. If things linger in here, then we need to figure out if they're really important/urgent. # TKTK what about the [[org-mode]] master outline? ## TKTK Would be good to see if [[2019-06-13 Warren Buffett's 5/25 prioritizing method]] still applies here. ## It's fine (actually, maybe even preferable) if the things listed here are Outcomes instead of Projects. # review calendar for next few weeks # sync up calendar with SH # Review [[Things]] inbox and Today lists # Review `master outline.org` file (this is where I keep a project backlog) # Check [[Reminders]] for anything lingering (or coming up) # scan Gmail inbox for anything on fire that I've missed in the last week. ''Note:'' Do not get derailed into processing/answering the emails you haven't caught up on in the last few days at the expense of finishing the weekly review. Keep your eyes on the prize. If you don't get anything else done tonight but the weekly review, that is ok. ## Starred items ## Spam ## everything else # review the [This Month] log in Rhodia for any projects/tasks to start or migrate # review Future Log spread in Rhodia for any projects/tasks to start # in pocket bullet journal: ## review undone tasks entered in the last week ### Migrate the ones that still matter to the [This Month] log in Rhodia. Overwhelmed already.
* For someone supposedly so obsessed with logging and journaling and recording, I sure am bad at keeping up with it every day.
* Sarah Hand and I have been watching DVDs of [[The Muppet Show]] that I bought her for her birthday. It's even more artfully done than I remembered, and I had forgotten what a pure joy it is to watch. It's such a balm after keeping up with too much news recently. * Turns out, a glob of [[peanut butter]] is a great [[salad]] dressing when you run out of salad dressing. * [[Justine Haupt]] made a rotary cellphone that [[Jack Baty]] [[linked to|http://micro.blog/jack/8283550]], and now C and I want to use the [[open-source]] plans and make one. * AGAIN I spent all day at work and thought in the back of my mind of stuff to do when I got time on the [[MacBook]], made notes about it in my fancy notebook, and now I'm finally home from a family dinner out and I'm too full and dull to do much of anything interesting. I suppose I could finally give [[org-roam]] a try. * All of a sudden `C-c C-j` in [[Emacs]] is working again to invoke `org-journal-new-entry` in [[Org-Journal]]. I swear this wasn't working the last time I tried it.
* I spent way too long last night trying to get [[org-roam]] to work on my machine. Whatever I did was wrong or incomplete, because it sort of half works, but it's nothing like the demo videos. That's fine. I can wait until it's a proper released package. I was just fighting it every step of the way to get it to do anything. * I //could// export from [[Markdown]] or [[org-mode]] or [[org-journal]] to some nicely formatted HTML or a PDF, but do I actually ever, ever do this? No. * The one thing that I have a hard time getting comfortable with in [[Roam]] (aside from the potentially high monthly cost, the murky privacy policy, and it being a hosted app I can't control) is that it leans towards the "throw in little bits of everything each day" model instead of the "here's a single list to add to for topic X, here's another single list for logging Y, and here's another single list to use to keep track of long-running project X". Like, how will I know I'm looking at all the records for a particular thing if I forget to tag or refer to that thing the same way every time I talk about it?
* +32°F ⛅️ Partly cloudy * Ordered a used [[Ludwig]] snare stand from Daniel's Gear Emporium on https://reverb.com to use with the [[Evans Realfeel 2-Sided Practice Pad]]. * I actually finished [[book: The Bullet Journal Method]] by [[Ryder Carroll]]! I highlighted a bunch of ideas and tips in there, but the writing goes on and on is full of cliches. A bunch. Still, worth reading. (I pray he never sees this.) Ready to move on to a new book! * Bought the [[Lotus Plaza]] [[Spooky Action at a Distance]] [[FLAC]] on [[Bandcamp]]. Had been on the wishlist too long. * All these amazing new [[notetaking]] tools are making it easier and easier to collect an ever increasing number of snippets and facts and observations, making it feel like the task of organizing and refining all these collected bits of text will never end. * Finally got around to installing [[Deft]] in [[Emacs]].
* I'm not going to use [[Diarly]] anymore. I had only made a handful of new entries in it and just moved those to [[Org-Journal]]. I had never used the built-in plain text search function `C-c C-s` until tonight. Very cool! * Boy, after messing around with [[Org-Journal]] and [[org-agenda]] a bunch last night (which was no doubt fun), I just opened one of my regular non-[[org-mode]] text files in [[nvALT]] and it is just so dang easy to get around. No guessing about where anything is, no fear of pressing the wrong keys. Not that I'm going to go back all-in on nvALT, but I'm not going all-out of it anytime soon, either. * Saw [[Parasite]] tonight. Wow. Now I see why everyone was raving about it. Here's what I [[wrote|https://letterboxd.com/twelvety/film/parasite-2019/]] on [[Letterboxd]] > One of my favorite things is to know zero about a movie before I see it, and then get sucked in to its world completely. What a beautiful, grimy, gritty, cozy world they created (depending on which scene you're watching). Just masterful all the way through. * I'm still fully into [[Roam]] for notes, but the more I use it and try to figure out where everything should go, the more I think [[journal]]/[[daybook]] stuff should generally not got in Roam. Other than [[CRM]]-type stuff, I don't want boring details about what I did today to clutter up my notes and crowd out more interesting stuff out there.
* I want [[Otter.ai]] but for [[handwriting]].
* My brother and I had dinner with Dad last night. I asked him what he used to use to capture todo's and notes-to-self back in the 70s, like when he was at work and thought of something he needed to do, and where did he write things down. He said that "didn't happen that much"! (''What?'') For things like changing/sharpening lawn mower blades or changing A/C filters, he just kept it all in his head and did it when it occurred to him. ''Who am I and where did I get these genes from, then?'' * It's amazing how much more future-viable [[Roam]] feels now that the saving problems seem to be fixed.
* The weird thing about not writing a fresh Today task list on paper every morning is that I don’t know how far behind I am day-to-day (or how much I’m keeping up, which is rare anyway). If I do make a fresh list and move yesterday’s undone things forward, I have better clarity about how much is slipping //and// I feel worse about it. I can’t win. — [[posted on M.b|https://twelvety.micro.blog/2020/02/20/the-weird-thing.html]]
I feel fairly certain my notes should live in [[Roam]], but where I get stuck is where journal entries should go. [[Day One]] seems like the best mix between slick, stable, secure and universal for now, but man I have never liked how the list of entries appears in the iOS app (and the macOS version isn't much better). It's just a mess, whether in Light or Dark mode. But if I stick with the Day One format and keep dumping stuff in it, I figure eventually something that looks better will come along and be able to import the data.
* +70°F ⛅️ Partly cloudy <- this is not right. Checked [[wttr.in]] and saw this message: > Sorry, we processed more than 1M requests today and we ran out of our datasource capacity. > We hope to solve the problem as soon as possible, so you can enjoy your favourite weather service 24x365 even if it rains or snows. * What if... I actually dug into my many folders of scanned [[film]] photos and actually uploaded one to [[Instagram]] for the first time since January 21st, 2019? * I actually uploaded a photo! I'd forgotten what my entire process was, and I'd also forgotten that I had long ago dropped the requirement to catalog and edit each photo in [[Lightroom]] first before posting it. Today's photo went straight from the [[Finder]] into [[Photos.app]] (where I pressed the magic Auto button for a subtle tweak) and from there to IG. I suppose I'll get to doing it the complete, more-efficient way at some point: putting a batch in Lightroom, getting it all perfect and tagged, and //then// posting the best ones from that set. But boy, what a tactile pleasure just to name and date a bunch of JPEG files properly, even outside of LR. [img[https://twelvety.com/philtiddlywiki_images/2019-05-05-roger.jpg]]
* Oh. I see [[Roam]] is not instantly saving for the moment. Leaving a 2nd tab open.
* +50°F ⛅️ Partly cloudy * Getting back into posting one [[film]] photo a day to [[Instagram]] has short-circuited my obsession with [[notetaking]] apps. It hasn't shut it down, but it's dulled the teeth of that dragon temporarily. And it's not even that I'm posting to [[Roam]] a whole lot at the expense of [[TiddlyWiki]]. I just haven't been converting much of anything that started in the [[bullet journal]] into digital.
+51°F ⛅️ Partly cloudy
I totally did not have time to write this much about [[what makes following COVID-19 so addictive?]] this morning before I leave for work, but there I go again.
* +57°F ⛅️ Partly cloudy * Well, I've eaten chicken in salads at work for three days in a row now, because it was convenient and I wanted it. Sorry, chickens! RIP, [[2019-07-30 Journal (vegetarian-ish)]]. * [[Day One]]'s "On This Day" feature continues to make life better almost every day in a way that no other journal has done. If they could just show me what the corresponding day's page in the [[Field Notes]] [[bullet journal]] looked like, I'd really be set. I could hand do that with images or PDFs of scanned pages embedded in each day's Day One entry, but I'm never going to get around to that.
* How on earth am I supposed to get anything done while there's this stock market and [[COVID-19]] news deluge this morning? * R.I.P., [[Max von Sydow]]. ** [[Max Von Sydow: The Exorcist and The Seventh Seal actor dies aged 90|https://www.bbc.com/news/entertainment-arts-51803195]]
* Well, the wedding we were going to this weekend has been postponed because of [[COVID-19]]. 10% of the guests had already canceled their travel plans. This is all so weird. I feel like my brain is splitting in half while I watch life at work and in our neighborhood go on like everything's normal, but the virus is absolutely here somewhere. We just don't see it yet.
* 53°F ☁️ Overcast * Day 2 of working from home. At worst, it's a little monotonous and uncomfortable, but at least I can do it, and that is a truly lucky spot to be in. Something about being visible to colleagues only by my IM status and by the number of emails I respond to is making me want to be better at email. Even when things are normal, I let too many emails sit unread because I think I "know" what's in them. So I remembered [[Michael Lopp's zero tolerance for unread email]] post from [[Rands in Repose]]. * Also re-found these: ** (2014) https://randsinrepose.com/archives/inbox-reboot/ ** (2012) https://randsinrepose.com/archives/the-elegant-email/ ** (2018) This looks really good: https://randsinrepose.com/archives/rands-information-practices/
* +61°F ⛅️ Partly cloudy * Man, I have GOT to get my shit together. This weird global situation is oddly energy-sapping, and I'm in a relatively good place compared to a lot of people. * Day 3 of working from home. Using [[Michael Lopp's zero tolerance for unread email]] policy is becoming a skill. It breaks the "touch it once" rule, but the vast majority of work emails I get are either unactionable or short enough that there's no reason to save them up and leave them as a simmering source of unnecessary stress. And for the rest of them, at least I have an idea of how good or bad they are and what's in store for when I can get back to them and do something with them. ** For me, the corollary to the rule is to not hang out in the inbox all day, and don't switch to it without thinking. If I don't see the inbox, I can't know about unread emails. But once I see them, I know they're there, and they have to be read as quickly as possible. And of course, mail rules that display alerts about emails from my boss and upper management make it a lot easier to not peek at the inbox as often for fear that I might miss something.
* Using [[5K Runner]], I managed to complete Day 1 of [[Couch to 5K]] in the chilly rain this morning //before// logging on for work! I'd been feeling trapped in my body and knew something needed to change. Like something was dying from the inside out and bad things would happen if I didn't start to move. I've done Cto5K once before, and [[AirPods]] (even old ones) make it much nicer. * I don't think most of us who have the privilege of working from home are grasping just how inordinately screwed a lot lot lot of people are going to be either directly from the effects of the [[COVID-19]] pandemic and/or from the economic fallout from it. And when a ton of people lose out and a giant portion of the economy is gone, everyone is going to suffer. I'm including myself in the group of people who aren't grasping it. I just don't have anything in living memory to compare it to. * Oooo. Nice news about [[org-roam]] from [[Jack|https://rudimentarylathe.org/#Monday%2C%20March%2023%2C%202020]]. Now that it's a package I'll have a prayer of installing it correctly: > Org-roam went 1.0.0 this morning.
* Well, fuck it. I just had to go and angry-post something on Facebook about Trump for the first time in over a year because his "task force" press conferences are such an abomination. I don't mean to make a habit of it, but it was totally unproductive and felt good. * When I hear stories about [[Asian Americans being blamed for COVID-19|https://www.npr.org/2020/03/27/822383360/asian-americans-are-blamed-by-some-for-covid-19-outbreak]], I think that maybe the virus is the earth's immune system kicking in to save itself from humans. * I haven't really been in this bad a mood all day. Just now.
At lunch today I paid the mortgage and the balances on our credit cards. TCB'ing is not interesting, but it feels better than looking at the news as much as I was (and I'm still looking at it plenty, along with [[Twitter]]). I can't do anything about, well, any of the [[COVID-19]] stuff in the world, other than continue to stay home and away from other people. But bringing a modicum of order back to life in our house helps a little. And I got to use [[org-journal]] to record dollar amounts and confirmation numbers for all the TCB'ing I did, so that was fun.
* I don't want the pale, old, pre-[[COVID-19]] skies back when this is over. I'm enjoying the unpolluted blue skies too much. * Being isolated at home makes keeping up with the [[bullet journal]] way more challenging because there are way fewer state transitions than if we were going out into the world all the time. During the time of [[social distancing]], it's so easy to just glide through the day, rudderless, without recording anything that happened, and at the end of the day you've got a blank page. * Every one minute I can avoid being on [[Twitter]] today will probably yield two minutes of calm and/or productivity. Yesterday was such a Twitter-nap-depression-sloth-fest. * Yesterday I saw a bug report on [[Roam]]'s [[Slack]] about someone losing a bunch of data. I don't think that's happened to me recently, but I hate knowing that it can still happen to people. * Woooot! Just saw a [[tweet|https://twitter.com/Conaw/status/1246943815534923777?s=20]] from [[Conor White-Sullivan]] about [[Roam]]: <<< Just pushed up a big change to @RoamResearch to handle offline editing, local caching. You'll now get a green check when your changes are confirmed as hitting the server -- which is useful if you are somewhere spotty wifi. Need to do some UX work to make that clear. Lmk bugs <<<
* I have the distinct feeling that someday, when we get through all this [[COVID-19]] stuff, I'm going to look back on this time and say, "What did I do to help?" and I'm not going to have a good answer.
* +69°F ⛅️ Partly cloudy * I have now finished two weeks and one day of [[Couch to 5K]]! Even though I'm plenty far away from other people and exercising alone, I am starting to feel weird that I'm not wearing a mask when I walk+jog, but I also haven't seen any other joggers/runners wearing masks. I don't think I'm actually in danger or putting others at risk, but I'm still trying to read the faces of people I pass (and they're usually on the other side of the street). * I want to use our 4.5-month-old [[iPad Pro]] more (meaning, "at all"). Now that we just subscribed to [[The Atlantic]], downloading their app seems like a good place to start. I just need to install [[Drafts]] on it so I can use the "save to buffer.md" action to send snippets and URLs to my [[buffer notes]] file (to later never get around to processing and putting in [[Roam]]/[[TiddlyWiki]]). * While doing dishes, I listened to [[Casey Liss]] on [[Accidental Tech Podcast]] [[Episode 372|https://atp.fm/episodes/372]] describe in detail his series of missteps with failing hard drives that almost resulted in a catastrophic data loss on his [[Synology]]. It made me want to fully audit all of my scattered data and get my shit together and use [[nvALT]] to keep track of it all.
* What in the hell. [[Roam]] is going to get better and more reliable at some point, right? * If I had started in [[Emacs]] and [[org-mode]] and/or/plus [[deft]], and then one day I saw [[nvALT]] on [[macOS]], I'd be like OH MY GOD forget Emacs!!! * Man, the difference between using a laptop on the couch vs. sitting at my desk with the same laptop + a proper keyboard, mouse and monitor is: in the former, I'm on my computer; in the latter, I'm //in// it.
* Last night I used the [[Moog Mother-32]] and a new [[iOS]] app called [[Spire]] to record my noodlings. I wanted something easier than [[GarageBand]] but without a big laptop screen to stare at and get distracted by. I lost time! I did it for over 2 hours, I think. Need to do that more often. * Oh god I'm living in Groundhog Year. I was just about to list out all the inboxes and infinity feeds I feel I must tend to, and I remembered having written something about that in this wiki. I searched for "inboxes" and [[2019-04-11 Not making enough things]] came up: > I flit around between various streams and inboxes, dipping into micro-maintenance chores of fun things here and there, being distracted by every shiny new app, service, and tool, and essentially treading digital water with little to show for it except for this wiki. * I totally ordered the [[Massdrop X Sennheiser HD6XX Headphones]] yesterday. Sarah was 100% supportive and egged me on.
* +66°F ⛅️ Partly cloudy * Yay, [[wttr.in]] is working again! * I need to remember this: Even though I'm not what we regard as an essential worker, I can still try to do my job in a way that makes it as essential as possible. ([[posted|https://twelvety.micro.blog/2020/04/12/i-need-to.html]] on M.b) * It is so supremely fucked up that I can watch the [[COVID-19]] death tolls in the US tick up by 2,000 people in one day and it's still somehow hard to remember that there is a person and a family behind every single data point. For me to do this is sad. For lots of people to do it is tragic. * I keep sitting down with the laptop at night, glancing at the day's scribbles in the [[bullet journal]] and the [[buffer notes]] file, thinking I'll transcribe them into [[Roam]] and then [[TiddlyWiki]], and my low energy self always reacts with //please shut up you overeager dork, I don't feel like any more typing or organizing right now, give it a rest for once//. And then the next morning, fresh-faced me starts the process all over again. * Even with the new green syncing-checkmark in [[Roam]], it is //still// worth opening today's individual note page in a new browser tab before moving on, to make sure it's been written to the server. I just did this and today's notes in Tab 2 were blank for a minute until I made an edit in Tab 1. I don't know if the notes really weren't on the server yet, or if the content on the page was just taking a while to load. ([[reported|https://roamresearch.slack.com/archives/CN2L1UUHY/p1586707356305700]] on [[Slack]])
* Well, last night I got all set up to do a [[Weekly Review]] and then realized that my [[nvALT]] in-app link title autosuggest dropdown thing wasn't working, and probably hadn't been working for a while. People on [[GitHub]] had logged issues about it and they were still open months later. And then I wondered if [[nvUltra]]—being actively developed but still in beta—might be more stable. But the beta is still closed and there's no 1.0 available yet, so that rabbit hole had to be abandoned. By the time I was back on track with the review, I spent 5 minutes on it and joined Sarah and Roger for a nap. * Whoever programmed the nightly ~11pm automatic living room lights-out on our [[Phillips Hue]] system is a total dick.
* I'm with Jack. [[Roam]] is great //and// the culture around it is insufferable. It wouldn't be impossible for some different group of really smart people to take the idea, make it rock solid, provide a decent documented on-ramp for new users, be able to scale it up to the size that it deserves, and run away with it. God, I want to keep up to date with what's happening with it on [[Twitter]], but it's hard to watch sometimes.
* I just can't trust [[Roam]] for anything related to todo's or projects or research. At least not yet. Notes and quotes and trivia, sure. * Trump is such a fucking asshole that I'm trying really hard not to give him any more of my time or emotion than is minimally necessary.
Sarah Hand just had to make me promise to do a [[Weekly Review]]. She did everything but physically pull me off the couch to get me to do it. I still don't want to.
* I was not kidding when I said all I cared about recently was researching the [[Modular synth shopping list]]. * One thing I am REALLY good at is starting a good habit, breaking the chain, and then making a whole new chain out of not doing that good habit. It's like, how long can I go without doing the good thing? Oh, a long time, I assure you.
* Trying a new rule where I can't check anyone else's wikis until I post new stuff here. * During quarantine, I usually manage to get in the shower by 8:19 or 8:21 AM. Our team's morning huddle call is every day at 8:30. They would be very sad if we were doing Zoom calls. How will I ever go back to normal?
* How did I not know until now that [[Jerry Garcia]]'s right middle finger was a nub, chopped off by his brother when they were kids? ** from: https://jerrygarcia.com/jerrys-story/ ** > A wood chopping accident with his older brother at the Garcia family cabin causes Jerry to lose much of the middle finger on his right hand at the age of five. * Another depressing bug report about [[Roam]] corrupted/missing bullets in [[Slack]]: ** https://roamresearch.slack.com/archives/CN2L1UUHY/p1588259552399200 ** Reading the parade of issues and bugs people are logging makes me again question why I trust this system with anything. Imagine if [[Dropbox]] had bugs that just randomly made certain bullets and lines of a text file disappear or get corrupted. (I know that's not a fair comparison.) Yet, I keep dumping stuff in Roam. But how in the world can they possibly expect their bug fixing/preventing and data integrity efforts to keep up with their current and expected growth? I feel like we're all setting ourselves up for a huge fall. It seems like there's a missing foundation of fault tolerance. Like, we need the equivalent of filesystem journaling for all the bits in Roam to make sure we never lose data and can roll back to a last-known-good state. * Jesus, now I've seen the bug with my own eyes. I just typed the Jerry Garcia URL bullet above, saw the green status circle, switched to another app, switched back, and the bullet I typed and pasted into was empty.
* At the rate I've been updating this, I suppose I should call it TiddlyWeekly instead of TiddlyWiki. * I don't know whether my daily writing of a task list is a monument to the durability of hope or just evidence of willful denial and insanity. Here's where all my time has been going: [img[https://twelvety.com/philtiddlywiki_images/2020-05-03-modular.jpg]]
* I'm taking a short break from [[Roam]] while the world's alpha testers continue to report data-loss bugs and hopefully their engineers fix them. ("Taking a break" = instead of writing nothing in a wiki for days and then remembering to write in Roam once or twice a week and then copying some stuff into [[TiddlyWiki]], I'm just writing what little I write here first instead.) * I spent way too long yesterday reading about the awfulness that happened 50 years ago at [[Kent State]]. One thing I do appreciate about the anniversary is that [[Eric Meyer|https://twitter.com/meyerweb/status/1257309942215659526?s=20]] always tweets about it. I count on him to remind me of it. This [[virtual 50th commemoration video|https://youtu.be/C8PmgDMj_Zc]] on the [[Kent State website|https://www.kent.edu/may4kentstate50]] is riveting and depressing.
* The daily summary email from the [[Org-roam Discourse forum]] is a delightful thing to subscribe to! * The [[Music Thing Modular]] [[Radio Music]] should be delivered today!
* Oh my god I am losing my mind. In all the years I've had an iPhone, I don't ever remember the iPhone hanging up a call when I pressed the power/sleep button. I thought I was just putting the screen to sleep but I keep hanging up the call (on hold with the credit card company while they figure out who was trying to use the card). Did it always do this and I just never hit this use case? What is happening to me? * I see a lot of smoke rising from some brush fires after [[Roam]] said they were going to start requiring payment as a way to shed 50% of their user base and "fix" their data-loss problem, without actually fixing their data-loss problem. I've just read a couple of tweets or [[Reddit]] comments, but I have a lot of stuff to catch up on before I decide how indignant I'm going to get. * Life is way easier when [[TiddlyWiki]] is the (for now) only place I care about putting wiki-style notes.
* I understand that every single corporation is here for me in this uncertain time, but I categorically do not give a shit. * Jack saying [[Conor White-Sullivan]] "[[has terrible bedside manner|https://www.copingmechanism.com/2020/take-lots-of-notes-thinsp-mdash-thinsp-but-where]]" is 100% perfect. * I suppose I //could// try [[Doom Emacs]], but is now the time?
Well, as cool as Reaper is, I'm downloading the trial for [[Logic Pro X]]. We'll see if I'm $200 poorer in 90 days.
This is so boring for a wiki, but: After trying many things with the dishwasher as it got worse and worse at washing dishes, now it’s just not even filling with water. It’s BONE DRY. So I researched water inlet valves. According to https://www.whirlpoolparts.com, the OEM replacement is part# WPW10158389. Found one on Amazon for $17.78 by Primeco, should be here 5/18. It is always something. p.s. If this doesn't work, we're getting a new Bosch.
+62°F ☁️ Overcast * I badly needed it to be as cloudy and occasionally drizzly as it was all day today. * Started listening to the [[Wind of Change]] podcast tonight. I'm only 23 minutes in and completely invested. I WANT to believe.
+54°F ☁️ Overcast * I thought of the [[Drop Nineteens]] song "Winona" from their //Delaware// album this morning. [[Qobuz]] had it. The guitar parts are as melodic and fuzzed-out as ever, but the vocal just sits there except for a few good phrases and hooks. It's like they never figured out how the verses should go. They sure did milk any similarity they had to [[My Bloody Valentine]]. Even though this song isn't actually //good//, it reminds me of the period in college when I would stay up too late on Sunday nights to watch [[120 Minutes]] and soak up all the videos from shoegazer inspired bands. * I would totally dive into [[org-roam]] and lose myself in it except for: ** I don't think (?) it can do embedded images, which are dead simple in [[Roam]]. ** Of course, in plain text files, there's no way to do bullet-level references the way that Roam can do. But, it's not like I'm actually using those a whole lot in Roam anyway (heck, I'm not even using Roam at all at the moment, while the #bug-reports channel in [[Slack]] keeps reporting random daily weirdness). ** Most importantly, if I totally gave in to it, I'm afraid I'd spend all my time tweaking it and it'd become a project in itself. But that's never stopped me before!
* I should learn how to use locators in [[Logic Pro X]] so I can achieve my dream of recording in a DAW without staring at a bunch of waveforms. The idea is to hide the timeline and only show the mixer and transport, and force me to listen to what I'm doing and figure out where I am. Like learning to orient yourself with a paper map instead of just mindlessly following directions from a GPS talking to you. More listening, less looking. And locators would help skip back and forth quickly, I presume.
* I know that I can't theorize my way through deciding whether to use [[org-roam]] without really trying it, so I predict that by the end of this long weekend, I'll have installed it properly. ** I left a Safari tab open to [[this demo video|https://youtu.be/gDAbpz98ooU]] by [[Ian Jones]] showing off his [[org-roam]] setup and it's just beckoning me. * What I //need// to be doing right now is opening up my [[Dynalist]] current projects outline and breathing some life into it. It's so fraught, though.
* Maybe I can just concentrate on learning [[org-roam]] by itself in [[Doom Emacs]] for now without mucking it up with [[Org-journal in Doom Emacs]] until I have more free time. * One of the things that has totally sold me on [[org-roam]] is its built-in aliases. Seeing that capability by adding `#+ROAM_ALIAS: "WWII" "World War II"` to an item is like cool water on my brain. * I am fully invested in [[Doom Emacs]] now. It's like a game. You learn just enough stuff to get it installed, then Google enough new stuff to figure out how you're doing some things wrong. And I am fully aware that it's taking time away from making music with the [[modular synthesizer]]. * I can easily add to the daily [[org-roam]] pages using [[Dropbox]] scripts in [[Drafts]]! This makes it much more likely that I'll add stuff to these files as it all happens! * [[Roger]] has been in bed all day. I think he's depressed that we've been outside so much and away from him. * I've written more in [[org-roam]] today than I've written in [[Roam]] or [[TiddlyWiki]] or [[Day One]] alone in ages. Part of it is the new-shiny factor, but part is the sense of permanence and calm, and the feeling of doing something fairly outside the norm, which is where I'm happy. (As if Roam is mainstream or something.) But it's also because the hyperlinking is so easy and feels like it will pay off in the future.
* This was the first morning of using the [[Logitech]] wireless keyboard to enter stuff into [[org-roam]] while away from the laptop, by using [[Drafts]] and the action to append with [[Dropbox]]. * I guess every new enterprise [[CMS]] has to have a certain level of hubris built-in to pretend that any particular way we enter and organize content will stick around for more than a handful of years. (Says the guy who is jumping into [[org-roam]] with both feet, but hey, that's a personal platform.) * Browsing the [[org-roam]] [[Discourse]] group is my new favorite way to pass the time on my phone. * TODO Trying to figure out how to get ⌘-X to consistently do a Cut in [[Doom Emacs]]. ** Well, now I see that sometimes I can do ⌘-X to do a Cut, but sometimes I can't. I don't get it. * This [[Noel Welsh: Doom Emacs Workflows]] post looks handy.
* I'm gonna sponsor [[org-roam]], too. (Thanks to [[Jack|https://rudimentarylathe.org/#Wednesday%2C%20May%2027%2C%202020]] for making me aware this was possible!) If [[Roam]] were stable enough for me to want to pay for it, I'd still do it a little begrudgingly, just because of not totally trusting the founders. But [[org-roam]] I feel great about giving money to. Like, I look //forward// to giving them/[[Jethro Kuan]] money. * [[org-roam]] is what I wanted [[VoodooPad]] to be years ago, but it never stuck for some reason and then Gus sold it and I never felt like trying it again. * Watched this intro to [[Doom Emacs]] "Getting Started" video https://www.youtube.com/watch?v=rCMh7srOqvw and ran `doom upgrade`. The first time it ran, it reported some weird errors, but I ran it again immediately and got no errors and all seemed to be ok. (I hope.)
* I'm not sure I can see adding transclusion to [[org-roam]] without making it as complicated and fragile as [[Roam]] itself. I mean, it would be nice, sure, but do we //need// it? * Why is [[Dropbox]] now taking so long to sync text files after I wake up the [[MacBook]]? * I could set up [[org-download]] and take pics of my [[Field Notes]] page for that day and plop it in the [[org-roam]] daily entry for that day. That would be crazy, though. * [[org-roam]] [[Discourse]] note about [[Backlinks to non-roam notes|https://org-roam.discourse.group/t/backlinks-to-non-roam-notes/106]]: > As a quick and easy method, yes you can just move your notes into your org-roam directory. Make sure they have a #+TITLE: at the top like other org-roam notes to make using them easier. * I am not cut out for these days of texting someone back and seeing the dots animate, meaning they're typing their reply in real time. * One of the greatest things about [[TiddlyWiki]] is that I can dump whatever random thoughts out there for "public" consumption, but I can do it with no worries about people I owe emails or texts to, who would know that I'm otherwise "online" and paying attention to something other than the thing I haven't replied to. * Helpful video about "Copying and pasting in [[Vim]]": https://youtu.be/UJ79faY3HWw * Ooooo. [[Plex]] has a new beta "Watch Together" thing out: https://www.plex.tv/blog/coming-in-hot-watch-together-chill/ * Jack is keeping an eye on [[Obsidian]]: https://rudimentarylathe.org/#Thursday%2C%20May%2028%2C%202020 * It's funny that on May 11, I wrote that [[Obsidian]] "doesn't appear to be an [[outliner]]", as if that was a deal-killer. What's also funny is how fickle I am. I've been using [[org-roam]] for like FIVE DAYS and loving it and already another app has me checking it out. If I were smart, I'd just keep my head down and keep using [[org-roam]] until things settle down. ** Hell. I just downloaded the beta and it's really good. Like, a complete rip-off of [[Roam]] and I don't even care. They even have a section for "Unlinked References" and there's all kinds of stuff in there, just like Roam shows. I have to admit there's no mental overhead associated with it like there can be with [[Emacs]] or [[Doom Emacs]]. ** It can also automatically update all old links if you rename a file. * The thing about people who put [[social distancing]] in quotes ("social distancing"), and who think there's an actual choice between the economy and public health, is that they think that if we let [[COVID-19]] just rip through the country that somehow the economy would be fine.
* Jack is about where I am now, but he has more experience with [[org-roam]]: https://www.copingmechanism.com/2020/org-roam-vs-other-roam-alikes ** Most of Jack's notes are in [[org-mode]] and most of mine are in [[Markdown]]. But I still don't know which system to settle on. At least I don't have to worry about [[Roam]] anymore. I should try pointing [[Obsidian]] to a copy of my [[Notesy]] folder of text files and see what it does. * Is there a way to use [[Max]] with audio files for [[musique concrète]]? How does [[Adriene Lilly]] do [[The Blind Tourist]] on [[WFMU]]? * TODO Watch [[Top Gun: Maverick]] trailer. * from https://org-roam.discourse.group/t/how-to-use-roam-tags-and-or-tags/190/6 > If you have tags, they should show up in the minibuffer completions as such: > [screenshot goes here] > allowing you to filter for them. * Even though so many of my text notes are in [[Markdown]], I think I can stick with [[org-roam]] for this dailies purpose because I'm using it as a diary/[[daybook]] more than anything else, and the additional ways of structuring data with TODO's and timestamps, and getting use out of it later, seem to be worth it. Plus, [[Jethro Kuan]] is so super responsive and helpful in the forums and I want to support him. We'll see. * I love their app, but I'm not a fan of this tweet from yesterday where [[Obsidian]] admitted stealing the look and animation of their homepage from some other dude. https://twitter.com/obsdmd/status/1266041974458548224?s=20 * I have to admit that part of the appeal of sticking with [[org-roam]] and anything [[Emacs]]-based is what I call the "[[Stallman|Richard Stallman]] factor", as in, "all I need is this laptop and these text files and Emacs and I'll go live in this hollowed out tree like a [[Hobbit]] forever". * [[2020 music to check out]]: [[Shogun Kunitoki]] - Daniel, on [[Strength Through Failure]] 2020-05-28 * It would be really cool to use [[org-mode]] or [[org-roam]] to catalog shooting notes about photos, but maybe that's something better handled in whatever photo cataloguing system I use. * [[Beorg removes empty lines between headings on sync|https://appsonthemove.freshdesk.com/support/discussions/topics/14000015618]] ** I have verified that this is still happening when I open a file and edit it in [[beorg]]. Oh well. I'll try to not make edits on iOS.
* Friday night I stayed up way too late watching the #rva tag on Twitter for Richmond protests coverage. I'm basically sitting in an ivory tower, aware that I have the luxury of watching it or tuning it out. It seems to be escalating everywhere and there's a looooootttttt of white people doing it, and not just in a way that's defending and protecting others. I get Black people making themselves heard and doing whatever it takes to effect change. I don't get white people in all black, with hammers, breaking windows at CVS, knowing that Black people will get blamed for it. I also don't get police shooting rubber bullets and pepper-spraying peaceful protesters. * I learned this afternoon that Richmond is under curfew starting tonight at 8pm. Wow. Lots of other cities doing the same (including Washington, D.C.).
* OK, [[org-roam]] is working almost //too// well, because I've now made it so easy to add stuff to it that I'm not able to keep up and format all the raw info dumped into it so it's usable later. I can either get enough sleep, or I can have a perfect org-roam knowledgebase/archive. * This was a good day: ** Per @[[OmarJimenez|https://twitter.com/OmarJimenez/status/1268245592964313095]] on Twitter: Minnesota Attorney General Keith Ellison is increasing charges against Derek Chauvin to 2nd degree murder in George Floyd’s case and also charging the other 3 officers, @amyklobuchar confirms. ** [[Ralph Northam to announce plans to remove Richmond’s iconic statue of Robert E. Lee|https://www.washingtonpost.com/local/virginia-politics/robert-e-lee-statue-removed/2020/06/03/0cb346d6-a5e1-11ea-b619-3f9133bbb482_story.html]] ** [[James Mattis Denounces Trump as Threat to Constitution – The Atlantic]]
* I just hopped over to [[Obsidian]] to see "what would happen" if I dragged an image into it. ** The answer is that it copies the image to the folder where your notes are and it inserts a [[Markdown]] link and shows the image in the preview pane. No messing with extra packages or config files or anything. Dammit. * Whatever way [[Jethro]] has backlinks set up in [[org-roam]] is working fine for me. I'm doing this weird thing where lots of entries in the daily notes are headings that are just timestamps and nothing else, and then all the good stuff is stored in the notes under the heading. As long as I hyperlink things in that line or paragraph of notes, they show up in context in the right-hand panel. I'm still trying to figure out if maybe a good model is to make an [[org-roam]] `.org` file whenever I would make a tiddler in [[TiddlyWiki]]. * Will I ever fully absorb all these [[Doom Emacs]] commands and the [[org-roam]] [[keybindings]] that go on top of them? I guess I know they're starting to sink in a little when I shift-select something in [[TiddlyWiki]] and I'm surprised that it actually shift-selects instead of yelling at me to not do that. * The reason I'm still up at 12:14 AM on Thursday night is because it's what we like to call the "[[first night of the weekend]]".
* Fun thread on the [[Obsidian]] forums with the usual religious debate about software lock-in and flavors of [[Markdown]]: [[Why Markdown? [3 POLLS]|https://forum.obsidian.md/t/why-markdown-3-polls/838]] * Oh. I see that the [[Markdown]] flavor [[Obsidian]] uses allows for checkboxes. Hmm. * How fast will [[Obsidian]] be if it's dealing with thousands of files? * [[Obsidian]] is improving //quickly//, but at this rate, and if they add the extra features forum users are clamoring for, how long until it gets bloated? * Turns out, [[Obsidian]] //does// do embedding/[[transclusion]]. May be time to import my [[Roam]] notes to [[Obsidian]] to see what it can do. * [[macOS]] [[Finder]] is now allowing me to search the contents of [[org-mode]] `.org` files. That's new! I don't think I did anything to enable that, but it sure puts my mind at ease. * FINALLY the new [[Momma]] record is out!!! [[Two of Me|https://mommaband.bandcamp.com/album/two-of-me]] was supposed to be available yesterday but I kept checking and didn't see it until today. Just bought from [[Bandcamp]]. It's wonderful. [img[https://twelvety.com/philtiddlywiki_images/2020-06-06-momma-two-of-me.jpg]]
* Yesterday I re-imported all of my [[Roam]] notes to [[Obsidian]] and added the [[org-roam]] files and that's it. I'm converted. I've lived in [[Markdown]] since 2016 and plain non-[[org-mode]] text files since December 2009, so I may as well lie in the bed I made. It's a relief, and I have zero mental overhead with this! Especially now that I can envision planning and thinking through [[projects]] with this format. * "Updates not installed" is going to be my epitaph.
One day after pronouncing my full adoption of [[Obsidian]], I'm already scheming ways I could use [[org-roam]] for [[project management]] instead of [[Dynalist]], while still using Obsidian for collecting notes, since Obsidian is definitely not an outliner. But I don't know. Lots of project management and tracking is keeping notes, so maybe keep Obsidian for that. But I was going to use Dynalist or [[Things]] for PM anyway, so uggggghhhh.
* Need to watch this [[The Innocence Mission]] [[Tiny Desk Concert]] on [[NPR]]: https://www.youtube.com/watch?v=_RT5tZtCAD0 * Listen to [[Blue Smiley]]'s //[[Return|https://bluesmiley.bandcamp.com/album/return]]//, per [[Momma]]: “this shit has texture” ([[music]])
* TODO fix my [[BetterTouchTool]] [[buffer notes]] [[script]] to format links as [[Markdown]] and not [[TiddlyWiki]]. * Seeing that [[Chris Aldrich]] wiki last night jolted me into remembering that there are lots of people on [[TiddlyWiki]] out there. These wikis are so disconnected from each other that it's easy to forget they're visible to anyone as long as they bother to visit. I added him to my [[Daily Haunts]] folder in [[Firefox]]! * [[Roam]] just opened up pricing. $15/month is reasonable, and the promises of local-only/offline storage being built out are promising, but I just don't think I need it now that I have [[Obsidian]].
* Amazing [[AC/DC]] live video of [[Let There Be Rock|https://youtu.be/s3nEAmt5AZ8]] at the Apollo Theatre, Glasgow, April 1978. * [[music]] heard on [[Strength Through Failure]] from [[2020-06-11]] ** [[Curtis Mayfield]] - We People Who Are Darker Than Blue ** [[Broadcast]]: The Future Crayon ** [[John Coltrane]] - Alabama (from The Gentle Side of John Coltrane) ** [[Noah Howard Quartet]] - Apotheosis
* One thing that I will grant that [[Roam]] does better than any file-based [[wiki]] is completely remove any mental overhead about what filename to give to an "entry" or a "thought". * [[Journaling]] is one thing, and it can be a drag. But recording details about the people and events of today in [[Obsidian]] or [[Roam]], where I can make connections and create links that have a prayer of resurfacing in the future is a //whole// 'nother thing.
* [[question]]: How to monitor daily changes to a snapshot of a batch of text files to make sure data isn't lost? * [[TODO]] Fix the [[Obsidian]] keybindings for following page links so they're consistent (not like they are now, with `⌘`-click vs. `option-Enter`). * What if I had a bunch of `[[todo]] do this thing` next actions in [[Dynalist]] or [[Obsidian]] with `[[projx - blah]]` at the end of each one to link to its project page? * It's funny that in my day job, I'm like "there's a cloud app/service for that, WHY are we building our own locally in a dumb silo", but when it comes to my personal notes at home, I'm like "ehhhh, let's just keep some text files in [[Dropbox]] and edit them with local apps where I can see everything". * One week later, I'm still humming "Double Dare" by [[Momma]] on a continuous mental loop. [[earworm]] [[music]] * Watched [[Knives Out]]. It was good! https://letterboxd.com/twelvety/film/knives-out-2019/
* Welp, just disabled the M.b-cross-post-to-Twitter feature because it does no goddamn good and only gets me into trouble.
* Cool [[Obsidian]] forum post about various [[CSS hacks|https://forum.obsidian.md/t/meta-post-common-css-hacks/1978]] * Ohhhhh, being able to hyperlink between [[Markdown]] files in [[Obsidian]] is a wonderful way to have a [[car property taxes log]] linked to the [[Honda Fit log]] and the [[Honda Fit Sport log]]. Why didn't I do this before?
* I'm already scheming ways to ditch [[Dropbox]] and get the [[Raspberry Pi]] downstairs working again for running [[Syncthing]] all the time (inspired by [[Nikita Prokopov]]'s [[post|https://tonsky.me/blog/syncthing/]], via Jack's [[wiki|https://rudimentarylathe.org/#Monday%2C%20June%2015%2C%202020]]. Just would need to figure out how to view text files from the phone. Or, I guess I don't have to go //all// in Syncthing. * Trying [[NetNewsWire]] for [[RSS]]. I do love how there are 17 hand-picked feeds in there already. I'm going to leave them in there and only take out the ones that don't resonate. ** ...5 minutes later... ** DANG IT'S GOOD. It made me want to use Apple [[Mail.app]] on the Mac, because native apps feel more real than web UIs. * Uninstalled [[Little Snitch]]. I tried it briefly, had never bought it, was too confused by the options, and figure I can live without it for now. * I need to read [[Bring the War Home: The White Power Movement and Paramilitary America|https://www.goodreads.com/book/show/36228413-bring-the-war-home]] by [[Kathleen Belew]]. * I increasingly can't think properly without today's [[Obsidian]] page open. * Places today's tasks might be: ** [[Dynalist]] ** [[Obsidian]] ** [[Reminders.app]] ** [[Things]] ** [[bullet journal]] ** [[Drafts]] * Even though I'm not using a new email address with [[Fastmail]], the fact that I didn't migrate all the old stuff over means that I achieved this message in the inbox just now: `This Folder Is Empty` * I like using Apple [[Mail.app]] on macOS, but it's barbaric that there's not a one-key shortcut to archive a message. I know I can set up a command-key shortcut to do it, but that's no way to live.
* I had forgotten that you can make completed tasks in [[Things]] move to the Logbook daily or manually instead of immediately. It's motivating to see stuff I've done throughout the day appear as crossed off instead of them just disappearing. It's more like paper, and I currently don't have the energy to keep up with paper from writing down tasks. It never seems to be in the same room as me. * [[Ordered]] a used [[Doepfer A-120 VCF1 24dB Low Pass Filter]] from a seller on [[Reverb.com]]. I couldn't afford not to! * Canceled [[HBO]] through the [[Apple TV]] app on the [[Roku]]. Will stay active until the end of June. It's silly that the billing for it is done by Apple, but the only place you can find it in a list of subscriptions is on the physical Roku device, inside Roku's Apple TV app. Can't get to it from the [[iTunes Store]], nor from the Apple TV iOS app, nor from an [[Apple ID]] account page on the web. * Bought [[AnyFont]] for $1.99 after seeing [[this old tweet|https://twitter.com/agiletortoise/status/935689716959272960]] from [[Greg Pierce]] (after googling "add IBM Plex Mono to iOS"). [[IBM Plex Mono]] looks lovely in [[Drafts]].
* Ah! After over 4 months of not being able to automatically import our bank's credit card transactions into [[YNAB]], I finally learned in a [[forum reply|https://support.youneedabudget.com/t/q6hy5ns?r=x2hyr42]] by YNAB Support that you can import them directly as files. QFX ([[Quicken]]) is their preferred format. I'm doing this now and it seems to be working! * Discovered [[Elephant Gym]] playing live at the Megaport Festival in 2018: https://youtu.be/saccx5dTmKU - wow. * From [[Jason Kottke]]: [[Palo Alto, a Previously Unreleased Thelonious Monk Live Album|https://kottke.org/20/06/palo-alto-a-previously-unreleased-thelonious-monk-live-album]] > A [[Thelonious Monk]] live album that was recorded in 1968 is set to be released for the first time on July 31, 2020. Ooooo.
* Maybe my project names should have images or photos with them. It's a lot more exciting and interesting to pick a movie from [[Letterboxd]] than from a plain text list. Same for picking an album in [[Roon]] vs. a plain text list. * Well that's embarrassing that I didn't know about virtual desktops in Windows until just now. * I don't even care about keeping fiendishly obsessive notes anymore. What's the point? * I want the structure of [[org-roam]] entries but with the prettiness and low mental overhead of [[Obsidian]]. * Although it actually isn't, everything feels terrible. We're blasting through our previous [[COVID-19]] new daily case totals, people don't want to be told to wear masks even though it's the easiest fucking thing in the world, and the person in the Oval Office will do whatever he thinks he has to to stay in power and we can't do anything about it. * Don't do it. Don't look at their Facebook wall. Do not do it. * Okay, I will not.
* For some reason, my [[Obsidian]] only shows the inspector/developer tools by pressing `Alt-Cmd-I`, not `Cmd-Shift-I`. At least I can see all the CSS goodies now.
* New good stuff in [[Obsidian]] [[v0.7.4|https://forum.obsidian.md/t/obsidian-release-v0-7-4/2641]]: You can now swap lines up or down with the keyboard! * I haven't looked at any wikis or anyone's blogs in a week. I got behind and working on music and then I was depressed and in a bad sleep cycle. I have no idea what's going on and feel like I'm missing out. * I haven't used [[Things]] much in about a year and all of a sudden I started again and boy, it's nice. They either made it even better, or I forgot how you just start typing anything and it just surfaces it all for you. With [[Obsidian]] carrying the burden of notes, I may have to ditch [[Dynalist]] for projects, which I wasn't using much anyway. Whither the [[bullet journal]]?
* I saw the [[Sony NW-A45 hi-res audio player]] sitting forlorn on a bedroom shelf. It had been months since I'd turned it on, but I listened to it while working today and it sounds as good as ever. Especially when boosted by the old [[Mackie MS1202]] for driving the [[Massdrop X Sennheiser HD6XX Headphones]]. The nice thing about it compared to using the iPhone: No worries about USB interface weirdness, no wondering whether a file is downloaded to local storage, no deciding which [[Qobuz]] release is the most authentic and least compressed, no buffering, no wifi issues, no worrying about (my beloved) [[Roon]], no phone calls interrupting the music, and no notifications. Also, *hardware buttons*.
* That was a hard week, and the next few days will be, too.
* Man, I have lost the internal biological clock sync that tells me when to take notes and when to log them here. I feel like this is the first time I've been able to properly sit down with my own computer in weeks. * When my energy is really low and time is really scarce, it doesn't matter whether I use [[Obsidian]] or [[Roam]] or [[org-roam]]. I don't have time or inclination for any of them.
* Mark McElroy is writing some interesting posts about "thought processors" instead of just dumping notes in "everything buckets": https://markmcelroy.com/dreaming-of-a-thought-processor/
* [[Thank you, Jack|https://rudimentarylathe.org/#Monday%2C%20July%206%2C%202020]]! The week did get better, slowly. Whew. I'm glad that's done. By the way, count me as one of the people who is glad your daily entries live natively in TiddlyWiki now. It's fun to be rewarded for manually visiting a wiki regularly. :)
* Who the hell was the marketing genius who chose the phrase "defund the police"? Did they really think that would resonate with most of the country? Did they think that people would bother to dig deeper into what that actually meant and all the grey areas it covers and all the possible ways to go about it? My guess is they just decided "eh, we'll let them figure out what we really mean while we shout it at them and if they don't get it, fuck 'em". How did that work out? * Because of Jack's tiddlers about the [[Keychron K2]] and [[Happy Hacking Keyboard]], I spent way too long today learning about Cherry MX switches and Topre switches and all that. I'm quite likely to justify buying a keyboard I don't need because a second quarantine is coming and I'm going to be home a lot more and I need something to make me want to use my desk for fun computer stuff at night after I've sat at it for 8 hours working at home each day. Not that I'm complaining. * We finished bingeing [[Dirty John]] tonight. Holy moly what a great series. Terrifying, creepy, expertly written and acted, and with a perfectly slow pace.
Oh my god. "Find the perfect Topre keyboard with arrow keys" was not a project I envisioned being at the top of the list for this weekend, but here we are! The [[Happy Hacking Keyboard]] looks fantastic, but I just cannot see myself getting used to non-dedicated arrow keys. So the [[Leopold FC660C]] with silent Topre keys looks like the way to go, but it's unavailable for at least the next 1.5 to 2 months, at best. And now that I've watched enough YouTube videos to see how much nicer sounding (and feeling?) a proper keyboard would be than my piece of shit Logitech membrane keyboard from work, I need to fix this problem NOW. Something with Cherry MX Browns could be a bridge to get me over the hump, but it seems stupid to buy a keyboard I'd only use until the Leopold was available.
* I guess life is better now that I know that other mechanical keyboard options are out there, although it's not easier, because now I just stew about the mushiness and imprecision of the Logitech K120 keyboard from work, while I wait for the [[Keychron K2]] to arrive. Oh, and the silicone o-rings arrived today. I don't know for sure that I'll need them, but who wants to be relegated to clumsily "bottoming out" past the point where the key actuates? I certainly don't want to bottom out. * Subscribed to [[FastMail]] for 2 years. Probably should have done it for 3. Now if I could only get myself to bear to look at email again. * I'm tired of friction creeping in to every digital interaction everywhere. Email newsletter popups on web pages, waiting for apps to sync before I can enter data into them, [[dickbars|https://daringfireball.net/linked/2011/03/06/dickbar]], endless prompts to update iOS, links that move out of the way by the time you tap on them on pages that are heavy and slow to load/render. Everything is getting worse. * Well, this is the third night in a row that I've managed to clean my mouth guard, floss, and brush, all well before bed, and thus safely before I lose any momentum to accomplish anything healthful. The other half of this is making sure to do all of those things before settling in with a laptop. * All these "troops" being federalized to "quell unrest" or whatever the fuck are really depressing me. This move by Trump and the DHS is scarier than any rise in crime, and there's nothing I can do about it.
* Good god there are [[Topre]] clones: [[The TOPRE Alternative: Niz EC 45g Keyboard Review (YouTube)|https://www.youtube.com/watch?v=rKZmsJdM35E]]. I should just look away, because I know they can't be as good. * The new [[Taylor Swift]] [[video|https://youtu.be/K-a8s8OLBSE]] is totally great and inventive. Makes me want to live in that little world. And the chorus in the song is catchy!
* Wow. The [[2020-02-09 weekly review - process]] tiddler is hysterical. Since that tiddler was started, the pandemic hit, our whole department started working from home, I abandoned [[Roam]], and I still subscribe to [[Dynalist]] but I don't know why anymore. * This is the first weekly review with the [[Keychron K2]]. I'm also stupidly trying to force myself to learn to [[touch type|touch-typing]], but it's not taking. Awfully hard to unlearn 38 years of bad keyboard habits. But I am looking forward to hooking this thing to my work laptop starting tomorrow. You have to bring some fun and pleasure to your work somehow, even if you're using your own equipment. * Installed 2 new oven hood lamps. Incandescent R16 bulbs from [[Philips]]. No more LEDs in that spot. * Pulled out and discarded the bad Ethernet cable that used to go to the Roku or [[Squeezebox]] or something (at the TV/stereo area in the living room). * Installed new flat Ethernet cable for my work PC. Ran it through the holes in the floor to the basement. * Thoroughly disassembled, dusted, labeled, and rewired/rerouted wires behind the half-height IKEA thing. Now the router, [[Roon Intel NUC]], [[FLAC]] hard drive, and APC UPS all have a place, and their wires are neat and tidy and have mounting clips so they're not weighing down their own equipment. * Ok, it's not so much a [[Weekly Review]] as it is a glance under the baseboards to see what's rotting. * Sarah said, "It's like you don't even WANT to do a weekly review." And then I admitted that it's just a personal weekly review, not a work-oriented review, and she laughed and said "You don't have that much going on!" ** I know! * Well, I stupidly bought the wooden wrist rest that goes with the [[Keychron K2]], thinking that I wouldn't want to be without it because the profile of this thing is so high, but I really don't think I need it. I always end up with the keyboard so close to the edge of the desk and my wrists just sort of hover when I really get going with typing anyway.
* Well, I guess I really own the [[Keychron K2]] now that I've opened it up and stuck shelf liner and cut-up yoga mat pieces in it to quiet it down. It's not a perfect keyboard, but will do for now. It's funny that Jack was the first person I saw who mentioned it, and I researched the hell out of inexpensive mechanical keyboards and ended up buying it in the end after all that anyway. Could have saved myself tons of hours! But I guess I wouldn't have learned all that keyboard trivia.
* I wrote some thoughts down about the [[Keychron K2]] and they ended up being a [[blog post|https://twelvety.micro.blog/2020/07/30/keychron-k-keyboard.html]]! * Oooooo. [[Obsidian]] just added an "outline" plugin which shows an outline of the current file in the right sidebar. I'm not sure if I'll actually use that, but it is cool. I so badly want them to introduce an alias function like [[org-roam]] has had for so long. It was such a luxury to name things whatever I wanted without worrying about filenames, and to think of alternate ways to referencing a note right up front, and then I'd know that no matter how I created a link to that note, one of my aliases would catch it. Obsidian isn't that smart yet. * I should really remember to look at [[Micro.blog]] at least once a day. * I suppose I should break the seal and actually look at my email. But SO MUCH DREAD. It's so much more pleasant to close myself off from everyone but Sarah. * I'm going to have to lube the backspace key on the [[Keychron K2]]. The sound and feel of the scraping is killing me. * I wonder what keyboard I'll buy next. Will I say Fuck It and get an HHKB [[Happy Hacking Keyboard]] Pro 2 or pre-order some Leopold Topre board, or find something else that ticks all the boxes? If it's an expensive keyboard, I'm going to have to lug it between work and home (whenever we go back to our building) and that's going to be a major pain. If it's not so expensive, I'll be able to have one at work and one at home. * It's so weird that two weeks ago I knew nothing about keyboards at all. I just used whatever was decent enough that was in front of me. Now I know too much and can't go back.
* Installed [[Karabiner-Elements]] to see if it would work to switch the Option and Command keys on the [[Keychron K2]] if I have it running in Windows mode. It works. Now the only question is how many hours will go by before pre-ordering a [[Leopold FC660C]]. * Ok, it's no [[Leopold FC660C]], but I [[installed PBT keycaps in Keychron K2]] and with the other mods it's now the best keyboard I've ever used so far. People with mushy keyboards that flex when they type on them do not know what they're missing! * Congratulations on the [[Leica M10-P|https://rudimentarylathe.org/#Thursday%2C%20July%2030%2C%202020]], Jack! Looks beautiful.
* Canceled [[Qobuz]] Studio Plan ($14.99/mo). It'll end on 2020-08-25. I wasn't listening to it enough, and I'd rather have the burden of organizing my local [[FLAC]] library (which I had completely stopped doing) and buying actual releases than wading through Qobuz and feeling like I'm not using it enough. Here's my list of [[Qobuz favorites]]. So many of them were CDs I already own and have ripped, or just never got around to ripping. * Canceled [[Dynalist]] ($9.99/mo because I had never gone with the annual plan). It's so good, but between using [[Obsidian]] for notes, and [[Things]] for projects and tasks, I just didn't need it anymore. It'll expire on 2020-08-13. * Paid for [[Obsidian]] Catalyst license. * [[Super Lube 51004]] arrived! Applied some tiny drops to the [[Keychron K2]]'s Backspace, Return, and Left Shift. All are improved and less scratchy! * In each day's [[Daily Notes]] file in [[Obsidian]], I'm dumping short bullet-point kinds of notes about "what we did today" along with clippings from articles, Twitter threads, and random bits of info that don't deserve their own individual files. It's a mess! I would convert more things to their own files, but I have to think too much about what to name the files. I never had to do that in [[org-roam]], because it always generated file-system-safe filenames and the aliases worked so well. I would give clipped quotes and news items and tweets pseudo-titles in Daily Notes by putting them in a bullet and then nesting the quoted text as bullets within them, but putting a `<` character after a bullet is almost as gross in Obsidian as it is in [[Roam]]. So what I'll probably do is put item pseudo-titles in `##` headers, since the H1 `#` headers are always for the title of the daily note. Time to edit the Obsidian CSS file again to make headers all the same size in plain text.
* The fastest way to feel like you have a new phone is to turn JavaScript off in mobile Safari. At least for the sites that don't completely go blank when it's off. It's shocking how fast everything is.
* Sarah's iPhone 6 has the dreaded battery bulge, and it's long past time for us to order her a new one anyway, so we just did. An iPhone 11 with 256 GB. Just have to figure out how to migrate her two broken Apple IDs to a completely fresh Apple ID and not lose anything. * I really, really like the feel of the new [[YMDK ISO OEM PBT keycaps]] on the [[Keychron K2]], and the keys now have a nice "clop" they didn't have before. But the sound of the [[Topre]] keyboards all over YouTube still haunts me. I type a lot of shit during the day for work, and it's so enticing to imagine every one of those keypresses being more of a pleasure. Plus, the totally messed up PageUp, PageDn, Home, End layout of the K2 is killing me. Not literally killing me, because there are so many other terrible things happening in the world, but it's not the best. * When I was searching for sample photos of the iPhone 11, [[Craig Mod]]'s old [[Leica Q]] article came up, and I re-read it and went down a rabbit hole of looking at pictures from that camera and the [[Sony a6500]], [[Sony RX1R II]] and [[Ricoh GR III]]. But then I remember that I don't actually want a new digital camera. I just want to have the energy to use my film cameras again. I just want to have the energy to do anything besides eat, sleep, work, and look at Twitter.
* Sarah's new [[iPhone 11]] arrived! She loves it. She started with a brand new Apple ID and is happy. * Sarah was right about [[What We Do in the Shadows (tv)]] way before I got it. As usual. It's funny and mundane the way "The Office" is, and I never even got into that. * Tonight Matt sent to all the dudes a Spotify link to a [[Graham Parker]] song. That one little link was joyful because he knew that most of the guys on the other end of the text would be able to play the song, and no one gave a shit what bitrate it was encoded at. I can play in my lossless sandbox alone, or I can join the rest of my friends in their lossy party and have fun. * I need to figure out how to make a laterally adjustable spindle for a turntable to correct for off-center LPs, like a poor-man's [[Nakamichi Dragon Computing Turntable]].
* The past three days have been total, all-consuming [[hotbrain]] about [[tonearm research]]. I accidentally snipped the [[DIY unipivot tonearm]] wire right as I was getting close to re-mounting it on the [[Kenwood KD-600]] on Sunday. I took that as a sign to just order the thing I need instead of sourcing more impossible-to-find Mogami ultra-flexible shielded "tonearm cable" harvested from hard drives, replacement cartridge clips, re-soldering all that for hours, and then ultimately still wanting a non-DIY arm. Found a new Moth-branded [[Rega RB220]] for relatively cheap from [[Britaudio]] in Raleigh. They also have stores on eBay and Audiogon. That arm is the same as the one that comes with the current [[Rega Planar 2]], except that it adds an antiskating control. This is going to be my first "real" tonearm!
I adjusted the [[Rega RB220]] to the [[Löfgren A]] curve using [[Conrad Hoffman's custom arc template generator]] (after re-finding [[my own dang 2016 blog post|https://twelvety.com/blog/baerwald-conrad-hoffman-winebottler-alignment]] the other night, [[a la Jack|https://jack.micro.blog/2020/08/08/while-going-through.html]]) and it blossomed. Nearly perfect tracking all the way through a side of an LP. So that's good. But the [[Kenwood KD-600]] sped up to 45 RPM randomly just now, then went dead. Wouldn't respond to pressing the 33/45 buttons. Turned it off for 10 seconds and then it started working again. But it had a couple more instances of acting weird. I know this thing is living on borrowed time, but I really hope it pulls through and I don't have to think about shopping for another turntable anytime soon. Fingers crossed.
* This week, it's been all tonearm tweaking, all the time. * Wow. I don't know how I hadn't heard this [[UFO]] song, "[[Cherry|https://www.youtube.com/watch?v=ZmoabKcA4Cc]]", until now. And what a performance. * And that somehow led to YouTube playing this live [[Heaven & Hell]] show from [[Rockpalast]] in Germany in June 2009. ([[Ronnie James Dio]] died in May 2010.) Wow. He still sounded great, but it's sad that he was diagnosed with stomach cancer so soon after this. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//RPnNGJLj584' frameborder='0' allowfullscreen></iframe></div>
* One of the eternally hardest challenges of working with other people on a project is carving out a mental model that captures what we know, what we agree on, what we’re doing, what we’re not doing, what questions we still have, and what the answers are to the questions we had in the past. And making it easy enough to use the model that everyone remembers to refer to it and update it. * So, just now, I removed the extra weight I had put on the headshell of the [[Rega RB220]], turned the tracking force back down from 1.8g to about 1.65g, put the heavy rubber mat back on the [[Kenwood KD-600]] (after unsuccessfully trying a DIY cork mat and the old Thorens mat), and it sounds better than it has the past two weeks! Part of it may be the acrylic armboard, but it's also now on a more solid, short stool/shelf. Even so, I couldn't help but order a [[CoRkErY Decoupled Cork N Rubber Turntable Platter Mat|https://www.hudsonhifi.com/collections/high-fidelity/products/corkery-decoupled-cork-n-rubber-turntable-platter-mat-1-8-audiophile-anti-static-slipmat-made-in-usa]] and some [[IsoBlock Silicone Isolation Feet|https://www.hudsonhifi.com/collections/sound-isolation/products/isoblock-silicone-isolation-feet-4-pack-soft-60lb-capacity]] from [[Hudson Hi-Fi]]. I also do still need a large maple cutting block to use as an isolation platform under the turntable.
* The "Ladies from the Canyon" compilation I just bought by the [[Numero Group]] is bad musically, and the vinyl pressing is awful; sibilant and strained. The songs are unlistenable except for the ladies on there who are doing their best [[Joni Mitchell]] imitations, and even then it would be better to just listen to Joni Mitchell. Hearing it was so depressing that I had to put on the old LP of [[Thelonious Monk with John Coltrane]] to hear good music again and not feel like the new setup of the [[Kenwood KD-600]] and [[Rega RB220]] was a total failure. (It worked.) ----- I wrote this on Twitter earlier today: > I support the protests and the need for massive changes, but I dare one of these bullies to loom over me and coerce me to raise my fist in “solidarity”. I’d sit on my hands just to spite these dorks. Have they never considered *attracting* people to the cause? It was a quote-tweet response to this https://twitter.com/KunkleFredrick/status/1298344285079838720?s=20 > 1) In a scene that played out several times Monday, a Black Lives Matter protest that began in Columbia Heights confronted White diners outside D.C. restaurants, chanting “White silence is violence!” and demanding White diners show their solidarity. #DCProtests That's not protesting. It's just a bunch of people ganging up on someone and being threatening assholes. And probably the reason it bugs me so much is because I don't want this shit to detract from the actual protests and the reasons behind them. We have a hard enough fucking time convincing people that Black lives actually matter without this going on.
* Another pandemic day working from home, another nighttime nap between the end of work and the start of dinner. Now it's 1:15 AM and it feels like 10:30. * For me, [[turntables]] are the [[Emacs]] of audio: lots of effort and research to understand what at first looks simple, prone to endless tweaking, lots of variables and settings, always open to improvement, inefficient, require manual work, glorious once they're tuned, easy to obsess about, and more fun than any other similar tool. * Ordered a vinyl copy of [[Descendents - All]] from [[SST Records]]. It's a new pressing, because the old 1986 pressings are rare and expensive. Fingers crossed it doesn't suck. * The [[IsoBlock Silicone Isolation Feet|https://www.hudsonhifi.com/collections/sound-isolation/products/isoblock-silicone-isolation-feet-4-pack-soft-60lb-capacity]] from [[Hudson Hi-Fi]] arrived today. I put them between the turntable stool/platform and the cheap pine isolation block that the turntable sits on (until the [[Butcher Block Acoustics]] block gets here on Tuesday). I may be imagining this, but it does seem to make the bass frequencies less squishy and more focused. The IsoBlocks also came with four rather thin rubber discs that weren't wide enough to put under the [[Kenwood KD-600]]'s adjustable feet, so I put them under the legs of the stool. All good so far. * I think the biggest problem with my [[DIY unipivot tonearm]], as detailed as it was, was that different frequencies bounced around at different speeds in that porous cedar arm. With this new [[Rega RB220]] being made out of one chunk of aluminum, it sounds like everything is arriving coherently and in phase all the time. The only thing the DIY arm was better at is tracking. I can hear different parts of each side of a record lining up better or worse with the [[Löfgren A]] geometry I've settled on with the Rega arm. I need to tweak that some more. * I went 24 entire hours thinking the [[RoPieee]] [[Raspberry Pi]] [[Roon]] endpoint wasn't working, when it was just that the recent power outage had shut off the [[Cambridge Audio DacMagic XS]] and I didn't realize it. * Digital recording and the ubiquity of the [[DAW]] has completely ruined music. When I listen to modern records, I can practically see how the artist, engineer and producer have visually laid out their tracks in [[Apple Logic Pro]] or [[Pro Tools]] or whatever it is they use now, instead of using their ears and committing things to tape in linear time, where it's harder to take stuff out and there's no Undo. Every component sound file lives in its own space, disconnected from all the rest. Nothing fits together and you don't have to have a vision for how you want something to sound before you start recording. You just figure it out as you go by trying a million plug-ins until something works. And the unerring timebase of digital sampling clocks makes for a very easy to ignore signal. There are no imperfections anymore. I base all this opinion on my dearth of experience with recording and producing, and the zero award-winning records I have produced in my lifetime.
This is embarrassing. I didn’t realize Jack had just written a [[post about neglected tools|https://www.baty.net/2020/neglected-tools/]] and there I go spouting off about largely the same thing. But I ultimately think Jack planted the seed in my brain last week anyway with his wiki entry about not having the energy to maintain his tools. That started a whole shame spiral in my brain when I looked around our house.
* I tried fixing the old [[Hitachi F391]] VHS VCR this morning so that it would play audio-only [[VHS Hi-Fi]] recordings we made in the early/mid-90s. The need for "fixing" was because it wouldn't play anything that didn't have a video signal for more than 30 seconds without stopping and trying to rewind. That's no good for trying to archive audio. So I opened it up, cleaned every surface that touched the tape, put it back together, and it was no better. I took successively deeper dives into the innards, at one point pulling the insert/loading mechanism out, figuring I was smart enough to get it back together in working order. I figured wrong. I either lost a tiny spring or dislodged some gear to the point where the tape wouldn't even thread anymore. Luckily it ejected the tape when it realized something was wrong. The final straw was when I turned the whole thing upside down hoping to shake out the missing spring and one of the metal pieces fell on my pajamas and got dark grey grease on the front of them. By then it was past 5pm and I still hadn't showered, so I took it as a sign to stop trying and let this unit go back to the earth. At least I learned a lot about the innards of VCR transports. * I just ordered a [[Sony SLV-N50]] VHS VCR from someone on eBay. That unit looks like it was manufactured about 20 years ago, so hopefully whatever belts and lubrication it has in it still have some life left. * It now occurs to me that the one thing I didn't try was to turn off "movie mode" on the [[Hitachi F391]], because I am a dumb-ass. That feature automatically rewinds a tape when a movie finishes playing. I bet what was happening was that it saw no video signal on those audio-only Hi-Fi tracks, waited 30 seconds for there to be one on the tape, and then dutifully tried to rewind when it saw what appeared to be blank. I guess it doesn't listen for sound. Well, I'll try to think harder next time. That VCR is now toast. * I wonder what next week's insane, ridiculous quest will be? * Every time I get close to just giving in and using [[Roam]] instead of [[Obsidian]], I see a tweet from [[Conor White-Sullivan]] saying how they added a bunch of non-essential features to Roam—this time to apparently perfectly do task management—and I think, well, there's a bunch of stuff that can only serve to fuck up the core purpose of Roam, which is to take notes. I mean, can any other software out there that isn't strictly a task manager really do that job better than [[org-mode]], [[Things]] or [[OmniFocus]]? Does anything else even need to?
* Oh my god the world of medical-grade VHS VTRs is a wonder: The [[Panasonic AG-MD830]] is one gorgeous recorder. Even better is the [[Mitsubishi MD3000]], which looks to have been made around 2002. It has a USB port, so it can't be all that old. * Ooooo. [[Sony TCD-D8]] [[DAT]] recorder repair video by a retired [[Sony]] engineer: https://youtu.be/fIfgVWZOZbk * Today was going to be a day of calm, non-hotbrain productivity, as atonement for yesterday, but it wasn't. I succeeded in waking at 8:07, doing morning chores, loading the dishwasher, taking a gratuitous nap, researching [[VHS Hi-Fi]] VCRs (yes, after I've already ordered a used one), and assembling an [[Ikea]] Alex rolling drawers unit to put the [[modular synthesizer]] on. It's so quiet in town that it feels like everyone is out of town. * Ok, I know I will eventually end up in [[Roam]]. And I hear Jack on [[his experience with Roam|https://roamresearch.com/#/app/jackbaty/page/Wnpfv8s0E]]. He's been using it a lot longer than I have, so I trust his opinion more than my skepticism about tasks getting sucked into the Roam vortex. I still can't get used to the lack of [[Markdown]] blockquotes, though. Putting a `>` beside a bullet feels wrong, especially since it doesn't "do" anything anyway. And every other blockquote workaround I've seen looks like something I can't live with. Why can't they just do this one thing for us? I'd probably already be back in Roam if it weren't for this.
* Again, it happened. I was looking through all my [[Markdown]] text files, [[Drafts]] entries, [[Day One]] diary entries, and saved iPhone screenshots for a stern warning from three years ago from my doctor about lowering my [[cholesterol]], and I couldn't find it. But I knew it was in there somewhere, in some format, in some repository, in some app! I was reduced to looking through old messages on my patient portal website for the text. I found it there, and eventually also found it with the [[Memos]] app on iOS, which finds text in photos/screenshots. But why is all my stuff so spread out? It also reminds me that a year-long "2017 Phil health diary" text file is a sucky thing to scroll through. It'd be much better to turn that [[phil health log]] into just an index file that has links to individual entries. (Which, yes, would be even easier and require less thought in [[Roam]].)
[[Logic Pro X]] keyboard shortcuts: * `Ctrl-Shift-T` = ''Move to Focused Track.'' Will move a selected region (a strip of audio) in some track to whatever other track you have selected as the "focused track". And it'll keep that region perfectly aligned in time, so you don't have to gingerly drag it up and down from track to track, hoping you're not nudging it back and forth. * `⌘U` = ''Set Locators by Selection and Enable Cycle.'' This is especially handy when you want to select a region (or multiple regions) and bounce just that part of your project to a mixed-down file, without having to set the project start and end points every single time. ** From https://loopcommunity.com/blog/2019/12/how-to-export-your-tracks-in-logic/ > ''Cycle Region'' > When exporting tracks in Logic, the cycle region is the key. The cycle region is a yellow bar towards the top of the screen, right under the control bar. When the cycle region is toggled on, anything that is within the region is considered highlighted. This means that when exporting, anything within the cycle region is what will be exported. Whatever is outside of that region, will be ignored by Logic. To toggle on the cycle region, simply press ''C'' on your keyboard. Once it is on, you can click and drag the region to move it anywhere in the timeline. If you click and drag the edge of the region, the cycle region will lengthen. There is also a handy shortcut when wanting to have a certain track or clip in the cycle region. Simply click on the desired track or clip, then press command + U. The cycle region will then mirror the length of whatever is highlighted. * The ease of making the above bullets in [[Roam]] is enough to sell me on it completely. Dammit.
* Well, here I go: trying to migrate all of the pages/items in my "starter" database in [[Roam]] (the one with the dumb, poorly-chosen URL) to one that will be the "forever" database (with the better URL). I see that attachments like PDFs and images aren't exported, so I'll need to go into the old database, find those, and re-import them to the new database. But luckily there aren't very many – only 20. I found them all by searching for `firebasestorage.googleapis.com` and all the image references came right up. ** Well that seems to have gone fine! Need to make sure I stop using that old database. * I just set a reminder to start paying for [[Roam]] in one month if I'm still using it (again). * I guess I don't care as much about [[Markdown]] blockquotes as much as I care about not having to worry about what characters I put in a link name.
* I've been listening to Butch's [[Vinyl Assault Vehicle]] from the other night and actively not looking at the online playlist or now playing info in the [[Mixcloud]] app. I'm noting which songs and artists I think I recognize on a piece of paper so that when he back-announces stuff I can figure out what was what. I think it makes me listen better! Like back in the old days before streaming. You just had to be patient and wait and deal with [[not knowing]] for a few minutes. * The thing I'm learning about [[Roam]] is that it's the only [[notetaking]] app I can use (other than [[OneNote]] and [[Drafts]]) that's fast and light and also pretty enough that I can use it while I'm figuring things out about a topic. It doesn't require a dedicated "ok, now I'm going to update my wiki" session like my dear [[TiddlyWiki]] does. * [[Steve Albini]] keynote address at [[Face The Music]] 2014 https://www.youtube.com/watch?v=Lz_CPzuwSk4 [[to watch]] * I'm not ready to put projects into [[Roam]] yet. The old man in me still likes using local [[Markdown]] files in [[Obsidian]] for mixing project tasks with notes, at least for creative/ambitious projects that need more freeform thought than what [[Things]] can do. * If I embed a tweet in [[Roam]], does it grab the tweet text and copy it into Roam? Or is it like an include or an iframe where if I delete the tweet on Twitter, it'll go missing on the page in Roam where I embedded it? ** Answer: the tweet text in Roam goes away if you delete the tweet in Twitter.
Hello [[Sphygmus]]! I just created a [[to: sphygmus|https://roamresearch.com/#/app/twelvety_public/page/2WWg1F1Bd]] page/bullet/whatever in my public [[Roam]]. Anything I write there that's meant to be a hyperconversation/missive to you should get caught in that query's net. I hope you're well!
* 2020-12-29 [[Taylor Swift]]: Evermore * 2020-12-29 [[The Who]] - Early Morning Cold Taxi, from The Who Sell Out (Expanded Edition) * 2020-12-18 listening to [[Vinyl Assault Vehicle]] from [[2020-12-16]] ** [[The Greenhornes]] - Saying Goodbye ** [[Herbie Mann]] - Memphis Underground (Live Montreux Jazz Festival) from //Hold On, I'm Comin'//. There's an //insane// [[Sonny Sharrock]] guitar solo on this track. * The 2012 [[Melody's Echo Chamber]] album is amazing all the way through. * 2020-12-09 [[The Bird and the Bee]] - [[Unchained|https://youtu.be/B8okxxhehGI]] (by [[Van Halen]]). Genius Van Halen cover from a whole album of VH covers.
Alright, dangit. I can do what I want with my private [[Roam]] DB, but if I'm going to have a place on the internet that I invite(?) other people to, it has to be disconnected from my whims of wanting to pay for Roam, and from the whims of the Roam staff itself. [[TiddlyWiki]], if you'll have me, I'd like to come back. I just have to develop some better [[TextSoap]] macros to make it easier to convert Roam [[Markdown]] to TW syntax. [[music to check out]] * [[Kiss]] - Love Her All I Can. ** Damn! * [[Red Fang]] - Listen to the Sirens ([[Tubeway Army]] cover) I am totally a person who would go back to all of the italicized non-blockquotes I made in [[Roam]] and turn them into real [[Markdown]] blockquotes now that they finally look right. I should make another version of the "[[+Roam, a bookmarklet for Roam Research - Ness Labs|https://nesslabs.com/roam-research-bookmarklet]] bookmarklet that doesn't say "via" in it, since I delete that almost every time. Also, I should change it to put the link at the top and the blockquote down below and not in italics. [[Storyblok]] has a good description of what a [[headless CMS]] is: [[Headless CMS explained in 5 minutes - Storyblok|https://www.storyblok.com/tp/headless-cms-explained]] [[Frank Chimero]] on [[Twitter|https://twitter.com/frank_chimero/status/1335675040705228805]] recommends [[The Power Broker]] by [[Robert Caro]] > Finished my quarantine busywork project: an ebook of Caro’s Power Broker. Got in some keyboard nav practice for VS Code, toyed with simple OCR, and learned a whole bunch about writing by spending time in Caro’s words. The guy is something else—and sure does love his em dashes. [[Dr. Fauci's daily routine and work schedule during the Covid pandemic|https://www.cnbc.com/2020/12/04/dr-faucis-daily-routine-and-work-schedule-during-the-covid-pandemic.html]] > To unwind, the couple goes on a power walk for 45 minutes before eating dinner. * If [[Dr. Anthony Fauci]] can manage to walk religiously every day after his insane schedule, I can work some kind of daily walk in. People like to say "The [[cloud]] is just your stuff on someone else's computer", but more often, it's your stuff on someone else's dozen or 100 or 1000 computers. Which isn't necessarily bad. [[Autumn leaves are falling. Perform a small act of civil disobedience – Roger Ebert|https://www.rogerebert.com/roger-ebert/autumn-leaves-are-falling-perform-a-small-act-of-civil-disobedience]] - via Jack * Death to leaf blowers. Preach it, [[Roger Ebert]]!
The [[Roon Intel NUC]] is [[no longer bricked|2020-12-09 Roon Intel NUC bricked]]. Whew, that was close. I'm impatient for the day that someone like [[Basecamp]] offers a [[Roam]]-like tool to the enterprise. Non-cutting-edge companies just need a vendor boring enough that [[InfoSec|information security]] doesn't balk at putting corporate data in a tool like this. I can't see our organization ever trusting cowboy [[Conor White-Sullivan]] and the "[[Roamcult]]" with our data and plans, but man, once we get a tool that enables [[backlinks]] and block-level [[transclusion]] and references, it's going to be a huge help to everyone. Listening to [[Throw - The Yoyo Studio Compilation]] from the early 90s, I'm thinking about all the cellphones, email accounts, and social media platforms those artists didn't have at the time. Musicians had to distinguish themselves by what they made and put out into the world, not by what they posted on Twitter or Instagram or YouTube or elsewhere, or what interesting thing they posted a commentary on or admired publicly (like I'm doing now). Sure, there were paper zines and magazines and Xerox copiers and low-budget videos to help get the word out or to be a platform for meta content, but not like we have today with the morphine drip of social media (for both posters and readers/watchers). You largely had to //put physical stuff out there// or play live shows, and that was how people knew whether to pay attention to you. I am such an old man. Oh, I like how I used to do these: [[2019-01 found music]]. Starting [[2020-12 found music]] right now. [[@akblakemore]] on [[Twitter|https://twitter.com/akblakemore/status/1336308306294542337]] > yesterday my partner told me that when he's mad at me he gives me 'the bad fork' to eat dinner with, then proceeded to explain to my flatmate & i his personal taxonomy of our flat's seven forks One thing I like to do about once a month is open my main [[org-mode]] file in [[Doom Emacs]], go to a heading, and hit `tab` over and over and watch everything under it open and close, open and close. Has there ever been a more perfectly lean, immediate interaction? Opened the [[Harman Kardon PA2200]], blew out and vacuumed the dust from the insides (there was a lot of it) and hooked it up to some old speakers. Been playing it for an hour and no crackling from the right channel. Was it really just that embarrassingly dirty? I know I've had long dry spells with this wiki, and me adding this much in it right now probably has more to do with it being fresh to my eyes again and with my available energy being ever so slightly higher, but maybe the key that makes it more suitable for public consumption (ha, come on) is that there's //just enough// friction with writing to it. Like, because it's not a strict copy and paste from one [[Roam]] DB to another, I have to think just for a few seconds more about whether something is worth putting in here?
Well, the [[Roon Intel NUC]] is definitely not booting up. The front panel LED blinks orange a handful of times and then nothing else. Come to think of it, I believe the last time it worked was before I ran a system update on it. Here's something from the forums: * [[Roon OS woes, build 1.0.221 (resolved) - Roon Software - Roon Labs Community|https://community.roonlabs.com/t/roon-os-woes-build-1-0-221-resolved/117217]] > ''The Issue'' > The maintainers of the Linux Kernel made some changes in this version to be more strict about standards compliance for NVMe drives. It appears that a tiny fraction of SSD units were “dinged” by this change, and the kernel was refusing to interoperate with them. This prevented Roon OS from seeing the drive during installation and startup. > ... > ''ROCK'' > For those running ROCK, you’ll want to download the latest version [[here 164|http://download.roonlabs.com/builds/roonbox-linuxx64-nuc3-usb-factoryreset.img.gz]] and run the [[recovery function 162|https://kb.roonlabs.com/ROCK_Recovery]]. Note that if you install instead of recover, your database and settings will be lost, so it’s important you choose the correct option. > > After running the recovery, everything should function properly again. So I downloaded the latest ROCK installer, couldn't get it to load on my SD card, and found my notes here, which helped: [[2019-12-18 erasing a stubborn USB drive on macOS]] Not totally smoothly, because I had to go multiple rounds of killing processes to get it to where I could format it with [[Disk Utility]] and re-flash it with [[ApplePi-Baker]], but I got there. Now the NUC doesn't see the SD card to boot from. Trying to flash the ROCK installer image to a USB thumb drive with [[ApplePi-Baker]] now. ----- 2020-12-09 I got the [[Roon Intel NUC]] working again last night right before bed. For future reference, because my [[Intel NUC]] doesn't see the bootable OS on the [[Roon]] installer SD card (for some reason), I had to flash a USB thumb drive with it. But if you've ever flashed the Roon installer to that thumb drive in the past, you really have to nuke it before you can re-flash it. You may have to kill more than one process tying up the Linux partition on the thumb drive before you can reformat it (thereby getting rid of the Linux and FAT partitions). //Then// you can boot from the thumb drive, run the [[Roon ROCK]] recovery thing to salvage the OS that was installed in the NUC, and if you're lucky it'll "just" work. Again, [[how do normal people deal with this?]] I guess normal people aren't the target for Roon anyway.
Ordered a pair of [[Genelec 8010a studio monitors]] from [[B&H Photo]], with 2 [[Whirlwind]] cables. The research on these has occupied my brain all day and it's basically the only thing I accomplished. Now I can sleep. Whew.
I should just accept right now that my [[Photos.app]] is always going to be a mess, I'll never "catch up" on all the drafts in [[Drafts]], I'll never maintain [[Inbox Zero]], my [[Instapaper]] backlog is and will remain a joke, and someday (hopefully a long time from now) I'll be a memory and all my [[Markdown]] files will be deleted. However, if Markdown had existed when my grandfathers were alive and they had kept folders of text files (or [[Field Notes]] notebooks), I would absolutely have agreed to be their caretaker for as long as I'm here. * Oh god I've been retreading this ground for a long time: [[inboxes to check – April 2020 edition]] I think it kind of sucks that [[Roam]] discourages putting dates in page names. I know we're supposed to just rely on today's [[Daily Notes]] to be the effective date for whatever new page we link to from it, but sometimes it's really nice and practical to use [[in-band signaling]] and stick a `yyyy-mm-dd` date in a page title, so that when it comes up in a list of auto-suggestions or search results, you can tell at a glance how old the thing is you're deciding to click on or not. Most of what I'm putting in [[TiddlyWiki]] these days still starts as (of course) individual blocks in the private [[Roam]] DB, but when it goes into TW, it's just lumped into [[Daily Notes]]. This makes it much easier on the (non-me) reader to see what's new, but loses the interconnectedness of the Roam blocks. It's also the most likely way for anything at all to make it out of my Roam and into the light of day (if I'm not just going to have a public Roam DB). Another nice thing about the private [[Roam]] DB being an "app" in [[Microsoft Edge]] is that I never have to worry about opening/editing the public DB by accident (since I'm apparently not just deleting it). The [[Harman Kardon PA2200]] is not out of the woods yet. The right channel still makes a scratchy noise occasionally. I do not want to have to spray cold stuff on the power transistors to find out which one is bad, but I will do that if I have to. I'll tell you right now that the surest way to ensure I won't fill out your "how are we doing" survey is to pop up a 3rd-party survey box in a modal window obscuring everything else I'm trying to get done on your website. Maybe what everyone on earth needs to do once a week is just sit down with a computer and properly tag and file away a few dozen FLACs or mp3s. Think of how much trouble we would keep people out of.
That's weird. The [[Roon]] endpoint on the [[RoPieee]] [[Raspberry Pi]] has defaulted to only doing [[AirPlay]] for Roon. The [[JustBoom Digi HAT]] is reporting itself as "Device Not Found" on the ropieeexl box in the Roon Audio settings screen. I disabled it, waited a minute, and then re-enabled it and now it's back and the signal path is lossless "purple" again. Whew. And I disabled the RopieeeXL AirPlay in Roon, since I'd rather it not be an available device for Roon. Whoa. I didn't realize that [[RoPieee]] had added the ability to be a native [[Spotify]] endpoint. That's nicer than having to just brute-force [[AirPlay]] from Spotify to the RoPieee.
Knowing that a [[COVID-19]] vaccine is slowly starting to become real, I realized just now while looking at dates for upcoming shows on [[Songkick]], that the idea of seeing a band at a real venue in our town in August 2021 is, for the first time in months, not just a wish but a possibility! I still like [[org-mode]] better than anything else for keeping track of what steps I've done in the [[CD-ripping process]] (or when buying [[FLAC]] albums) and then getting them to [[Roon]] and all the other backup hard drives and [[Backblaze B2]], etc. Of course I want a [[Sleevenote]] audio player, but it also feels kind of ridiculous with [[Roon]] for digital and a world full of old LPs out there for analong. Nothing beats a turntable and a gatefold record cover. Sometimes a thing that's even better than "whole-house audio" is when your wife is in her art studio late at night and plays a CD or FLAC you uploaded to lossy [[iTunes Match]], from her phone to a Bluetooth [[JBL]] portable speaker, and you hear it from the next room and it's effectively mono now, but is somehow even better than stereo. The trendline is not looking good for how much dumber and fatter I'll be after the pandemic is over. There's going to be no hiding the cholesterol numbers when I go in for the yearly physical this week.
Well, the power is out tonight, so I'm formatting all these [[Drafts]] notes in [[Roam]] and [[TiddlyWiki]] with my phone and the [[Logitech K811]] wireless keyboard. This power outage is the first test of the APC UPS since putting it on [[Roon Intel NUC]] duty. It kept that box and its hard drive running with no problem and with plenty of time to spare for me to shut the [[Roon]] server down gracefully. I think I want to order a USB dongle for running a [[software defined radio]] app on my laptop. [[A Recording Of Radio Moscow's Moscow Mailbag (On Short Wave) From 1976 Played Back On My Revox A77 – YouTube|https://youtu.be/dDeq-brm1LQ]] – I enjoyed listening to this in the background while working today. Found it after searching YouTube for “soviet shortwave radio”. [[Harald Wagener]] on [[Twitter|https://twitter.com/mausdompteur/status/1338387893107175424]] > As a security engineering friend once said to me "every security problem that's solved with signing keys will turn into a key management based security problem" [[Justine Sherry: Middleboxes as a cloud service (2016)|https://video.seas.harvard.edu/media/Justine+Sherry+3+21+2016+%5BCS%5D/1_j8n61f34/13151381]] – I’m such a fan of [[Justine Sherry]]. Wizard-level smarts. Listening to [[Strength Through Failure]] from [[2020-12-10]]. [[Fabio Roberti]] recommends these [[movies]] on [[Cinephobe.tv]] * [[Cockfighter|https://boxd.it/1rhE]] (1974) by [[Monte Hellman]] * [[In The White City|https://boxd.it/1ePo]] (1983) by [[Alain Tanner]]
One obsession per day. Today it's [[room correction software]] and [[calibrated microphones]]: [[Using the UMIK-1 with AudioTools on the Apple iPad – miniDSP|https://www.minidsp.com/applications/acoustic-measurements/using-the-umik-1-with-audiotools-on-ipad?gclid=CjwKCAiA_eb-BRB2EiwAGBnXXl_BjIMmaT1iEOmG7EWOJ_i9iy5dAZVDbJorhf5V3SwCnYnlYCuAxRoCmSkQAvD_BwE]] The [[Genelec 8010a studio monitors]] arrived today. They're good but I'm not sure they're worth $700. There's an annoying resonant bump at 110 Hz that I can hear, and can see reliably on a spectrum analyzer. Embarrassing and troubling to have possibly bought "the wrong thing". So now it's most likely time to return them and move on to the next thing.
Packing the [[Genelec 8010a studio monitors]] back up to return to [[B&H Photo]]. Sarah reminded me: "They don't have feelings. It's ok to return them." But they look so forlorn wrapped back up in their plastic. 😢 Ordered [[Mackie MR524 studio monitors]] from [[B&H Photo]]. They're back-ordered, but they were so nice about the return of the Genelecs that I wanted to buy from them even though they don't have the Mackies in stock right now. I know I have problems.
Of course I wish the [[Mackie MR524 studio monitors]] monitors had been in stock when I ordered them. It would be great to see them "out for delivery" now, but it's a little bit of a relief for a change to have no idea when they'll be back in stock. You just pay your money, get in line with a back-order, and wait, which we have to do so seldom these days. It's like the time equivalent of eating your vegetables. Nice to have something that's not 100% about ''me'' getting it now now now. But what happens when I go all hotbrain for a few days and then have to wait around is that all that energy has to go somewhere. And now it's going to [[shortwave radio]]! [[Should I even bother buying a shortwave radio anymore? – r/shortwave|https://www.reddit.com/r/shortwave/comments/4wv4i3/should_i_even_bother_buying_a_shortwave_radio/]] > You're mostly right if it's all about simply listening to the content, but for me it's about the thrill of using a physical, separate device and not having to spend even more time on a computer. I love the waterfall displays and so on that I get with the WebSDRs and my SDRplay, but nothing beats taking my Tecsun PL-880 to the cabin in the Norwegian mountains where there's almost no other pieces of technology around, turning the knobs and hearing radio broadcasts from as far away as Australia. I guess that makes it more of a DXing kind of activity than usual SWLing though. Ordered an old [[Sony ICF-SW11 radio]] from [[eBay]]!
It would be so cool if I could just use [[Tot]] for a daily [[journal]], or I guess if there was a journal app that looked like Tot. It's so unassuming, nimble and lightweight. I know [[Day One]] has that menubar dropdown quick-entry thing, but it feels too much like it'll evaporate before I'm done writing and I have to remember to click Save and I don't trust it to reliably get data into the real app, and if you click Open, then the whole app launches and weighs everything down. Another to add to the list: [[Panasonic RF-B11 shortwave radio]] About those back-ordered [[Mackie MR524 studio monitors]]: I still most certainly have a Safari tab on my phone dedicated to their [[B&H Photo]] page, which I check every few hours to see if they have an in-stock ETA yet. Not that I have any more room in the [[macOS]] menubar, but [[bitbar]] looks neat. [[Transmission from Nowhere: Numbers Stations – The Dark Histories Podcast|http://www.darkhistories.com/transmission-from-nowhere-numbers-stations/]] > Starting off in 1890, we take a look back at the history of secret radio transmissions, leading up until today and unravel some of the mystery, whilst uncovering some new oddities, of what are known as ‘[[numbers stations]]’. * Wonderful episode, and he even tuned in some live numbers stations towards the end. * //V24 is a South Korean number station.// — via [[V24 › Priyom.org|https://priyom.org/number-stations/other/v24]]
What a super nice thing for [[Andrew Canion]] to say. 😊 * https://blog.andrewcanion.com/2020/12/24/thanks-to-joshsullivan.html > Thanks to [[@joshsullivan|https://micro.blog/joshsullivan]], [[@jack|https://micro.blog/jack]], [[@twelvety|https://micro.blog/twelvety]] who maintain wikis that I enjoy visiting and reading. Consider me your wiki-lurker. Merry Christmas! I am continually amazed and grateful that even one person finds this wiki interesting enough to go to the trouble to visit at all, much less repeatedly! I try not to make people visit in vain by going too long without updates. [[shortwave radio]] stuff: * logging with the old Sony digital shortwave radio ** [[7.49 MHz]] *** 2020-12-24, 9:49 AM *** [[WWCR|http://www.wwcr.com/]] *** [[Nashville, TN]] *** The Power Hour - Call-in talk show with crazy people talking about Satan *** And then Financial Survival with anti-vaxxers ** [[11.76 MHz]] *** 2020-12-24, 10:30 AM *** Spanish guitar with vocals music. Signal very weak and noisy. * [[Sangean Ultimate FM/SW/MW/LW/Air Multi-Band Radio, ATS-909X2 -- Amazon|https://www.amazon.com/dp/B08MSXX6LH/ref=cm_sw_r_em_api_glc_fabc_7Xl5Fb4NWEPHE]] ** Too expensive for me, but looks nice. [[Design's Lost Generation -- Medium|https://monteiro.medium.com/designs-lost-generation-ac7289549017]] by [[Mike Monteiro]] #[[to read]] > The current generation of designers have spent their careers learning how to work faster and faster and faster. And while there's certainly something to be said for speed, excessive speed tends to blur one's purpose. To get products through that gate before anyone noticed what they were and how foul they smelled. Because we broke some things. It's one thing to break a database, but when that database holds the keys to interpersonal relationships the database isn't the only thing that breaks. * ⬆️ This may be one reason I get so uncomfortable with those exhausting lightning-round "let's have two front-end developers design and build and code a website in 1 hour LIVE ON STAGE" things at web conferences. Barf. That is hell to me. How can any worthwhile thought go into a process like that? [[BSAG - But She's a Girl]] recently started collecting notes in [[Obsidian]] * [[BSAG » Obsidian|https://www.rousette.org.uk/archives/obsidian/]] * Hmm. Do I need to start using [[MailMate]]?
Updated my notes on [[Converting Markdown URLs to TiddlyWiki markup]] with a better [[regex]] pattern. The [[Panasonic RF-B11 shortwave radio]] arrived today! Analog tuning across a given band with no muting between frequencies is the only way to go. There's no 50% duty cycle on the audio anymore, so I can actually listen and zero in on a transmitted signal. I feel like part of the radio. The more expensive digital tuners out there manage to sound like this, but for simple and cheap, this works great. And it is somehow in totally mint condition. Most of these scribblings are still turned into sentences in [[Roam]] in the private database, but I don't think I'll ever go back to updating the public database. Roam is such an unwelcoming experience for a reader, especially if I've skipped a day of [[Daily Notes]], or waited until late at night to share anything. [[TiddlyWiki]] is so much better for the reader (I think) that I don't feel like I have to apologize for it. Anyone can always see the very latest journal entry right up front, no matter when I made it, and the "New" and "Recent" tabs make it so easy to get a feel for what's been going on the last few days. The "TOC" could stand a refresh, but as a functioning, non-vendor-dependent collection of badly organized notes, I'm proud for anyone to stumble across it. Another nudge in the direction of [[MailMate]], this one from [[Maique Madeira]]: https://micro.maiquemadeira.com/2020/12/26/i-didnt-need.html > I didn't need any more distractions from the endless photos still waiting to be looked at, but [[MailMate|https://freron.com/]] is a ''HUGE'' rabbit hole, with all the tinkering available. * Self, you are not allowed to install the [[MailMate]] trial until you make progress on a bunch of other real-life things in your house. Reading Jack's blog post made me have/remember thoughts about [[Where did people take notes before computers?]] We watched [[Holiday (1938)]] last night and boy was it good. I don't think I've ever seen a movie from that time with such a piercing existential crisis scene in it (the one between Linda and her brother).
Me taking notes on something and then forgetting where I put the notes, or not being able to find the notes because they're filed in too many places or filed unintuitively, is just as bad as forgetting everything about the thing I took the notes on. Maybe I should start doing the 1-line-per-day log in the [[Rhodia Webnotebook]] again? One potentially useful and motivating [[journal]] I could keep would be a short list of things I accomplished each day. Not just "what happened" and "tasks I did", but things that count as //accomplishments//.
Sarah stepped in dog shit in our yard and unknowingly got it on the brand new OEM floor mat I'd put into my car, and I promptly made it all about me and not her and the brand new shoes she was wearing. Sometimes I'm such a dick I just want to go to bed without supper. We finished [[The Queen's Gambit]] tonight and it was just about unimpeachably great. What a journey. If you're a musician complaining about all the music that [[Taylor Swift]] has put out this year, maybe you're just jealous?
I'm afraid that by the time this [[staycation]] week is over, I'll have completed a half-dozen home/hobby projects and medium-sized chores, but I won't have done any kind of retrospective of 2020, or reset or re-thinking for 2021. Happy new year!
* 2021-01-16 [[Aretha Franklin]] - Ain't No Way, from [[Lady Soul|https://www.discogs.com/Aretha-Franklin-Lady-Soul/master/123018]] * 2021-01-12 [[Paul Stanley]] - [[Wouldn't You Like to Know Me|https://www.youtube.com/watch?v=blhRlW0IUBI]], from his solo album * 2021-01-05 Listening to [[Vinyl Assault Vehicle]] from 2020-12-30 ** [[Southern Comfort]] - Netti-Netti, from //Southern Comfort// ** [[Patti Smith Group]] - Dancing Barefoot, from //Wave// ** [[Mandrake Memorial]] - Witness the End/Celebration, from //Medium// ** [[Mother Mallard's Portable Masterpiece Company]] - [[C-A-G-E Part II|https://cuneiformrecords.bandcamp.com/track/c-a-g-e-part-ii]], from //Like A Duck to Water // * 2021-01-05 [[Emilia Wang]] - "Chaos". S.A. says this is her favorite new artist of 2021.
Today was supposed to be about cleaning my desk. Instead: Troubleshooting the [[Harman Kardon PA2200]] * [[Vintage Audio Addict]] has these good videos, both of which share some of the same content: ** [[Troubleshooting Failures In Vintage Audio Equipment. Fixing Old Stereo System Electronics. - YouTube|https://www.youtube.com/watch?v=xk5gjq5ehK0]] *** [[TODO]] Always visually inspect for bad capacitors *** [[TODO]] Electrolytic capacitors older than 20 years should be replaced *** [[TODO]] Use a multimeter to test the DC offset at the speaker outputs. You want to have close to zero DC volts. Normally you'll have something under 50 mV. *** [[TODO]] The nice thing about stereo equipment is you have 2 channels. So if one is bad and the other is good, you've got something good to compare the bad one to. *** Note: I see he has this testing gear **** [[Mastech MS8268 multimeter]] **** https://www.amazon.com/Mastech-MS8268-Digital-Manual-Multimeter/dp/B0050LVFS0?th=1 **** old Rigol and Siglent [[oscilloscope]]s ** [[Repairing Vintage Audio Equipment. Solid State & Tube. How To Repair & Restore Old 2 Channel Stereos - YouTube|https://www.youtube.com/watch?v=E3yTtm3yCG8]] *** [[TODO]] Google "electrolytic capacitor lifespan" and look up the manufacturers of the capacitors in your gear to see what they say about how long those caps should last. *** You can increase the voltage of capacitors when you replace them as long as you keep the uF the same * from [[BJT Amplifier Troubleshooting Worksheet - Discrete Semiconductor Devices and Circuits --- All About Circuits|https://www.allaboutcircuits.com/worksheets/bjt-amplifier-troubleshooting/]] ** Here are a few good steps to take prior to applying any specific troubleshooting strategies to a malfunctioning amplifier circuit: *** Measure the output signal with an oscilloscope. *** Determine if the amplifier is receiving a good input signal. *** Check to see that the amplifier is receiving good-quality power. ** (I just learned a ton by reading this answer to Question 5) *** The 0.47 μF [[capacitor|https://www.allaboutcircuits.com/video-lectures/capacitors-part-1/]] connected to the microphone: //passes (AC) audio signal, blocks DC bias voltage from reaching microphone// *** The 220 k Ω and 27 k Ω resistor pair: //sets DC bias voltage for first transistor stage// *** The 4.7 μF electrolytic capacitor connected across the 1.5 k Ω resistor: //bypasses (AC) audio signal around emitter resistor, for maximum AC voltage gain// *** The 33 μF electrolytic capacitor connected to the speaker: //couples (AC) audio signal to speaker while blocking DC bias voltage from speaker// *** The 47 μF electrolytic capacitor connected to the power supply rail: //"decouples" any AC signal from the power supply, by providing a low-impedance (short) path to ground// * [[Harmon Kardon HK 330c - Fixing Noisy Transistor Issue - YouTube|https://www.youtube.com/watch?v=RdpG6WNzkKw]] ** This is not my model, but this is also a fun video to watch because he's so laid back. ** Only replace one or two components at a time between testing the unit to make sure it still plays and looks good on the scope. You don't want to recap the whole thing in one go and then wonder where the fault is when the unit doesn't work. ** Also, make sure not to assume that replacement or equivalent transistors have the same pin arrangements as the original components you're replacing. ** And before you pull a component, make sure to note its orientation on the PCB with a magic marker (and I'll also take photos). * [[Blueglow Electronics]] ** [[Six Common Mistakes Made When Recapping Vintage Electronics - YouTube|https://www.youtube.com/watch?v=BeDKwi-GJRI]] *** Don't confuse factory glue for leaky capacitors *** Factory board polarity markings and service manuals are not always correct. Always mark what the capacitors have on them before you remove them. Also, mark the capacitors to show which way was the front of the unit. *** If you increase the voltage of capacitors, make sure they can physically fit on the board. * Options for my next steps ** Order test leads/clips, 2 sets of 4 same-batch output transistors (if those are indeed bad), maybe a bunch of capacitors and/or resistors, and thermal paste, and try to fix it myself *** If I need to replace all 8 output transistors, do it in complementary pairs. But output transistors that still make music and aren't just silent are probably less likely to have shorted/gone bad. Although, why did that one respond when I shot it with Endust? *** Will need to set transistors' DC balance + idling current, but that should be checked anyway, and the service manual tells how to do it with a multimeter. *** I have the service manual, which has detailed notes about what voltages should appear at dozens of points on the board, so I don't really have an excuse not to try. *** The worst that could happen is that I solder one of the (at least) 24 connections wrong and it still doesn't work. *** The best would be that I get some more years out of the amp and gain some troubleshooting knowledge. *** I should ''first'' find whether a drive transistor, capacitor and/or resistor leading up to the output transistors is going bad and taking an output transistor with it. That's most likely. **** I could re-cap the main board (or at least the electrolytics), which is probably a good idea and a good place to start, since the amp is 25-29 years old now. **** A new multimeter that measures capacitance and does diode checks would help a lot. **** But I don't have an [[oscilloscope]], which would help greatly with finding where the noise starts **** New digital oscilloscopes are CHEAP, but that's a whole other rabbit hole, and I could spend as much on a decent oscilloscope as I could on a working amp, and I still wouldn't necessarily have a working amp yet, although it'd be way more likely. And then I would also have an oscilloscope. **** Just think of all the other stuff I could measure and fix with an oscilloscope. **** I'm going to be 50 this year and have always wanted an oscilloscope. It's too bad there aren't many new analog ones now, but they are cheaper than they used to be. A very old analog one is probably a bad idea, because it would need to be restored/calibrated to be accurate, and that would be another thing to take care of. **** I see two [[Tektronix]] oscilloscopes on [[Jeri Ellsworth]]'s bench on YouTube, and sometimes some sort of [[Rigol]] scope peeking out from behind those. Not sure if the Rigol is a spectrum analyzer, signal generator, or oscilloscope. ** Buy another PA2200 in good condition from [[Reverb]] or [[eBay]] and just use that. ** Buy another PA2200 for parts from [[eBay]] and pull the whole main board out of it, or just harvest the components that went bad on mine *** But those "for-parts" amps could be bad for so many reasons. Probably not worth it. ** Research and buy a totally different, new amp, but that's depressing. I love the PA220. It's so fast and musical and muscular, I don't want to use anything else. [[oscilloscope research]] * [[My First Oscilloscope - r/AskElectronics|https://www.reddit.com/r/AskElectronics/wiki/equipment/oscilloscopes#wiki_my_first_oscilloscope]] * [[GW Instek GDS-1202B oscilloscope]] ** Scope Channels: 2 Analogue, 1 Ext Trigger ** Bandwidth: 200MHz ** Sampling Rate: 1GSa/s ** Display Memory Depth: 10 Mpts ** 7" 800 x 480 WVGA LCD display ** 256 colour gradient display function to strengthen waveform performance ** $319 at Newark: https://www.newark.com/gw-instek/gds-1202b/dso-2-1ch-200mhz-1gsps-1-75ns/dp/83AH9682 ** Has separate scale and position controls for both channels ** Note how the soft buttons under the screen do not exactly line up with what's on screen. No good. ** Not available from that many reputable places, though * [[Siglent SDS1202X-E oscilloscope]] ** This is a "super phosphor oscilloscope". ** review: https://youtu.be/uasDBPcibUw ** 200 MHz ** 1 GSa/s ** 2 channels ** Has separate scale and position controls for both channels ** $379 on Amazon: https://www.amazon.com/Siglent-Technologies-SDS1202X-Oscilloscope-Channels/dp/B06XZML6RD/ * [[Siglent SDS1102CML+ oscilloscope]] ** This is ''not'' a fancy "phosphor" oscilloscope, but is probably all I need ** 100 MHz ** 1 GSa/s ** 7 inch TFT-LCD (800*480) screen ** $299 on Amazon: https://www.amazon.com/Siglent-Technologies-SDS1102CML-Digital-Oscilloscope/dp/B01J1MQC3G
[[Buying an Oscilloscope and Accessories For Audio Bench Work and Testing - YouTube|https://www.youtube.com/watch?v=CoaI9lJsNgA]] by [[Blueglow Electronics]] * How perfect that this came out within the past week. So many great [[oscilloscope]] tips here. I love this guy. After looking at many dozens of videos, reviews, and articles, I ended up ordering the [[Siglent SDS1102CML+ oscilloscope]] and a pair of extra probes last night. It's not as good as the next model up, but it's probably more than I need, and is 1000x better than having no [[oscilloscope]] at all. Part of the rationale for not going with the $380 model is that I figure this is my "first" oscilloscope, it's honestly an impulse buy, and it doesn't make sense to dive into the deep(er) end right away, especially given how fast these things improve. If I'm still using this model a lot in five years and I feel limited by it, I could always step up to whatever the latest/best thing is then.
Sometimes I get unnaturally irritated when I see peoples' hyper-structured [[Weekly Review]] dashboards built in [[Roam]]. I know they're not doing it //at// me, but wow. If you're using SmartBlocks and building in that much scaffolding, shouldn't you just be using [[Notion]]? One day back at work and I'm already taking a nap as soon as I log off and staying up way too late to cram in fun stuff after all the chores are done. Those new year [[habits]] are going great. At least I totally cleaned my desk last night. That helped today go better. I ordered Sarah a year of bi-monthly art/mailings from [[Kate Bingaman-Burt]]'s [[KBB Mail Club|https://www.outletpdx.com/shop/2021-kbb-mail-club]] after seeing [[Mike Monteiro]] recommend her. Sarah never looks at this wiki so I feel confident it will still be a surprise when it arrives.
[[Statement of Congressman Jamie Raskin and Sarah Bloom Raskin on the Remarkable Life of Tommy Raskin|https://repraskin.medium.com/statement-of-congressman-jamie-raskin-and-sarah-bloom-raskin-on-the-remarkable-life-of-tommy-raskin-f93b0bb5d184]] > He hated cliques and social snobbery, never had a negative word for anyone but tyrants and despots, and opposed all malicious gossip, stopping all such gossipers with a trademark Tommy line — ‘forgive me, but it’s hard to be a human.’
Other than the [[Siglent SDS1102CML+ oscilloscope]] arriving today (which is definitely neat), I don't have any new notes. It was hard to look away from the utter implosion on Capitol Hill. What in the fuck.
Anything good that I've ever done at work or at home has always started with "Well, I don't really have time to be doing this, but here goes anyway. Let's see how far I get." I don't really feel guilty about looking at Twitter in every free moment the past couple of days. It sucks that it has to be that way, but boy are we living through something.
[[The KISS guitars, now and then, in words and pictures|http://jerobison.blogspot.com/2012/07/the-kiss-guitars-now-and-then-in-words.html?m=1]] from [[John Elder Robison]] <<< That guitar was a modified Gibson Les Paul TV. We routed out the face of it, and embedded a circuit board with almost 1,000 incandescent lights. We set it up to do stripes (you can sort of see that in the photo) and them flash the whole border at the end. The lights were powered by a Ni-Cad battery pack and the music was transmitted via a Shaeffer Vega wireless rig so the whole thing was cable free. There was a special XLR-type plug in back to connect a battery charger between sets. [[Ace|Ace Frehley]] played this guitar on a number of songs over the years but the one it's most famous for is New York Groove. He'd start the guitar while facing back in the corner of the stage. The audience could see something flashing but could not tell what. He'd walk out backward, turn round, and they would just go wild. <<< [[Inside the Capitol siege: How barricaded lawmakers and aides sounded urgent pleas for help as police lost control - The Washington Post|https://www.washingtonpost.com/politics/inside-capitol-siege/2021/01/09/e3ad3274-5283-11eb-bda4-615aaefd0555_story.html]] * This is totally insane and riveting. Three days later and there's still so much new information coming out every couple of hours that I can't process it all. It's draining my attention.
Working on the [[Harman Kardon PA2200]] again. Well, prepping to work on it in a sane way: * Dang. Using a real [[Dixon Ticonderoga 2HB pencil]] instead of a mechanical pencil in the [[Rhodia Webnotebook]] to plot out steps for debugging this amp à la [[Adam Savage]]'s [[checkboxes|2019-11-17 Adam Savage on Lists, More Lists, and the Power of Checkboxes]] is really the way to go for thinking things through. I don't know why I didn't do it sooner. Should also be good as a [[lab notebook]] to write down expected/tested results. * Speaking of pencils, well, shit. The [[Blackwing x The Hardest Job in the World pencils|https://blackwing602.com/products/blackwing-x-the-hardest-job-in-the-world-set-of-12?_pos=1&_sid=e220666c4&_ss=r]] are sold out, probably forever, so I just ordered a set of [[Blackwing 602 pencil]]s. * I know I can figure this out. I never made it through [[electrical engineering]], but I should be able to troubleshoot this thing. [img[https://twelvety.com/philtiddlywiki_images/2021-01-10-hk-amp-schematic.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2021-01-10-hk-amp-steps.jpg]]
Ok, to get to where I can eventually use the cluttered desk to work on the [[Harman Kardon PA2200]], I assembled the steel wire shelf in the basement. [[Karl Voit]] wrote this about [[How to Design File Management for a Company|https://karl-voit.at/2021/01/11/company-file-management/]]. ([[To read]]) [[Vintage 1950s-1960s : RCA COLOR Picture Tube Manufacturing -- YouTube|https://youtube.com/watch?v=7IrSLPVkxCo]] ([[to watch]]) [[Louie Louie - Wikipedia|https://en.wikipedia.org/wiki/Louie_Louie#The_Kingsmen]] > A significant error on the [[Kingsmen|The Kingsmen]] version occurs just after the lead guitar break. As the group was going by the Wailers version, which has a brief restatement of the riff twice over before the lead vocalist comes back in, it would be expected that Ely would do the same. Ely, however, overshot his mark, coming in too soon, before the restatement of the riff. He realized his mistake and stopped the verse short, but the band did not realize that he had done so. As a quick fix, drummer Lynn Easton covered the pause with a drum fill. * I have to admit that [[Animal House]] gave me my love for this song.
No matter what I try, whenever I use a computer, filesystem, or app to log exercise or stretching or movement or whatever, it steals my energy and makes the logging feel like a chore. The only thing that makes logging that stuff feel remotely fun or worthwhile or sustainable is to do it on paper, in a [[bullet journal]] index log format, where one page is dedicated to it. The latest attempt is to have a page called "Moving our bodies" instead of one for "walking" or "stretching" or "yoga" or whatever. "Moving our bodies" should be able to cover it. ([[habits]]) [[Why The Attack on the Capitol Was Even Worse Than it Looked - The New York Times|https://www.nytimes.com/2021/01/11/arts/television/capitol-riot-graphic-videos.html]] > This steady drip of videos and reports, each bit seemingly more disturbing than the last, has created a feeling of delayed-onset trauma. * Amen. [[Insurrection at the Capitol: A Timeline of What Happened - The New York Times|https://www.nytimes.com/interactive/2021/01/12/us/capitol-mob-timeline.html]] * This is the kind of timeline I was hoping would come out to tie it all together. [[@roamhacker]] on [[Twitter|https://twitter.com/roamhacker/status/1333666939911213056]] ([[to watch]]) > New RoamHacker game: If in your lifetime you could ask [[@Conaw|Conor White-Sullivan]] one question, what would it be? My Q: What does he mean when he compares [[Roam]] to [[Excel]]. Excel is probably my favorite program ever written next to [[Space Invaders]]. @RoamResearch Answer: https://www.youtube.com/watch?v=mlCiO2oIF2s * Why are the young blessed with such enviably great hair? [[Kudoboard|https://www.kudoboard.com/]] > Kudoboard is an online tool to gather a group and send appreciation. Think of it like the greeting card that gets passed around and signed, but in a more fun and customizable group Ecard format. [[Pence Reached His Limit With Trump. It Wasn't Pretty. - The New York Times|https://www.nytimes.com/2021/01/12/us/politics/mike-pence-trump.html]] > Mr. Pence was already in his motorcade to the Capitol by that point. When the mob burst into the building, Secret Service agents evacuated him and his wife and children, first to his office off the floor and later to the basement. His agents urged him to leave the building, but he refused to abandon the Capitol. From there, he spoke with congressional leaders, the defense secretary and the chairman of the Joint Chiefs of Staff --- but not the president. * I hate hate hate hate Mike Pence, but refusing to abandon the Capitol in that moment is pretty cool. [[Matt Glassman]] on [[Twitter|https://twitter.com/MattGlassman312/status/1349174443101327361]] > This Pence letter is reasonable. I agree that the 25th amendment isn't designed for the current situation. I disagree that letting Trump finish his term is the best course. But it's nice to see the VP working to strengthen the system, especially as POTUS is trying to destroy it. https://twitter.com/phil_mattingly/status/1349157076929536003
OMG I could mess around with [[Wolfram Cloud]] code all day. I didn't know it felt so [[Roam]]- and [[Soulver]]-like in the way that it figures stuff out as you type. Why didn't I know about this before? Trump [[impeachment]] #2 today. It made us tired to follow it even though there was really no doubt it would happen. Thank god. [[The Cars]] - Bye Bye Love, live in 1978. Wow. [[Benjamin Orr]]. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//msAcTMKMSKA' frameborder='0' allowfullscreen></iframe></div>
This has been basically a lost week. Has anyone accomplished anything good in the last few days?
On any given day, I can end up making something, or making [[notes|notetaking]] about other people making something. Most (weekend) days I know how things will go based on whether I started [[making something before taking a shower]]. When it's really important, the making something happens first (after coffee). [[Justice Sonia Sotomayor]] dissenting in [[United States v. Dustin Higgs|https://www.supremecourt.gov/opinions/20pdf/20-927_i42k.pdf#page=5]] > This is not justice. After waiting almost two decades to resume federal executions, the Government should have proceeded with some measure of restraint to ensure it did so lawfully. When it did not, this Court should have. It has not. Because the Court continues this pattern today, I dissent. [[Juliette Kayyem]] on [[Twitter|https://twitter.com/juliettekayyem/status/1350411259414458368]] about [[storming the Capitol]] > This is great point. Trump's conduct during the raid shows a perversity of constitutional proportion. The Articles of Impeachment might have included a "failure in the duty to protect" to capture what can't be denied: he enjoyed watching. And I know exactly how that sounds. https://twitter.com/lrozen/status/1350268480344485890 The [[Boygenius]] EP cover photo is an homage to [[Crosby, Stills & Nash]]. I spotted it! * [[How All-Female Supergroup Boygenius is Changing Indie Rock|https://www.newsweek.com/2018/11/09/boygenius-julien-baker-lucy-dacus-phoebe-bridgers-supergroup-ep-interview-1194109.html]] > The EP's cover is a play on the famous Crosby, Stills & Nash album photo: three songwriters perched on a couch. (Bridgers was friends with the late photographer who snapped that photo, Gary Burden---"he was a crazy awesome stoner wizard," she says.) > [img[https://twelvety.com/philtiddlywiki_images/2021-01-16-boygenius-ep.jpg]] * Actually, [[Henry Diltz]] took the [[Crosby, Stills & Nash]] photo and [[Gary Burden]] designed the cover. But anyway... [[Gyen Abubakar]] on [[Twitter|https://twitter.com/GyenAbubakar/status/1350096836619595778]] > This was me 4 years ago. No phone, no laptop, with the passion to code! I'd borrow my uncle's phone to copy content from W3Schools, learn, & practice when I got hold of a computer. 😅 Still don't own a computer, but I got a job as Front-end Developer late last year. > [img[https://twelvety.com/philtiddlywiki_images/2021-01-16-gyen-abubakar.jpg]] [[What is .NET? What's C# and F#? What's the .NET Ecosystem? .NET Core Explained, what can .NET build? -- YouTube|https://youtu.be/bEfBfBQq7EE]] by [[Scott Hanselman]] [[Jaron Lanier]] from [[Ten Arguments for Deleting Your Social Media Accounts Right Now]], via Jack > How can you find happiness without authentic self-esteem? How can you be authentic when everything you read, say, or do is being fed into a judgment machine? * That right there.
I cleaned off the basement desk and put all the tech debugging gear on it! Ready to start working on the [[Harman Kardon PA2200]] for real tomorrow. [img[https://twelvety.com/philtiddlywiki_images/2021-01-17-basement-desk.jpg]] Ordered a [[Mackie Big Knob Passive Studio Monitor Controller]] from [[B&H Photo]] * https://www.bhphotovideo.com/c/product/1567493-REG/mackie_big_knob_passive_black_big_knob_passiv_studio.html * Needed this for the [[Mackie MR524 studio monitors]] anyway if they ever get here, but it'll also be handy for controlling the level of test signals through the [[Harman Kardon PA2200]]. Ordered a [[Mobius & Ruppert Solid Brass Pencil Sharpener]] to use with the [[Blackwing 602 pencil]]s when they get here. * https://www.moebius-ruppert.com/spitzer/sp_details/06020000_en.html Retail therapy, anyone?
I don't think I'd ever read anything she wrote, but a lot of doctor people on Twitter sure did have nice things to say about [[Sharon Begley]]: [[Remembering STAT's Sharon Begley: Mentor, friend, journalism legend|https://www.statnews.com/2021/01/17/remembering-sharon-begley-mentor-colleague-science-journalism-legend/]] > “Me, I seem to be getting more Zen about it all,” she wrote me at one point. “I tried my best with the years I was given, often fell short, but my lodestar was always kindness and making things a little better than I found them, journalistically or personally. I think I can look back and say I was not a mean or bad person.” > ... > She demonstrated every day what it means to be a generous colleague, one with no ego. She gladly shared tips or sources and didn’t feel possessive over her beat. She would add other reporters to contrib lines (those “so and so contributed reporting” mentions at the bottom of some stories) when they had done practically nothing, and would add them to bylines when a contrib line would have been more than fair. She came to cheer on our goofily bad work softball team. She would send me nice emails about my stories, which I always appreciated but only now am I realizing just how much I cherish them. I still have so much to learn from her.
I measured around 5V DC across the right channel speaker output on the [[Harman Kardon PA2200]], which is about 83x too much voltage. No wonder I was getting a massive “POP” sound in the right speaker. The outermost right channel output transistor also measures about 5V DC at its base, when it should be 0.6V. So either it has a short or something further upstream is shorted and driving it way too hard. The oscilloscope was invaluable for comparing the left/good voltages to the right/bad ones. More tomorrow!
Last night I tested a bunch of resistors and voltages on the [[Harman Kardon PA2200]] PCB. Saw a bunch of probably-good resistors and a couple of very not-good voltages. Q441 and Q443 are both way too high at their bases, but they're only off from each other by 1.12V, which is close to the 1.2V difference they should have relative to each other. They could both be bad, but I think it's more likely that either Q441 is bad and pulling Q443 up, or there's some other problem common to them that's causing them to be off together. Next step tonight is to check the underside of the board for cold solder joints. If that doesn't reveal anything obvious, I'll try reflowing the Q441 transistor connections. If that doesn't work, I'll keep going leftwards in the circuit checking voltages. This is maddening but fun. Also, OMG I love the [[Blackwing 602 pencil]]. So, so good. [img[https://twelvety.com/philtiddlywiki_images/2021-01-21-hk-amp-notes.jpg]]
Last night I made some actual progress on the [[Harman Kardon PA2200]]! I harvested the below [[Canon]] teleconverter lens from a non-working [[Super 8]] camera, and it made a decent 3x magnifier for seeing heat-stressed solder joints on the bottom of the main amp board. Then I reflowed the solder on Q441 and Q446 and scraped off some extra flux and got a massive (good) mostly-steady drop in voltage on the Q441 base. The right speaker output is now closer to the ballpark and not sitting at +5.20V DC anymore. Today I ordered a silly amount of stuff from Amazon: * thermal grease (for if I have to replace/re-mount the output transistors) * replacement [[Weller soldering iron]] tip * desktop 3X magnifying gooseneck lamp * 99% isopropyl alcohol * and a [[Bausch & Lomb]] 5x loupe (mostly because it looks fun) Tonight I'll make do with the 91% isopropyl alcohol in the house and see what more flux I can remove from the board before I reflow anything. Ooooo and the [[Amprobe AM-510 multimeter]] arrived today! [img[https://twelvety.com/philtiddlywiki_images/2021-01-22-hk-amp-notes-wb.jpg]]
Sorry for the lack of updates, world! 🙃 I went basically off-grid this weekend while working on the [[Harman Kardon PA2200]] and it felt like a vacation. After taking so many lab-notebook notes about the amp in the [[Rhodia Webnotebook]], I realized there's no way I could have done that as quickly or effectively with anything digital. With that notebook and a pencil, it's so easy to add data, make a table, add a component schematic and pin-outs, and glance around at all of it to make connections and get a feel for what was tried and worked or didn't work. Almost makes me want to go back to analog for everything, but only almost. So. Many. Notes. About. Fixing. Electronics. Many things to try tomorrow. I had to work so late tonight that I didn't get to spend any time with the amp. ☹️
When you only have time to add a sentence or two to a single wiki before bed, which one do you pick? I guess it's [[TiddlyWiki]]. Maybe if I use each day's lunchtime to answer and write emails to people like a human person, I won't be such an incommunicado dick. Someday I'll close the tabs in [[Safari]] at a faster rate than I open new ones and then I'll be caught up. I still always open Jack's TiddlyWiki sidebar //just in case// there's a recently edited tiddler that doesn't show up in the main story river.
Sarah: What are you doing over there at your desk?<br /> Me: Closing a bunch of browser tabs that are slowing down my computer.<br /> Sarah: Oh, that old song-and-dance. This was a hard week. Apparently, [[How you do anything is how you do everything]] still applies. I forged ahead like a mule, beating my head against a JavaScript-generated map for our public website, convinced that I Could Just Do It if I tried hard enough and I Didn't Need IT To Help. In the end, I sort of got there, but it would have been way better if I had admitted a month ago that I could use help from others. I think my most atomic, natural state is to be able to not talk to anyone for hours. Hours. All these people on Twitter talking about the "compounding effect" of taking notes in [[Roam]]—I don't know what they're talking about. Maybe if I were forced/allowed to use it for work, I'd see different results from it. I mean, it's great, and the backlinks are awesome, but I suppose that more than half of it is in how you use it. Most of the time, I'm on today's [[Daily Notes]] page, plugging away and never looking backwards. One thing I like about [[Day One]] is that it's pretty hard to do meaningful cross- or back-linking. If you stay out of tags, it's pretty much the equivalent of a paper notebook + search. Isn't one of the appeals of paper journals the fact that there's zero linking, and to get any insights from them you have to go dig them out and sit with them and flip the pages and sift through them a bit? And you might hit upon something interesting and you also might not? I'm still feeling the palpable sense of relief that Trump is no longer in office, but his absence has really shone a light on how fundamentally annoying most of the people I follow on [[Twitter]] are when they don't have him to fixate on. The ceaseless eye-rolling, the exasperation, the overstating of the case. It also reveals how pointless my persistent doomscrolling has been the past 4–5 years. I'm totally part of the problem. Ha! ''Jack'', [[I knew what this was|https://rudimentarylathe.wiki/#2021.01.27%20-%20PSYCH!]] before I even clicked on the tiddler. ;) It's going to snow this weekend and we're going to be trapped at home and that is an ideal situation. No daily logging system I come up with—paper, digital, or hybrid—can survive a week of working late. I was at best an acquaintance of [[Phred Rainey]]'s, so I don't know this for sure, but from the kind of stuff he did and was interested in, I doubt that he would have spent much time "curating his notes" or whatever. He probably would have asked why one would bother spending time on such a thing. Now he's gone, and if he did have a mountain of notes, what good would they be now? What would he have missed out on in his limited time here if he were keeping his folders and metadata comprehensive and tidy?
Here's my progress with the [[Harman Kardon PA2200]] amp over the last few days. Every time I think I'm in over my head, I think of some new angle to try. Today, I'm going to look at the complementary input transistors. People on [[AudioKarma]] seem to suggest that most often as the reason for DC offset drift. [img[https://twelvety.com/philtiddlywiki_images/2021-01-23-hk-amp-1.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2021-01-23-hk-amp-2.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2021-01-23-hk-amp-3.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2021-01-23-hk-amp-4.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2021-01-24-hk-amp-1.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2021-01-24-hk-amp-2.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2021-01-24-hk-amp-3.jpg]]
* 2021-02-25 ''Tim Buckley'' - Dolphins, from Vinyl Assault Vehicle 2021-02-17 * 2021-02-25 ''Akron/Family'' - There's So Many Colors, from Vinyl Assault Vehicle 2021-02-24 * 2021-02-24 ''Wye Oak'': Civilian, esp. "Holy Holy" * 2021-02-24 ''Cloudboy'' - Red Rubicon ([[YouTube|https://youtube.com/watch?v=dGj5bZTV4Zs]]) * 2021-02-23 ''Norma O'Malley'' (ex-Look Blue Go Purple) - Some Tame Gazelle from Killing Capitalism With Kindness comp (1991) ([[YouTube|https://youtu.be/Yl2mV7P5fhE]]) * 2021-02-23 ''Look Blue Go Purple'' - Circumspect Penelope (live) ([[YouTube|https://youtu.be/gdEziDQqCgc]]) * 2021-02-19 ''Peggy Lee'' - Is That All There Is? per https://gullibleear.wordpress.com/2021/02/19/peggys-in-a-goth-gang-the-philosophy-of-full-loss-ophy/ * 2021-02-12 ''Birchville Cat Motel'' - We Count These Prayers. Cool sound/radio/morse code collage/ambient stuff. From Strength Through Failure 2021-02-11 * 2021-02-09 ''Richard Swift'' - Lady Luck * 2021-02-04 ''Humble Pie'' - Stone Cold Fever * 2021-02-04 ''TAD'': 8-Way Santa is a really good record that I never listened to past "Plague Years" before. * 2021-02-03 ''The Zombies'' - She Does Everything for Me. from Vinyl Assault Vehicle 2021-01-27 * 2021-02-01 ''AC/DC'' live in Glasgow ([[YouTube|https://youtube.com/watch?v=s3nEAmt5AZ8]]) * 2021-02-01 ''The Critters'' - Mr. Dieingly Sad. Jesus what a song.
More testing of the [[Harman Kardon PA2200]] after work tonight. Even with the output set to 4 ohms, the negative power supply rail is a few volts off. That has to be what’s screwing up the DC offset for both channels. How can the rest of the circuit be ok when the power supply isn’t dead-on? As much as I’m flailing around in the dark with this thing, I’m learning a ton and the whole [[electronics]] hobby is becoming an obsession. Now I want to dig out the breadboard and play with some transistors and resistors and LEDs and see how much I remember. I even watched a video of someone debugging a small kit amp today. His whole problem turned out to be a bad solder joint. The amp sure did sound good once he got it worked out. Why haven’t I been paying attention to this stuff all along?
Transistor tester arrived!!! So cool. It had been so long since I’d played my Koss Frankenstein headphones with just the DACMagic and no Mackie mixer as a headphone amp that I forgot what a good, lightweight combo they are. On the [[Harman Kardon PA2200]] I checked the ground side of every component on the main audio board that goes back to ground and didn't find any broken traces. So that's one thing that checks ok. I haven’t ~~had~~ made time to put anything in [[Roam]] in days. 😬
Huh. Staying up until 1am working on the [[Harman Kardon PA2200]] two nights in a row makes a person unfocused the next day(s). I don't know how much longer I can hold out with the [[Keychron K2]], even with the improvements my mods made. I'm desperate for [[Topre switches]].
2nd day in a row getting up too late to shower before logging in to work. GROSS. Have to shower at lunch.
We had a bright idea to make February a no-TV-except-DVDs/Criterion month, but then decided a stay-at-home pandemic is not the time for that. We have to have something. Where in productivity/GTD/whatever do I make time for the part where I stare blankly at the computer screen contemplating my litany of regrets?
Late last night I posted on [[AudioKarma]] what is probably [[the world's longest question|https://audiokarma.org/forums/index.php?threads/harman-kardon-pa2200-unstable-dc-offset-and-mysterious-rails-voltages.948179/]] about my various [[Harman Kardon PA2200]] issues. I really hope [[Conrad Hoffman]] weighs in. After listening yesterday to [[Matthew Walker on what you lose by cutting sleep short]], I need to make whatever changes are needed in order to prioritize sleep. Less Twitter, less news, less messing around, whatever it takes. Ha! Well, after realizing that—amazingly—no one had bought [[220221whateverittakes.com|https://220221whateverittakes.com/]], I just grabbed it. I don't even have any ideas for it, but that's just too good to let sit there. Until I can figure out a purpose, I set it to redirect to this wiki after the DNS kicks in.
I’m so boring that the only thing I accomplished tonight after dinner was washing the dishes (and there were a lot). No amp work, but at least I’m a little less crazy tonight and we’re getting to bed at a decent hour. I have tomorrow off, so I’ll get in some good soldering iron time then. I’ve watched a dangerous number of YouTube videos about restoring old audio gear, so now I have an inflated sense of what’s possible.
The chances of me wanting to stick with a particular note-taking platform or app or file format are inversely proportional to the likelihood that that platform will be around for the long haul. Here's the thing about [[email]]: If I don't look at it on my phone because it's more efficient to do it on the laptop, then I save it all up until it's too much to do on the laptop and then I don't bother, because why even try, and then I'm an email dick. If I look at it on the phone, the majority of it is just reading and deleting, but for the stuff that requires action, I have to star/flag it or make a zillion to-dos in Things to remind myself of what to do with the stuff I can't process on the phone. I'm pretty sure the reason I'm getting so caught up in gulping down as much analog [[electronics]] theory and practice as I can comprehend is because, unlike front-end web development, the basics have been the same for decades and aren't going away anytime soon. Ohm's Law is going to apply until the sun burns out. Diodes let current go in only one direction unless you burn them out. Transistors are still transistors and are mind-bogglingly everywhere in various flavors. Whatever I can learn about how to bias transistors is going to work long past my time here. And if you really want to slow down time, they still make vacuum tubes and tons of DIY amplifiers use those. All of this is a balm for a brain addled by pocket-size iOS devices, the latest web frameworks, and cloud/virtualization fads. I will continue to hibernate at my basement bench long after the pandemic is over! I reflowed dozens of solder joints on the [[Harman Kardon PA2200]] today. It sure looks like thermal cycles have taken their toll on a lot more joints than I realized. We'll see if I (hopefully) don't make it worse.
[[Analogging - Jack Baty's Weblog|https://www.baty.net/2021/analogging/]]: 😍 Pretty sure the web started losing its way right about the time we stopped underlining all the hyperlinks. Jack, I remember getting the Heathkit catalog in the 80s and seeing that [[clock kit|https://rudimentarylathe.wiki/#2021.02.10%20-%20Daily%20Notes]]. I wanted it and don't know why we didn't just get one. All that time I spent assembling and painting plastic model cars when I could have been assembling working electronic appliances!
Last night I reflowed a bunch more joints in the [[Harman Kardon PA2200]]. Why haven't I been using solder flux this whole time? Scrubbed extra flux off with 99% isopropyl afterwards and the right channel offset still isn't good, but we'll see what happens after reflowing the power supply PCB and left channel. I started a sleep log page in the [[Rhodia Webnotebook]] and as soon as it was time to put data in it, I froze, not knowing whether to use a [[Blackwing 602 pencil]] or a [[Pilot G2]]. The Blackwing has ruined me.
Now that I've broken the reflexive habit of looking at Twitter when I'm bored, I'm holding this phone and staring at the app icons and I don't know what to do next. After my post-work nap, and then "dinner" and TV, I finished reflowing the remainder of the right channel and then almost the whole left channel PCB of the [[Harman Kardon PA2200]]. The [[Weller]] brass sponges for cleaning the soldering iron tip are life-changing. Then scrubbed the extra flux off and will let it air out overnight. I guess we stay up til 2:30am on Friday nights now. Learned about [[transistors]] and how they have cutoff, active, and saturation regions! This is starting to make more sense. https://instrumentationtools.com/transistor-cut-off-saturation-active-regions/
Of course, the ice storm and resulting power outage means that the only thing I can do on the [[Harman Kardon PA2200]] right now is remove the giant heat sink, clean out the old thermal paste on the output transistors, and apply new paste. And then WAIT for the power to come back on to see if that helped. No ETA from Dominion yet. Until then, I'm scratching out wiki updates on my phone with my cold hands sticking out of the bed blankets.
The power came back on around 8pm last night. Thank goodness. Tonight I pulled the massive heat sink out of the [[Harman Kardon PA2200]] to clean the heat transfer paste goo off of it and the output transistors. And in the process, cracked one of the brittle mica insulators that keeps the transistors from shorting out against the grounded heat sink. There's no way I'm going to put that back in the amp, so I went down the rabbit hole on [[AudioKarma]] and read about the religious wars between those who stick with mica+grease vs. silicone pads. Silicone pads have come a long way in the past few years, so I ordered a set of old-style mica pads //and// a set of [[Bergquist K10-104 silicone pads]]. I only hope the K10 pads are strong enough to resist being punctured by any burrs in the heat sink. If they're not, then maybe their poly-pads. I am a huge fan of Jack's and Kevin's newsletters. Keep 'em coming!
I stayed up way the fuck too late last night writing a blog post for [[The Gullible Ear|https://gullibleear.wordpress.com]]. It'll come out on 2/26. Seemingly, as a cosmic reward (and not a punishment for a change), the ice storm knocked out our power again today from 6:30 am until 3:30 pm, which was the closest thing to a snow day I've had in years. I'm just thankful to have the heat on again. I'm fascinated by [[Class D amps]] like I'm fascinated by [[Class AB solid state amps]], and by [[tube SET amps]]. I was wondering about the difference between my beloved DSD recording method and Class D amplification and realized after reading around that: # Class D (these days) typically has a pulse rate on the order of 600 kHz. Hence the fears about every non-expensive Class D amp becoming its own accidental AM radio station if not sufficiently protected. # That switching frequency is nowhere near what DSD achieves at around 2.8 MHz. Because of that, the filter at the end of a Class D amp is much more likely to introduce phase shifts and deliver weak bass because of complications with how it reacts to speakers and their impedance. # When DSD sends a high-frequency series of pulses from a DAC to a filter, it's at a much lower level than what a Class D amp sends to a filter. The Class D filter, receiving the potentially full wattage of whatever the amp is sending, has to literally not burn up while doing its job. Plus, that just seems like a cruel thing to do to output transistors (even if they're GaN), and to filters. Slamming transistors to full on and off at 600 kHz with 100 watts of power and expecting a filter to clean up the mess is not what I think circuits want to be subjected to, assuming one cares about that. # Newer, more expensive Class D chips are able to reach into the 1 MHz area, and I expect this will get more common in the near future. This means the filters can be less steep and more gentle to the audio. Less phase shift, less damage. # All that said, I still want the [[Allo Volt+ D]] amp, just to play with. I'm as woke as the next almost-50-year-old, but I'm really tired of young people telling me how I'm doing it wrong. The [[Mackie MR524 studio monitors]] arrived today, two months after I ordered them. Yay! One of them has a broken bass-response switch on the back. Boo! Will ship that bad one back to [[B&H Photo]] tomorrow. The working one sounds great, though, if one is working on mono recordings. Even though I want the [[Allo Volt+ D]] because I'm curious about [[Class D amps]], I still plan to fix the [[Harman Kardon PA2200]]. That project has become less about the amp itself and more about whether I can learn enough to get it back to working order. I have way too much ego tied up in it to quit now. And the new mica pads got here today! Just need to wait until the [[Bergquist K10 thermal pads]] get here tomorrow and see which one feels like the best one to mount under the output transistors.
Man, when I go off the grid, I really go off the grid. This week has been one misdirected obsession after another, sometimes two in one day: * [[Class D amps]] for speakers * ordering output transistors, trimpots and resistors for the [[Harman Kardon PA2200]] * various [[Schiit]] solid-state and hybrid headphone amps * cheap assembled [[Class A tube headphone amps]] * DIY solid-state, all-tube, and hybrid headphone amps
The replacement [[Mackie MR524 studio monitor|Mackie MR524 studio monitors]] arrived yesterday to join the other one that was already here. They sound incredible together. Holographic and balanced, but boy do they show off how awful our small studio/office room is for listening to and mixing music. We have the typical room nodes that cause severe bass problems no matter what you try. So I've decided that all my music-recording/making/mixing/synth/archiving gear, and the homemade desk riser I just finished, is going to a new spot in the basement tomorrow night, where it can all be used all the time, and especially where I can have the monitor speakers way out in the middle of the room, away from walls. And most importantly away from cat litter dust. That shit is killing my gear. Related to the impulsiveness to decide to move everything to the basement, I ordered a [[Schiit Magni 3+]] headphone amp today! This will stay in the office where I'll use it during the workday with the [[Massdrop X Sennheiser HD6XX Headphones]] and the [[Massdrop Koss KSC75X headphones]]. That amp is insanely inexpensive and the reviews are off the charts everywhere. My latest DIY [[headphone amp]] aspiration until this week was a [[Whammy Headphone Amplifier]], but I can't start that until the [[Harman Kardon PA2200]] is finished, and Mouser emailed to say my parts order is delayed, so it's gonna be a while. I know I've had [[sleep apnea]] for years, but this is really hitting close to home: [[Is a symptom of this condition feeling like you don’t “wake up” or feel a difference between night and day?: r/SleepApnea|https://www.reddit.com/r/SleepApnea/comments/lsyu0f/is_a_symptom_of_this_condition_feeling_like_you/]] > This semi detachement is exactly what I felt. You quickly fall into a slight depression or apathy because of it since you just don't feel emotions and day to day interactions that much. It's gonna take four more years of me completely ignoring the news and [[Twitter]] to make up for the previous four years of overdoing it.
Sarah sent me four text messages in the middle of the night last night to say how my snoring was killing independent Sarah. I saw them at about 4:30 am and then spent the next 1+ hour lying in bed looking at Amazon reviews of [[mandibular advancement devices]]. All of them look sketchy. None of them are guaranteed to work, but some are cheap enough to give a try. I ended up ordering a set of [[ZQuiet]] mouthpieces. They'll get here tomorrow. Until my sleep doctor appointment in April, I don't know what else to try. I'm tired of feeling like a zombie all day and I know Sarah would like some deep sleep again. I randomly searched [[eBay]] today for an old [[Pro-Ject DAC Box S FL]] [[non-oversampling DAC]] and happened to find a used one available for $100. I had to jump on it just to see what the difference is. This should be fun to listen to.
A funny thing that happens with [[Roam]] and me, over and over again: I spend time when I'm away from the computer thinking about all the ways that Roam is bound to fail over the long term. How there's no way it's going to last decades. How it's all in the cloud and not local and it's out of my hands and run by people unfathomably younger than me. How it's not "free" as in [[Richard Stallman]] free. And then when it's time to do research to solve an actual problem and evaluate alternatives and copy and paste what experts have said about emitter resistors for [[output transistors]] on [[AudioKarma]], Roam is the only thing I use. Y'all, there is too much texting. Too fucking much.
The [[ZQuiet]] is an abject, harmful failure of a device. I tried it for two nights. Both times it helped (practically eliminated) my snoring, at the cost of shifting my front teeth so much that my bite felt weird the next morning. True, this is not one of those [[mandibular advancement devices]] that takes a mold of your teeth, but I don't think any of these over-the-counter gadgets are any good. The [[Schiit Magni 3+]] and the [[Pro-Ject DAC Box S FL]] are a wonderful, incisive pair. I've never had a [[non-oversampling DAC]] before, and the theory of it seems intuitive, but also like you're asking for trouble: Output a series of stair-step voltages decoded from PCM input by using an old-fashioned 16-bit resistor network, don't include a reconstruction filter because that would artificially smooth the signal out, and just //let all the resulting ultrasonics go along for the ride with the rest of the audio signal and hope for the best//. Everything I've learned about audio sampling for the past 39 years says that should not work, and yet it works better than anything else I've ever heard. I can hear //into// and //around// instruments in a new way. Just listening on the [[Massdrop X Sennheiser HD6XX Headphones]], there's a height and depth to the sound that is utterly strange and addictive. It's refined at the level that I thought only really expensive gear could do. That Pro-Ject DAC goes great with the Magni 3+, which is about as ruler-flat accurate and boring as they come, except for the bottomless well of current it can supply the headphones. The only drawback is the uber-cheap volume pot, which has the channel imbalance everyone predicted. [[Roon]]'s DSP makes it easy to correct that, but since I also [[AirPlay]] [[Spotify]] to this DAC through an [[AirPort Express]], I ordered a passive volume knob from Amazon for $50 today to see if I can notch the left channel down by 1.2 dB and get everything in balance again all the time. Notice how my attempt at simplifying my setup to get "just a headphone amp" has spawned a bunch of... other things. I'm at that state where I rush through the days and nights, barely taking care of anything. Email, money, computers, dishes, friendships, this wiki, all neglected and withering. The coming warmer weather will force maintenance on some things that have gone into hibernation during the cold. Jack's [[book-logging in plain text|https://copingmechanism.com/2021/book-logging-in-plain-text-2/]] is one of those things that could make me go back to [[logging]] all the new music I find in a [[plain text]] file. Like I did for years before [[Roam]] messed everything up.
Some nights I just need to spend a lot of time on a computer in order to feel like a person again. Tonight it was by doing a [[massive catch-up on Jack's wiki|2021-03-11 massive catch-up on Jack's wiki]].
I had only had time to glance in short stretches at [[Jack Baty]]'s wiki over the past few weeks and felt like I was way behind (because I was). Since I needed to see more new tiddlers than would show in the sidebar, I used a filter in [[TiddlyWiki]]'s advanced search to find all the non-system tiddlers created within the past 30 days: `[!is[system]sort[title]days:created[-30]]` I get [[ocular migraines]], too! I get one about every other month. I have for the past 25 years. Never have found the cause. [[quote]] via the [[wiki|https://rudimentarylathe.wiki/#2021.03.04%20-%20How%20simple%20can%20it%20get%3F]]: > //The more simple any thing is, the less liable it is to be disordered; and the easier repaired when disordered// – [[Thomas Paine]] ''Thank you'' for the [[note about the CPAP|https://rudimentarylathe.wiki/#2021.03.06%20-%20Phil%3A%20CPAP]]. My wife (and I) both say "thank you!" I had one 15 years ago and stopped using it, but I understand that they've gotten a lot better in the years since. I am down with it if they prescribe one. I hope they do. Holy moly: [[EasyOrg - Org Mode Made Easy|https://easyorgmode.com/]] > ''Org mode Made Easy'' > Get your projects done. Todos. Notes. Scheduling. Text-file based. Secure and future proof. [[Dendron]] is a [[Roam]]-like extension for [[VS Code]]: https://dendron.so Need [[to watch]] this [[Jeremy Ruston]] interview: https://youtu.be/OFstPn355xQ
And now I'm back to Editor mode as the default mode to open all files in in [[Obsidian]]. I think of it as a linkable text editor anyway, so I barely ever want to look at Preview mode anymore. [[Johnny.Decimal]] is setting off sparks in my brain, starting me thinking about potential hierarchies for things where it makes sense. Also, I realize I keep clipping things in [[Drafts]] to paste into [[Roam]] and [[TiddlyWiki]] about how to design and use a numerically ordered filing system in a hierarchical filesystem. 🙃 Oh boy I just made a fresh [[2021-02 found music]] tiddler and I feel like I'm getting back to my roots.
In two days I will be 50. And yet, farts and boogers are still funny. The [[Harman Kardon PA2200]] is going to start feeling jealous of [[Johnny.Decimal]] soon. One thing that always lures me in with systems like [[Johnny.Decimal]] is when they're presented like, //"Here are the steps. Do this. You can tweak it, but try to just do this as prescribed. This has proven itself over years and years. You will be happy."//
I would really love a [[Johnny.Decimal]] Discourse site.
Birthday day off! Egg and cheese biscuit, muffins, and cookies at [[WPA Bakery]], Sarah drove us to the [[Blue Ridge Tunnel]] trail and we walked the length of the tunnel, then [[Chick-fil-A]] on the way back for a pit stop, chicken sandwich, fries and a Coke. We napped when we got home, I woke up and there was a new [[Johnny.Decimal]] Slack and then we got pad Thai from [[Mom's Siam]] and watched [[It's Always Sunny in Philadelphia]].
Dammit! Same here: > It occurs to me that I've accidentally stopped using RoamResearch. –//[[Jack|https://rudimentarylathe.wiki/#2021.03.18%20-%20Daily%20Notes]]//
Oh boy. I'm very excited to see the petri dishes (first [[Slack]] and then [[Discord]], soon to be [[Discourse]]) springing up for [[Johnny.Decimal]] discussions. Hats off to Jack for being the catalyst! I don't think I've ever talked for as many straight hours at work as I had to today.
The [[Johnny.Decimal]] [[Discourse has arrived|https://forum.johnnydecimal.com]]! That browser tab is just gonna have to stay open all the time. It's going to take deep wells of resolve to not get sucked into pre-pandemic levels of socializing once we all get vaccinated. I just can't do it. I'm all for having a beer or eating a meal (in a restaurant!) when it's time, but not //all the time// like we used to.
I thiiiiiink the [[Johnny.Decimal]] index-to-rule-them-all plaintext ([[Markdown]]?) file should probably not live //within// the J.D hierarchy? Wouldn't that cause like a wormhole or something?
It’s 12:20am and I just finished the workday 15 minutes ago. I got nothin’.
When I start back on hunting for digital cameras I don't need, like a used [[Fujifilm X100F]] or [[Fujifilm X100T]], it means I don't have enough to keep me busy, I need to get back to electronics, and/or I need to //actually process some of the film I have shot and have left lying around in cameras to rot.// Jesus. There's no way I could justify a new Fujifilm anything. The only reason I'm even allowing this bout of [[G.A.S.]] to trod into my brain is because those used cameras are half the price and seem to still be good. I don't know what I'm even doing here. Then again, turning 50 does weird things to a person's brain. Nice gear isn't just going to buy itself, you know. Yay! [[@kordumb]] is back in [[TiddlyWiki]]! * https://wiki.tiv.today/#24%20March%202021 ([[via Jack|https://rudimentarylathe.wiki/#2021.03.24%20-%20Daily%20Notes]]). * ''Kevin'', one way around the "how do I get everything out of [[Roam]] and into the wiki" problem is to just not care about doing it. That's what works for me, at least! :)
I took the [[Panasonic GX1]] and the [[Panasonic Lumix G 20mm f/1.7 II ASPH]] out for a visit to our neighborhood park. I knew at the time that I was taking possibly the most boring photos ever and it was confirmed when I brought them into [[Adobe Lightroom CC]] tonight. Just the most uninspiring yet technically accurate-enough photos on my hard drive. I mean, they're bad. Not blaming the camera or lens at all (although I'm already scheming how to send the camera and the 20mm and the kit lens to [[KEH Camera]] to see what they'll give me for them). It's because I was out "looking for something to shoot" instead of being somewhere with a camera and keeping my eyes open for if or when something actually grabbed me.
Whew. It's always something when you start `ssh`-ing into things. There are way too many details to put here, but tonight on the [[DigitalOcean]] droplet I: * updated all the Ubuntu packages * updated to Ubuntu 20.04.2 LTS * updated to the new [[Certbot]] client using these instructions: https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx It's always scary when the wiki is down for an hour, but everything seemed to go ok!
I no longer want a [[Fujifilm X100F]] or [[Fujifilm X100T]]. Now I (again) want a [[Ricoh GR (2013)]] because of [[Tim Gray]]'s GR photos on Flickr. After I asked Tim more about his process on Micro.blog today, he sent me very detailed steps about what he does (or did) to his GR photos to get them to look so nice. There were more steps than I was anticipating, but I admire the end product even more knowing how much time he puts into what I thought were just snapshots out of the camera. ''Update:'' Ordered a used GR from someone on eBay. Fingers crossed that it's in as nice a condition as it was described. ''Congratulations on the end of a 25-year era, Jack!'' I know you've more than earned it and I hope there's a nice stretch of time to catch your breath before you do whatever comes next. Today was a Saturday of //zero// productivity. Coffee, peanuts, walnut cake, read about cameras, saw friends outside at the [[VMFA]], ate Cheetos, came home and read more about cameras, bought a camera, had beer, watched [[Freaky (2020)]] and ate leftover pizza and an orange, and read more about cameras. Apparently my interest in photo gear is like a plague of locusts that comes along every few years and when it does it wipes out everything else.
[img[https://twelvety.com/philtiddlywiki_images/2021-03-28-camera-keychain.jpg]] This is really all M's fault. She gave me this handmade keychain for my birthday and it stared at me all week. At first I thought that through the power of suggestion (and the similar shape) it was telling me to get a [[Fujifilm X70]] or maybe even a [[Fujifilm X100F]], but it ended up making me buy the [[Ricoh GR (2013)]].
Almost bought a small camera pouch to put the [[Ricoh GR (2013)]] in to protect it from dust, and then remembered that I have that fancy small waxed-fabric bag that came from Spain that I bought to carry small cameras in! The one that I've gotten out of the habit of using. We decided we're not taking [[red yeast rice]] or even any real statins. We don't want to have to not drink beer, or worry about liver damage if we do. Plus, we need to eat more healthfully anyway. We've gotten cholesterol down with changes in diet before.
Ok, I actually did order a pouch for the [[Ricoh GR (2013)]]. This one I can fit in a pants pocket when I don't want to bother with a bag. More like a less-dusty inner lining for my pocket than a camera bag. * https://www.bhphotovideo.com/c/product/1191076-REG/tamrac_t1130_8585_goblin_body_pouch_0_4.html
The camera isn't even here yet, but I am very, very nervous about dust getting into the non-weather-sealed [[Ricoh GR (2013)]] and on the sensor, so I ordered a [[Ricoh GH-3 lens hood and adapter]]. I don't think I'll use the lens hood.
Uggggh. The last trio of jeans I bought are now almost 5 years old, and one pair has developed an unseemly rip, so I have to get some new ones. I'm not pandemic-worried about shopping in a store, but I just can't bring myself to go to the mall to pick out pants, so I gave some [[Levi's 502 Taper Fit Flex Jeans]] on Amazon a shot. I learned from my mistake last time when I didn't pick the "stretch/flex" version. We will see if I look silly when they get here. Also, why don't they come in fun colors anymore? So, let's see if I have the last few weeks straight: * [[Harman Kardon PA2200]] amp repair, unfinished, but I received some free, rare, sample resistors from [[KOA Speer Electronics]] the other day, so that's a boost. * [[Mackie MR524 studio monitors]] arrived and assumed their position in the basement where someday they'll be joined by all the keyboards * Headphone-listening crisis solved with [[Schiit Magni 3+]] and [[Pro-Ject DAC Box S FL]] * Then [[Johnny.Decimal]] comes on the radar and is a good influence for a few days, only to be knocked out of my attention span by... * the [[2021-03-28 Camera keychain by my niece]]... * which spawned a sudden, irrational need to get a new-to-me digital camera, which will be the [[Ricoh GR (2013)]] * and now I'm onto photo organizing tips while the Ricoh is in transit. * When do I go back to messing with electronics?
Number of times I've regretted angrily composing a would-be IM in a text file and deleting it instead of sending it: 0. I keep trying [[Adobe Camera Raw Super Resolution]] on random old and recent digital photos. It does give you the ability to zoom in one more level on an image before you get sad. Neat trick.
I don't know if this is the right way to go, but I just imported my first batch of really fun, beautiful shots from the [[Ricoh GR (2013)]] and haven't had to think about dealing with RAW vs. jpg files in ~~[[Adobe Lightroom CC]]~~ [[Adobe Lightroom Classic]] since I used the [[Panasonic GX1]] regularly years ago. So I'm gonna do this: https://photo.stackexchange.com/questions/39697/how-to-view-side-car-jpgs-on-lightroom-how-to-easily-manage-rawjpeg-image-revi > Edit > Preferences > General > "Treat JPEG files next to RAW files as separate photos" and: > Stack the JPEGs & RAWs by doing this: Select All > Photo > Stacking > Auto > Auto-stack by exposure time > set Time between Stack to 0:00:00 and then select all the photos in that set and collapse the stacks. I'll just have to be careful about knowing what I'm editing (RAW vs. jpg).
Well, I just adore this [[Ricoh GR (2013)]]. It makes it so fast and easy to grab a shot and you don't have to do a million things to it in [[Adobe Lightroom Classic]] to make it look good. <a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/51095613961/in/photostream/" title="Roger"><img src="https://live.staticflickr.com/65535/51095613961_c2b5df3615_h.jpg" width="100%" alt="Roger"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> <a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/51096417595/in/photostream/" title="Roger"><img src="https://live.staticflickr.com/65535/51096417595_80158a1441_h.jpg" width="100%" alt="Roger"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> <a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/51096420935/in/photostream/" title="Roger"><img src="https://live.staticflickr.com/65535/51096420935_98cbf8de12_h.jpg" width="100%" alt="Roger"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
I don't have time to take notes on these [[Adobe Lightroom Classic]] or [[photo workflow]]-related things tonight, but here's a bunch of stuff I have open, that I can theoretically //close// if I leave some breadcrumbs here... * [[What is a Photography Workflow? Here is What You Need to Know|https://photographylife.com/what-is-photography-workflow]] * [[Digital Photo Editing Workflow - Better Images From Capture to Output|https://digital-photography-school.com/digital-photo-editing-workflow-better-images-capture-output/]] * [[10 Things I Would Tell New Lightroom Users - Scott Kelby's Photoshop Insider|https://scottkelby.com/10-things-i-would-tell-new-lightroom-users/]] * [[Why There are 6 Types of Lightroom Previews and How to Use Them|https://digital-photography-school.com/6-types-lightroom-previews/]]
No regrets at all about buying the [[Ricoh GR (2013)]]. But I have noticed that I'm precisely back where I was the last time I used a digital camera with any regularity: ''I click the shutter way more frequently than I can deal with the results.'' Because it's so easy and essentially free to take pictures, they pile up on an SD card > a holding pen inbox folder on the laptop > [[Adobe Lightroom Classic]] `photographs` folder (either the `YYYY-MM daily life` folder or a folder for a dated event) > the ones worth keeping go to a Lightroom catalog > best ones from there get burned to a `photos` folder in Dropbox with the same structure as in LR > really decent ones get shared with family and/or go on [[Flickr]] + [[Instagram]]. All that crap is fun and it takes time. Time that I don't always have in a day, and then repeat all of it starting with clicking the shutter tomorrow before I've even caught up with today. I'll figure it out. I just need to get more ruthless earlier in the process and keep the garbage shots from hitting Lightroom at least.
At any given time I'm either vegging out, following a process, making or revising a process, or making an actual thing. And never the four shall meet. Now that a handful of people on Micro.blog are re-evaluating whether [[HEY]] is worth it for them compared to stuff like [[Fastmail]], this could be a rare case where my tendency to procrastinate (and not get around to trying HEY) ends up working out.
I worry that I'm going to be really unpopular when everyone's vaccinated and wants to hang out all the time and I end up telling people No when they want to hang out like they did pre-lockdown. I won't do it all the time, and sometimes it'll be great to see folks, but I just cannot go back.
That's it. The MacBook's hard drive is busting at the seams and I keep getting warnings. I have a 98% empty external Samsung SSD velcro'd to the laptop so I'm going to move the entire [[Adobe Lightroom Classic]] library to it. ''Update:'' That worked great! On the internet, there are two main recommended ways of moving a library to another drive: (1) Drag-and-drop ''moving'' it totally within Lightroom, or (2) ''copying'' the photo files to the new drive via Finder and then pointing Lightroom to them after it pops up a bunch of missing-folder question marks, which seemed like a dicey way to go. ("[[You left the bodies and you only moved the headstones!]]") I went with option 1 based on this guy's approach, and I don't know who he is but this seemed less scary. I did this but moved each month's photo folder individually. I didn't want to rely on a 10-minute, 5,000-file move to complete successfully in one go: [[External Drive for Lightroom – Ask Tim Grey|http://asktimgrey.com/2020/01/28/external-drive-for-lightroom/]] <<< If you also want to move photos to a different hard drive, that should be done within Lightroom. With a new external hard drive you would first need to create an empty folder on the drive, so that that folder (and therefore the hard drive itself) will be visible within Lightroom. To create a new folder, click the plus (+) button to the right of the Folders heading on the left panel in the Library module and choose “Add Folder” from the popup that appears. In the dialog, navigate to the new hard drive, and click the New Folder button at the bottom-left of the dialog. Type a name for the folder, such as “Photos”, and click the Create button. Then click the Choose button to close the dialog. With the new folder created, you can then drag-and-drop the folders containing your photos to that new folder. You can move multiple top-level folders (and their contents) at once by clicking on one of the folders on the list and then holding the Shift key while clicking on the last folder in a series. You can then drag-and-drop the one of the selected folders to the folder you created on the new hard drive to move all of the selected folders at once. <<< Also, I did not move the catalog file and its supporting files. Those are still in place in `~/Pictures/Lightroom`. In the process of doing all this, I saw lots of [[Panasonic GX1]]+[[Panasonic Lumix G 20mm f/1.7 II ASPH]] photos that I hadn't seen in years, and there were some nice things in there! That lens is insane. Its critical flaw is how slow it is at focusing.
Why do naturally rolled-off highlights look so cool on film, but when you try to preserve highlight detail in digital it just looks dorky? I have to admit it's fun to be posting a photo or two every day on [[Instagram]] again, and adding [[Flickr]] to the mix. Makes me feel like I'm regularly putting one little thing out into the world.
Monday night was mostly no good other than dinner and TV and then a call with an old friend. After that it was back to work until 1am. Tuesday was better. I napped after work and did nothing useful after dinner other than read about [[Negative Lab Pro]]. Today I got my first Pfizer shot and then a sleep study kit, worked, napped after work again because the shot made me tired, and now I'm starting to realize all the home/life projects I've ignored while working on the [[Harman Kardon PA2200]] (stalled) or processing [[Ricoh GR (2013)]] photos (still fun but impractical). People in other cars are bad. Tonight we watched an [[It's Always Sunny in Philadelphia]] from 2017 that finally went too far. I bet it's an outlier and there's no way I'll stop watching. Just a reminder that things that we love 99% of the time will get it wrong occasionally. If I stopped taking notes in public and putting them in this wiki, I'd have hardly any text content on the web at all, because, truthfully, I'm too lazy to spend time writing things up properly for a blog. I can barely manage to micro-blog for heaven's sake.
Well, I guess I'm fully back into [[Instagram]] now. And I love pixel-peeping the film shots as much as the digital ones. I am saddened by the number of shitty film scans out there, though. Like, barely, barely passable film scans. There's so much more information contained in 35mm scans that what typically comes through. Once you see how a good lens exhibits [[micro-contrast]], you can't unsee it, and you see how iPhone photos don't have it the same way.
This is fun and came out of nowhere. My oldest dude friends are finishing/augmenting the [[Dutch Treat]] CD from 1998. The one that I helped record and mix and that technically "came out" on a dozen CD-Rs back in the day but no one else ever heard. They want to augment it with new/additional vocals and leads. I still have all of the old 1/4" [[Fostex R8]] multitrack reels from that album, and one unlabeled 1/2" [[Tascam TSR-8]] reel that may or may not have relevant songs on it. My goal is to resuscitate both of those decks long enough to transfer all of the individual tracks to [[Logic Pro X]], add whatever new stuff, and mix from there. Amazingly, the R8 still powers on and plays, although it does need a new pinch roller, which I ordered. I didn't turn on the TSR-8 because its pinch roller has turned to gooey tar, so I ordered a new one of those, too. Assuming I can get these both working, I need a way to digitize the tapes. !! Options: * Old FireWire 8-channel audio interface with a FireWire-to-Thunderbolt adaptor ** It's a bad idea to buy something obsolete plus a $100 adaptor to bridge it to work with a current Mac and hope it keeps working with M1 machines. * New digital multitrack recorder if it can record 8 simultaneous tracks ** Would be cool to be able to record without using the computer, but most of the qualified units are limited in their built-in effects. * New USB 8-channel audio interface ** Probably the best way to go to have something new, likely compatible now and in the future, and be able to record various synthesizers after this project is over without unplugging and re-plugging stuff into a pair of inputs. ** [[M-Audio AIR 192/14]] ** [[Focusrite Scarlett 8i6]] ** [[Focusrite Scarlett 18i8]] <- this one
Well, one day after I discovered that Focusrite sold refurbished stuff directly, they got the [[Focusrite Scarlett 18i8]] in stock! Ordered one today, with much less guilt than if I'd bought one new. Fingers crossed that whatever caused it to be refurbished was fixed and leaves it better and stronger for the duration. Scheduled my 2nd vaccine dose today. Can't get here quickly enough. I just tried to start the massive project outline for the [[Dutch Treat multitrack reboot]] in [[Roam]] and I lasted two minutes before I bailed and went back to [[Obsidian]]. Roam is fine for taking notes, but I still can't get used to it for making a project outline. I'm probably wrong, but I'm also old, and I need to be able to see a text file running everything to relax enough to know that nothing's getting lost.
Jeez, it's either keep up with the wiki or make stuff, but not both, apparently. This week is all about the [[Fostex R8 restoration]], or at least reading about it and buying the required supplies. Today was another successful demonstration of [[making something before taking a shower]]: Cutting two 24" x ~70" pieces of very thick birch plywood with which to make side-desk surfaces that will branch off of my main desk in the basement. This is all spurred by the [[Dutch Treat multitrack reboot]]. Sarah said, "oh, so you'll have a cockpit", which is yeah, what this will be. [[Harman Kardon PA2200]] repairs in limbo on the left desk, [[Fostex R8]] and [[Focusrite Scarlett 18i8]] in the middle desk against the wall, and laptop + [[Mackie MR524 studio monitors]] on the right desk.
Posted on M.b: [[A Palm Zire 72 time-capsule has lessons for today|https://twelvety.micro.blog/2021/04/30/a-palm-zire.html]] I could create some [[Twitter]] lists to make scrolling through it less instantly annoying and irritating, but I think I've turned some corner where I just don't care about it enough to try it.
I can take notes faster in [[Roam]] than in [[TiddlyWiki]], but I think the ways that TW slows me down in the short term make the notes more readable for other people, and they make more sense to me in the future when I forgot why I took them.
[[David Sparks]] on [[Mac Power Users]] has gone all-in with [[Obsidian]]. I'm still using it but haven't been paying attention to the new features. It sounds like the developers are still going full-speed on it: [[Mac Power Users #583: The Obsidian Deep Dive|https://www.relay.fm/mpu/583]] For someone who claims to like order and structure so much, I sure can Tasmanian Devil my way through a project (meaning, the [[Fostex R8 restoration]] is taking over my life). I've now gained enough fat that I can feel my shoes getting tighter.
Wow, [[Jack has re-done his wiki completely|https://rudimentarylathe.wiki/#2021.05.05 - Daily Notes]], following [[Soren Bjornstad]]'s lead. Might have to try it, but //not now//. Must stick to the [[Dutch Treat multitrack reboot]].
So "knowledge worker" just means people who have the tools and time to add animated GIFs to their messages with co-workers? How does anyone get through life without getting bogged down in just popping the stack to deal with the latest and loudest thing? Here's my current stack, and things just keep landing on top of it: * unnamed urgent work project * poetry/music album mixes for W+DC * my car inspection, etc. * [[Dutch Treat multitrack reboot]] * exterminator inspection * playing with the [[Ricoh GR (2013)]] * [[Harman Kardon PA2200]] repair * [[Johnny.Decimal]] I miss adding stuff to this wiki and keeping up with the wikis of others.
Picked up the [[CPAP]] at 9 a.m. today and took a first nap with it at 11:30. It was an hour long and felt like three. Deepest nap I've had since my colonoscopy. I can't wait to go to bed tonight.
None of my notetaking systems—digital nor analog—are nimble enough to keep up with the tiny slices of time I've had the past couple of weeks. Everything is scattered, incomplete, and ugly. Tonight we encountered a 3- to 4-foot black snake in our basement stairwell. Never had one of those before, [[Wild Authority]] came to our rescue in 30 minutes and made humanely getting rid of that thing look easy. "Why did it have to be SNAKES?"
We've lived in this 96-year-old house for 11 years and today was the first time we've had an exterminator visit. They did the whole bit: checked for termites (no evidence), cockroaches (no evidence), rodents (lots of traces of past ones), and ants (yep), and treated the basement, living space, cabinets, drawers, and "perimeter". I don't know why we didn't do it sooner. And now they'll come back every quarter, automatically. What a dream, and actually comforting to watch them physically move around the edge of every room and spray a fine toxic mist along the baseboards. Today's visit was the reward for three straight days of deep cleaning, tossing, and refactoring, and that part sucked. Maybe next time we won't let things get so far gone.
This dedicated emergency cleaning and tidying of the entire house (for the [[2021-05-27 exterminator visit]]) feels like the universe getting back at me for spending time on electronics and cameras and reel-to-reels and music mixing. I know the universe doesn't give a shit about me, but I still take it personally. A couple of nights ago I rigged up a Command hook and zip-tie to hold the [[CPAP]] hose above my head in bed. Made it way easier to sleep all the way through the night. I barely woke up to mess with the mask and felt much more rested than the first two nights. AHI is more like 0.5 or 0.6 instead of 16 (from before the CPAP), which seems like a big change for the better. The number of animated GIFs people put in any messaging or microblogging platform in a day is too much. We're constantly performing for others, desperate for a like or a LOL. "See? I'm funny, too!!" Why?
That's the message I just got from macOS (I'm still on Mojave). Goddammit. All I wanted to do was edit the [[org-mode]] file where I keep track of the [[FLAC]] albums I've downloaded, backed up, copied to [[Roon]], and transcoded to AAC for [[iTunes Match]]. Upgrading now from 26.3 to 27.2-2. JFC this is why I haven't been using [[Emacs]]. Trying this: [[Upgrade Doom Emacs from Emacs 26 to Emacs 27 – D.S. Chapman]] Well, that didn't seem to do it all the way, because I still got the error when I tried to open a `.org` file. I did ``` brew update brew upgrade brew install --cask emacs ``` (because `brew cask install emacs` doesn't work anymore) and got `Error: It seems there is already an App at '/Applications/Emacs.app'.` So I tried: ``` brew reinstall --force --cask emacs ``` And that seemed to put Emacs.app in the right place in '/Applications/Emacs.app' but the last thing I saw was: `Error: It seems there is already a Binary at '/usr/local/bin/emacs'.` ...which seems bad. Well, if I do this: ``` brew install cask ``` I get `Error: cask 0.8.5 is already installed` So I did: ``` brew upgrade cask ``` And //now// I'll try: ``` brew cask install emacs ``` And get `Error: Unknown command: cask` Motherfucker. I then looked at https://formulae.brew.sh/formula/emacs and it says all you have to do is ``` brew install emacs ``` so I did that. And got `Warning: emacs 27.2 is already installed, it's just not linked.` So I did as it suggested: ``` brew link emacs ``` and it said there was a symlink belonging to emacs-plus, so I did as it suggested: ``` brew unlink emacs-plus brew link emacs ``` And //now// I can type `emacs` at the Terminal, but I still need to do: ``` doom sync ``` And now when I type `emacs` I get actual [[Doom Emacs]]. But now the 27.2 version that was at '/Applications/Emacs.app' is gone now. So I went back to [[Upgrade Doom Emacs from Emacs 26 to Emacs 27 – D.S. Chapman]]. Ahhhhhh, and when I open that macOS icon I get Doom Emacs again. But when I go to Get Info on an `.org` file and set its default application to the new 27.2 Emacs, it switches right back to the 26.3 version. Ah! I see this hanging out there: `/usr/local/Cellar/emacs-plus/26.3/Emacs.app` For now, I did this in that directory, because "Emacs.app" was confusing macOS, and this will make it obvious when it's talking about the 26.3 version: ``` mv Emacs.app "Emacs 26-3.app" ``` And NOW I can set those org-mode files to all open with 27.2. I know I should get rid of that 26.3 version, but it's almost 3 AM and I don't care.
[[2021-06-04 to Jack - thank you!]] Read last night about lots of people who love [[Dendron]]. I tested using [[Logseq]] for some work notes today and it was delightful. It was so [[Roam]]-y I barely had to think about it. Bullets in a paper bullet journal don't bother me. Bullets in a digital journal feel like work notes. I gave away my old pair of [[Acoustic Research AR-4x speakers]] this past weekend. They still sounded surprisingly good, but they took up too much basement space, I never used them, and they were in such visually bad shape that I didn't want to haggle with anyone about whether they should go for $30 or $20. I just posted them on Facebook Marketplace for $0 and got a dozen responses back in the first hour. The first guy who asked about them didn't follow up, so I gave them to the second person. He was in the area and made his wife get off the highway and turn around so they could come pick up the free speakers. He even sent me a photo of them in his system the next day. I'm not going to give away all of my old gear, but this one time it was just nice to let something have a new life and expect nothing in return. Ordered a [[Leopold FC660C]] with 45g silent [[Topre switches]]. I think waiting 11 months was damn long enough.
Thanks for the [[Emacs guidance|https://rudimentarylathe.wiki/#2021.05.31%20-%20To%20Phil%2C%20Re%3A%20Emacs]], [[Jack|Jack Baty]]! I will likely not change anything on my current Intel Mac because I will surely make matters worse, but I will keep your note around for when I hopefully get an M2 or M1X or whatever they come out with later this year. At that point I will try to do [[Emacs]] right.
Learned [[how to change the local directory|how to change local directory in Logseq]] in [[Logseq]]. Also, I'm going back to the browser version. Based on various things I've read, the desktop app isn't as stable as the browser app yet.
I just set up [[ChronoSync Express]] to back up my folder of [[Logseq]] work notes every 10 minutes. For any newly-updated or overwritten files, it'll save the earlier version to an `_Archived Items` folder, which is exactly what I was looking for. In the 1.5 days since I've been playing with Logseq, I've seen just enough weird random block-deleting behavior to spook me, but not enough that I don't want to use it if I have enough safeguards in place. Today I saved a half-dozen URLs of various interesting things to [[Drafts]], but is sitting here putting them all in the wiki worth the time it'll take? Shouldn't I be paying bills or something? Or going to sleep? For fun, I just exported all of my [[Roam]] stuff to JSON and imported it into [[Logseq]]. At first glace it worked surprisingly well, but then I realized that the nesting of blocks didn't carry over and everything seems to be a headline of some sort. Not ready yet, but it was admittedly labeled as "experimental". * This was the first time I'd spent more than a few seconds in [[Roam]] in months. They've really polished some of the ugly edges around the Help menu and Settings. It does feel solid in a way that it didn't used to feel for a long time. Lordy, I don't know. I don't know. I'm so freaking tired of seeing the astrolabe and waiting for it to load every time I visit. As alpha or beta as [[Logseq]] feels, it's just so local and easy to keep an eye on with the underlying filesystem powering everything (if your stuff is kept local, which I like).
I made a temporary copy of my [[Obsidian]] notes folder and opened it in [[Logseq]] and it works pretty great as long as I tell Logseq to use `yyyy-mm-dd` format for the preferred journal format. What I would really like now is a [[Doom Emacs]]-looking theme to use in Obsidian. * Well, [[Obsidian Nord theme]] will do for today.
The [[Obsidian Nord theme]], with my tweaks, makes me feel like I can totally hang out in [[Obsidian]]. Earlier today I accidentally started a [[Weekly Review]] in it just because it was so pleasant to look at. Besides the radically better sleep the [[CPAP]] makes possible, the daily pain-in-the-ass ritual of cleaning the nose pillows and the hose has a side benefit of encouraging me to clean (and therefore wear) my mouth guard way more often. There's also a fairly decent iOS app for the machine that gives me a score every night. If I get enough sleep and do all the right stuff with the gear, I get 100% or in the high 90s. Just the pressure (haha) to get 100% and keep my numbers up is making my broken little brain try to get the sleep it's been needing all this time. The [[Leopold FC660C]] got here Wednesday and I started using it with my work computer immediately. What a great device. [[Topre switches]] are everything people say they are. I'm getting used to not having dedicated function keys, as well as the slightly weird combinations required to go Home/End and PgUp/PgDn, but it's all worth it for the feel and the sound. I'm going to take it back to work with me when we return to the building, but I may lock it up each night before I leave. That may be paranoid. We'll see.
Deleted my reference to Jack’s mention of Alice’s early morning diarrhea. Nothing funny about that when the vet is involved. I’m sorry – hope she feels well soon. I'm feeling a pull towards the [[Roam]]/[[Logseq]] style of using [[Daily Notes]] and linking //everything// and less of the pull of [[Johnny.Decimal]] order. For now. Oh man. The [[Roam]] desktop app just came out. * Great. Just when I was getting really comfortable with [[Logseq]] they go and upend everything. Before I get too sucked into all the notetaking precious things, I have to remember that taking notes is not the same as doing something, in the same way that making Instagram videos of messing around on a modular synth isn't the same as making finished music with one.
Why have we again over-scheduled our upcoming weekend to the point where we don't look forward to it? Why? Weren't we supposed to be vigilant about this after having come through 13 months of social distancing? I saw the [[Logseq]] [[changelog|https://logseq.github.io/#/page/changelog]] today and holy shit they are working fast on it. I also peeked at enough videos to see that it's really gaining some momentum. I do like that it seems more "humble" than [[Roam]].
Ugggggghhhhhh. Ok, here's the deal: Setting [[Logseq]] to use [[Markdown]]-formatted notes would seem to be—for me—obviously the best choice based on multi-app compatibility and a folder full of a decade of my notes written in [[Markdown]]. It should be easy. But today I peeked under the hood at what happens when you (for example) collapse a bullet and a sub-bullet in Logseq. Here's what it looks like in an [[org-mode]] file. It uses properties drawers, properly: ``` * here's a bullet i will collapse :PROPERTIES: :collapsed: true :END: ** first item ** second item ** third item (which is also collapsed) :PROPERTIES: :collapsed: true :END: *** sub-item A *** sub-item B *** sub-item C ``` Here's what it looks like in a Markdown file: ``` - here's a bullet i will collapse collapsed:: true - first item - second item - third item (which is also collapsed) collapsed:: true - sub-item A - sub-item B - sub-item C ``` If we look closely we can see that the Markdown one is a bit of an abomination, waiting to be corrupted. Here's [[BBEdit]] with invisibles turned on, which shows us that the non-standard properties markup Logseq adds in Markdown are preceded by just two spaces, and those two spaces will follow however many tabs are needed to create a bullet. [img[https://twelvety.com/philtiddlywiki_images/2021-06-18-logseq-md.png]] It's all just begging to be mangled when these files are edited in another app, and Logseq does get confused if you delete those critical pairs of spaces in a Markdown file. I don't want that. I tested this stuff in org-mode files and they seemed to be more robust, plus I still feel like org-mode is the canonical format to the Logseq developers. I'm going to stick with org-mode formatting, which means I won't be able to [[use my Logseq files in Obsidian|Making Obsidian play nice with Logseq]], but that already seemed like asking for trouble the more I thought about it. p.s. [[Jack|Jack Baty]] has been right about this all along.
Ok, instead of getting all wrapped up in trying to import a bunch of old things from [[Roam]] into [[Logseq]], let's just try Logseq (with [[org-mode]] files in [[Dropbox]]) as a [[daybook]] for real for a couple of days and see how we like it? Will also see how it works for viewing/searching in [[Editorial]] on iOS for when I'm away from the computer. Then we can figure out if there needs to be a wholesale migration into it. * Spoiler: I love it. I mean, I went deep. I'm talking theme-tweaking, the true danger sign. I'm talkin' that me and Dot are swingers, as in "to swing." I'm talkin' about wife swappin'.
# Make a new folder in [[Dropbox]] called `logseq-org-daybook` # Point [[Logseq]] to it # Change these Settings and leave everything else as default values: #* Theme: Dark (this is less practical, but it makes these outlines feel less like I'm at work) #* Preferred file format: Org #* Preferred journal format (which I don't like, but is the only current way to be compatible with [[Roam]] eventually): `MMMM do, yyyy` # Re-index # Oh, I forgot that the default journal file format is `yyyy_mm_mm.org`. I figure if I'm getting away from Roam-style journal filenames anyway, I may as well set my own journal file format to use dashes like `yyyy-mm-dd.org`. Did that in `config.edn` by adding this above all the Git instructions, and then re-indexing: #* ` :journal/file-name-format "yyyy-MM-dd"`
I'm trying to stick with [[Logseq]] but this is driving me fucking batty, so I posted a question about it. I will not budge on this. If there's no workaround for it soon, that alone could send me back to [[Roam]] for a bit. Every time I attempt this muscle-memory movement and it fails, it's like someone is hitting me on the head. [[How to Shift+Down or Shift+Up to select the next line in a long block? – discuss.logseq.com|https://discuss.logseq.com/t/how-to-shift-down-or-shift-up-to-select-the-next-line-in-a-long-block/1310]] > Hello! As much as I love Logseq, one thing is a huge point of friction for me: When I’m in a long block, like a long paragraph with many sentences, if I’m on a line of text and press Shift+Up or Shift+Down, I end up in block-selection mode with the current entire block selected. What I’m hoping to be able to do is extend the text selection up (or down) by one line. This is how the vast majority of “normal” text editors and multi-line input fields work in the rest of the world, including this here rich text field as I write this question. > > Is there a way to set the keyboard customizations to do this, but also preserve the ability to select multiple blocks with the keyboard when in block-selection mode?
It changes your brain and greatly expands the possibilities for what you want to record when you find a notes format that is ultra flexible ([[Logseq]]) //and// can go in a container ([[org-mode]]) that you know will exist and be stable for literally the rest of your life. One of my favorite things about [[org-mode]] is that you can put a crap-ton of notes about something (like the text details of an invoice) under a headline, and you never have to worry about the indentation of those notes sticking with the headline. They're bound to it. OMG, in the [[Logseq]] Help menu, you can now see the full list of keyboard shortcuts and customize them without going to `config.edn`! Ahhhhhhhhh: [[2021-06-23 restored shift-selecting text in Logseq]] The thing about me having a Daily Notes page that I'll actually feel like using (this week) is that it's about 50–75% as technically proper as a bunch of uniformly formatted plain-text topic pages or single-page logs, but because it's so easy and fast to put information into [[Logseq]] and fairly easy to get out, it's effectively a 95% perfect system for my scattered attention and small slices of focused time. "What's the best notetaking system? The one you'll actually use."
Ok, I edited `config.edn` in a text editor ([[VS Code]] works great) and added these lines in the keyboard shortcuts section. This enables shift-selecting a single line at a time inside a long block, but prevents using the keyboard to select a bunch of blocks at once. That's fine with me. I do the former way more than the latter. ``` :shortcuts {:editor/select-block-down false :editor/select-block-up false} ``` [[Posted to the Logseq forum|https://discuss.logseq.com/t/how-to-shift-down-or-shift-up-to-select-the-next-line-in-a-long-block/1310/3]].
People (me included) love [[Markdown]] for writing, but it's not an [[outlining]] markup language. [[org-mode]] is [[lossless]] like [[FLAC]], and from there you can transcode to lossy formats like Markdown. Yesterday I signed us up for 1 year of the [[Lunch Money]] app/service. It's really good and non-overwhelming.
After you've read all the stuff, taken all the notes, and done all the todo's, what else is there? What am I looking for in all this?
[[Logseq]] for personal [[daybook]] notes is on probation. I got one of those big red errors and lost a block (a short one) while adding a tag this morning. [[Dropbox]] was there with a previous version that had what I needed to restore, but that's not great. If I really cared about keeping things clean, I'd go back to [[Roam]] for now until bugs like that were sorted out. It's fun to watch [[Jack|Jack Baty]] experiment with [[Daily Notes]] in [[Roam]] again. I don't care where the notes live, as long as they live somewhere! (No pressure, though.) Seeing stuff like this keeps me in [[Logseq]] against my better judgment: [img[https://twelvety.com/philtiddlywiki_images/2021-06-28-doom-logseq.png]] I know [[Logseq]] is open-source and all, but how will they stay around if they don't make money? Do they make money? If I'm not going to actively use [[Roam]] I should stop paying for it. It's obvious. But I CAN'T. I can't commit to it and I also can't //leave//.
Up at 6:45am, but I feel like a failure because this is 2 days in a row I haven't gotten up early enough to walk before work, and I had meant to. I got spooked by reports that [[Apple]] had killed production of the [[iPhone 12 mini]], and a 13 mini in September isn't a sure thing, so I ordered a 256 GB iPhone 12 mini this morning. I don't care that it's almost 8 months old. I just want a phone that's the right size again. Fuck it. [[Logseq]] isn't ready, at least for me. I was using it at lunch and it lost another block randomly. I only happened to notice it because I went to a page and was actively going back to an earlier page to add details to a block, only the block wasn't there anymore. It was like I was being gaslit, because I knew exactly where I had left it. I mean, I'm not even a heavy user of it and I see weirdness like this. I know they're working hard on it and it'll get there before long. [[Roam]] for the [[daybook]] for now. And as long as I have the wiki for sharing "the good stuff" in a fun way, I don't even need Roam to be fun. I just need it to work and take as little effort as possible so I don't waste more time with it than I should. * Also, I'm turning brackets back on because I can't bear for things to jump around anymore when I put the cursor in some text.
Every time I see a date in a spreadsheet or a document, I wonder how many times it's been copied from somewhere, and how many times it'll get pasted somewhere else, and by how many people. [[Org Mode's new site — Hacker News|https://news.ycombinator.com/item?id=24903311]] > I don't mean to go all Stallman on you, but MATLAB is the devil's software.
I know that my eventual plan is that once [[Logseq]] gets solid enough, then I'll do a massive [[Roam]] export to it, so I shouldn't worry too much about my [[daybook]] files being future-proof and all. They'll get there. But it still feels weird right now. And I burned way too many idle cycles today thinking about whether the way Logseq uses [[org-mode]] headlines for //everything// is "proper" or not. I obviously shouldn't think about it this much. //Any// text file is going to be 99% permanent. Whether it's `.txt` or `.md` or `.org` shouldn't matter as much. But I still feel like org is The Way, at least as far as we know right now. The eternal problem of deciding //which format???// is that we only have today's existing structures available to work from. Are we supposed to keep our heads in the sand and ignore whatever comes later, even if it's better? Also, I know that there's nothing stopping me from just using [[Org-Journal]] or [[org-mode]] //right now// and I don't need to wait for [[Logseq]] to get good enough, but I'm too lazy and my energy levels are too variable to think I'll always be up for [[Emacs]] or even [[Doom Emacs]]. What's the word for writing stuff online in a place that you know will only reach one or two people ever? It's not "blogging", really, but it's the only thing I'm up for. Lemme guess: Another three-day weekend where we stay up til 3am every night? The real indicator here is that I'm worrying about [[notetaking]] formats at all. It's always a sign that I'm just [[not making enough things|2019-04-11 Not making enough things]].
First official day back in the office as part of what I hope is a permanent schedule. It was glorious. Breakfast and lunch in the cafeteria. Barely anyone in our department, so I worked at double speed compared to what I can do at home. [[Jack|Jack Baty]], [[you guessed right|https://roamresearch.com/#/app/jackbaty/page/dqK604A-J]]! I do still feel the pull of [[org-mode]], and I haven't sworn off [[Logseq]] completely. I still use the Windows version when I'm not at the Mac, and when I have to peek at one of the underlying org-mode files, they are //so reassuring//. I just can't stop reading about people who make org-mode do tricks. But I am troubled by an experiment I ran just now where I made a fresh "graph" in Logseq just for the purpose of importing a [[Roam]] JSON file. If you use block embeds or block references in Roam, they do not appear to translate well (or at all) to Logseq right now. I hope they enhance the export/import feature in the near future, but until then it'll be Roam for 95% of my stuff. References, embeds, and aliases appear to be the Achilles' heel of all these notetaking systems that rely on (or export to) plain-text. They're interoperable, but only up to a point. As much as I would like to, I cannot seem to keep up with even a private [[daybook]] with any degree of consistency.
2nd day back at work on-site! Got there early enough to have black coffee, scrambled eggs, and a blackberry parfait. Also got a Bubly Bounce Blood Orange Grapefruit. Re: Relying on [[Daily Notes]] for everything (no matter whether in [[Roam]] or [[Logseq]]) — is that what I need? Is it smart? Don't I actually need //more structure// in the form of dedicated files for each topic/log (like with [[Topic journals]])? I don't know. If I were advising someone else on this "problem", what would I recommend for them? Gonna give this a shot: [[2021-07-07 using org-mode for selected log files]]
Alright, when something pulls at me for this long, I know enough to pay attention to it. [[Roam]] and [[TiddlyWiki]] are great for notes and reference stuff, but I'm going to use [[org-mode]] for log kinds of things that are important. Like car maintenance logs. I need to be able to see all the updates for one thing in one file, and I need to be able to assign proper dates and stuff to them. So I'm starting with a fresh `~/Dropbox/org/` folder and two files. I hope that when I see these things in a folder, they'll remind me of what I'm tracking: * ~~`log-car-2009-Honda-Fit.org`~~ * ~~`log-car-2010-Honda-Fit-Sport.org`~~ ''2021-07-08 Update:'' Even [[Karl Voit]] uses spaces in his filenames, so I'm changing to these: * `log car 2009 Honda Fit.org` * `log car 2010 Honda Fit Sport.org`
Last night I had to dig around through [[YNAB]], scanned PDFs, long-lost folders of printed papers, handwritten notes, Google Docs, and Markdown/text files for any threads of info related to an old bill we paid. I was really wishing I had put a more rigorous [[Johnny.Decimal]]-like system in place, with local files for everything. I found what I needed eventually, but it took too long and I wasn't sure I had found //everything//. It would have made it a lot easier to narrow my search and know that I had all the pieces I was looking for. Makes me want to stick with [[org-mode]] for the core/important stuff even more. Sometimes I wish we couldn't forward-link or backlink anything. All text would have to just sit there unlinked and earn its place on the page/screen. The argument [[Conor White-Sullivan]] always makes about [[Roam]] is that it lets you organize information the way your brain works. That's true! It's uncanny how frictionless it is when I submit to it. But I don't know if that's the best long-term way to store information, even if I'm the only one using it. What would a Library Science person have to say about all this? Someday Roam is going to suffer a catastrophic hack, outage, or data loss, or the company is going to go away somehow, and [[Richard Stallman]] is going to wave his dirty foot at us and say "I told you so". [[Jack|Jack Baty]] seems to be tossing [[some of the same questions|https://roamresearch.com/#/app/jackbaty/page/aIye5XHPW]] around as I am. I just tested exporting from Roam to [[Markdown]] and Flat Markdown. Good news is that the content from block references and block embeds gets rendered into the exported file in both formats. Bad news is that all notion of pointers or IDs identifying things as being actual references or embeds is gone. I guess I don't know how those would work otherwise, and that's what the JSON is for.
In what is about the most severe un-[[Roam]] direction I could go, last night I went down the rabbit hole of exporting [[org-journal]] entries with [[ox-tufte]], which uses [[Tufte CSS]] to render surprisingly [[Tufte|Edward Tufte]]-like HTML pages. It was just for fun and I don't know how practical it is, but boy was it a nice output, especially because I went down the other rabbit hole of playing with attaching images to org-journal entries.
My poor [[org-mode]]-widow wife. I think I'm done trying to tag all of my private daily notes. Can't we have one thing that isn't optimized to within an inch of its life? I'll still put links into [[TiddlyWiki]], and link to other tiddlers of course, but I think plain vanilla text in [[org-journal]] files and some choice [[Topic journals]]/logs for home and health stuff is all I should worry about. I don't need to clutter things up with a bunch of empty files that only serve to deliver backlinks. And I'll still record "what happened" in [[Drafts]] and then paste it all into org-journal, where it'll be easy to read without all those bracket links messing things up. Two things I don't like about [[Roam]] for [[daybook]]/daily logging: # It's a little too "tidy" for my taste. Those bullets and blue links sit there, hovering in a white background (or whatever background you tweak it to be), but the stuff that happened in the life you're recording was way messier. It becomes depressing to see the toils and trivia from your life listed in that format. # All tags or pages are effectively at the same level. I know there are namespaces, but when you look at a list of tags/links, they're all equal. Some topic that I unwisely tagged that I'll never refer to again has the same weight as "health log". You end up with tag pollution and the only way to see what's important is to put things in the right namespace or run a query or group a bunch of tags under a page called "important" or whatever. It encourages hoarding of potential connections. I just need files and folders to mean something and to find my way around. Because I am old? For things like quotations or nuggets of wisdom that don't make it into [[TiddlyWiki]] for whatever reason, won't it be more interesting to put them in [[org-journal]], so that I'll have a reason to revisit those old pages and discover something forgotten in the future?
If we pretend that [[Joan Didion]] would have ever used [[org-mode]] instead of paper journals, what would they have looked like? Just a bunch of unformatted [[org-journal]] entries, probably? Should I make my [[org-mode]] stuff simpler and more like a [[bullet journal]] except for the important car/home/house/health logs? What do I want to get out of it? What should the output look like? Maybe I should figure that out before I go setting up all these files all over. Or maybe just use org-mode more like I used all those text files in one giant folder in [[nvALT]]. Also, it'd be cool to automatically copy my org nested folders to a flattened single folder for use in [[beorg|Beorg app]], since it can only work with one folder at a time. Could have an `org copy for beorg` folder in Dropbox or something just to be able to view stuff on the phone and not worry about corrupting the real files. Is my reluctance to hitch my wagon to [[Roam]] part of a [[scarcity mentality]] vs. the [[abundance mentality]] I had when I went all-in on it? Could be. My non-jeans pants don't fit anymore, so something has to change. I'm gonna set up org-journal to use monthly files, not daily anymore. As fast as it is to navigate to any given file in Emacs, it's still too much of a pain to get any context around a day when you can only see one day's file at a time. * UPDATE: OMG I didn't realize that if you use monthly files in org-journal that (of course) each day's heading is a //heading//, so it's easy to collapse.
For the past three days, whatever I have done to [[Doom Emacs]] has caused it to take 13 seconds to load 188 packages across 33 modules. I don't know how that happened, but it's not great. I'm [[Stealing from Jack's "Logging Food With Org-mode"]] with a capture template and `food.org` file with a datetree in it. I'm thinking of it like a "collection" page in a [[bullet journal]]. It's a thing I want to pay attention to (especially starting today, because of our terrible bloat last night), and I don't want all these little tiny meal entries cluttering up [[org-journal]] or `daybook.org`. This is the opposite of [[Roam]], which wants you to put everything in today's [[Daily Notes]] and let the tags and parent links figure everything out. I prefer to add stuff to individual files with capture templates and do a date query or look at [[org-agenda]] to see what bubbles up under any particular day across all those files. When they say "[[org-mode]] eats everything", I used to think it just meant information. I didn't envision it eating up all my spare brain cycles and free time. It's so addictive once you get a foothold.
In addition to all the stuff I wrote in [[2021-07-16 to @kordumb re: org-mode]], I also have this analogy: When I use the amazing [[Roam]], I have the nagging sense that I'm digging myself deeper. With [[Emacs]]/[[Doom Emacs]] + [[org-mode]], I feel like I'm building a foundation.
[[@kordumb]], I saw [[your note|https://roamresearch.com/#/app/Variably_Distressed/page/rHn2Uw5YI]] about [[org-mode]]! I have to admit, I only fell back into it by accident after trying [[Logseq]] for a bit, which reminded me how cool org-mode's "[[drawers|https://orgmode.org/manual/Drawers.html]]" are. The other half that makes it stick for me is [[Doom Emacs]], which I love. But I am still basically a toddler banging on pots and pans at this point, and I've only just now gotten to where my curiosity and excitement is always just ahead of my fear of breaking everything. I'm learning how to use it for what it's good at, and I have to say it is deeply calming (for now) to know that all those files are files and I can see them. No, it's not as easy as working with blocks in [[Roam]], but it's so much fun I don't care! Some people have video games; I have org-mode. ☺️
Now I want to print photos again, too. Reading [[Jack's stuff about printing photos|https://rudimentarylathe.wiki/#2021.07.17%20-%20Daily%20Notes]] made me want to check in on Patrick La Roque's progress with the HP Tango photo printer. There is more information! * [[more about Patrick La Roque's Shoebox Project]] To learn [[Doom Emacs]] better, I'm trying to force myself to use it when I would normally use the Finder for renaming or moving a text or [[org-mode]] file.
I wish I had known earlier about [[insert-char for putting Unicode characters in Emacs]] and `SPC ,` for switching to different buffers in [[Doom Emacs]], but part of the fun is discovering at least one new thing a day. Got sucked into reading some long Twitter thread about [[Roam]] and how peoples' expectations for it "aren't in sync" with what [[Conor White-Sullivan]] is delivering and where his vision is headed. Maybe they are unfamiliar with him, but he's gonna do what he's gonna do. I'm not currently actively using Roam, but I still like how he just does his thing and fuck everyone else. Worked for a couple of hours on mastering the Pipe & the Organs cassette tracks in [[Logic Pro X]]. Of course I'm using [[org-mode]] for it and below the project-planny stuff and TODOs at the top, I have a datetree with whatever progress I made today. Like [[Daily Notes]] but //only for that project//.
Well, it just happened. I sat down at my laptop, opened the lid to see the Finder desktop, and hit (only) the spacebar expecting something to happen. The [[Doom Emacs]] muscle memory is strong! Earlier today I felt paralyzed by the thought that nothing really matters. None of our work, our apps, our websites, the art we consume or rate, the texts we exchange and the posts we Like. We're all just stuck here kicking the can down the road until we die and then someone else does it. I must need to sleep more or something. Life is good and yet I'm in a bad mood about so many tiny things today. If I were to ever consolidate my notes from Roam, Drafts, Obsidian, and the Bullet Journals into org-mode and TiddlyWiki, that would be two places where everything could be found, which would be a lot better than the way things are right now.
I'm relearning how handy [[org-refile]] is with things like `daybook.org`. I can throw stuff in there and it'll be date-stamped and useful for probably as long as I need it without any further filing. And then I can always move things from there to their proper/permanent dedicated [[org-mode]] files if I have time.
We saw //Dial M for Murder// for about the 5th time last night (but the first time in a theater!) and it made me want to ditch all digital journals and logbooks and just keep everything in paper notebooks. And then by the time I got home I was reading about [[org-mode]] tricks again.
Now I think the `food.log` file and [[capture template I was trying|Stealing from Jack's "Logging Food With Org-mode"]] is overwrought. It works fine if I keep up with food/drink entries as they happen, but as soon as I get behind, it's easier to just put all those entries in `org-journal` files and tag them as `:food:` and/or `:alcohol:`. I don't think I care so much about which meal everything is in anyway. Especially these days, where eating is so irregular.
Well, hell. I know I made one or two encrypted disk images of //something// and put them //somewhere// a few years ago, but where? Maybe on a thumb drive? What did I put in them? How do I not know where my shit is at this point? I added this to my `config.el` today, but I took it back out because it opens a buffer for every `org-journal` file in the `org/journal` directory: > `(add-to-list 'org-agenda-files org-journal-dir)` [[Jack|Jack Baty]], why do you [[taunt me with your structured food logging|https://rudimentarylathe.wiki/#2021.07.22%20-%20Daily%20Notes]]? ;) I honestly don't know which I like better at this point. If I put all those food notes in `org-journal`, it's just a mess, but it's easy to enter. But that `org-agenda` view in your screenshot is so //nice//. No matter which way I go, I'm going to end up with lots of things to refactor. Oh well!
Yikes. I just saw this note in the [[Logseq]] [[changelog|https://logseq.github.io/#/page/changelog]], regarding the 0.2.5 version (it's now up to 0.2.8): > Pages or even the whole graph can be deleted when re-index > * Introduced by the release `0.2.4` which was deleted to avoid more data loss
My two new tiddlers for today belie all the obsessing I did about the difference between a food log, a [[daybook]], and [[org-journal]], and what the hell I think I want to put into and get out of all of them. When I'm away from the computer, I think one thing. When I sit down at it, I think another.
At this point I'm Milton from //Office Space// and [[org-mode]] has become my red stapler. A sparse tree filtering on `:food:` or `:alcohol:` works great for using [[org-journal]] to keep a food/drink log. We'll ignore the fact that this is essentially re-implementing [[Roam]] and [[Logseq]]'s [[Daily Notes]] in [[org-mode]]. If my model for org-journal is to be like a [[bullet journal]] of what happened today, then it should be food eaten, where we went, what we did, what I'm thinking, and that's it. Put everything else in `daybook.org`, or in `notes.org` - maybe in a datetree (which is like a commonplace book), one thing after another, with inactive date stamps, and using tags, because tags are there to be used. And selected things from there get copied to TW. I hope I haven't just picked the worst possible time to double down on org-mode, now that seemingly the whole world has caught on to double-bracket search terms/tags/links and Daily Notes in their notetaking apps. org-mode may—//may//—provide just enough healthy friction to keep me from over-annotating everything. [[iCloud Music Library]] or [[iTunes Match]] or whatever they call it isn't uploading music from my Mac tonight. Happy birthday, [[Jack|https://rudimentarylathe.wiki/#2021.07.26%20-%20Daily%20Notes]]! 🎂
I'm challenging myself not to print anything now that I'm back in the office. I was thinking this morning about how if you use all the knowledge-graph apps and services with one graph (which is the easiest way), all the important, unimportant, ephemeral, and long-term notes are all lumped together. In reality, some notes cannot be allowed to die, some are handy, some are fun, and some are trivia. They should be treated differently, backed up differently, but they may also morph, in the way that a boring trivial photo today may have way more meaning and be more important later if a person in the photo dies. I don't know how to solve for this no matter what system I use. I didn't realize the Jan. 6 commission was working so quickly. I just watched a handful of clips from the Capitol police officers' testimony. I clearly haven't built up enough tolerance to news to be able to process much of it. It's disappointing, enraging, depressing, and infuriating. Makes worrying about notes systems seem impossibly silly. Last night I tried a bunch of [[Doom Emacs]] themes and none of them felt right. In the end I went back to the standard Doom theme because nothing else feels like Doom.
Well, Dusty Hill of ZZ Top is gone. Sigh. What if my fascination with [[org-mode]] is just a consequence of, and contributor to, a total absence of physical exercise? "What if", indeed. Watched some of [[Rainer König's org-mode course on Udemy]]. It's unpolished and also very good and I've already learned some things.
I had a crazy idea to export this month's [[org-journal]] file to HTML with the [[ReadTheOrg]] theme and holy moly does it look good.
[[Jack|Jack Baty]] [[said|https://rudimentarylathe.wiki/#2021.07.28%20-%20Daily%20Notes]] the other day about his setup: > Org-roam is for TopicJournals and its Daily Notes are for technical notes. I think of it as a lab notebook I've liked the idea of a [[lab notebook]] for a long time. I guess that's what a lot of this wiki is. I wish I could separate my thoughts well enough in the rest of my local-only notes to break things up like this, but everything technical and nerdy just gets mushed together with all the this-life-stuff-happened notes and I give up every time. I haven't even written this paragraph in my [[org-mode]] files because I don't know where it would go. --- Yesterday I did a free trial of [[Momento]] Premium just to see what the plain-text export looked like. It looked good! Not ready to port into [[org-mode]] or anything, but it wouldn't be too hard.
Tried pulling the old [[Logseq]] [[daybook]] sandbox GitHub repository into [[Working Copy]] on iOS. It works surprisingly well! Can't tap on note links and stuff because the files are in a hierarchy and Working Copy reads the links and expects things to be all in one directory, but you can read and search all the notes and it natively understands [[org-mode]] syntax.
I can't make people get vaccinated, but I can sure control my Emacs setup (at least as far as I can understand it).
My definition of future-proof is expanding to include the likelihood (or not) that a system will hold up to stress and you'll still feel like using it when things get crazy. I wonder if [[org-mode]] will hold up. I hope so!
I need to get serious about [[Swedish death cleaning]] of my papers, audio/video tapes, and digital files. As technology moves on and storage gets cheaper, this problem hounds each generation worse than the previous one. Until today, I think I had gone two whole days without editing `config.el`. [[Obsidian]] looks superficially more like [[Roam]] every day. I gave it a sideways glance this morning and almost got sucked in by the idea of the iOS app, but then I remembered: # Obsidian isn't an [[outliner|outlining]] (and [[org-mode]] is). # I still prefer the way that org-mode can "hard-wire" a plain text note to each headline. # I vastly prefer how you can make giant, multi-paragraph blockquotes in org-mode without a million `>` characters. Well, my day is absolutely made. A kind [[Micro.blog]]ger and reader of this here wiki emailed me to share a recommendation to look at Eufy [[security cameras|researching security cameras]], so I'm going to do just that. I love to have a rabbit hole to go down, but I really love knowing that there are people I didn't realize who read this thing!
Well, I ordered one [[Arlo Essential Spotlight camera]] and an [[Arlo Essential Solar Panel Charger]] to go with it. If it works out, I'll get one or two more. From all the [[researching of security cameras|researching security cameras]], I still think that this kind of gear is generally not really ready to rely on, but this was relatively inexpensive compared to a lot of what's out there. I looked at the Eufy stuff, but everything I could find says that the Arlo would generate fewer false alerts, even thought it may be a few seconds slower.
Canceled my [[Readwise]] Lite subscription. It's a good service but I don't need yet another neglected bucket of notes. Alert the media: I started reading a book today: [[Like A Rolling Stone: The Strange Life of A Tribute Band|Book: Like A Rolling Stone: The Strange Life of A Tribute Band]]
Here's what I did for Sunday's [[Weekly Review]] (the first real one in ages). # This was a good move: I'm logging here what I did in what order, without necessarily following a checklist. Just writing down what I'm doing to keep me on task. # Doing this in the basement at my desk and listening to music on [[Roon]] on the [[Mackie MR524 studio monitors]]. This is the only way to get it done in a reasonable amount of time. Don't do it in front of the TV, on the couch. # Opened [[Drafts]] to capture loose thoughts and trivial to-do's (separate from this list). I did this in Drafts because it's the least-friction way to get stuff out of my head while I'm dealing with [[Things]] and [[Doom Emacs]] for the actual review. It's the next best thing to dumb paper, and faster. # Opened Things and got rid of some completed projects in the left bar, at least as far down as what I could see on the laptop screen. # Now I'm going through the Today screen in Things and deleting a bunch of the extra shit in it, especially the auto-recurring tasks that I never seem to get done. # A quick glance at the calendar for the next 8 weeks. # Looked at [[Gmail]] and [[Fastmail]] inboxes for stuff from the past 7 days to see if anything I've ignored is spinning wildly out of control. # Reviewed and cleaned out Gmail and Fastmail spam folders. Just those few steps felt better.
Yesterday I installed the [[Arlo Essential Spotlight camera]] on the front porch in the corner of the ceiling and left it at 80% sensitivity, with the Smart Alerts watching for people and packages, ignoring animals and cars. We'll see how it does when the mail carrier comes by. Haven't installed the solar panel yet. I may end up moving the camera directly over the front door, in which case the cable to the solar panel wouldn't reach far enough to allow it to face the sun. I wonder if the process of making a relatively small number of things public here in [[TiddlyWiki]]—where I have to clean them up to be somewhat presentable—is equivalent in value to having 5 or 10 times the number of notes thrown down haphazardly into a private [[Roam]] or [[org-roam]] or [[Logseq]]? I guess it doesn't have to be either/or.
Last night I figured I would sit down and at least start the process of migrating to [[org-roam]] v2. Over the past few weeks, I'd collected a ton of snippets and hints and directions and URLs about how to do it (with [[Doom Emacs]] requiring its own wrinkles on the process), so I figured I'd just make a list of the steps, since I didn't have time before dinner to actually install v2 and start the conversion and check everything. And then the system //broke down//. Did I save those hints in [[TiddlyWiki]], or were they stuck in [[Drafts]] limbo because I hadn't gotten around to putting them in [[org-mode]] somewhere? If they were in org-mode, were they in an [[org-journal]] entry from when I was first getting back into that? Or could they be scattered in headlines in `notes.org`? It wasn't a failure of any particular tool. It was my failure to come up with a process that I can keep up with, and to know where the hell I put everything. I don't have a great conclusion here, but I am gonna start the org-roam v2 upgrade today at lunch. The first step will be to do a safety backup of `~/Dropbox/org/`.
Finished [[listening|https://www.relay.fm/mpu/599]] to [[Dr. Drang]] on [[Mac Power Users]]. What a pleasure. He really wants things to be nice to look at when he uses them, is no fan of [[Obsidian]], and rolls his own [[Markdown]]-based static HTML [[wiki]]. God help me - it's making me look askance at [[Emacs]]. That and using [[Logseq]] for work all the time is making me want something that just //looks nicer// for daily note taking. But I've just now gotten my [[org-roam]] v2 setup working in [[Doom Emacs]], so I'm going to stick with it and essentially re-learn org-roam again. When I read the changelogs for Logseq and org-roam, I understand most of the items in Logseq, but not the ones in org-roam. If I ported all the org-roam v2 stuff (with IDs) to somewhere else, how readable and useful would it be? What about the same question for Logseq? What do my new org-roam files look like in [[BBEdit]]? If every episode of [[Ted Lasso]] is as good as S1E01, we're in for a joyous, emotional ride.
Was curious to see how the latest [[Logseq]] was doing in the web app on my Mac and it's not good: local images I've linked to in the past don't display at all. [[Someone on GitHub reported the same thing|https://github.com/logseq/logseq/issues/2579#issuecomment-898327003]]. Also, I don't see how you can upload/import any images anymore. There seems to be a lot of 1-step-forward-2-steps-back with their releases.
As I read various frightening bug reports about things disappearing under various circumstances in [[Logseq]], I think it mostly comes down to the troubles that happen when you use a web browser to make things in a text file look "nice". Even [[Roam]] itself still has gaping problems parsing combinations of its own standard markup for highlights and bolding. And though I'm [[tearing my hair out sometimes|2021-08-15 not using the Doom +roam2 flag for now]] with [[org-roam]], I still feel safer with it knowing that when I look at the contents of an `.org` file, I'm seeing what's there. The org-roam backlinks buffer is just an add-on. Today I made my first org-roam v2 node that was just a headline with an ID and not its own dedicated file. After seeing that node appear in the list of `org-roam-node-find` results, //now// I see what all the fuss is about with v2.
Good lord this has been a trial. Yesterday's issue with was that I was getting random errors in the minibuffer when I would click on certain links, and when I had an [[org-roam]] link to a node/page in an [[org-mode]] headline, the preview for that snippet in the backlinks buffer wouldn't show anything other than the title of the page where the link appeared. It was like this issue: [[Link in headline breaks org-roam buffer · Issue #1674 · GitHub|https://github.com/org-roam/org-roam/issues/1674]] I can't tell how old the org-roam package is that [[Doom Emacs]] makes available at any given time (according to [[this bump request in the doom-emacs GitHub|https://github.com/hlissner/doom-emacs/issues/5294]]), so I took out the `+roam2` flag in `init.el`, and instead configured my `config.el` and `packages.el` to grab org-roam like [[Jethro Kuan]] does in his [[dotfiles|https://github.com/jethrokuan/dots/tree/master/.doom.d]], which makes sense, because he always needs to grab the latest org-roam version. I didn't get that at first. THAT DID IT. Once I pulled his stuff in, I ran `doom upgrade` in the Terminal to get the latest version of org-roam, then `doom sync`, and the errors went away and the previews worked better. And it's still entirely possible that I just misconfigured things when I was using the `+roam2` flag by itself, without all the extra stuff from Jethro and the `packages.el`, but I'm just happy that it feels like it's working again now.
I'm back to using the `food.org` file to log my food and drink, but not with all that metadata. Just a dumb [[datetree]] with as little data as I can get away with. Even though it'll require some duplication of data in the food log, and some loss of detail in the [[org-journal]] entry for today, I just don't need to recall that much detail in the day-to-day non-travel days of life at home when I'm looking at old journal entries. I'd rather look at a few paragraphs of prose and use a dedicated log file for food.
[[org-mode]] and dedicated files are great for logs that can get really long. [[TiddlyWiki]] I think of as more like index cards (it even //looks// like index cards). [[org-roam]] is somewhere in between. Looking at [[Glass.photo]], there are more than a few photographers who use both Google Pixels and iPhones. Imagine that – people using whatever tool is best for the job, or whatever they prefer, or just have handy, and it not being a badge of loyalty to one type of platform or another. Well, my muscle memory just made me hit `SPC b k` to try to close a browser tab. But it's not a buffer.
Seeing [[Jack's|Jack Baty]] newest edition of The Lathe reminded me that a light [[Emacs]] theme can be good. So I'm trying [[Doom Emacs]] themes again. * `doom-tomorrow-day` is good. * `doom-material` is good. * `doom-one-light` is good. * Today I like `doom-flatwhite` the best. I started a new habit grid in the [[bullet journal]] at lunch to track learning [[Russian]] and whatever other habits I can manage to keep up with. I almost started using `org-habit`, but that may be a bridge too far for me. Doing it in the [[Field Notes]] is the easiest possible thing that can work, the most likely thing to be updated frequently, and leaving it open during the day will make it easy to see, do the [[habits]], and fill them in.
Spurred to do it after seeing a CNN live shot in Kabul with Clarissa Ward, where the two random dudes she talked to spoke excellent English, in a way that I'll never be able to speak another language at the rate I'm going. (They weren't Russian – I just love the sound of it.) tiddlers: [[Russian]], [[Babbel]]
The tidy appearance of this wiki belies the utter chaos I live in each day.
Oooo. [[Alex Johnstone]] has a [[wiki|https://fondoftea.com]]! Fun to have a new one to get hooked on. * I dig his [[HP Tango]] [[write-up|https://fondoftea.com/#HP%20Tango]]! That cute book-style cover of the X version looks great, and would be helpful in this cat fur-laden house. I tried `variable-pitch-mode` in [[Doom Emacs]] for about 5 seconds tonight and turned it off immediately. I thought I wanted more information on the screen but it just looks so wrong. (Jack, you're right – I //do// see the light!)
Just switched to the `doom-tomorrow-day` theme in [[Doom Emacs]]. //Finally// I can get some [[org-roam]] node suggestions that make sense by using [[orderless]] completion. Whew. Org-roam is starting to feel usable now!
{{the "Values" section in John Jacobsen's resume}} Learning about [[literate programming]] //"Are you awake?"// * This is what Sarah likes to ask when she's in the studio and I'm in the living room on the couch, quietly neckbeard-deep in whatever rabbit hole I've fallen into on the laptop. Something about the impending fall season makes me want to shoot with real cameras again. The friction that comes with keeping stuff in [[org-roam]] is making me a little more choosy about what goes in it. It's probably not a good place to put things that might //potentially// be interesting, like if someone at dinner recommends a podcast or a YouTuber. When deciding what should go in it, the [[lab notebook]] analogy still holds better than anything else I know of. And when in doubt, maybe think of it like this (and ignoring the public/private distinction): //Given enough time, would I put this thing in the wiki?// I haven't used an RSS reader in years, so it was fun to turn on [[elfeed]] and play with it after seeing [[Jack|Jack Baty]] [[mention it|https://rudimentarylathe.wiki/#2021.08.22%20-%20Daily%20Notes]]. I just set up a handful of feeds and it's addictive to see all those headlines in plain text.
[[Russian]] in [[Babbel]] is getting difficult, but it's keeping me out of trouble! As fun and as permanent as all this [[Emacs]] and [[org-mode]] stuff is, one thing it is not is "lightweight".
Sarah told me tonight: "The reason you're out of ideas is because you're out of practice." Truth. I forgot how to use the [[Ricoh GR (2013)]]. Literally forgot what little I had ever learned. After not using it for about 3 months, I took it to work today and brought it out when I went to lunch with co-workers. They asked me to use the timer function to take a group photo, and between not ever having learned where that is, and forgetting that there was even an Effect button, I felt lost. They ended up using an iPhone.
I'm only in a mildly stressful time right now and it's already crowding out time for messing with [[Emacs]] and [[org-roam]]. Plus, when you add in any tangentially interesting thing, like re-learning how to use the [[Ricoh GR (2013)]], that means the whole meta-fixation on [[notetaking]] gets crowded out, along with all the time just to update notes and put stuff in the many systems. This is typically the period when my resistance to [[Roam]] gets the lowest. I thought I had written down steps for how I download, import, process, and export photos from the Ricoh GR, but if I did, I can't find them anywhere. I think [[Jack|Jack Baty]] is right about [[putting private information/people/projects in org-roam|https://rudimentarylathe.wiki/#2021.08.27%20-%20Daily%20Notes]] with the rest in the wiki. I've been trying to put everything in org-roam first and then copy things to here, but it's just a giant pain, just like it was a pain when I put everything in Roam and copied bits here. I'm just going to put things where they want to go. And I'm going to stop logging all my food. I'll still write down what I had if we do something remotely interesting, like go to a restaurant or bar, but I do not need to remember that I ate a small cup of grapes with 1 hard boiled egg for 4 days out of the work week every week for 2 months. And I don't want to have to enter a backlog of mundane food entries every time I sit down at my laptop before I can get to "the good stuff". How is that ever going to matter anyway?
[[Fabio|Fabio Roberti]] did a very nice tribute to [[Charlie Watts]] in his [[Thursday show|https://wfmu.org/playlists/shows/107262]]. Here are the [[Rolling Stones|The Rolling Stones]] songs he played: |''track''|''album''| |Paint It Black|Aftermath| |Tell Me|The Rolling Stones| |You Better Move On|December's Children (And Everybody's)| |2000 Light Years From Home|Their Satanic Majesties Request| |Yesterday's Papers|Between The Buttons [UK]| |Winter|Goats Head Soup| [[Discourse]] forums (for anything: Logseq, org-roam, Doom Emacs, and now [[TiddlyWiki has one|TiddlyWiki Discourse forum]]) are a great thing to have on hand when I get the urge to check the news or Twitter. I always feel better reading the latest posts on one of those forums instead. Like eating an apple when you crave a candy bar. I just re-found the [[Noel Welsh: Doom Emacs Workflows]] post after trawling through my own wiki. It's insanely helpful.
I just did my regular search of recent [[Ricoh GR|Ricoh GR (2013)]] [[photos on Flickr|https://www.flickr.com/search/?q=recent&cm=ricoh%2Fgr]] and realized (again) that I don't need a better camera. The problem is me.
Well, one weekend of not logging my food left me feeling unmoored. I'm back at it, but logging it in the [[bullet journal]] along with other things that happened during the day. I always forget and then have to remember that it's not so much the food I care about, but the food becomes a series of wayfinding points that help me remember what happened over the last few hours. Whatever! I imported yesterday's [[Dutch Treat]] [[Ricoh GR|Ricoh GR (2013)]] photos to Lightroom and the b/w ones look wonderful because the camera cranked up the ISO in the rather dim garage, which results in a very film-y looking digital grain, without me adding any. And the outdoor color shots with the Positive Film preset looked great after some white-balancing. I dare say they're the most film-y color shots I've ever made on digital. I'm addicted again.
Great. I haven't added anything to [[Org-Journal]] or [[org-roam]] since Saturday. Part of it is because of a welcome fixation on the [[Ricoh GR (2013)]], but it also didn't help that there was an impromptu mostly-obligatory group lunch at work today. It's fine. It's probably good for me to be around other people or something. During today's [[Russian]] lesson in [[Babbel]], I had the bright idea to get out a pencil and paper and spell out the entire words I was hearing it say when it asked me to fill in Hangman-style missing letters in the app. I didn't allow myself to look at the letters that were already filled in on the screen until I was done writing. I think that's an important step to make this stuff stick. It has to have something to do with tying the eyes and ears and hands together. I love [[org-mode]] so much and it feels like "coming home", but I'm also always two steps away from saying Fuck It and just going all in on [[Roam]]. But then I remember that there is always, always going to be some new shiny, fast, pretty way of doing this stuff. It's insane to imagine that in a year or two there won't be yet another new Roam-like thing that uses double-brackets for links and is local-first and privacy-focused and stable and aims to solve everyone's problems. I just assume that's going to happen, and it's going to have to be up to me to stick with the Old Ways. But how long can I do it? How long will it make sense to swim upstream against practically the rest of the world?
I'm just gonna keep collecting things about [[Charlie Watts]] until I run out.
I started a new [[bullet journal]] the other day. Using a light grid [[Field Notes]]. On the last one the lines were too far apart. I'm using this one to track food and situations/events during the day, and for a [[habit|habits]] grid on the last couple of pages. For me, no habit app works better. Also, making a habit grid is FUN. Last night we parked a block away and walked to the [[VMFA]] to see the Dirty South exhibit. It was about 7pm and the golden hour light hitting a church steeple gave me the sudden urge to get a 50mm lens and put it on something like a [[Fujifilm X-E1]], just to get back to the feeling of seeing only a snippet of the available scene. Or move up to one of the Fujifilm cameras with an optical viewfinder and put a 50mm on it. But I should stop thinking about that and keep learning the [[Ricoh GR (2013)]] I have. Plus I already have film cameras and 50mm lenses.
I'm trying to get better about not overshooting ("spray-and-pray") with the [[Ricoh GR (2013)]]. But it's hard to limit the number of shots when my eyesight is so bad (even with the progressive lenses) that I can't accurately see what I'm composing or whether the camera has locked focus without holding the camera 12" away from my face. I really want an optical viewfinder again, but there's no attractive/practical way to add one to the GR. And I'd love a digital camera with an optical viewfinder, but it has to be a rangefinder-style body. I don't want an SLR-style body with the middle hump. The [[bullet journal]] is slower, not searchable, and less practical than [[org-mode]], [[org-journal]], and [[org-roam]], but it has muscled its way back in and is eating everything else's lunch at the moment (with an assist from [[TiddlyWiki]]). As for //all the notes//, I think at this point I'd rather plop certain things in org-roam and org-journal and the rest here in the wiki, with very little overlap or duplication between them. I can live (this week) with the separation. That seems better than all the manual re-formatting and re-syncing that would need to happen between two wildly different kinds of systems.
Much like audiophiles use music to listen to our sound systems, I use events and places and people to test my cameras.
Because I'm old, I pulled a muscle in my neck and shoulder last night and got about 2 hours of sleep by the time this morning arrived, so I called in sick to recover. I slept a lot of today. My phone says I spent 3 of the later hours on Safari and Flickr, and I know most of that was looking at camera and photo stuff, researching things I don't need. How did that become OK? How have I allowed myself to spend that much time browsing before I took 1 photo? [[Jack|Jack Baty]], you would love [[George Saunders on The Ezra Klein Show, Feb. 2021]]. They just re-ran it and I missed it the first time.
Noooooo. While processing some shots in super low light, I saw what are undoubtedly at least 3 dead pixels on the [[Ricoh GR (2013)]] sensor. Not a killer, because it looks like lots of other people on the forums have run into the same thing over the years, and 3 dead ones out of 16 million for an 8-year-old camera is pretty good. I don't think there's way to remap them in the camera, though. I'll just have to fix them in Lightroom every time. Also, I will not not not use this as an excuse to get the new [[Ricoh GR IIIx]]. Nope, not gonna do it.
One thing about tagging [[Ricoh GR|Ricoh GR (2013)]] photos on [[Instagram]] as `#ricohgr`, `#grsnaps`, and `#grist` is that GR freaks come out of the //woodwork// in a way I haven't seen with any other camera I've used. I'm finding all kinds of talented people out there! I just re-read what [[BSAG - But She's a Girl]] wrote about the [[Fujifilm X100T]]'s viewfinder and it hurts all over again. I absolutely am in love with the GR, except that my eyes can't focus any closer than 12" from the LCD screen.
I wonder if all the magical processing the iPhone camera does to make things visible and "look good" is what can render its photos feeling dead compared to cameras with larger sensors, bigger lenses, and less in-camera trickery. I can't blame software for it all the time, because there are plenty of people who post unreal iPhone pictures on [[Glass.photo]] every day. Maybe it's just the intent behind iPhone snapshots vs. more carefully composed ones. Why are old [[Fujifilm X100T]]'s still so expensive?
I'm sticking with the "Original" ambient brightness setting that the latest firmware enabled (and leaving the actual Vignetting turned off) on the [[Ricoh GR (2013)]]. I don't know if Original just reveals the natural vignetting of that lens, but I like it better than the non-original (whatever it's called) setting with any of the other extra vignetting options turned on.
I saw some great people on [[Instagram]] who develop in [[caffenol]] and that's making me want to shoot film again! I've never shot something on film and seen the results the same day before.
I saw that [[Jack|Jack Baty]] was giving [[Craft.do]] [[another go|https://rudimentarylathe.wiki/#2021.09.15%20-%20Daily%20Notes]] and figured, well, now is a perfectly busy time for me to procrastinate by trying yet another notetaking app. I gave it 10 minutes on iOS and was pretty sold after just that. It's just so agile (in the real sense of the word) and slick and inviting. I don't see it replacing [[TiddlyWiki]], but I could see it replacing a lot of other things. Of course there's the problem of it being tied to one company that we would then have to hope and pray would stick around for years, but their attitude about owning your data seems to be right. Jeez, I don't know. I won't be able to give it a real shot until I update to [[macOS Catalina]], which I have been lazy enough to avoid all this time. But I needed something to force me to do that anyway before I get too far behind. Somewhat related to this is that I've been spending a lot of recent lunchtimes doing [[Russian]] lessons in [[Babbel]] when I would otherwise be nose-deep in [[org-mode]] or [[org-roam]], and the Russian feels a lot healthier. Not practical, but valuable, especially because it gets me out of my head and interested in how other people think and talk. That has got to be better for my brain than logging some of the minutiae I was packing away in my various text files. If Craft ends up making some of that record-keeping easier and better and less of its own project, that may be worth the risk of putting so many note eggs in one basket.
Installed [[macOS Catalina]] on the [[MacBook Pro 2014|Phil's MacBook Pro 2014 changelog]]. Ran a [[SuperDuper]] backup for the first time in ages before I started. Issues: * Window snapping by dragging the top of a window to the top or edge of the screen doesn't work for me anymore. But if you option-click on the green dot in the upper left of a window, you can make an app tile itself left or right, or take up the whole screen without going into full-screen mode. * [[eficheck warning after Catalina install]] * 2021-09-18: Terminal says "The default interactive shell is now zsh." Great.
What makes [[Craft.do]] any better than Evernote, other than the design and that it looks like Craft has a better outlook for technical portability and practical portability of your data? One thing in favor of [[Craft.do]] over [[org-mode]] is that Craft stuff would be vastly more useful to Sarah. There'd be at least a chance she could ever get to the information and use it. On the other hand, Craft doesn't have [[datetree]]s.
[img[https://twelvety.com/philtiddlywiki_images/2021-09-14-bullet-journal-pages.jpg]] This arrangement of mixing [[Russian]] practice notes in with daily logs in the [[Field Notes]] [[bullet journal]] accidentally turned out to be a great move. I didn't do it strategically. I just did it because I wanted to practice spelling things out and I didn't have any other notebooks, but I did have a pencil and eraser. Besides reminding me that I actually accomplished something during lunch, this has the extra benefit of gently reminding me about vocabulary words and phrases whenever I glance at the notebook as it sits open on the desk. I also abandoned the bullet notation because it was overwhelming and depressing and reminded me too much of work. Now I just write things in clusters, separating events or meals or spans of time with a blank line.
I don't understand how to use blocks vs. pages vs. documents in [[Craft.do]]. I may just need to use it more, but right now it's not clicking, and is making [[Roam]] and [[org-roam]] look simpler in comparison. * I [[asked about it|https://micro.blog/twelvety/11956099]] on [[Micro.blog]] and [[Jesse Kelber]] responded with this helpful note: > It took me a beat, but I’m actually loving being able to nest pages inside of pages! I’m prepping for a big interview Monday and have one document with everything I need either linked or nested. Stick with it a bit and see if it clicks, if so you’ll love it. I hope my feelings of impending doom are just environmental and have to do with the changing angle of the sun. I should see this coming this time every year. Unsubscribed from two of my "favorite" podcasts because I realized I had been hate-listening to them for a while. I felt better immediately. Sometimes if you're too familiar with a host or hosts, you know too much about them and you can anticipate every annoying thing they're going to do and the way they're going to do it, and then it's your fault because you could have stopped listening at any time. Maybe they were that way all along and it's only gotten on your nerves now that you and they are both older. I dare say [[TiddlyWiki]] is prettier than [[Craft.do]].
So, after using [[Craft.do]] some more and seeing [[Numeric Citizen]]'s [[reply|https://micro.blog/numericcitizen/11957554]], I now see that Pages are also Documents. All the Pages I've been making are just littering the Inbox until I put them in a folder. I don't know if that's what I want to deal with.
The [[Arlo Essential Solar Panel Charger]] is working slowly but great. After about 8 days it's charged the [[Arlo Essential Spotlight camera]]'s battery up to 50%! Sometimes I just want to paste a URL into [[Craft.do]] and have it not populate a title and thumbnail.
I would prefer if my addled brain would not get sucked into [[researching TVs]] right now. Maybe not until Black Friday-season. I'm just starting to get annoyed by the projector cables draped between the coffee table and stereo, and the fan noise of the [[Epson Home Cinema 2150]]. Overall, a projector is always going to be easier on the eyes, but I can see that the winds are blowing in the OLED TV direction. Our neighborhood randomly lost power for 70 minutes last night. What a nice change of pace. It always seems to slow down time, and felt like 2 hours has passed when it came back on. While we waited, we lit tea light candles, lazed on the couch, felt the breeze blow through the open windows, and of course I looked at my phone a bit and fell asleep for a few minutes. I could have done with the lights staying off a little longer. Wait a minute: How do I insert an arbitrary date into a random [[Craft.do]] page without having to write anything on that day's Daily Notes page? * Whew. Here's [[how to enter arbitrary dates in Craft.do]].
Everyone on [[Instagram]] wants likes just for practicing stuff, but not for finishing stuff. (Well, except [[my brother|https://www.instagram.com/crookedgrain/]], who finishes a shitload of things with wood.) I could post IG stories of me learning [[Russian]], but I'd rather just mention it here (I have to have //somewhere// to brag) and not let anyone else know I'm doing it. If it comes up in conversation, great! Otherwise, it needs to be something done for its own sake. I think of all those hours of practicing drums in high school that were "wasted" when I had no IG to show off with. 🤷 The smaller number of formatting/presentation options in [[org-roam]], [[org-mode]], [[Roam]] and [[Logseq]] make them feel more like a scalpel than [[Craft.do]]. Maybe it's just because I'm newer to Craft, but I feel like I'm not sure what's going to happen sometimes when I enter stuff in. I want it to be fancier/nicer, except when I don't. Also, I want everything to be an outline, except when I don't. If I used [[Tailscale]], couldn't I host a private TiddlyWiki instance for home stuff for me and Sarah on a home server or RPi and get to it from anywhere and not have to worry about it being intruded upon? Instead of using Craft and sharing links to pages with her? I stopped [[researching TVs]] for now. Shopping for one was activating my existential angst. ("I guess we just work to buy expensive shit we don't need.") Our projector is fine and currently not-broken.
Last night I saw a bit of this recent [[Genesis]] [[reunion show in Birmingham|https://www.youtube.com/watch?v=t4mpjqLTrQk]]. It's hard to accept that [[Phil Collins]] has to sit in a chair and try his best with what's left of his vocal capacity given his decline in health, but good for him that he still wants to do it at all. [[This comment|https://www.youtube.com/watch?v=t4mpjqLTrQk&lc=Ugy3LWjRG9SDCskjPrd4AaABAg]] hit home: > What we are witnessing here is the a closing of a chapter in real time of 20th Century Culture. We are living in such tumultuous fast changing times culturally. The boys in Genesis are all too aware of father time and thus have come to bid us farewell for the final time. Sometimes my eternally mad scramble for [[notetaking]] systems and the bits and bobs I push and pull around in them is enough of a distraction from the futility of the act itself, but sometimes it's not and I get panicky.
[[Kids who grew up with search engines could change STEM education forever - The Verge|https://www.theverge.com/22684730/students-file-folder-directory-structure-education-gen-z]] <<< Garland thought it would be an easy fix. She asked each student where they’d saved their project. Could they be on the desktop? Perhaps in the shared drive? But over and over, she was met with confusion. “What are you talking about?” multiple students inquired. Not only did they not know where their files were saved — they didn’t understand the question. Gradually, Garland came to the same realization that many of her fellow educators have reached in the past four years: the concept of file folders and directories, essential to previous generations’ understanding of computers, is gibberish to many modern students. <<< I smugly //know// what files and folders are, yet most of my folders are little more than barely contained piles. ----- If I could use a Mac all day and live in my [[org-mode]] directory, I would stick with org-mode for my journals and TCB-style lists and records. But if I don't want to continue to argue with reality, I have to use tools that are always around (the [[bullet journal]] + [[Craft.do]]), that I can live in. Org-mode files are functionally useless to me without [[Emacs]]. But I feel like I'm cheating on org-mode if I quit it and dive into Craft. I'm tempted to compromise and limit my use of org-mode to only certain log files, but once I'm in the Emacs orbit, I can't be trusted. Every single time, I will make Emacs into its own project and nothing else will get done. No photos, music, recording, house stuff, nothing. It's so fun and addictive, but I can't control myself. I've figured out that I really, really don't like it when I'm moving a cursor through an outline in [[Logseq]] or [[Roam]] and the markup dynamically hides/displays on each line as I touch it. Either just use rich text like Craft.do does or use pure plain text like [[Obsidian]] and Emacs/org-mode do. But don't frenetically switch between the two. I can't wait until gas-powered cars are outlawed and all these fuckers who live around here can't rev their hopped-up engines anymore.
Everything [[Jack|Jack Baty]] [[wrote about|https://rudimentarylathe.wiki/#2021.09.25%20-%20Daily%20Notes]] [[Emacs]] vs. everything else is true. And I agree that nothing else is as good or precise or controllable as [[org-mode]]. It pains me not to use it as much as I was just a month ago. I was so happy to have (at the time) settled in with Emacs, but then life got harder and more stressful, and it went by the wayside as it has done so many times before. And that brief time away made all the friction of getting back into it more apparent, especially when [[Craft.do]] got my attention. I think Craft has a ways to go before it's a "forever" app, and somehow it's also good enough (for me) to use right now. The ability to share a Roger page (or any other pages) with Sarah is priceless. But there is the aggravating point Jack made about linking and plugins and all being app-specific, which is true for sure. Looking at Craft's export format, it's not going to be ideal when the time comes to move to some other app (which I know will happen someday). I'm trying to be careful not to lean on the Daily Notes and backlinks too heavily, and using individual pages more like [[Topic journals]] with embedded date stamps. But it's hard not to go all-Roamy with it. Also, dragging images into [[Craft.do]] is dead simple and adds nice context to notes. I have to remind myself that that capability is there. One thing that [[Craft.do]] does unambiguously better than [[Roam]] is that its exported [[Daily Notes]] files are named like this: [img[https://twelvety.com/philtiddlywiki_images/2021-09-26-exported-daily-notes-craft.png]] …instead of how Roam does it, which is maddening: [img[https://twelvety.com/philtiddlywiki_images/2021-09-26-exported-daily-notes-roam.png]] It would be simpler in the long term, though, if I could stick with one notetaking app literally forever (which is technically not that many years for any of us). My [[switching of tools|Karl Voit: The Cost of Switching Software Tools]] would not be so painful if I could do it in an orderly fashion, and say "between date A and date B, ALL of my new stuff was here, and then between date B and date C, ALL of my new stuff was over here". But that's not how I do.
`ssh`'d into [[DigitalOcean]] console. `sudo npm update -g tiddlywiki` `forever stop /usr/local/bin/tiddlywiki` `forever start --spinSleepTime 10000 /usr/local/bin/tiddlywiki ~/apps/wiki/mywiki --listen credentials=THECSVFILENAMEGOESHERE "readers=(anon)" "writers=(authenticated)"`
The wiki is going to go silent for a few days. We found out today that Roger has aggressive lymphoma throughout his little body. We're going to say goodbye to him tomorrow. We're bereft.
Having [[Roger|2021-10-01 Roger]] taken away from us so suddenly has forced me to stop everything I was doing. The obsessive research for insert-material-item-here, the increasing detail and infrastructure around my notetaking "workflow", the journaling of things that didn't matter, even the [[Russian]]. It's all just so pointless. I know it won't all go away, but it won't all come back, either. When he passed, I just wanted to go back to washing the dishes each night and hanging out on the couch with him and Sarah after the kitchen was closed down. It's a tired phrase, but that was truly all I //needed//. (Thanks, [[Jack|Jack Baty]], for your [[kind words|https://rudimentarylathe.wiki/#2021.09.28%20-%20Daily%20Notes]]. If any other wikis mentioned it, I'm sorry I missed them - I'm just behind.) I'd always dismissed [[The Office (NBC)]] simply because it wasn't the "real" British one, but it turns out I was wrong and it's really funny. When you're looking for something to get you through some sad nights, the pacing and cringing is good at taking your mind off of other things. [[Twitter]] is quite likely the worst possible thing to look at when you're already depressed. I unfollowed a ton of terrible people and that helped a bit. I'd prefer if "never losing my notes" didn't always feel like it also meant I couldn't easily "use my notes". But if I have to, I'll lean towards "using my notes" and whatever comes with that. I'm not a game person, but after signing up for the trial of [[Apple Arcade]], I saw a promo for [[Creaks]] and gave it a few minutes this morning. It's cute and calming, and the controls aren't confusing, which may be my favorite part about it. Me, me, me. It's all about me, isn't it.
[img[https://twelvety.com/philtiddlywiki_images/2020-10-17-roger.jpg]] Roger Hand, ~2011–Sept. 28, 2021 — //I don't appreciate being a tiddler.// --- Roger took Sarah's last name. She was the one who took him to the vet most often, and he spent more time with her than anyone else. I've never had such a hard time in the aftermath of losing a cat. We'd been through this three times before, and this was the worst one. He was the most pure-hearted animal I've ever known, and came with so many problems from the day we adopted him, that I think it made him appreciate our quiet home more than other cats did. It sure made us more protective of him than we had been in the past. I'll never understand how he hid his illness so well. I think Sarah was right when she said that he didn't want to reveal to us how bad it had gotten until we got the news from the test results. At least we got one last night at home with him on Monday. We did all his favorite things: couch time, watching TV, bed snuggles.
On [[Friday|2021-10-01 Journal]] I appeared to have renounced conspicuous consumption and frivolous notetaking. Well, guess what I ordered Saturday: I can't say I //needed// a [[Fujifilm X100T]], but [[KEH Camera]] happened to have a black one listed as Excellent condition for less than $700, and that was enough to push me to order it. I justified it with our looming travel plans, and also because I wanted something else to think about other than the cat-shaped hole in our home. Since I had already researched that camera to death a few weeks ago, I only felt half-guilty about the impulse purchase. I don't feel guilty enough to not be looking forward to having a real viewfinder and those famous Fuji film simulations. We've now reached the uncanny valley where [[Google Lens]] is good enough to accurately OCR 99% of my handwriting in a [[Field Notes]] [[bullet journal]]. It's incredible.
I'm still going to use [[org-mode]] for when I pay off the credit card balance. Sometimes I break those payments up into pieces and I always paste the full thanks-for-your-payment confirmation notes under the subheadings in the file. There's just nothing better than org-mode for that. That file and some other loggy ones are files that only exist to help me tick off all the mental boxes, and Sarah doesn't care about them, so I think they'll stay out of [[Craft.do]]. Thanks to [[Alex|Alex Johnstone]] for [[pointing me to the|https://fondoftea.com/#2021-10-04%20Mon]] [[Fuji X Weekly]] website and all the cool Fujifilm recipes there. Gonna be fun to experiment with.
I happened to try to load my old, neglected [[Statamic]] blog at https://twelvety.com today and it is totally hosed. I don't know how long it's been that way or what caused it. I don't even care that much about the content, but I do hate that something with my name on it is just serving up nothing but errors. Oh well. I haven't added anything to it in forever and I'm not that worried about it right now.
The [[Fujifilm X100T]] arrived from [[KEH Camera]] yesterday. It's lovely and the build of it reminds me of when my 2002 VW Golf was in nice condition, in that one-giant-hunk-of-metal-and-plastic way. KEH described it as Excellent but they could have gotten away with listing it as Near-Mint if the box, manual, lens cap, and charger cord had been included (which they weren't). All that doesn't bother me because the camera itself looks pristine and the shutter counter reports only 5400 actuations, although people say that every time the camera is switched on, that activates the shutter, so it's probably not a reliable number the way Fuji counts it. When I looked through that viewfinder, I had the feeling of "so this is how the other half lives". But I have intense guilt about having bought it. It's the most expensive near-impulse purchase I've ever made, so I've started a [[Craft.do]] list of things (that have all been taking up space for years) that I need to sell to make myself feel better. The [[Arlo Essential Solar Panel Charger]] has now trickle-charged the [[Arlo Essential Spotlight camera]] battery to 100%.
It was delightfully weird to hear [[Jack|Jack Baty]]'s [[actual voice|https://thinkingabouttoolsforthought.com/episode-007-interview-with-jack-baty/]] on [[Thinking About Tools for Thought]] when I mostly otherwise just read what he writes. You can count me in the logging > [[Zettelkasten]] camp, too.
Met Dad at the the [[Richmond Folk Festival]] today. Took the [[Fujifilm X100T]] with me for its first real outing, but I don't know what I'm doing with it yet. I feel like it's a precision tool that I'm using with mittens on. I'll get there. I do really like the viewfinder, whether I'm using the optical or electronic mode. Feels like using a real camera again.
Lots of experimenting with [[Capture One 21 Express Fujifilm]] and [[Adobe Lightroom Classic]] on [[Fujifilm X100T]] images tonight. Fun!
I keep reading people saying how bad [[Adobe Lightroom Classic]] is at processing Fujifilm X-Trans photos, and I've seen demonstration pictures of the wormy, watercolor artifacts that can happen, but I just cannot find those same problems when I try LR on my [[Fujifilm X100T]] photos. Huh.
to [[Jack|Jack Baty]], re: https://rudimentarylathe.wiki/#2021.10.13%20-%20%40Phil%20re%3A%20Fuji%20and%20C1 Thanks for this! I think you're right. I'm going to attempt to move on and not analyze this to death. Also, I like how you're splitting conversations out into tiddlers again. I forgot that's how we used to do it. :)
I knew I had written down some [[Dorothea Lange quotes about photography]] //somewhere//, but they weren't in the wiki (until tonight), weren't in [[Drafts]]. I did a Spotlight search and there they were, trapped in [[DEVONthink]]. It's like they don't count unless they're here, publicly in the wiki.
Great. Now that I look closely at green grass and foliage in [[Fujifilm X100T]] photos in [[Adobe Lightroom Classic]], I see the wormy/watercolor effect, and now I can't un-see it! It makes stuff look synthetic. And I don't see it in the same photos in [[Capture One 21 Express Fujifilm]]. The grass just looks like grass. And I'm not close to comfortable with relying on the JPG renders from the camera because I keep missing exposure wildly. The RAF/RAW files are so much more adjustable. And yes, this stuff is only visible at 100% and higher zoom, but I can't be working with photos that I are know are slightly mangled at the lowest level. So now everything is more complicated.
Now that I've found and tried [[Pete Bridgwood: Sharpening X-Trans Files in Adobe Lightroom]], I can go to bed in peace.
I know [[Kenneth Wajda]] can be a little repetitive, but I needed to read every one of those things I read of his in [[2021-10-16 photographing moments]].
These things I've bumped into recently are exactly what I needed to read. * [[Craig Mod on moments, etc. in photography]] * [[Kenneth Wajda: take photos as you go out to live]] * [[Kenneth Wajda: Photographing Life’s Little Moments]] * [[Kenneth Wajda: You Don’t Want a Mint Condition Leica]] So often, I look around in my daily activities and in the same old places I walk and drive and think "there's nothing good to photograph here", and the camera (if one is even with me) stays turned off, in the bag, like a useless limb. But if you think of the boring stuff you see every day as only temporary, that you and it will go away someday, and remember that you'll forget what it looked like or what you did every day if you don't document it, that suddenly makes previously invisible, uninteresting scenes mean something.
We are wiped out. Sarah is being treated for a case of shingles on her head, and last night she thought she spotted them encroaching on her eye. When that happens, they say you should go to the ER. So we did, at 10:30 pm on a Saturday night, and we came back home this morning around 8 am. The weird thing is that in [[COVID-19]] times, a visitor can't wait in the same area as the patient they're with. I had to go to some far-off waiting room where a TV was playing "The Jeffersons" on repeat for three hours. I wouldn't say that that show holds up. After that was over, the other lady in the waiting room switched to a 30-minute infomercial for a Time-Life [[Richard Pryor]] 12-disc DVD set. I love me some Richard Pryor, so it was actually fun to watch, but like empty calories because it was all so chopped up. And then came "The Golden Girls", which holds up quite a bit better, but seven or eight episodes was too much. To pass the time and reclaim some sort of control over the situation while I still had battery power, I ordered a bunch of accessories for the [[Fujifilm X100T]]: * [[Samsung Pro Plus SDHC Full Size SD Card 32GB (MB SD32H)|https://www.amazon.com/dp/B08JF4DV1M]] * [[Wasabi Power Battery (2-Pack) and Charger for Fujifilm NP-95|https://www.amazon.com/dp/B005CRHM5C]] * [[MegaGear Cotton Wrist Strap (Black) MG939|https://www.bhphotovideo.com/c/product/1314591-REG/megagear_mg939_cotton_camera_hand_wrist.html]] * [[Vello LCD Screen Protector Ultra for FUJIFILM X100T, GSPU-FX100T|https://www.bhphotovideo.com/c/product/1102540-REG/vello_gspu_fx100t_lcd_screen_protector_ultra.html]]
I was/am all for removing statues of Confederate generals in RVA. They are explicitly un-inclusive and irrelevant in this age. But (to admittedly nitpick [[this much longer post|https://www.instagram.com/p/CU8czLaFWMu/]]), demanding that an independent bookstore remove its Civil War section just because you'd rather not see those books and don't like the people who buy them is unproductive and obnoxious. I'm not even a Civil War person, but dang these people are tiring.
[[Jack|Jack Baty]], re: [[your question to readers|https://rudimentarylathe.org/2021/10/17.html#a101131]] about timeline format in [[Drummer]], I //personally// prefer the entries within each day to run chronologically, oldest-to newest, but take that with a grain of salt, because I'll read your stuff every day no matter how it's formatted! :)
Opened [[Craft.do]] for the first time in about 3 weeks today. [[2021-10-19 @Jack re: your Drummer timeline]] Ordered a [[Think Tank Mirrorless Mover 10 Camera Bag (Blue)|https://www.amazon.com/dp/B01N8QGTKH]] to carry the [[Fujifilm X100T]] when it's not in my right hand on a wrist strap. I really swear I'm done buying camera accessories for this week.
Curiosity got the better of me and I had to go set up a shell of a [[Drummer]] blog: http://oldschool.scripting.com/twelvety/ – I don't expect I'll do anything with it, but if I do, I'll mention it here in the wiki. Am I getting sick? I may be getting sick. One of my favorite people in our department caught up to me on my way into the bathroom this morning and said, “Phil, I’m fast on your heels. I’ll be honest, I’m gonna do some things in here that you’re not gonna be happy about.” I suppose one of the worst things about hearing loud, muffer-less cars revving their engines all day and all night is that it reveals how many dumb people there are in our city. [[Luís Costa's Fujifilm simulations]] made me switch from DR100 to the DR200 Dynamic Range setting on the [[Fujifilm X100T]]. We'll see what that does to the images. I love the X100T, but after using it along with the [[Ricoh GR (2013)]] for a while longer, I've decided that no matter what, I will ''always'' own a GR-something. I'll make this original one last as long as I can, but there's always going to be some kind of GR with me. It's miraculous. I took the photo below (with the [[Ricoh GR (2013)]]) at MCV early on Sunday morning, as we were there finishing up Sarah's ER visit for shingles encroaching on her eye. The fire alarm strobes started flashing when I was in my separate waiting room. Don't know if it was a false alarm or something real, but the Panera Bread across from the waiting room sure did smell smoky when they let us back in. This was a great example of the kinds of shots you can get when you have a real camera with you. I mean, yes, I could have taken one with my phone as well, but I was glad I had a camera with an APS-C sensor and a real lens. <a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/51611902037/in/dateposted/" title="Fire trucks at MCV!"><img src="https://live.staticflickr.com/65535/51611902037_a2d86fcba7_b.jpg" alt="Fire trucks at MCV!"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
FINE, [[Jack|Jack Baty]] and [[Alex|Alex Johnstone]]. I guess I'm [[using|http://oldschool.scripting.com/twelvety/]] [[Drummer]] now. But if the [[TiddlyWiki]] [[Daily Notes]] die on the vine, it's going to be //your fault//. ;) Also, even though I told Jack my preference for //his// Drummer blog was to be chronological-within-a-day, I'm gonna punt and just do reverse-chrono-within-a-day, because now that I actually see it in action, I can see that that's how Drummer "wants" to work. I know not to swim upstream.
Those [[Drummer]] forum posts Alex and Jack linked to are disheartening. Takes a little bit of the fun wind out of the sails of using it, but I'll stick with it for now. I do indeed hope someone forks it. If nothing else, it's given me the itch to have a lightweight, HTML non-wiki place to put [[Daily Notes]] kinds of things again. I think my favorite format ever for that is still [[@kordumb]]'s https://tiv.today/ [[Alex|Alex Johnstone]], re: [[your mention|https://alexjj.com/2021/10/21.html#a182432]] of my mention of Drummer being easier to edit on the phone, you're right. Now that I test it again, posting to [[TiddlyWiki]] from the phone //is// in fact easier than posting to Drummer. TW feels less dicey, at least, just because the formatting scales down to phone size. What made me feel like it had more friction than Drummer was that the Drummer outline is just "there", ready to be typed into (if you ignore the overflowing CSS layout). Also, my phone never remembers to keep me logged into TW for editing, so at least once a day I would have to log in again if I wanted to add or edit a tiddler.
[[Jack|Jack Baty]], you know what? You're right about [[carpenters and tools|https://rudimentarylathe.wiki/#2021.10.22%20-%20%40Phil%20re%3A%20Carpenters]]. My brother is the best carpenter I know and he's a hot mess! ;)
I get irritable when I have to go a day without using my laptop. I don't even have kids. How do parents do it? I think I would really like a [[Drummer]]-formatted private [[daybook]] if I could have archives and search. It looks exactly how I'd want to see it. But how are you supposed to look at your raw outline in [[Drummer]] and know at a glance that there's an image associated with any particular entry? It seems to be invisible unless you click on the briefcase icon to Edit Attributes. I launched [[Adobe Lightroom Classic]] and it said it needed to update, so I tried to update it from the Adobe account page, but the Adobe Creative Cloud Desktop app never launched. Now I've downloaded and run the Creative Cloud Uninstaller and am re-installing Creative Cloud.
Ordered a [[16-inch MacBook Pro (2021)]] for Sarah and a [[14-inch MacBook Pro (2021)]] for me. I swallowed hard when I saw the total, but we got our first pair of MacBooks in 2007, our next pair in 2014, and now these new ones in 2021. Seven years is a pretty good run. It's excessive and I feel some guilt, but I hope that spending a lot of money now will be better than the regret I might feel if we'd only gotten 16GB of RAM. Weirdly, upgrading these to the M1 Max processor didn't add that much $$$ compared to the base cost of the machines. Still, for computers that spend a lot of their time editing text, reading and writing email, and doing lots of non-heavy-duty things, it's a bit ridiculous to go all out. I just hope I feel the benefit in [[Adobe Lightroom Classic]]. I also hope the M1 Max doesn't chew through battery life and make me wish we'd gone with the M1 Pro.
We're getting ready for a short trip to NYC and I pulled up my [[org-mode]] file from fall 2019 from the last time I went. I had put everything in that file: things to pack, tasks to do ahead of time, things to see there. It was nice to see all of it pop back into view by opening that one file. Why am I not opening [[Craft.do]] much anymore?
This is an out-of-office (or out-of-wiki) message while we’re away for a few days. Back to the wiki and Drummer on Tuesday!
[[Drummer]] is great, but it's made me lose my bearings here in [[TiddlyWiki]]. I need to get back to my roots. Drummer is certainly fun, and has potential to be seen by people (especially thanks to [[Andy Sylvester]] finding it and adding me to [[oldschooldrummers.andysylvester.com|http://oldschooldrummers.andysylvester.com/]]), but it's less useful to me than the wiki. There's nothing like a slew of new trip photos to spur a person into ordering the [[HP Tango]] printer they'd meant to order a long time ago! From Newegg. I guess if I buy enough varieties of printer paper, I can zero out the dollar savings of the ultra-cheap HP all-you-can-print ink! Here's what I ordered from B&H, all 5x7: * [[HP Premium Plus Photo Paper, Glossy]] * [[Ilford Galerie Glossy Photo paper]] * [[Moab Lasal Photo Matte 235]] I have now internalized why people love the [[Fujifilm X100T]] (and other [[Fujifilm]] camera) JPEGs: They're just great. In every case, when I looked in [[Adobe Lightroom Classic]] at the SOOC JPEGs next to the RAW/RAF files (that had Fujifilm-approved Adobe approximations of the camera's film simulations applied), the SOOC JPEGs look more unified/integrated/whole. They look more like... photos.
Alex! Well, I'm bummed about missing the [[three months of free ink|https://fondoftea.com/#2021-11-02%20%40Phil%20HP%20Tango]] for the [[HP Tango]]. I had no idea. At least I was able to get one month of free ink with [[Patrick La Roque]]'s [[affiliate link|https://try.hpinstantink.com/fwmq2c]]. I'm excited no matter what, though! And [[Dynalist]] is indeed a [[great option|https://fondoftea.com/#2021-10-24%20Sun]] for a [[daybook]]. I used it for a while about a year or so ago and then one day their sync system between the mobile app and the desktop app glitched and I saw some conflicts and evidence of lost data. I couldn't reconcile my way around that, so I canceled it. It's one of the best outliners I've ever used, though. I miss it.
I'm stuck. Now that we're back home, I have real, tangible home/financial projects to tackle, but I also feel the pressure to write down as many [[New York City]] trip details as I can before I forget them. Same for the backlog of photos to deal with. For once, it'd be nice to complete a personal/creative task like that, with tags and titles and descriptions and everything organized. But I could also spend forever doing that because it's fun. If nothing else, I somewhat successfully used iPhone, [[Ricoh GR (2013)]], and [[Fujifilm X100T]] photos as a proxy journal while we were there. I didn't write anything in the [[Field Notes]] like I thought I would, and I wrote precisely two tiny entries in [[Day One]]. Thank goodness for photo metadata.
Well, that’s super weird. After buckling down and working on the financial project I mentioned [[yesterday|2021-11-03 Journal]], I felt a tiny piece of order creeping in, and it makes me want to keep going and try to get some more structure in place with bills, papers, photos, music, notes (always the notes), etc. And I see that in [[the urge to organize everything]], I wrote about the same thing almost exactly 2 years ago on 11/5/2019. There’s something about the biological calendar here. For getting stuff out into the world, [[Drummer]] has replaced [[Micro.blog]] for me. Except for when I want to target a message to certain people, or reply to someone else's post. I need to get back to learning [[Russian]]. I heard a half sentence of it spoken by a lady we passed outside the American Museum of Natural History in [[New York City]] and it made my brain swoon.
Yesterday I busted out [[Day One]] to start adding location names and descriptions to a bunch of the automatically captured places from the [[New York City]] trip. I hadn't spent much time in the app recently, and I'd missed out on how nice and easy they'd made it to automatically generate timestamped entries. You can even tell it to make a single entry with all of that days times and addresses collected in it if you don't want to break things up too much. It's a great solution to the "where did we go and when" problem, but I still would prefer if it would show everything in a day in an outline. Like, oh, I don't know, [[org-mode]].
Using [[Drummer]] just for lightweight blogging makes me not want to use [[Craft.do]] for [[daybook]] or [[Daily Notes]] or [[journaling|Journaling and logging systems]] anymore. Craft is still good at what I would have put in [[org-roam]], but otherwise it feels too clinical, and I can't find a way to set the typeface to something better globally for all new notes. Drummer is getting me hooked on seeing a sequence of days in an outline again, like [[Org-Journal]] and [[org-mode]] do. I can't be happy! Sometimes garbage makes it into the river of news. Oh well.
One nice thing about [[org-mode]] is that you can have per-file tags. So for a `daybook.org` file, where you may want every item to have one tag, you can limit it to a small number of very functional tags like `:car:`, `:health:`, `:house:`, `:hardware:`, etc. I miss Collection pages in a [[bullet journal]]. You'd think that if I miss them so much, and if none of the digital options feels right, I'd just back to using a proper big bullet journal. //Maybe it's time!?//
The [[HP Tango]] arrived yesterday! Of the two kinds of photo papers that have shipped, the [[HP Premium Plus Photo Paper, Glossy]] yields prints that look uncannily like something from a lab. The [[Moab Lasal Photo Matte 235]] isn't really for me, but there must be something I can use it for. As of 1:14 PM today, I've collected 51 photos in my "To print on HP Tango" album in [[Photos.app]]. This is the best ~$150 I've ever spent.
Now that I'm trying a local [[TiddlyWiki]] file for home/private stuff, I added [[Timimi]] in [[Firefox]]. But I kept getting a "developer cannot be verified" error when I would click the checkbox on the toolbar, so I figured I'd need the backend server thing to run. Got it from: https://github.com/ibnishak/Timimi/releases/tag/2.1 But the `timimi-2-1-1-Mac` file it downloaded wanted to open as a text/script file in BBEdit. So I found someone with a similar problem in the Google Group: https://groups.google.com/g/tiddlywiki/c/g3M0MlG_13o/m/KiV0FnmGAAAJ Running these in Terminal to make it executable fixed it and made the installer start. All I had to do was go into the Security & Privacy app to tell it the file was ok to run: ``` cd ~/Downloads chmod +x ./timimi-2-1-1-Mac ./timimi-2-1-1-Mac ``` After that I picked Firefox as the browser and it was done. Also, I changed the location of my backup folder in the Timimi extension preferences screen to be: `/Users/phil/tiddlywiki_backups` ...because I want the real wiki to live elsewhere (either Dropbox, or iCloud Drive if I can get that to sync reliably).
Last night I gave the frozen drain hose in our refrigerator's freezer my best shot and got nowhere. Something is either clogging it up deeply or the heater that defrosts everything isn't kicking in. This is above my pay grade, so I left a message with [[Richmond Refrigeration Repairs|http://rrrexperts.com/]] this morning. [[Jack|Jack Baty]] [[nails the issue|https://rudimentarylathe.wiki/#2021.11.09%20-%20Daily%20Notes]] with [[Drummer]]. I still like it and it's fast and feels fun to write in, but because it's 100% out of my control and we can't pay for it, I view what I put there as ephemeral and disposable. It serves a purpose, but it'll never replace this wiki. I'm jealous of [[Alex's new TiddlyWiki blog]]. Updated the [[iPhone 12 mini]] to iOS 15 while I was on a conference call. I love that (knock on wood) major iOS updates are so easy these days. I'm setting up a local TiddlyWiki file to use as a home logbook/daybook for me and Sarah. I know in my bones that this is right.
# Download an empty [[TiddlyWiki]] from tiddlywiki.com # Save it to a folder in [[Dropbox]] # [[Install|2021-11-10 installing Timimi]] the [[Timimi]] extension in [[Firefox]] # Install [[Edit-CompText]] autocomplete plugin # Install a tiddler like: [[2019-01-17 css - changing titlebar text weight]] # Install a tiddler like: [[2019-01-17 css - adding space under each day's tiddlers list]] # Install the [[tobibeer random tiddler plugin]] # ~~Install the [[NTFS19]] plugin~~ # Import the [[Backlinks footer]] # Enable [[syntax highlighting in TiddlyWiki]] # In Control Panel > Info ## Basics ### Change ''Animation duration'' to 50 ### Change ''Default tiddlers'' to `[tag[Journal]!sort[created]limit[5]]` ### Change ''Title of new journal tiddlers'' to `YYYY-0MM-0DD Journal` ## Advanced ### Editor Types #### Click on ''text/vnd.tiddlywiki'' and set it to `comptext` to work with [[Edit-CompText]] (which has to be installed first) ### Parsing #### Uncheck "wikilink" # In Control Panel > Appearance ## Toolbars ### Page Toolbar #### Turn on "home" #### Turn on "new journal" #### Move "random selection" right before "save changes" ### View Toolbar #### Turn on "permalink" and drag it after "edit" ## Theme Tweaks ### Settings #### Copy whatever's in "Code font family" to "Editor font family" ### Sizes #### Font size: 16px #### Line height: 22px #### Font size for tiddler body: 17px #### Line height for tiddler body: 24px # In Control Panel > Keyboard Shortcuts ## Change ''sidebar-search'' to `alt-F`
Even though the local TiddlyWiki is a perfect place to track most home-related things, I'm still using [[org-mode]] for logs of certain monthly payments (new furnace, credit card payoffs, etc.) because it keeps me on speaking terms with org-mode and [[Doom Emacs]], and it's easy to throw a bunch of ugly text at it, and it's fun. Here's a picture of the [["local" TiddlyWiki for home stuff|2021-11-10 setting up a local TiddlyWiki for home stuff]] that I created. I say "local" because it really lives in [[iCloud Drive]] (well, it does now, and this screenshot was when it still lived in [[Dropbox]]). In any case, why did I wait so long? [img width=50% [https://twelvety.com/philtiddlywiki_images/2021-11-11-home-wiki.png]]
For the luckiest of us, the beginning of the [[pandemic]] brought a windfall of free time. It felt like tons of things were possible. Now, almost two years later, for me it feels like the options are narrowing, and depressingly few things are possible or achievable. That's probably more to do with my brain feeling like it's trapped in a bloated, dull body that gets no exercise.
I like what [[Jack|Jack Baty]] [[wrote about lock-in|https://baty.blog/2021/11/14/110056.html?title=iDontWorryTooMuchAboutLockIn]]. If I think about a handful of all the apps and services I use regularly—Gmail, Google Calendar, Apple Reminders, Things, Google Docs, even TiddlyWiki—I don't seem to fear lock-in and avoid their platform-specific features for some reason. I don't know why I get so wrapped up worrying about certain notetaking apps, though. Maybe because I boiled them down to such an atomic level when I used [[Notesy]] and [[nvALT]] almost exclusively. But it's again more of a symptom of [[scarcity mentality]] than anything else. Today when I was using [[Logseq]] I was block-referencing the hell out of things because it was the fastest way to achieve what I was doing while keeping date-oriented context around where certain notes originated, and it was great.
The 2022 [[Hobonichi Techo]] A6 is here! I see why people love it so much. What a nice chunk of a notebook. I especially like the "Coming up!" page between the last/first days of each month. It's a bit of a breather in the relentless march of time. I would be totally ready for another year of stay-at-home as far as social engagements go, as long as I could still go into the office when I wanted to. Having the new [[HTML-only home-oriented TiddlyWiki|2021-11-10 setting up a local TiddlyWiki for home stuff]] for logging and record-keeping and [[daybook]] entries is great (even though I'm bad at keeping it updated) because it makes it more obvious about what's left that should go in [[Day One]]. For me, that would be the more embarrassing/feelings stuff, or things about the workplace, that I don't want just laying around in public or on paper or on a shared wiki.
If you're going to leave me a voicemail, for the love of god tell me why you're calling. Any sliver of information will do. Just, something. Otherwise, there are about 14 million other ways to get in touch. I suppose the holidays are annoying me right on schedule again. I can spend all day working while the back of my mind generates a list of a million things to do and organize once I get to my personal laptop at night, and when I do, I sit cow-eyed in front of the screen, unable to do much.
Wheeee! An excellent new single from [[Momma]]. Reason to keep going for another 4 minutes and 14 seconds: https://mommaband.bandcamp.com/album/medicine
Well, this made my night. [[Merlin Mann]] tweeted about [[Protomartyr]]'s "[[Processed By The Boys|https://www.youtube.com/watch?v=yBQy_S_k-qg&]]" (which I'd never heard) and it made me think of [[Tropical Fuck Storm]]'s "[[You Let My Tyres Down|https://youtu.be/zYWHjfVtoSM]]", which I thought he would like. He sure did! [img width=55% [https://twelvety.com/philtiddlywiki_images/2021-11-17-twitter-merlin-mann-tropical-fuck-storm-1.png]] [img width=55% [https://twelvety.com/philtiddlywiki_images/2021-11-17-twitter-merlin-mann-tropical-fuck-storm-2.png]] I'm out. Thank you! Good night!
What must it be like to not have these imagined thieves of time always threatening to take a chunk out of the back of your neck if you work on the wrong thing? After reading about [[Jack|Jack Baty]]'s [[iCloud Drive]] [[woes|https://rudimentarylathe.wiki/#2021.11.16%20-%20Daily%20Notes%20(Tuesday)]], I'm moving the [[local/HTML wiki|2021-11-10 setting up a local TiddlyWiki for home stuff]] back to [[Dropbox]]. I don't care if I can't edit the wiki on the phone with [[Quine 2]] anymore. It's extremely rare for Dropbox sync to fail, and when it does, it's pretty good about letting you know.
Not that I have the [[Hobonichi Techo]] ready to go for 2022, is it just insane to imagine that I'll keep up with daily entries in it, and this wiki, and our [[HTML home wiki|2021-11-10 setting up a local TiddlyWiki for home stuff]], and whatever needs to go in the [[Field Notes]] [[bullet journal]]? What's going to be the "authoritative" version of anything? Which one takes priority when I'm tired or pressed for time? This is shaping up to be another "eyes are bigger than my stomach" situation.
I'm alone today and tomorrow from 10am–4pm and can do whatever I want. What's the likelihood that I'll get some things done or just sit paralyzed by the unstructured time? Installed [[Plain Org]] but can't recommend it yet. Too buggy to use on my phone at least. Maybe eventually it'll get there. I'm just glad someone new is trying. [[Roam]] gives you a chance to start clean every day with a new [[daily note|Daily Notes]], but [[TiddlyWiki]] gives you a fresh start every time you create a new tiddler!
The [[14-inch MacBook Pro (2021)]] is supposed to arrive early this week. This is the most meta-privileged thing ever, but I'm not ready for it yet! Need to do some other pressing home projects first instead of setting up, migrating to, and tweaking the new machine. And even though the 2014 MBP it's replacing has been with us for seven years, it still looks basically brand new and I've had zero hardware problems with it, other than very occasionally the screen flickers if I'm playing a full-screen video that has bright parts, but I don't do that very often anyway. If I don't keep up with a [[daybook]] every day, as things happen, it's not really a "daybook", is it?
Indeed, [[Jack|Jack Baty]]. //What was wrong// with [[flat text files to log things|https://rudimentarylathe.wiki/#2021.11.22%20-%20Daily%20Notes%20(Monday)]]? Before [[Markdown]] came along, I had a whole passel of [[plain text]] files in one [[Dropbox]] folder that I'd get to from [[Notesy]] and [[nvALT]]. Here's how I tracked "music to check out". I still have a current file for this year, but I moved it into the [[Obsidian]] vault and I need to move it back out. Look at what a glorious, unstructured mess it is! [img[https://twelvety.com/philtiddlywiki_images/2021-11-22-music-text-file.png]]
The [[14-inch MacBook Pro (2021)]] arrived yesterday – yay! I can't get [[Dropbox]] to sync on it – boo! * ''Update:'' Ok, now I've gotten the sync to work. It took some serious holding-of-the-breath and thinking good thoughts, but I can now see that all the files are there locally. I'll write up the "solution" soon. Added some thoughts after using the [[14-inch MacBook Pro (2021)]] for one day.
As I go about loading up apps and files on the new [[14-inch MacBook Pro (2021)]], it's becoming clear how much of what I install is there just to facilitate... keeping track of and writing about how my Mac is set up. 😕
Today I'm thankful for: # My wife (which is hard not to hear in Borat-voice) # Food, shelter, and transportation # Regular daily readers of this wiki. I'll never take it for granted that you manually make an effort to visit and I appreciate you all. # [[Micro.blog]], which led me to my people (see #3) # Close friends at home and far away # Family # More cameras than I could ever need # [[org-mode]] # [[Doom Emacs]] # [[TiddlyWiki]] # [[Drafts]] # All of my [[favorite songs ever]] # [[Succession]], which may be one of the best dramas ever # [[Fred Astaire]] & Ginger Rogers # [[Blueglow Electronics]]. That guy just gives and gives and gives. # My job # Finding my people at work after many years there # Beer # We got to spend four years with [[Roger|2021-10-01 Roger]] # [[Letterboxd]] # John Siracusa # [[Field Notes]] # WFMU and [[Fabio Roberti]]/[[Strength Through Failure]] # WERA and Butch/[[Vinyl Assault Vehicle]] # Nick Cave's newsletter There's not enough on here about what I'm thankful to do for other people, though. Maybe next year there can be more of that?
I realized that the "you must keep your photos separate from your system drive" idea may be old thinking, so I've decided to store my [[Adobe Lightroom Classic]] photos right on the [[14-inch MacBook Pro (2021)]]'s internal SSD. We spent a shitload of money on these machines and they both have 1TB drives. Why not use them? If we run out of space, we can always Velcro an external SSD on like we did on the last machines, but in the meantime, there's probably no need to rush things, and having a USB-C wire sticking out of the machine (or having to go get one when I get in the mood to work on Lightroom) is a point of friction.
I swore I wasn't going to get sucked into the Black Friday trap of imagined urgency and pointless research, but I did it! I got to thinking about how our [[Yamaha AVC-50]] integrated amp has an annoying low-level hum that is beyond my capabilities to fix, and that I "need" some cheap amp to get us over the holidays. The [[Allo Volt+ D]] was always in the back of my mind, but that seemed "too expensive" for a temporary amp, so that spurred a whole rabbit hole of looking into sub-$100 and then sub-$200 [[Class D amps]]. And then I thought, well, if I make this a more permanent thing, I should look at $350+ [[Class AB solid state amps]]. But none of that is necessary. What I should do is finish fixing the [[Harman Kardon PA2200]] (remember that old thing?) now that I have //literally all the components// that are likely to be needed to bring it back to life. I hit a logistical wall in the basement at some point this past spring and lost all momentum with it. I shouldn't spend a bunch more of our money to make up for my laziness. However, I did learn about the German/Danish [[Infineon MERUS MA12070]] chip, which is the new Class D hotness out there. So, that's one to watch.
Bought a [[Samsung 870 EVO 500GB 2.5 Inch SATA III Internal SSD]] for the [[Roon Intel NUC]] to be able to store all its music internally instead of on a spinning external drive. When it gets here, the spinning drive will go back to the [[Plex]] [[Raspberry Pi]]. I mean, I had to buy //something// during Black Friday weekend (even though this SSD has been this price since Nov. 8). I think I want to go back to having a million [[Markdown]] or even [[plain text]] [[topic journals|Topic journals]] that all have dumb `YYYY-MM-DD` date stamps for each entry.
[[FSNotes]] is a decent alternative to [[nvALT]]. It's not quite as fast on some of the way-too-long notes I have, but it feels the most like nvALT of all the things I've tried so far. I have it pointing to my old [[Notesy]] folder of text files in Dropbox. * ''Update:'' FSNotes is //great//. Just discovered there's a setting to show the notes list at the top instead of the sidebar. I'm set. If I had never heard about [[org-mode]], I wouldn't know what I was missing when I use [[Markdown]].
Today on the laptop I made a [[macOS]] smart folder that searched for any [[Dropbox]] files that had `2020-11-28` (one year ago today) in the filename or contents, and then I did the same for three years ago, five, etc. It was fun to see exactly what I was doing at this time of year in the past, but it was also ''so depressing'' because I keep worrying about the same pointless shit every year. Such as: > Figured out how to format blockquotes in [[Roam]]! and > Decided I need to put car log kind of stuff in [[Obsidian]], along with financial stuff But I did learn from all this that I go numb when I try to read a complete summary of a past day in a plain text file. When it's written on paper, I find it more interesting and less pointless. But I somehow don't go numb or sad looking at a [[topic journal|Topic journals]] page with a bunch of past dated items in it, as long as they're all about the same topic.
My own wiki comes to the rescue again! I had no memory of writing [[2019-12-24 internal hard drive for Roon Intel NUC]], but there it is, and it was helpful. I expanded on it based on what I learned tonight. That's how a wiki is supposed to work! The [[Samsung 870 EVO 500GB 2.5 Inch SATA III Internal SSD]] is now in the [[Roon Intel NUC]] and the files are transferring to `InternalStorage` as we speak.
Hearing [[Daniel Jalkut]] [[talk|https://www.relay.fm/mpu/616]] on [[Mac Power Users]] about not syncing files and knowing that all his stuff was on his laptop has made me start thinking: Do I really need [[Dropbox]] anymore? [[Drafts]] does a lot of what I used to lean on Dropbox text editors for. Plus, there's the [[Backblaze]] iOS app if I need to grab a file that's really only on my MacBook. Would I use the [[iPhone 12 mini]] less if I didn't try to edit text files on it? Although it is handy to look at the home wiki on.
I randomly thought about [[Geoffrey Palmer]] today and was sad to learn that he [[died|https://www.washingtonpost.com/local/obituaries/geoffrey-palmer-british-actor-who-starred-in-tvs-as-time-goes-by-dies-at-93/2020/11/06/7c7d7b08-2048-11eb-ba21-f2f001f0554b_story.html]] //last November// (2020). I tried to stay current with his status and somehow missed his passing entirely. I wanted (and still want) to be [[Lionel Hardcastle|https://www.imdb.com/title/tt0105943/characters/nm0658244?ref_=tt_cl_c_2]]. The [[Etsy leather cover for Hobonichi Techo]] arrived today and it's very nice! I hope the pen holder softens up, though. Right now, it wants to hug the edge of all the pages and it'd be better if it flapped about, off the edge of the notebook. But we will see as it gets used.
I'm sick and I'm pissed about it. I'm off tomorrow and it was supposed to be a day of light productivity and hanging out. Now it'll be no productivity and lots of lying around on the couch or in bed. Sarah thinks I inherited her "super cold". I don't know if I'm that bad off, but it is the first time I've been sick in almost two years. I told some close work peeps about [[my Drummer blog|http://oldschool.scripting.com/twelvety/]] today. I hope that wasn't a mistake! I guess I treat it like a pseudo-Tumblr anyway, so it should be harmless. After hearing [[Daniel Jalkut]] talk so enthusiastically about [[Docker]] on [[Mac Power Users]], I thought I'd give it a whirl. I even had a thought that there might be a [[Doom Emacs]] container out there, and there are a few, but there's very little information to go on and it seems like anyone can make any container they want and call it whatever they want. Spooky. I was interested at first because no matter what method I use to install Doom, it always feels like inviting a messy downpour of stuff onto my machine, which is still fairly new and pristine. But I couldn't get the couple of containers I downloaded to even run, and I don't know how to reliably customize an Emacs config that lives in a container. Plus, there are hoops to go through to get it to talk to your actual text files on your filesystem. And Doom "wants" to always be able to update itself from the mother ship, which I guess defeats the idea of having a portable, standard install like what containers are supposed to give you. It's probably better to use Docker for quick things I want to experiment with (databases, Linux environments, etc.) and not use it for a daily-driver, bedrock app like Doom. It would be a bit like putting vinyl slipcovers on a new couch to keep it "nice". This MacBook isn't here to stay nice. It's here to get used. Ordered a cheap portable bidet for our office white elephant gift exchange. I'll fight someone to keep it. Please let [[Christmas]] pass quickly.
I've been putting off installing [[Emacs]] and [[Doom Emacs]] on the [[14-inch MacBook Pro (2021)]] because I don't want to do it "wrong" and screw everything up like on the last computer. There are so many mysterious commands I still don't understand that have to be done in a certain order.
Thanks to [[Jack|Jack Baty]] and [[Alex|Alex Johnstone]] for their answers about how best to install [[Doom Emacs]] on the [[14-inch MacBook Pro (2021)]]! It boiled down to using: ``` brew tap railwaycat/emacsmacport brew install emacs-mac --with-modules ``` Seems to have gone fine and [[org-mode]] is working again. I held off on installing [[org-roam]], though. I'd gotten out of the habit of using it and it'll be less confusing if I don't have it mucking up the works. I don't use org-mode for everything, but I //need// it for certain logging files. Still sick, btw. In addition to getting Doom going, I'm having a great time with [[FSNotes]] for the bucket of [[Markdown]] notes. It's great.
Requirements: * subwoofer output (mono is fine) * at least 40 WPC into 8 ohms if Class D; at least 70 WPC into 8 ohms if Class AB [[Cambridge Audio AXR100]] is a possibility. Anytime I look for Cambridge stuff, remember that they have an [[eBay]] [[outlet where they sell refurbished models|https://www.ebay.com/usr/cambridgeaudiousa/]] for way less than retail. * Ouch. This thing is horizontally cooled by a fan shooting out the back. I don't think I want an amp with moving parts that make their own noise. [[2021-12-06|2021-12-06 Journal]] I was tempted to go way up a couple of notches and get an all-in-one Bluesound Powernode or a NuPrime IDA-8, but the more I think about it, it's unwise to invest that much in something when [[Class D amps]] are advancing at the rate they are. The power amp section in either of those units would be the first thing to feel outdated in two years when some great new amp chip comes out. On the other hand, (ignoring the [[Harman Kardon PA2200]]) it would be slightly less crazy to invest $500 or so into a Class D power amp by itself, if I'm so curious about the pseudo-Class A performance they can deliver. I'm attracted to Class D because those boxes are usually small and don't get too hot, and they're interesting. Then the limiting factor would be whatever preamp we're using, which right now is the [[Yamaha AVC-50]], and could always be upgraded when it craps out. BUT, (again ignoring the PA2200) an even wiser move would be to get an integrated like the [[Cambridge Audio CXA81]], with a [[Class AB|Class AB solid state amps]] section that won't be out of date for decades. Except I don't need all the digital inputs it has. That seems like overkill. [[NAD D 3020 V2]]: No
Still sick. Stayed home from work today. Yesterday all I had the energy to do was [[research amplifiers|2021-12-04: amplifier research]] I don't need.
Still sick, but I managed to work from home today. First day of using the basement electronics/recording desk for work because the upstairs desk is such a disaster. It worked great! Next best thing to getting out of the house. And I finally short-circuited the obsessive [[amplifier research|2021-12-04: amplifier research]] by ordering the unit that started this whole thing: the [[Allo Volt+ D]]. It had gotten really bad, where I was spending every waking moment learning about amp topologies, following [[Audio Science Review]] conversations that were 16 pages long, refreshing eBay over and over, googling boutique amp manufacturers, and watching an infinite number of not-helpful amplifier demonstrations on YouTube while lamenting how many of them are just people fucking talking about amps and not playing music with the amps. It was the whole thing I do with anything I can't stop thinking about. I didn't order it //because// I couldn't quit researching, but more because: # That amp called to me. # Nothing else I found was any more suitable for my immediate need, which is to get a working power amp up in our living room again. The [[Yamaha AVC-50]] is doing the best it can, but there's a current leak in the power amp stage somewhere and the 60Hz hum is killing me. The preamp stage of that unit is fine and quiet, though, so a fresh power amp would solve our problem. # It was only $184.40 total, which is low enough to not trigger my guilt reflex. # Sarah asked me the other day, "Do you want a project or do you want to listen to music?" Right now, with the holidays approaching and lots of other duties to be attended to, I just want to listen to music. I can work on the [[Harman Kardon PA2200]] in my anticipated post-Christmas hermit period. If I'm able to get that thing back to normal, great. The Allo can then either live on the basement desk and power the [[Pioneer SP-BS41-LR]] speakers on the shelf, or I can sell it. (Imagine that. Me selling a piece of audio gear. Who am I kidding? I get nervous when I have only one working amp around, and right now I have none. Plus, a spare small, powerful amp is handy. I'll probably keep the Allo forever.) If I can't get the PA2200 working acceptably, the Allo will have an extended stay in the living room, which will buy me time to look for a more permanent integrated amp (or a new preamp and power amp) that can stick around in the main spot for 10 or 20 years. At least all this audio shit is getting me back to my roots.
While I wait for Allo to ship the [[Allo Volt+ D]] (which has still not shipped, as far as I can tell, arghhhhh) I have to redirect the brain-spinning to something else, so I've moved the [[Pro-Ject DAC Box S FL]] to the main stereo and am A/B'ing it with the [[Cambridge Audio DacMagic 100]]. I can't decide which is better. It depends on the source material. The DacMagic is harsher and spikier when the source material is too clean. But it's great on old, warm recordings. The DAC Box is more wooly and less transparent, with a bigger bass bump, which makes it not so good on old recordings, but on new over-produced stuff, it's generally better. It's like, which is better: shorts and a t-shirt or long underwear with layers and a coat? Well, it depends on the weather. Listening to all this Christmas music on this over-specialized stereo reminds me that one of my favorite "systems" ever was a used [[Squeezebox 2]], some 45-year-old [[Acoustic Research AR-4x speakers]], and a $28 15W [[Sonic Impact T-Amp]]. It all just worked so well together and I listened to it all December in 2010, I think.
This morning was the first day that I woke up forgetting that I was sick the day before! Now I'm just congested and everything else is tolerable. Yesterday I ran across a listing on US Audio Mart for a [[Cambridge Audio Azur 651a]] integrated amp. Now that is one to keep an eye out for. Made between 2011 and 2015, so just old enough to not have the stink of all the digital UI stuff that everything seems to have now, and new enough to not have developed problems. I asked the seller about it but I was too late. It would have made a great preamp for the [[Allo Volt+ D]], although that would have wasted a really nice Cambridge power amp stage. I cannot stop thinking about amplifiers of all kinds! I want them all: tube-type, Class D, Class AB, tube line buffers, passive preamps, everything.
I lost a year in the [[pandemic]] somewhere. We had our department's white elephant gift exchange on Friday and it was the first time everyone had been in the same room since March 2020. I almost felt dizzy trying to piece together what had happened at home and at work over all that time. Stuff that I thought happened in the spring of this year actually happened last year. Still thinking about [[amplifiers|2021-12-04: amplifier research]] constantly. It's bad. It's all because if I sat down and did a brain dump of everything else in my head that I'm afraid of what would come out. Learned that whole-system preamplifiers were called "control amplifiers" a couple of decades ago.
Okay. I swear to God I am done buying audio gear for a while. I kept reloading [[HifiShark]] over and over, hoping to see another improbably inexpensive [[Cambridge Audio Azur 651a]]. If I had, we would be in another place right now. But there were none for the whole three days that I kept looking. In that time I kept scanning the horizon to see if anything else new or old fit the role of preamp any better. I kept seeing Parasound come up in search results, but I didn't want any of their monstrous looking gear. And then popped up the [[Parasound Zpre3]] (what an atrocious name). It's very small, not feature-laden, has outputs for a power amp and a subwoofer, and it only does one thing: acts as a preamp and control center for all your stuff. It has no DAC in it – yay! I started to wonder if it would be better at being a preamp than the 651a would, where I would have surely wasted the power amp section. I ordered a Zpre3 tonight and I won't know if my hunch was right until it gets here. It's designed in San Francisco and not in Great Britain, so I wonder what the difference in sound signature will be. If Cambridge had made something like this, I would have bought it in an instant. But I'm looking forward to the Parasound. The reviews on it are almost universally glowing, and I expect it to be at least a marginal improvement over the dearly loyal 32-year-old [[Yamaha AVC-50]], which did its job plenty fine enough while we watched TV tonight. I almost felt it trying to prove it still deserved a home with us. Maybe I can put its mind at ease if I let it know it can live as a secondary system in the basement at my workbench with the [[McIntosh C27]], [[Pioneer SP-BS41-LR]]s, and [[Music Hall MMF-2.1]]. I have problems. Also, I forced myself to list the [[FiiO A5 headphone amp]] on US Audio Mart before I ordered the Zpre3. It's a drop in the bucket in comparison, but at least I'm managing to take one step in the direction of anti-hoarding.
The problem with having plans directly after work is that it directly impinges on my evening computer/wiki time. Note to self: When shopping for white elephant gifts, get the cheapest //funny// one, not the cheapest //good// one. If it's good and looks semi-legitimate, there's a high chance the joke will go nowhere and you'll be sad when people unwrap it and just look puzzled. The [[bullet journal]] is being neglected again. This wiki is just about the only thing getting any logs or notes these days. How will I ramp back up in January when it's time to start using the [[Hobonichi Techo]]?
[[Craft.do]] is good but it doesn't feel //real//, you know? Like, all the hard edges of text files are sanded off with that app and I can't take it seriously. It's fast and solid and easy and because of that it just gets littered up with a bunch of crap I don't really care about. Tonight I've stopped leaving the [[Cambridge Audio DacMagic 100]] on all the time. There's just no need and it probably doesn't do it any good. I think doing that for so long with the same input selected forever is what made the blue LED on that input go dim. Plus, whenever we would have a power blip it would turn itself off anyway. I think I can manage walking over to it to turn it on by hand and then turn it off when I'm done listening. The [[Yamaha AVC-50]] has no idea it has less than 24 hours left in its spot, soon to be booted by some younger, more agile whipper-snappers. Why do these inanimate objects tug at my soul?
Ok, I lied. Boy did I lie, about [[not buying any more audio equipment|2021-12-12 Journal]]. Since then I got banana plugs for the speaker cables, and then today my resistance broke down and I ordered an [[FX Audio Tube-01J]] buffer/preamp from eBay in Japan. The [[Allo Volt+ D]] arrived the other day and with the [[Parasound Zpre3]] it's tremendously clear, detailed and holographic. It's eerie and the most accurate amp I've ever had. But it's also too accurate, where every little spike and poky part of the audio waveform comes right through to the speakers, because the amp hides nothing. With well-recorded music, it's great, but with music with rough edges, it's unforgiving. Audio nerds on [[AudioKarma]] have been nuts for the Tube-01J and the Tube-01, and it's cheap enough to give a throw. Also ordered a matched pair of [[Riverstone Audio GE JAN 5654W]] tubes. I mean, you may as well have some tubes to roll.
I give up. It shouldn't be a surprise that Christmas week is a total loss for this wiki. I've been practicing trying to surrender and just let it all wash over me, and avoid being disappointed that there's no time or energy for anything else, but man is it frustrating. There's always a place to be or show up at, seemingly each day, or else there's advance prep for the place we're going to be or show up at next. And we got our boosters on Monday. I came out of it with a short, mild headache that went away with Advil. Sarah wasn't as lucky and only today has started to feel normal again. And people around here are in complete goddamn denial about COVID of all sorts. I've never seen more maskless people in Target. I don't think for a minute that we can all avoid Omicron, but we can sure as shit put forth the minimum level of effort to make things easier on hospitals and the vulnerable. Merry Christmas or whatever?
Back to work, finally! I'm not sad about it. There was so much stress and so little structure to life last week that it's a relief to have a schedule again. I'd like to take this brief quiet period (before 2022 roars in) to review and make sense of what in the hell we did in 2021. After emailing [[Alex|Alex Johnstone]] the other day about all the reasons [[Tinderbox]] doesn't fit me, now I'm thinking about using it for the timeline view, which is one feature that has always appealed to me more than any other. How did I get here? This is how: * [[Jack|Jack Baty]] [[mentioned|https://daily.baty.net/posts/2021/12/26/Dave-Rogers-on-distracti.html]] [[Dave Rogers]] on [[distractions|https://nice-marmot.net/Archives/2021/December_2021.html#note_789]] ** Which led to this great thread on the Tinderbox forum: https://forum.eastgate.com/t/what-are-your-writing-tools/5269 *** Where [[Dave said|https://forum.eastgate.com/t/what-are-your-writing-tools/5269/10]] ***> I really don’t get the clamor for Markdown, but to each their own. I don’t need to get it to do what I want to do. Tinderbox is a fine writing environment, and perhaps the best outliner I’ve ever used. **** Also, [[James Fallows]] (yes, of [[The Atlantic]]) [[popped up in that thread|https://forum.eastgate.com/t/what-are-your-writing-tools/5269/38]], which, wow. He said: ****> For keeping track of notes, leads, ideas, themes, reactions, and everything else in that category, I find Tinderbox to be unmatched. I used Lotus Agenda in the MS-DOS era; then Zoot software in the early days of Windows; and for the past dozen-plus years Tinderbox. ***** And then I googled "Tinderbox outliner" and found Steve Zeoli's [[Outlining with Tinderbox 6 (6.2 to be precise)|https://welcometosherwood.wordpress.com/2015/04/22/outlining-with-tinderbox-6-6-2-to-be-precise/]] and also his [[main Tinderbox page|https://welcometosherwood.wordpress.com/tinderbox/]]. Do I need to go down this rabbit hole right now? Nope. Am I going to? You bet! 11:13 PM: And here I thought [[Emacs]] was hard to learn.
I've heard of [[Dry January]] enough years in a row that I'm finally curious enough to try it. It shouldn't be a big deal, or worth making a pronouncement about, but I don't think I've ever gone even a whole week without drinking since I've been of legal age (or, uh, somewhat earlier). And I feel uniquely bloated this year from the accumulated food and drink we scarfed down over the holidays, so the idea of no drinking for 31 days just seems appealing, at least on paper. Plus I hear from nearly every person who's tried it that they regained lost time, woke up with more energy, and felt less foggy and less weighed down. I currently drink probably the same amount as my 50-year-old peers: Mostly one drink a day for over half of the weekdays, with two a day (rarely more than that) on weekends. But that adds up in calories, time, energy, and money. What will I learn after doing without it for a month? How many social situations will instantly become weird because of this?
Here I am, eating fries and chicken tenders with a fork, like an animal, so I can use my computer without having to wipe my hands after every bite. Remember [[2019-07-30 Journal (vegetarian-ish)]]? Well, chicken has been officially back on the menu for quite a while now. Pigs and cows, I feel badly enough for you that I'll avoid hamburgers and bacon as often as possible. Sorry, chickens. It's hard to know whether I've just lost my momentum with trying to take notes on everything because I'm tired and don't care as much, or because I have so many simultaneous, similar-but-different systems where things could go that I get paralyzed and don't know where to put them.
Wild, and not even unexpected. I'm almost as fascinated by all this now as I was in March 2020. It's particularly interesting how the focus in the news is on cases instead of deaths. Probably many reasons for that: Deaths as a percentage of cases are (for now) relatively lower than they were at the early peak; when people have been dying of [[COVID-19]] in steady numbers for this long, the deaths unfortunately lose their shock value, so you have to hook readers with ever-rising case numbers to keep them interested; we're entering a period where we don't know what the near-term cases hold in store with Omicron ramping up; the current and looming hospital crisis is closely tied to transmissibility and a large number of simultaneous cases. I mean, I guess. from https://www.nytimes.com/interactive/2021/us/covid-cases.html [img[http://twelvety.com/philtiddlywiki_images/2021-12-28-nyt-us-covid-cases.png]]
I've been emailing more with [[Alex|Alex Johnstone]] about [[Tinderbox]]. Seeing [[Jack|Jack Baty]]'s post about his [[Today agent|https://daily.baty.net/posts/2021/12/29/Today-agent-in-Tinderbox.html]] was exactly the practical example I needed. Now I may be hooked again and will probably have to upgrade from version 7 and pay $98. 😜 Also watched another [[Michael Becker]] video: [[Tinderbox - Understanding Agents & Queries (Part 1)|https://www.youtube.com/watch?v=NVcD0CugjuE]]. I maintain that the Map view just doesn't fit my brain, but agents and queries that can hunt for things across a Tinderbox file and show them in Outline or Chart view would be perfect. Dragging a long text file into Tinderbox and then "Exploding" its paragraphs to individual notes is so bad-ass. Ohhhhhh, and then if you shift-select on a bunch of notes //you can read their contents all at once.// Holy shit.
Yep, I bought the full [[Tinderbox]] license a couple of years ago, barely cracked it open, and now in a rush of new excitement just paid for the upgrade from v7 to v9.
In 2021, it's nearly an act of rebellion to adopt [[Tinderbox]], a Mac-only application that doesn't rely on the cloud, is written and maintained by essentially one dude (I think), doesn't have a great way of storing/referencing images, and has no mobile app. But how much great stuff have I done on a mobile device anyway? I don't shun paper notebooks like the [[Hobonichi Techo]] because it doesn't have a mobile app. A paper notebook does only what it does and nothing else, but it does that thing so well. I see 2022 being almost entirely [[Field Notes]] + Hobonichi + [[Drafts]] + Tinderbox + [[TiddlyWiki]]. If only I could unambiguously map out where things originate and where they end up. Actually that's still too many places. If I hope to make [[Tinderbox v9|2021-12-30 bought Tinderbox v9]] worth owning, I'm going to need to sit down and invest some time in [[Michael Becker]]'s videos. Which is not a burden! I guess Tinderbox is a headless CMS for your personal data/notes.
First day of [[Dry January]]! Not so bad. Mostly just weird to still be this alert this late on a Saturday night. Only have to do it 30 more days in a row.
The fact that I physically can't do anything with [[Tinderbox]] away from the computer is probably one of the main reasons I should stick with it! Could be a secret weapon that I don't want, but need.
Day 4 of [[Dry January]]. It's only been four days, but this isn't as hard as I was afraid it would be. I had a weird moment of deep calm last night as I was chopping garlic and ginger for dinner. Like the tide of voices and anxiety had receded from shore for a few minutes. It was nice! Only downside is that I'm eating tons of snacks and sugar, as lots of people attest to when they do this. I had a glimmer of doubt about [[Tinderbox]], or about the way I'm using Tinderbox, today. I emailed my doctor to refill a prescription and I recorded that as an item under my "health log" heading in Tinderbox. It could just as easily have gone in the "daybook" heading in the same file. Or it could have gone in a [[Markdown]] file in [[FSNotes]], or it could have just stayed in [[Drafts]] where I wrote it originally! But it went to Tinderbox, and as soon as it did, I looked at it and thought "if I need to refer to that when I'm away from the laptop, I'm not going to be able to". It's not even like it's a major data point, but it gave me a nagging urge to re-think what my purpose was for putting it in TBX. I think the answer was "because I could and because it makes it easy to hoard there", which is probably a bad reason to use it that way! I maybe ought to think harder about how I expect to use info, or where I expect to be when I need it, before I put it anywhere.
I'm mining [[BSAG's Tinderbox daybook]] posts for ideas from long ago.
I somehow made it to January 6 of this year without printing the 2022 version of [[D. Sri Seah's Compact Calendar]], which I did this morning. It must be 10 years that I've used these things. I fold mine in half and keep it in the last pages of my 6"x9" spiral notebook. Each morning I mark off yesterday and add milestones and launch dates for things our team is doing. It's the most useful and alarming presentation of the workdays in a year. You have less time than you think.
Tonight was the first Friday night of [[Dry January]], and the first time I thought hard about, "Wait, why are we doing this? Who would care if we bailed?" We stuck with it, though. Not because alcohol is evil (it isn't) or we can't handle our drinking (we can). For me, I stuck with it (so far) just because I said I would and I don't attempt that many hard things. And because I'm still curious enough about the cumulative effect on my brain after 31 days without alcohol. I just want to know what it's like, and I fully intend to drink beer on day 32, but I also don't expect to drink on many weeknights after that.
[[Dry January]] was ruined last night when I thought, "What is there to look forward to on Saturday night if we can't drink beer? What's the point of the weekend?" So I had one beer and it was great. It'll be a Moist January from here on out. With all the logging systems I have, I still don't feel like any of them are a good [[lab notebook]]. Hmm. Man, at some point, the import of [[Roam]] JSON into [[Logseq]] got just insanely good. Like, once I pull local copies of the handful of images I stored in Roam, I don't think I'll need to keep any stuff in there at all anymore and can cancel the $15/mo plan!
More and more over the last few weeks, I've been eating with real live humans during the workday lunch instead of browsing wikis, updating my own wiki, or taking more and more detailed notes about less and less. It's... fun! To talk and laugh with other people! I mean, if you find the right people. But there's what I //think// I want, which is time to myself, total control, order, and ticking things off some mirage of a todo list. But what //actually// makes life better is listening to funny stories, learning about what bothers my friends, what they're interested in, and generally letting my shields down. Monday and Friday lunch are still typically my own since barely anyone works in the office those days, so yeah, I'll have two days a week to nerd out solo for an hour. I mean, I'm not some social butterfly or whatever.
The [[Logitech M585 mouse]] is decent for a $35 mouse. I wish I had remembered before ordering it that the M325 is the one I use at work. That one is better because it has no side buttons. The M585 has two on the left that I'll probably learn to ignore. At least it has some heft to it because it uses a single AA battery like the M325 does. But the Bluetooth option on the M585 will be useful when I want to use this mouse in the basement with the Apple Cinema Display. I'm going to leave the Logitech unifying receiver USB dongle plugged in to the [[BenQ BL3200pt monitor]] here in the office/studio because I'm up here more, and because that works smoother and faster than Bluetooth. Good god when will January be over? In the spirit of [[Dry January]] (which I've turned into Dry Mondays, Tuesdays, and Wednesdays) I tried my first Brooklyn Brewery Special Effects Non-Alcoholic beer tonight after one normal beer. It's weird to taste bitterness and hoppiness without the alcohol in the mix. It got better as I got near the middle of the glass. And when it was over I didn't have the brain fog or complete lack of motivation that I'd usually have after two Saturday night beers. Huh. I hit the [[TW5-randomtiddlerbutton plugin]] button just now and was reminded of how promising [[2019-06-26 Leonard Cohen on putting your house in order]] is.
On 2022-01-11 I figured I'd try the free 6 months of [[Apple Music]] that Apple kept bugging me about. I signed up, told Sarah about it, she liked it right away, and we soon collided as we each tried to play stuff on our respected devices. So then I upped us to the $15/month family plan. The bad: the interface is inconsistent, buggy, doesn't preserve gapless playback over AirPlay, doesn't have a playlist of things you've Liked (or "Loved", as Apple says), and sometimes stops playing a track 15 seconds in and says "Unsupported URL". The good: it's lossless, the library is decent, and Sarah will use it (unlike [[Spotify]]). I didn't count on what a pleasure it is to have everything be lossless. Each song is a little treat, as long as it plays. I suspect it's something to do with the app getting confused about what music is really streaming from Apple's library and what music is supposed to come from my iTunes Match library, which may be superfluous at this point. As a whole, it was good enough for me to cancel Spotify Premium after one day. And now, to offset the cost, I'm going to get all my stuff out of [[Roam]] and stop paying for it!
[[Andy Sylvester]] very kindly interviewed me this morning for his [[Thinking About Tools for Thought]] podcast. The more I talked without taking time to breathe, the more I felt like I came across as a hyper, flailing, excited doofus who doesn't know what he's doing with all his notetaking tools. But it was fun and I finally got to use the DIY Anglepoise lamp-mic-stand with the [[Studio Projects C1]] mic. It drooped and I only had to pause our conversation once to nudge it back into place.
Yesterday I listened to [[Gina Trapani]] and [[Paul Ford]] on this April 2017 episode of Postlight's podcast: [[Gina Trapani has things TODO.txt – Postlight|https://postlight.com/podcast/gina-trapani-has-things-todo-txt]] This was another thing I found by googling stuff about Paul Ford and org-mode, although he didn't talk about org-mode for very long. Hmm, maybe I should take another look at TODO.txt... ''NO.'' Also, I have a whole new appreciation for anyone who can string spontaneous thoughts together in front of a live microphone and have them appear coherent. I've now tried it and it's way harder than it sounds.
At work I leave the [[Hobonichi Techo]] open all day. It lays flat and subtly invites things to be scribbled into it. I write down where I worked (on-site, mostly), who was there in person in our department, who I ate lunch with, and what I ate. If there's something else interesting or important, it goes on today's page, but there are only a fixed number of lines, so I can't be as wordy as I would be in the [[Field Notes]] [[bullet journal]]. I do more of the same jotting at home in the evenings, when I'm not pulled away by computers of all forms. That Techo planner/journal could cover nearly everything that's worth writing down. But I encourage dozens of other digital logs to spawn themselves like viruses. I can't help it. I want //all// the details for some reason. I'd forgotten that back in July of 2021 I bought [[Rainer König's org-mode course on Udemy]]. I made it through only a handful of modules before getting distracted by something else, so I picked it back up tonight. What a pleasure to hear his accent and see him show off tagging and checklists. I see he's using Linux, too.
I had to refer to some old CPAP notes in [[Craft.do]] and did a quick export of that page to [[Markdown]], just to see what it looked like. It was more gross than I remembered, because I'd used a bunch of Craft inter-document links and block references, and they look terrible in the exported Markdown. This makes me want to stick with [[org-mode]] even more.
Accomplished two things today: # Got [[Plex]] on the [[Raspberry Pi]] upgraded to the latest version, and took copious notes so I'd remember how to do it again later. # Started ripping the [[Joan of Arcadia]] DVDs I'd bought Sarah for Christmas. I was going to use the new 2021 MBP for DVD ripping, but out of laziness I hadn't installed [[HandBrake]] on the new machine, and I don't have enough USB-A/USB-C adaptors to plug in both the DVD-ripping Seagate spinning hard drive and LG DVD reader to the new MBP anyway. It turns out, I rather like letting that process tie up the old, secondary computer so I can do other things on this newer one.
I've had a bunch of different paper and electronic things that have aspired to being [[lab notebook]]s, but I have very little to go on regarding how academics use them. I think this stuff is fascinating and I want to get better at approaching home and work projects as experiments where we try things and document our results, and less as one-and-done projects that we finish and then forget about. [[Ten Tips For Keeping a Better Lab Notebook - Gold Biotechnology, Inc.|https://www.youtube.com/watch?v=O3isoitK-Ac&t=100s]] <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/O3isoitK-Ac' frameborder='0' allowfullscreen></iframe></div> --- [[What is a Lab Notebook?! - Alex Dainis|https://www.youtube.com/watch?v=sW9YBcDAAvI]] <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/sW9YBcDAAvI' frameborder='0' allowfullscreen></iframe></div>
I know people can't live forever, but I really hate seeing Howard Hesseman go. I was just barely old enough to get the humor in [[WKRP in Cincinnati]] when it ran originally and it left deep impressions on me. Loni Anderson was 90% of my initial interest in it, but there was so much more to the plots, people, and music that made me stick around. The two-part "An Explosive Affair" story was the pinnacle of comedy + drama for me at that time and it still holds up well today. That show was filled with great actors, but Dr. Johnny Fever transcended being a character. Hesseman just //was// Johnny.
I keep inventing scenarios where putting more and more historical data (dates, entries, events, milestones) in [[org-mode]] will be potentially useful in the future. Like, I could go back and mine old day planners from college for things that happened on certain dates, and put those all into org-mode with active timestamps that'll show up in the agenda. This is the way my brain responds to tools that have deep history and a solid future. It's the difference between fancier "hot" tools like [[Roam]] or even [[Logseq]]/[[Obsidian]], that are newer, easier, and prettier to work with in the current moment, but their enhanced features all require surrendering to their way of working and formatting data, so I never get totally comfortable with them and my horizon of possible uses gets smaller. Really, it's just that I don't want to go through another platform switch (or multiple ones) and will do anything to reduce the chances of that.
One reason I keep using [[org-mode]] and [[Doom Emacs]] is that every time I start adding notes to it (or looking back at old ones), I feel simultaneously calmed, energized and happy. It's similar to the feeling of writing in the [[Hobonichi Techo]], but with more sprawling possibilities for slicing and dicing, and so many things to learn. I'm frustrated that I don't learn things faster, but it's fun anyway. And it's a tiny rebellion against 95% of the other modern ways information is collected these days. I guess it's really more like cosplay where I get to pretend I'm doing all this at an 80s [[VT100]] terminal in a computer lab. And that makes me think BOY would it be cool if I could get to my org files from a real live VT100 CRT terminal, and be able to dip into a web browser when I need it. I'm sure I've written all this probably 10 times elsewhere in this wiki.
I love using `+vertico/project-search` (keybinding: `SPC s p`) in [[Doom Emacs]] to search all the files in the current project. But I would always get "[Omitted long matching line]" whenever a matching result was found in a paragraph that was more than 999 characters long. Thanks to [[Jack|Jack Baty]] who said to look for a [[ripgrep]] setting called `--max-columns` that could affect this. I found the setting as an argument in the `consult-ripgrep-args` variable. I checked the variable value and found that the `--max-columns` was set to 1000. I temporarily changed this to 4000 to see what I'd get in project search results. It didn't help the usual `+vertico/project-search` scenario (of course), but it did help when I did a `consult-ripgrep` and I can finally see long matching lines displayed. Only problem is that there's no quick keybinding for it yet, but I can add one. So here's the variable I added to my `config.el`. Everything was the same as the defaults except for where I set `--max-columns=4000`: ``` (setq consult-ripgrep-args "rg --null --line-buffered --color=never --max-columns=4000 --path-separator / --smart-case --no-heading --line-number .") ```
Huh. I bet it would be a good practice at the end of each month to physically go through that month's [[daybook]], [[org-journal]], and [[Hobonichi Techo]] daily entries and copy and paste the big events and milestones into a monthly summary page in [[org-mode]] somewhere. I always want something like this that lets me see things at one or two levels higher than day-to-day minutiae. Doing it manually (not just tagging things or transcluding them) would force me to review old things regularly.
When I [[last proclaimed vegetarian-ish-ism|2019-07-30 Journal (vegetarian-ish)]], it was late July of 2019. Today I watched [[The Cost of Cheap Chicken – NYT|https://www.nytimes.com/2022/02/10/opinion/factory-farming-chicken.html]] and it had exactly the intended effect of making me wonder why I regularly eat so much chicken that is surely produced under conditions similar to, or not much better than, the ones shown in the video. It's not even all that surprising to be reminded of it because we all know this is a dirty business. I was just due for a fresh look. I'm not even opposed to (someone other than me) killing chickens for me to eat, but I'd really rather they not suffer unnecessarily in huge numbers in such gross environments. To do this all measurably better makes chicken a lot more expensive, and I ought to be willing to pay for that. It's just not the caliber of chicken that you run into on a typical day in a bar or our employee cafeteria.
If there were a filter to hide sarcastic tweets on Twitter, what would be left in the timeline? I don't think I can spend any more brain cells trying to figure out whether someone is serious or just making a joke I'm too dumb to get.
A friend at work mentioned that his receiver and turntable were getting long in the tooth, and they were already decades old when he bought them. He suspected he could get better sound than what he was hearing. Of course I recommended various flavors of the [[U-Turn Orbit]] unless he wanted to go vintage again and make a project out of restoring and maintaining an old receiver or turntable. Not everyone wants to do that.
Some people on a call at work today said that keeping a consistent bed time and wake time every day — even on weekends, yikes — has helped them tremendously during the ups and downs of the pandemic. Something about training your body to want to go to sleep at the right time. I've never attempted that, but I'm this close to trying it or seeing how close I can get. I still have daily bouts of extreme sleepiness in the afternoons. It doesn't last that long and may have something to do with the sugar and carbs in the sandwich bread I eat at lunch anyway. But any change for the better would be welcome.
Tonight I started making some flashcards on real live index cards (props to Sarah for the suggestion) to teach myself all the characters in the Cyrillic alphabet for learning [[Russian]] again. I'm following so many Russia experts and native Ukrainians on Twitter now that every time I see some Russian in a tweet, I want to know more about what it says. I don't have a reason to learn it other than that I'm alive and I can and it's interesting.
I've heard my friend [[RC]] say "[[Input, self-discipline; output, freedom|Input, self-discipline; output, freedom.]]" for years. I still haven't internalized it fully, but trying [[a consistent daily bed/wake time|2022-02-15 a consistent daily bed/wake time]] for the past three days is making me a believer. The freedom has been manifesting as being able to do a random extra household chore and having time to swap out a dead battery in the [[Ricoh GR (2013)]] in the morning before work, not having to drive in a hurry to get to work on time, and hitting a wall less often in the afternoons. It turns into freedom from a lot of worry and stress. Huh! It also means less time to mess around on the computer at night, so boo to that, but still.
While importing some [[FLAC]]s I bought from [[Bandcamp]] and updating the [[CD-ripping process]], I thought about what's behind my brain wanting to possess these things and generate such an arcane checklist to keep track of it all. I like to think I could be a minimalist "digital nomad", but I'm really more like Navin Johnson in //The Jerk//: "The ashtray, this paddle game and the remote control and the lamp and that's all I need." Even if all these tracks were available for free forever in [[Archive.org|http://archive.org/]] or whatever, I'd still feel compelled to hoard them on local storage that I can touch. //Just in case.// Part of it could be from the idea that if I buy a thing, it's mine and I can put it somewhere and do something with it. If I only buy access to it on [[Apple Music]], that's certainly not enough. And when I do get a single local copy, even that's not sufficient, because what if it gets stolen, corrupted, or erased? Well, then I have to copy it to at least one or two other local places, plus a backup folder in [[Backblaze B2]], that, you guessed it, is neither local nor owned forever by me. It's only rented and stops being available when I stop paying for it. Most people would just hit "Play" on their streaming service and be happy. --- Sometimes I wonder why I bother to keep individual [[org-mode]] [[daybook]]-like files for things like monthly payments for our utilities bill. Today was a good reminder, when I went to pay the February bill and saw in the .org file for our utilities that I had unquestionably forgotten to pay it in January. It didn't help that I had accidentally marked that task as Complete in [[Things]]. When I actually remember to pay bills on time, I never miss a chance to log them in org-mode because it's fun. So I'll keep doing it.
I've now been reading so much about [[Ukraine]] and Russia that I dreamt last night that I ended up at Vladimir Putin's "house", but he didn't really live there. He showed up, alright, and all of us tourists waiting to have dinner with him had to mill around in a few cramped rooms, one of which was a dingy living room with uncomfortable leather couches, and the other two were recreations of his childhood and teenage bedrooms. The teenage one had a //lot// of exotic high-end audio equipment. I went through a hallway with plaques describing his hobbies, which happened to be audio, synthesizers, and film cameras and developing (hmmm), and that opened to a gigantic, bright two-level open mall area where his collection of old synthesizers was on display, as well as some more modest thrift-store caliber audio stuff, which you could apparently buy? There were some small dogs milling around.
Mark Lanegan of [[Screaming Trees]] died today. He was only 57. This is still one of my favorite songs of theirs. All melody: [[Screaming Trees - Bed Of Roses|https://www.youtube.com/watch?v=GAmZsfFKCxU]] <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//GAmZsfFKCxU' frameborder='0' allowfullscreen></iframe></div> And I found out just now how great his first solo album, [[The Winding Sheet|https://en.wikipedia.org/wiki/The_Winding_Sheet]], (from 1990!) was.
I've seen a lot of scary images of bombs and shelling in [[Ukraine]] since last night, but I can't handle photos of refugees' frightened dogs.
[[Former NATO Commander: 'Is The West Going to Tolerate Russia Doing This to Ukraine?'|https://foreignpolicy.com/2022/02/27/breedlove-nato-commander-russia-ukraine-war/]] > ''FP:'' Some Ukrainian activists, as well as former members of the Ukrainian parliament, have called for a no-fly zone to be implemented over Ukraine. What would that entail, and do you think that that is something that we may see in the coming weeks? > > ''PB:'' I am actually a proponent of it. But let me now tell you why it will probably not happen, because the reality of a no-fly zone is, it is an act of war. There are a lot of people who don’t understand no-fly zones. You don’t just say, “That’s a no fly zone.” You have to enforce a no-fly zone, which means you have to be willing to use force against those who break the no-fly zone. The second thing, which nobody understands, is if you put a no-fly zone in the eastern part of Ukraine, for instance, and we’re going to fly coalition or NATO aircraft into that no-fly zone, then we have to take out all the weapons that can fire into our no-fly zone and cause harm to our aircraft. So that means bombing enemy radars and missile systems on the other side of the border. And you know what that means, right? That is tantamount to war. So if we’re going to declare a no-fly zone, we have to take down the enemy’s capability to fire into and affect our no-fly zone. And few understand that. And that’s why, if you talk about a no-fly zone, it is a very sober decision because many in the world would interpret it as an act of war.
[[‘Yes, He Would’: Fiona Hill on Putin and Nukes - POLITICO|https://www.politico.com/news/magazine/2022/02/28/world-war-iii-already-there-00012340]] > Reynolds: The more we talk, the more we’re using World War II analogies. There are people who are saying we’re on the brink of a World War III. > > [[Fiona Hill]]: We’re already in it. We have been for some time. We keep thinking of World War I, World War II as these huge great big set pieces, but World War II was a consequence of World War I.
The [[Leopold FC660C]] [[Topre|Topre switches]] keyboard lives at my cube at work, and I’m working from home today to keep germs away from coworkers. I’m stuck with the [[Keychron K2]] for the day, and even with all my mods to it (heavier keycaps, lots of sound absorption and weights added), it’s still deafening!
[[Andrew Exum]] on [[Twitter|https://twitter.com/ExumAM/status/1499940627701809153]]: <<< I think his kind of public bragging is really dumb, and I can only explain it by noting that we just lost a really embarrassing 20-year war and some general officers are probably eager to trumpet a success. https://www.washingtonpost.com/opinions/2022/03/04/milley-ukraine-russia-weapons/ We are doing something fairly incredible — overtly supplying advanced armaments to help Ukrainians kill Russians — and I see absolutely no reason why we need to call even more attention to this fact. We — Americans — see a real difference between supplying the Ukrainians with advanced armaments (and teaching them to use them) and actually fighting the war ourselves. The question I have is: Do the Russians also see that difference so clearly? Everyone knows what is happening, and our defense assistance to the Ukrainians was a matter of public record before the war. But when we’re worried about Russia getting backed into a corner and escalating, are these articles really that smart? Also, arguably the most important relationship in the world right now is the one between Mark Milley and Valery Gerasimov. Those two guys could very well be the guys who deescalate whatever gets escalated. Why does Milley need to be chaperoning David Ignatius around Europe? I don’t think we should be rubbing Russia’s nose in this. They’re angry enough already, and I genuinely fear how they might lash out as their casualties inevitably climb higher thanks to all of those Javelins and Stingers. Maybe we should all just shut the f*** up for once? “You have to put this article into its American context, President Putin. The American military badly botched the withdrawal from their failed war in Afghanistan, and they need to rehabilitate their reputations via American media.” (Some hapless Russian intel analyst, probably) <<<
Where to start? I'm gonna end up using this wiki to process a bunch of things I've seen floating around out there with regard to the awfulness in [[Ukraine]]. It won't be especially interesting or nerdy, but it'll help my brain.
Uh-oh. [[Berna]] was updated to version 3 since the last time I looked: https://www.giorgiosancristoforo.net Oh man, there's so much other software from him on that page.
[[Calvinshootsfilm|https://www.instagram.com/calvinshootsfilm/]] on Instagram is again making me wonder why I ever shoot anything on digital anymore.
[[Ezra Klein Interviews Masha Gessen - The New York Times|https://www.nytimes.com/2022/03/11/podcasts/transcript-ezra-klein-interviews-masha-gessen.html]] I feel like Masha Gessen is one of those people we should listen to very closely about all this mess, as depressing as it is to hear her take on things. She seems to get Putin and parse his words better than almost anyone else besides [[Fiona Hill]]. > I mean, least worst in the short-term is still pretty awful. But it’s pretty clear he takes Ukraine up to say Kyiv. He imprisons or more likely kills Volodymyr Zelensky. The West sort of negotiates a cessation of the war in exchange for letting him take most of Ukraine. And then the optimistic part — I mean, that’s the best case scenario in the short-term because at least the killing stops — and then the optimistic part is he dies soon after. Because if he doesn’t, it happens again and again and again.
Well, hell! I ran across [[moonshake3d]] and "learned" about Blender today, and came to this wiki to add a tiddler and then found... [[Blender]].
I went from not wanting to pick up a camera for months straight back to spending the better part of a weekend processing [[Fujifilm X100T]] photos. And then I started reading about [[One Camera, One Lens, One Year]]. Help. <a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/51952489042/in/album-72177720297526020/" title="Full Moon Fever"><img src="https://live.staticflickr.com/65535/51952489042_6ea5cbca65_z.jpg" width="100%" alt="Full Moon Fever"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
Man, we can't keep losing drummers like this. Especially ones that are only 50 years old. I just liked knowing Taylor Hawkins was out there, trying his best to improve his craft and live up to the example of those who came before him. I loved seeing him and Dave Grohl nerd out about the music they listened to growing up, and how they were cosmically lucky to be paid so well to play in front of people. I //don't// love how everyone is suddenly a toxicology expert, with all their theories of what he had in his system when he died, and why. No one knows anything.
If I would just admit to myself that [[Drafts]] is my de facto [[daybook]]/inbox/notepad/journal and most things never actually migrate out of there, I'd probably be happier!
What has happened to this wiki? It used to be so easy to add at least one tiddler a day. I know I've whittled away at the time available each day, but I've also just gotten lazier. I've been researching [[Sony WM-DD series Walkmans]] again. A lot. It's not gonna be long now.
Replaced the belt in the [[Sony WM-EX511 Walkman]] with one from [[Marian Mihok]] on eBay (only realizing later that https://fixyouraudio.com/ is his website). It's a perfect fit, and I also cleaned some old dried belt rubber off of the brass capstan flywheels and intermediate pulley and motor pulley. Some of the gunk was really baked in to the motor pulley and wouldn't come off with alcohol and made the pulley wobble, so I put a tiny dab of Mother's metal polish on it and ran the motor while holding a paper towel wedged around the groove until the gunk cleared off and the metal was equally shiny. Now when it spins it's smooth. [img[http://twelvety.com/philtiddlywiki_images/2022-04-30-sony-wm-ex511-belt.jpg]]
While trying to decide whether [[org-mode]] or [[Markdown]] files or [[Roam]]/[[Logseq]] were better for logging the work on the [[Sony WM-EX511 Walkman]], I realized the answer was none of the above, and this wiki would do just fine as long as I create individual dated tiddlers noting what I do at each step. I forget that often!
Although I replaced the [[Sony WM-EX511 Walkman]] [[belt last night|2022-04-29 replaced belt in WM-EX511 Walkman]], the whole unit is still so mechanically noisy that I feel like I'm damaging it when it plays, so I'm going to hold off on using it until I get its parts properly oiled and greased. I have a PDF of the service manual, so I can theoretically lift the circuit board up and get to where the gears mesh together and pull the capstan flywheels out and oil their bearings. Not tonight, though. I want to do this all in one shot and need to find the right gear grease first.
I didn't know these two things about [[Day One]] on macOS: Slash commands for inserting the current time, date, tomorrow's time/date, yesterday's time/date, lines, headings, and to-do lists: * https://dayoneapp.com/guides/slash-commands-for-day-one/ It can understand [[Markdown]]! * https://dayoneapp.com/guides/markdown-guide/
Ok, wiki. What are we doing here? Are you going to be a tool I use or what?
Trying to come up with a good place for [[logging]] medications and vitamins taken each day so I can see them over time. Could be a mobile app (which [[Apple]] says is coming to the Health app in the new iOS), could be [[org-mode]], or just a dedicated file in a [[Markdown]] wiki like [[Craft.do]]. ''Whatever I do, I don’t want to have to change it anymore. It has to be good enough to work for decades.'' Each line could be: ``` * [[2022-06-22]] 50 mg Zoloft, 5000 IUs Vitamin D3, Centrum Minis Men 50+ multivitamin * [[2022-06-21]] 50 mg Zoloft, 5000 IUs Vitamin D3, Centrum Minis Men 50+ multivitamin ``` but that's kind of repetitive and not that useful. I know org-mode is great at slicing and dicing very structured data like this. I could always do a [[Drafts]] action to append it to a long-running .org file. Or a Markdown file. But then Craft can also have "pages" that are dedicated to one thing (like a [[topic journal|Topic journals]] in a [[bullet journal]]), and if you put a date in brackets, that line will automatically show up as a backlink on your [[Daily Notes]] page. Or I could really go nuts and write this in a grid on paper in the [[Hobonichi Techo]]. Why does this stuff take so many spare cycles in the back of my brain while I'm supposed to be doing other things?
While mowing the lawn and listening to [[The Weekly Review]], [[Jean MacDonald]] mentioned [[Ward Cunningham]] and how he’s the inventor of the [[wiki]] and it made me remember that [[Craft.do]] ''can just be a wiki'' and I can make my own structure and link to things within it. Instead of relying on backlinks and tags, I can make a household account page or a household vendors page and link to all of our vendors and details about them, or our appliances in a way that can make it easy for us to get to. And that double bracket wiki behavior is the kind of thing that can live on beyond Craft no matter what [[Markdown]]-based wiki I use.
I can't focus on any one thing. I'm just blown about by the winds of novelty and attention. [[Synthesizers]], [[analog tape recording]], [[photography]], [[notetaking]], all of it rotates endlessly, and I do little bits with each of them for a day or two, but I never finish anything other than deadline-driven assignments at work.
Boy am I glad we got to see [[Memoria (2021)]] in a theater.
I could blame my lack of updates here on all the family obligations, chores, and home projects that have sprung up over the past few weeks, but it's not really that. It's just a lack of will/focus. I'm still using [[Craft.do]] for the digital version of the daily log (usually first captured in [[Field Notes]]), but I'm also still not entirely comfortable with the way it lays out blocks, especially when exported to [[Markdown|Markdown]]. On the one hand, I'm glad it's not a proper outliner, but it can also approximate one if I need it to. I like not having everything in bulleted lists, but then when i need to put a blockquote around a section of text, making that an indented child of a parent block results in some ugly Markdown exports. And then when I compare it to the way [[TiddlyWiki]] works with one tiddler per thought, TW just seems to fit my brain better, but there's more friction. I don't know. I'll just keep beating my head against it. What happened to the simpler times when I kept everything in a single folder of text/Markdown files and used [[nvALT]] to manage all of it? I could go back to that right now with any number of apps, but I don't. Even worse, I still maintain and edit and add more of those files to that folder, but I also have stuff in all the other silos. Using a pen to update my [[bullet journal]] is the quietest, slowest thing I can do with "data". Updating TiddlyWiki is the next-slowest, next-quietest, and people might actually see it.
All that stuff about [[ultralight hiking]] is sticking in my brain and making me wonder how I could apply it to how much photo gear I carry (when the spirit moves me), how much computer gear I buy and maintain, and how much work is involved in keeping my umpteen [[notetaking]] systems working and whether there's any benefit to it.
This is going to be just like that [[2021-07-09 where to put and keep info]] entry from last year. Anyway, I saw [[Jack|Jack Baty]] [[write this|https://baty.net/daily/2022/2022-07-24/]] and it's where I am today, at this hour, but I've been back and forth on this three times today already: > I'm beginning to believe that keeping notes in tiny, single-thought "Zettelkastans" is not for me. When there are hundreds or thousands of small, separate notes, it requires software to tie things together. I'm inclined to use longer "topic journal" files for specific topics. And rather than linking to them in a "daily note", I add log entries to the bottom of the files themselves. No backlinks required. I even went back and forth on it three times in the length of one 30-minute car trip! The other thing I don't like about a [[Zettelkasten]] is that every item is the same digital weight, even if one note has a ton of text and another has nothing but a title and exists only to make backlinks work. You could say the same about tiddlers, but the extra ounce of friction involved causes me to not make tiddlers I don't need or care as much about. They feel more like files.
Dangit, I don't know why this is happening. But I can look at the Battery preference pane of the [[14-inch MacBook Pro (2021)]] and see a steady, linear decline over the past 24 hours, and the computer should have been asleep that whole time. Things I found and am trying: https://support.apple.com/guide/mac-help/if-your-mac-sleeps-or-wakes-unexpectedly-mchlp2995/mac * Clicked Battery > Power Adapter > turned off “Wake for network access”, even though the computer wasn't plugged into a power adaptor when this happened. * In the Sharing preference pane, turned off AirPlay Receiver (it was on). All other Sharing services were already off. https://osxdaily.com/2022/02/11/is-macos-monterey-draining-your-battery-overnight-in-sleep-mode/ * Turned off Bluetooth * ''Oh hell. I had left it plugged into a USB-C dongle that connects to a BenQ monitor HDMI and USB, and Ethernet, and that may be what did it.''
I've asked myself this before, but: What is really so wrong with having a dumb digital [[Daily Note|Daily Notes]] for each day (because in the moment, it requires no thought about where something should go) and then copying and pasting individual entries from there to their own specialized log files (and expanding on them when needed) if they're better off in those dedicated places? (Food log, car maintenance log, daybook, journal, etc.) People with paper [[bullet journals|bullet journal]] do it and they migrate (hand-copy) stuff to their "[[collection pages|Topic journals]]" every night and it's all ok. Is it not allowed in digital because of "one instance of each piece of data"? And then of course I took my first exhausting Tabata workout class in our work gym last night and I logged that in an Exercise journal in [[Day One]] and nowhere else.
[[Jack replied|https://wiki.baty.net/#2022.10.12%20-%20To%20Phil%2C%20Re%3A%20Copy%20Daily%20Notes%20items%20to%20topic%20journals%3F]]: > ...My thinking is that I don't like having anything too important in a daily note (regardless of software) as it requires said software in order to pull things together later... This, a hundred times, this! There are so many platforms that do some version of [[Daily Notes]] and rely on backlinks to bring order to them, and they all work fine on their own, but if you rely on the backlinks, then as soon as you splinter your Daily Notes across more than one repository/app, you lose the efficiencies that would have materialized if you'd stuck with one. And sticking with one is nearly impossible! Your tags/page-links aren't all in one place and they don't autocomplete when you type double-brackets and it becomes a mess. If I could, I'd prefer to use Daily Notes for what they're good for (capturing things in the moment with a minimum of thought about where they should go), and then copy those items to where they should live. The only problem with that dumb solution is that I rarely do it. I just let the daily notes languish wherever I jotted them ([[bullet journal]], [[Logseq]], [[TiddlyWiki]], [[Drafts]], etc.).
I wish people would entirely ignore Elon when he tweets. Is anyone surprised at what he posts? As long as we keep paying him any attention, he’ll keep doing it. I’ve fallen back into [[amp research|2021-12-04: amplifier research]] again, though I still don’t //need// one. What I //need// to do is commit to fixing the [[Harman Kardon PA2200]]. (What’s that? Didn’t I successfully fix it two years ago? Ha. Nope.) But my eyes still wander to amps by Arcam, Rotel, or the [[Cambridge Audio CXA81]].
Starting in 2003, [[Roon]] will go up to $149.88/yr if you keep paying annually. I've been paying $119.88/yr so far and it's been great, although I under-use it. +30 dollars a year isn't going to kill me, and we blow through twice that in a decent dinner out. But it still makes me wonder: is ~$150 a year to play my own local audio files justified when things like [[Plex]] are out there and could get me 80% of the way there? The way around some of this pain is to go with a lifetime subscription sometime in the next month for $699.99, which, OUCH. The urgency here is that the lifetime plan bumps up to $829.99 on 1/1/2023, which, even worse OUCH. I really don't like being extorted into thinking this way about spending a huge chunk of money, even if it's just one time. But one way that helps is to think of Roon as a high-end audio component, and $700 for something that makes listening to music easier and better isn't outlandish on its face. If I keep going with $149.88/yr, I'll end up in 4.67 years wishing I had gone with the lifetime plan (assuming they don't raise the annual price in that time). !! Assumptions if I go with lifetime right now: * Roon will still be in business in 4.67 years. Fairly confident on that one, since they're by far the best option for this kind of software right now. * Roon won't make the server software worse. I guess they won't? People on the forums are upset right now about catalog searching being offloaded to the cloud, requiring an internet connection to browse your own stuff, but in practice I haven't had any problems. * I won't be sorry in 4.67 years or sooner. !! Drawbacks of going with lifetime: * I'd be one less person actively giving them money regularly, making them less likely to stay in business. Their incentives and mine are diametrically opposed here. But if they keep raising prices every few years, I think they're going to drive people away anyway. !! Advantages of Roon: * The UI is by far the best out there. Metadata, artist info, rediscovery of forgotten stuff, Roon Radio. * The [[RAAT (Roon Advanced Audio Transport)]] protocol and that damn purple dot. They have me right where they want me with that. * DSP, which I don't use, but if I want to try room correction curves (yes, later), it's there. Also tons of control over sample rate conversion. * [[Roon ARC]] lets you play your home library from anywhere, although when I tried this at work yesterday my phone got hot enough to stop charging. Yikes. But I bet ARC will get better and better. * Still supports the [[Squeezebox 2]] by emulating [[Logitech Media Server]]. I have a couple of those still around, although not in the mix right now. But I could! * [[Roon Optimized Core Kit]] on the [[Intel NUC]] (aka [[Roon Intel NUC]] at my house) is wonderful. I barely have to touch it and it just works. It can run on so many things. * ''The short answer: It's the best one.'' Knowing that you've bought the best available thing counts for something. !! Alternatives: * Plex. Serviceable and cheaper, but not nearly as refined, nor as targeted towards audio nuts. * [[Apple Music]] [[lossless]]. Great, already paying for it, and is my go-to away from home on the phone, but when using it at home over [[AirPlay]], it annoyingly cuts out at the beginning of every track. And doesn't have all the stuff in my local library, although [[iTunes Match]] helps. * Running Logitech Media Server on a server again. Free, but nope. Not doing that after seeing the light with stuff like Roon. * A dedicated audio server like the [[Bluesound Vault 2i]]. $1400 for a worse UI. Nah. * [[Audirvāna Origin]] on a Mac. Hmm. Need to read more. The ultimate question is: Do I //ever// plan to go with lifetime? If I do, now is the least-bad time to do it. It'll only get worse later. Or do I want to sink at least $1500 into 10 years of Roon by paying annually? I don't think so. Plus, it's not like there will stop being a need to play stuff in our local library. As long as that need is there, as long as long as Roon is better than everyone else, it's the way to go. I think I'm going lifetime. Gulp. Now I just have to make myself feel better by dialing down spending on a bunch of other things I don't care as much about that I spend too much money on every month. ''Update:'' [[2022-11-20 signed up for Lifetime on Roon]]
For $699.99. Yikes. But I'm glad that's over.
The new 2022.10.0 version requires a manual install, which I'll use [[SD Memory Card Formatter]] to reformat the card with. Then tried [[ApplePi-Baker]] to flash the new [[RoPieee]]XL OS, but got all kinds of system errors, so I'm reluctantly going back to [[Etcher]] and crossing my fingers. * Finished flashing the card with Etcher. Installed card in RoPieee Pi but it wouldn't boot. Uh-oh. Power-cycled, still wouldn't boot. * Flashed again with Etcher. Still wouldn't boot. * Reformatted SD card with SD Memory Card Formatter with full Overwrite. Successful. * Re-downloaded compressed RoPieeeXL image from https://image.ropieee.io/ropieeexl_ose_pi4-2022.10.0-stable.20221023.542.bin.xz * Flashed again with Etcher. Still wouldn't boot. * Powered down the Pi, removed the card, blew compressed air into SD card slot, reinserted, powered up. Wouldn't boot. * Unplugged Ethernet around stereo sheld from Pi, moved Pi next to the router and plugged in with a different Ethernet cable. Wouldn't boot. * Checked the admin panel of our router and saw the RoPieeeXL device in the listing at 192.168.1.191, but Inactive. Network port lights on the Pi weren't flashing anyway, so I didn't expect to see anything there. * Tried https://192.168.1.191 and http://192.168.1.191 in the browser, but got nothing, of course. * Tried flashing the SD card with ApplePi-Baker again (which finally started up this time), but the whole Mac crashed hard in the middle of it! * Stupidly, tried ApplePi-Baker again and the Mac crashed again. * Deleted ApplePi-Baker. See [[ApplePi-Baker]] for details. * Downloaded uncompressed RoPieeeXL image from https://image.ropieee.io/ropieeexl_ose_pi4-2022.10.0-stable.20221023.542.bin, flashed with Etcher. Wouldn't boot. * Used a brush to clean the SD slot contacts on the Pi. Wouldn't boot. * Formatted another SD card (16 GB) with Quick option in SD Memory Card Formatter. Flashed using uncompressed BIN image with Etcher. Installed and this time I'm going to wait at least 30 minutes before I touch it. (It's 1:03 PM now.) It doesn't look like it's booting, but people in the forums say it can take a while for the first boot of a fresh install. Fingers crossed. ... That didn't work, either. * Bought a brand new SanDisk 32 GB card. Flashed RopieeeXL compressed image to it with Etcher. Didn't boot. * Cleaned the Pi SD card slot contacts with alcohol. Didn't boot. * Tried an old Gen1 Raspberry Pi power supply. Didn't boot. * Blew more dust out of the inside of the Pi with compressed air. Didn't boot. * Added Etcher under Security & Privacy preference pane -> Accessibility, then flashed compressed RoPieeeXL image again. Flashed with compressed image. Didn't boot. * Tried running Etcher from the command line and flashing compressed image: `sudo /Applications/balenaEtcher.app/Contents/MacOS/balenaEtcher` - Didn't boot. * Well, this is embarrassing and a [[lesson learned]]: [[Know your equipment]]. I forgot that the Pi I bought for all this is a 3B+, not a 4, and I've wasted a whole day trying to install the v4 RoPieee image on a 3B+. * When I realized that, I used [[Raspberry Pi Imager]] to flash the proper Raspberry 3 image from https://image.ropieee.io/ropieeexl_ose_pi3-2022.10.0-stable.20221023.540.bin.xz and the Pi booted just fine and now [[Roon]] plays again.
See [[2022-11-20 updating RoPieee XL to v2022.10.0]] for the details as they unfold. I've either: * bricked the Pi * its hardware has gone bad * I've ruined the SD card slot * all 3 SD cards I've tried are corrupted * or the [[RoPieee]]XL 2022.10.0 image is bad or ''not compatible with my Pi'' ''Hello! I'm an idiot. For the past 24 hours I've been trying to install a Raspberry Pi 4 version of RoPieeeXL on a Raspberry Pi 3B+.''
Dang! It's always something. It was working fine yesterday and now I've turned on music and it's stuttering while playing into both coaxial inputs on the [[Cambridge Audio DacMagic 100]]. Tried rebooting the [[Roon Intel NUC]], restarting the [[Roon]] server on the NUC, and rebooting the [[RoPieee]] [[Raspberry Pi]]. Playing Roon audio to the iPhone over wifi works fine. * Rebooted the FiOS router. Didn't help. * This person had a similar problem: https://community.roonlabs.com/t/choppy-playback-on-ropieee/205020/14 - Tried the optical output from the [[JustBoom Digi HAT]] into the [[Cambridge Audio DacMagic 100]] and now it's fine. I'd rather the coax connections work, but this will be fine for now. May also compare to USB later.
Last week I asked [[Twitter]] for an export of all my stuff. Took a few days, but the email finally came through. I'm downloading it now, but it's 690 MB? Seems like a lot for a person who doesn't tweet that much. (The bulk of the space was in images.)
When I was troubleshooting ~~the [[RoPieee]] [[Raspberry Pi]]~~ myself the other day (see [[2022-11-21 still working on the RoPieee Pi]]), I temporarily flashed it with the default [[Raspberry Pi OS|https://www.raspberrypi.com/software/]] to test the hardware (which was fine, of course), hooked it up to our projector to the HDMI output, and got to see a whole bunch of text-only status updates and log messages appear. I never get tired of watching Linux systems boot and show their status line by line. This reminds me: headless systems are no fun after the novelty of logging in remotely via SSH wears off. Every home server should have a display and keyboard. Otherwise it feels like building a ship in a bottle. After a bunch more status messages rolled by, it hung for 20 minutes so I rebooted and then a beautiful screen appeared, similar to this one. It made me want to set up a dedicated RPi for serving files or just for messing around: [img[http://twelvety.com/philtiddlywiki_images/2022-11-23-raspberry-pi-desktop.png]] Image from https://www.radishlogic.com/raspberry-pi/change-desktop-background-of-raspberry-pi/
Switched the [[RoPieee]] [[JustBoom Digi HAT]] off and now am sending audio out through only the USB to the [[Cambridge Audio DacMagic 100]]. And now I see the Cambridge icon in [[Roon]], and the [[RAAT (Roon Advanced Audio Transport)]] path ends in the DacMagic, which feels nice.
I forgot about [[Orgro]] and just looked at it again (for viewing [[org-mode]] on iOS). It's gotten better! It still can't search across files in a folder, but I think the way I use org-mode best is to not put //everything// in it, but instead focus it to a single folder of mostly log or notes files. So if I want to search for something about the maintenance history of our car, I know it's going to be in the one `.org` file dedicated to that car, and everything in it will be in a [[datetree]]. I just need to open that file in the app, search for a string inside the file, and only the headings that have that string in them (or their notes) will expand. And Orgro is really good at visibility cycling, as described in [[the manual|https://github.com/amake/orgro/blob/master/assets/manual/orgro-manual.org#visibility-cycling]]: <<< Rotate sections between expanded and collapsed states just like Org Mode in Emacs: # Overview: Show only top-level headlines # Contents: Show all headlines of all levels, but no body text # Show all: Show everything Activate with the button in the top app bar. <<< And because it's still read-only, I'm not worried about screwing up my org files on iOS when I'm away from the computer.
Re-found this tiddler the other day and it may as well be brand new information: [[Alcohol as a food, not a drug]]. Also, I figure I can skip drinking beer at home for most of December because there are so many social outings going on in the next few weeks. It’ll help me save a few calories and a lot of energy during the time I’ll need it most. I suspect it’ll feel less like deprivation and more like relief.
[[Craft.do]] just added GPT-3 AI but there's still no way to make all the text in the UI and documents bigger. With every new enhancement and new style of "card", I feel the urge to leave grow stronger. I've kind of already left anyway. I almost never use it. [[Jack nailed it|https://baty.blog/posts/2022/11/29/Taking-control-away-from.html]]: > I'm having one of those days where I want to burn my whole process to the ground and start over. Today's thing is that I don't want to have to go "through" an app to get to my stuff. I want to be able to work directly from my Mac's finder. And I want to be able to move files around without breaking references or having them become lost to an app.
A-ha! I kept trying to come up with justifiable uses for a "home file server". Being realistic, we haven't needed one for a long time and don't really need one now. But as I feel my periodic pull towards [[org-mode]], I figure I can keep logging things like mortgage payments, car maintenance, house repairs, etc., in org-mode, export those with [[ReadTheOrg]] each time they get updated, and have those auto-copy to the [[Raspberry Pi]], which can run a web server to make those visible only to our network. And here's my chance to finally use [[Tailscale]]: Run that on the Pi and on our phones so we can get to the HTML files when we're out of the house.
Sometimes the aesthetic look of a clean, modern notetaking app is more important to me than at other times. That would usually push me to [[Craft.do]] or [[Roam]] or [[Tana]] something. But today, [[org-mode]] feels pretty good, because its aesthetics look like something that'll be stable and around long after I need it. And I mean org-mode centered around [[Topic journals]], specific logs, and project files – not [[Daily Notes]]. I don’t think org wants to work that way.
Saw [[Ashton Womack|https://youtu.be/CpTQ6orqY_w]] on YouTube talk about her "intentional iPhone" and she showed the Screen Time widget right there on her home screen. Tried it and it's eye-opening to see the hours rack up with so little effort. Yikes. [img[http://twelvety.com/philtiddlywiki_images/2022-12-22-screen-time.png]]
<a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/52601884010/in/photostream/" title="Will Simmons"><img src="https://live.staticflickr.com/65535/52601884010_1b91074e67_k.jpg" width="100%" alt="Will Simmons"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> I need to write this up properly, but before I forget: I was scanning a bunch of stuff on the [[Plustek OpticFilm 8200i]] today and I wondered, what if the negatives sitting in the plastic carrier aren't at the optimal focal plane for the scanner head? I'd thought that before, but knowing that the machine is fixed-focus, I'd never thought what I might do about it. But I figured, I have one direction I can experiment in: Up. So I tried cutting two thin strips of very unsticky FrogTape and putting one on the north edge of where negative #4 sits on the carrier, and the other on the south edge. I ran a test scan and what do you know, the image was just a hint sharper than what I could get otherwise. I tried adding another layer of FrogTape. //Even sharper// this time. Oh my goodness. What about a third layer? That was the point at which I was getting to the wrong side of the focal plane. It was as sharp as one layer, but not an improvement over two layers. What I should do is rig up a flatter, more rigid shim with some transparency film or even just some scrap 35mm negatives and use those instead of two layers of FrogTape. But until then, I've made this scanner as good as it can be, and the results are nearly indistinguishable from the scanner that [[Old School Photo Lab]] uses when they send me the standard (not hi-res) scans. And because I have more time than they do, I can recover highlights they can't. This thing is bonkers. The photo above shows off the effect of the two-layers-of-tape shims. This is of course after toning and moderate sharpening in Lightroom.
Canceled my membership on [[Glass.photo]] just now. It’s a well-done service/app, but I just don’t ever think to look at it.
A few weeks ago, the trackpad on this [[14-inch MacBook Pro (2021)]] started occasionally, randomly jumping in the opposite direction when I'd scroll on a web page. Didn't seem to be specific to [[Arc]] or [[Safari]]. This person's description matches what I'm seeing: https://discussions.apple.com/thread/253493426 <<< !! View jumps backward when scrolling with trackpad I have a new issue on my 2021 14" M1 Max MBP; when scrolling through any view with the trackpad, the view will frequently jump the opposite direction. Didn't see this issue when the device was new, seems to have started with the 12.1 update. * Repros in Safari, Firefox, Chrome, Mail, Preview, Xcode, Slack, pretty much everywhere * Issue remains when booting into Safe Mode * Issue remains after reinstalling MacOS over the top * The issue stops if I switch Prefs > Displays > Refresh Rate from "ProMotion" to "60 Hertz" <<<
Refer to this thing I just posted: https://www.twelvety.net/2023/06/a-haphazard-doom-upgrade
I heard of [[NextDNS]] so long ago and never gave it a shake. Installed it on the [[14-inch MacBook Pro (2021)]] by using the app because I couldn't get the Apple profile generator method to work. If it sticks, I'll gladly pay $20/yr.
Remember the [[Harman Kardon PA2200]]? Well, over 2.5 years later, it's still unfixed, sitting in pieces scattered on the bench in the basement. A few days ago I gave up on the idea of fixing it. I've lost all momentum on it, I don't think I could safely re-insulate and replace the eight power transistors or the ceramic power resistors, and I never identified the actual part that was failing. It was all hanging over my head as a "should do", crowding out other things I want to do and need to do. Meanwhile, I've been making do with the [[Allo Volt+ D]] and realized one night this week that while it is transparent, it doesn't actually sound like //music//. It's disembodied, and listening to LPs it's downright harsh. I was eyeing the [[Cambridge Audio CXA60]] really hard, but the idea of the high-current capability of the [[NAD C 316BEE v2]] was too much to resist, so I just ordered one from Crutchfield. Also, it had just dipped $100 from its normal price, so that seemed like a sign. Only thing that concerns me is that there's no subwoofer out. I may be up the creek with the [[Cambridge Audio Minx X201 subwoofer]] that's sitting here, but I'm also hoping that I just won't need that anymore. I'm willing to risk it! Also, I don't want to mess with restoring old equipment now. I just want something new that works, before my ears get any older. Why am I not writing this in the blog?
I wasn't ever printing with the [[HP Tango]] printer anymore, so I canceled the monthly ink subscription. It was annoying seeing that small charge every time, reminding me I wasn't doing anything with it.
Well. After searching for some old info about the [[Mackie MR524 studio monitors]] and remembering I had only made notes about them in [[TiddlyWiki]], I saw some daily journal entries and was astounded at how freeform and un-precious they were. Apparently, I used to use this thing to think out loud in a way that I never ever do when writing a Real Blog Entry in [[Blot.im]]. I would "accidentally" blog all the time. So I'm going to try it again today, keeping this open for things that come up. At the end of the day I'll paste this entry into either a Post or a Daily Note in Blot with a link back to this entry in the wiki. I'm developing a fascination with the music and drumming skills of [[John Colpitts]]. I can look at his arms and legs and still not understand what he's doing. I pulled the old [[Sony ZS-S2iP boombox]] out of the closet last night and set it up in the kitchen. It has an Aux In jack, so I plugged the [[WiiM Mini]] into it and streamed lossless AirPlay to it from my phone. That works fine, but the speakers on this thing are terrible and always have been. Makes me want a pair of [[Audioengine A2+]] speakers in there. I just added myself to the waitlist on their website to get notified when a pair of white open-box ones is available. So if I put a bunch of notes in here, that makes [[Bear.app]]... not the one source of notes that I thought it would be. Oh well! I do still have an urge to do some kind of daily notes in there, but I appreciate the fact that the developers steadfastly refuse to design the app to do daily notes at all, so that makes me take a breath and not build a weird set of scaffolding that would force-fit them in.
It bugs me that every time there's a power blip, the otherwise wonderful [[Cambridge Audio DacMagic 100]] shuts off, and the LEDs on it are so small and dim, I never know whether it's going to work when it's time to listen to AirPlay or [[Roon]] through the [[RoPieee]] attached to the [[NAD C 316BEE v2]]. It'd be great to have a DAC that just stayed on all the time. A search for "best cheap DAC" revealed the [[Apple USB-C to 3.5 mm Headphone Jack Adapter]] as a surprising candidate, so I just ordered one! Also included a low-profile [[ddHiFi TC01A USB-A to USB-C adapter]]. Watched this old Josephine Foster interview while I did the dishes. She is just in her own time, isn't she? {{Josephine Foster interview (2011)}} We took our niece to Charm School Study Hall for soft-serve today. Mine was a dairy vanilla cup with chocolate sprinkles and caramel, but based on how we felt afterwards, I think our bodies are too old to process soft-serve properly anymore. It made us feel woozy before we were even done. And now I'm going to play with [[Hookmark]]. It's included in [[Setapp]], so why not?
I tried [[Hookmark]] last night and the first time I linked a Markdown file in [[BBEdit]] with a URL saved from [[Arc]], it didn't associate the hooked URL with the file. It threw me off at first and then I realized that Little Arc was the cause. The URL isn't really "open" until you do `Cmd-O`, so it's invisible to Hookmark until then. It would also help if I'd read the instructions. Sent Torch Marauder some [[record/stylus-cleaning tips|2024-06-09 Record/stylus cleaning advice for Dave B.]]. Huh. That video I included in the [[Blot version of yesterday's daily note|https://www.twelvety.net/2024/06/saturday-june-8-2024]] renders a big blank space after the video when I look at the post in [[NetNewsWire]]. Well, I'm not going to bother with working around it for now. I'm just using Blot's ability to embed a video with a single YouTube URL, and that's so easy and it looks fine in all my browsers and the phone. The [[Apple USB-C to 3.5 mm Headphone Jack Adapter]] arrived and I hooked it up to the [[RoPieee]] [[Raspberry Pi]]. It works, but Apple limits it to 1 Vrms (as opposed to the normal line-level 2 Vrms) when you're on a device that can't control volume. I can get around that by setting RoPieee to use software-controlled volume over AirPlay, but then I'm back to guessing which volume setting on the phone or laptop is the best to use when AirPlaying to the stereo. I don't want to do that, and I don't want the audio to go through extra volume math steps, so I'm back to using the [[Cambridge Audio DacMagic 100]] because it's a normal line-level device. Other than that silliness, the Apple dongle was indistinguishable from the DacMagic 100. Any preferences I had between the two were probably down to volume mismatches when I was testing them. Because I need to start learning this stuff for work, I downloaded the [[Oh My Git!]] game and got through all the exercises in these sections: * intro * files * branches
''Just sent this to Dave:'' Torch, I hear some problems there! First, if that’s a used copy of Led Zeppelin II, it may be super ragged out like mine and its grooves may be shaved smooth, which causes all kinds of distortion. There’s no improving that. The damage is done. But! If it’s just deep-seated dirt, you can improve that a lot with some Titebond II wood glue. I’ve done exactly this multiple times on my dirtiest records and it’s safe and it works amazingly well. It’s just a pain in the ass: https://youtu.be/lB4Np8me3Yc?si=jZ5H1sFk42AX8OH6 That scratchy/sludgy sound I hear in your video sounds like a dirty stylus. I’d be willing to bet there’s a dust bunny caked onto it. It makes it impossible for the tip of the stylus to seat in the groove right. You’ll need a record brush if you don’t have one already. You have to use it every time you play a side. Audio-Technica AT6011a Anti-Static Record Brush: https://a.co/d/8E1Zfp8 Once your records are clean, you have to make sure your stylus is clean. Every time I put on a record, I plop the stylus down on a stylus-cleaning gel about three times. It lifts dust off of the stylus and works better than any stylus-cleaning brush. Turntable Stylus Cleaning Gel: https://a.co/d/8sqrrrU If you do all that and still don’t hear an improvement, it’s possible that your stylus is just old and you need a new one. I think that’s an OM5e cartridge, and a replacement stylus is easy to snap on: Replacement stylus for the OM5e: https://a.co/d/0cKCYmt Ok, that should keep you busy for an afternoon!
Listened to an old [[Mark Rubel interview on Working Class Audio]] last night while folding laundry. Three things I want to remember from this: # Don't look at the screen when you're mixing. Use your ears. # Don't buy gear. Buy capabilities. # He paid for all of his studio gear in cash. The [[Apple USB-C to 3.5 mm Headphone Jack Adapter]] through the [[Koss KSC75 headphones]] (modded to use a cheap headband) sounds very good playing [[Apple Music]], but kick drums and bass notes lack the muscle behind them that the [[Cambridge Audio DacMagic XS]] has. There's just more power in the XS's amp, which makes sense. This might not work for all cases, but it's potentially handy enough that I'm trying it everywhere! [[How to turn off in-app review requests on iPhone, iPad, and Mac]]
I created a trial account on Pika today after hearing Jack and Alex talk about it: https://twelvety.pika.page There's nothing much posted there, but I had to try it since it was free for 50 posts. It looks totally great. Though it would scratch the itch of having a super-easy place to blog and it makes titles optional, I'm not going to adopt it because: * I'm already at home with [[Blot.im]] and have got it looking decent for my needs. I don't need to spend any time migrating anything right now, or feeling bad that I'm neglecting one paid platform over another paid platform. * I love Blot and it's super powerful and well thought-out without being overwhelming. The only drawback is its dependence on Dropbox and the like, but you could say that's also a feature, given all the text editors that work with Dropbox. * Pika is $5/month. That's cheap, but it's unnecessary if I'm on Blot already. Plus, I found out today that I was still on the Blot monthly plan ($4/mo) and the yearly plan is $44/yr ($3.67/mo), so I just switched Blot to yearly. * The only export option with Pika right now is to "Contact us to get an export of your posts". I'm sure that in practice, it's easy to get them to send you the export, but that still seems like extra work. With most tools I like, a zip file download is just a click away on the control panel or dashboard. At worst it's a button you click to get in a queue and wait for an automated email with an attachment or a download link. With Blot, you can download your config files easily, and all your posts are already in your Dropbox folder because that's where they started. So, for me, for now, no Pika, but I'll remember it for later!
We need to visit the [[Second Union Rosenwald School Museum]] in Goochland. I learned this this morning and have been haunted by it all day. I knew I lived in a bubble, but I didn't realize how expansive and blinding it was: {{median income for singles in Richmond, Va.}}
All those people that I used to call on the phone to keep up with during college and post-college years — the ones I've almost totally lost touch with — do they care? Is that just the natural state of things and would have happened regardless of the "advances" of the internet and communications tools? Or am I a neglectful, narcissistic "friend" in name only? I feel like a call out of the blue to someone I haven't even direct-messaged on any platform in years would be received the way it would if I they were calling me: //It's nice to hear your voice, but what's happening here? Why are you calling? Could you have warned me first?// <<sectionSymbol>> I like using TiddlyWiki for daily notes, but I don't like that all these paragraphs may be perceived as related. I don't necessarily want to put horizontal lines between thoughts. Maybe some fancy decorative character goes between each one? <<sectionSymbol>> Yesterday was the second day in a week that I forgot the [[Apple Watch]] and left it charging at home. Also notable: the sense of relief I had at not having it on my wrist. Hmm. To that end, I've finally turned off notifications for iMessage. What a self-punishing thing to have enabled. <<sectionSymbol>> Signed up for a Microsoft Enterprise Skills Initiative (ESI) account through work so I can learn [[Microsoft Power Platform]] stuff. I love studying new things, but how do people have energy for anything after they get done with a day of work?
Sometimes I realize I can't adequately string together disparate text files with metadata and tags and it makes me wanna use [[Tinderbox]] for everything. It's so good at containing and hiding detail below a certain level, but revealing tons of info when you want to. And it's a great outliner. If only it didn't delete every previous sibling and parent node when you hold down the Delete key too long when renaming an item. (''Jack,'' I promise I had not read your [[new post about Tinderbox|https://baty.net/2024/06/writing-posts-in-tinderbox/]] until I had already written this!) And hell. I just found my [[org-mode]] file from May 2023 where I was outlining notes about Microsoft Power BI as I learned about it, and it makes me want to use org-mode or a Tinderbox outline as I learn [[Microsoft Power Platform]] stuff now.
Made this system tiddler [[$:/macros/sectionSymbol]] with some inline CSS to test out putting a fancy symbol between unrelated thoughts in Daily Notes.
<a data-flickr-embed="true" href="https://www.flickr.com/photos/twelvety/53792830027/in/dateposted/" title="Twen at The Camel"><img src="https://live.staticflickr.com/65535/53792830027_165468595e_z.jpg" width="100%" alt="Twen at The Camel"/></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> Saw [[Twen]] play at The Camel. Doors opened at 9pm, show started at 9:30, and we left the house around 10:30, which felt surreal and unnatural. That's when we'd normally be thinking about getting ready for bed on a weeknight, or deciding whether to stream [[Ghost Adventures]] or [[It's Always Sunny in Philadelphia]] in the background while we puttered on a Friday night. But we made it and I was glad once we got there. They were fantastic. Played every song I wanted to hear, and with a presence like they were in a bigger venue. All the vocals were spot on (from both Jane and Ian), and Ian is like his generation's John Squire from [[The Stone Roses]]. They were really chatty and gracious when we met them at the merch table. Only wish the crowd had been a little bigger and the sound had been run better. We could have done without the big inflatable dice they threw into the crowd. That caused Sarah to abandon her spot near the front with me, but she found a good spot to sit along the side and could still see the band. Jane ran her own vocal effects unit, which I can tell by my other photos is a [[TC Helicon Voicelive Play]]. Ian used the same thing probably for his vocals and/or guitar.
[[Steve Albini]]'s widow keeps posting his old notes and journal entries on Instagram. This is no doubt made way easier and maybe even only possible because they were written on paper and not in an end-to-end encrypted journal app, or in future-proof text files that are stored in a place no one knows where to find them. I think a good use of the [[Tinderbox]] timeline feature would be as a list of all the live music shows I've been to. Like [[yesterday|2024-06-14 Journal]], I'm looking at outliners to take notes on stuff I learn, because apparently [[Bear.app]] isn't enough? This time it's [[Bike Outliner]], since it's just right there in Setapp. Bear feels great for many small notes, but for a sprawling, indented outline, maybe Bike is better? I wouldn't have to "find the perfect single future-proof all-encompassing notetaking system" if I could just find the perfect single system for keeping track of which system I was using when, and //where// I put something at the time. Like, if I was really into [[org-mode]] in 2019, it'd be nice to know that all the notes for Subject X at that time were in there, but all the notes for Subject X in 2021 were in [[Logseq]], etc. And find me all the instances of all of those in one search, in a nice way that ties them all together, please.
I read on Reddit that [[someone used GitHub|https://www.reddit.com/r/learnprogramming/s/eLzOq3s6Wx]] to take notes on what they learned about coding, so I made a https://github.com/twelvety/developer-notebook/ repo and am writing notes in it from [[VS Code]]. As if I don't have enough other places to log things (this wiki, the real blog, etc.). Never mind that by the end of the thread, they had been pretty much convinced to use [[Obsidian]] instead.
[[Thomas Dolby got a hairpiece|https://youtube.com/watch?v=TpLESu7NMX0&si=xV-DgipBxt3ul4PK]] and it’s unexpectedly moving to know that someone as genius as him could have been self-conscious about being bald all these years. Now he’s just owning his new hair and looks happy. I went to FedEx Kinko’s and dropped off my old laptop from work that I’ve been holding onto for two years and IT kept bugging me to return. You can give FedEx a naked laptop and they will just package it right up and ship it to where it goes. Played with [[Bike Outliner]] again today. Ran the [[WorldWideWeb (Iconfactory)]] app on the iPhone to open the Bike-format `daybook.html` file (in iCloud Drive > Bike) in Safari. Found that you can add CSS to the `<head>` of the file in a text editor and the Bike app won’t overwrite that when you edit the content. It will also ignore it when you view the file on the Mac. Used that to massively increase the font size so it’s readable on the phone. Only thing I wish was different is that it would be nice if the intra-document links in Bike were regular relative HTML links and didn’t specify the `bike://` app to open. I’d like this to be a sprawling “one big text file” thing, with sections for Health and Car and House, and links to and from items in those so I could hop around, but those links are only going to work on the Mac. * Isn’t this what I was supposed to be doing with [[Bear.app]]? Yes, it was. But I sort of like how I can only edit this stuff on the Mac, and the iPhone is for viewing only. It seems like a limitation, but the HTML view is at least viewable on the phone, unlike Tinderbox files. * Oh! Ok, the way intra-document links work is that if you just do Shift-Cmd-C on a row, you’ll copy the row text and link to the clipboard, so when you paste that to somewhere else in the document, you get the whole row text as a link. Of course, clicking that within Bike on the Mac takes you right to the link target, and the link won’t work on the iPhone, but you can select the text of the link and do a “find in page” in Mobile Safari and as long as you have unique text, like “2024-06-19 Boulevard Auto changed the oil”, you can find that string and jump to the target. * And using the Bike native format but using an `.html` extension means that iOS Spotlight can search the contents. * Isn't this a poor man's [[org-mode]]? I suppose. I should make a giant, hi-res diagram of all the ways I can think of to do diaries, analog or digital life-logging, [[daybook]]s, journals, [[bullet journal]]s, wikis, and see which one I actually like and //for what ostensible purpose.//
Ha, glad to take my turn being a bad influence about [[Bike Outliner]], [[Jack|https://wiki.baty.net/#2024.06.20%20-%20Journal%20(Thu)]]! If it helps, my "[[daybook]]" experiment with it is failing, because it's such a nice editor that I start listing some bullet points about what happened today and end up writing a bunch of prose in it, and then those entries look more like journal entries that should go in [[Day One]]. Had lunch w/S.W. to hear about her experience living through pursuing her MBA through VCU. Short answer: Do it, whether it’s CS or Software Engineering or something else similar, and whether it’s a certificate or an MS. I can't believe I'm even considering this, but 53 years old is better than 54 years old. Found this in my [[Day One]] from March 2023, and have redacted a little here and there: > On Monday, [our team] and K.S. took an online [in-house] class on Data Science ROI presented by A.W., a data scientist in IT. She was super smart and enthusiastic. It was just an overview, but enough to give us an idea of the difference between data science and data analytics. ... She’s also an adjunct professor at [a school], and has a master’s in Decision Analytics. ... She was smarter than anyone on the call. She’s taught advanced Python ... and has a whole coding/engineering background. Why am I so comparatively dumb? Should I be going back to school even though I probably only have 10 years left in the workforce? Is that a bad assumption to figure I’ll retire at 62/65 or so? Should I plan to retire later and go to school now instead of limping along like I have been? I had a thought today that a real household wiki, shared with Sarah, would be better than a bunch of files in Dropbox or iCloud. Think of it: A web browser viewing a page with a bunch of links to stuff like our oven, the cars, our cat's medical history, the lawn mower, etc. Wouldn't that be mentally easier than anything I could piece together with files and folders of text files that she'd never want to look at?
You know what's better than scrolling through [[Mastodon]] or [[Instagram]] when you have 15 more minutes to wait for your fries to cook in the oven? Scribbling something into today's [[daily note|Daily Notes]] in the wiki. I learned, or re-learned, that you can make intra-document links to headings in [[Bear.app]], and when you export a page to HTML, those links work like standard in-page anchor/jump links. Bear can't arbitrarily link to any line or "row" like [[Bike Outliner]] can, but Bike's in-page links are built as non-standard (as far as I know), although rather ingenious, "nested" IDs, like this: `href="bike://zgMNRzWM/HJ#yf"`. That works fine in the app, but the `bike:` prefix, and the document ID part and the `HJ#yf` pointer make it useless outside of the app. So I probably won't use that feature in Bike. I may be overthinking how useful that would have been anyway. Experimenting with (gasp) not drinking anything on a Friday night. It was weird before we ate dinner, but since then I haven't thought about it.
The only problem with [[Bear.app]] is that it's not an outliner. On the other hand... I tested opening a [[TaskPaper]] file in [[Bike Outliner]]. It works fine and is easy to navigate, but I wish [[Bike Outliner]] had the sidebar and tags like TaskPaper has. Although since Bike can do proper todo items, I guess it doesn't have as much of a need for tags. By accident, I found I can toggle between Edit and Outline modes with `Command-period`. I don't know if that's an undocumented mapping or a fluke of some setting on my computer, but it's better than stretching all the way to `Esc`. Oh, and you can make a Headline by typing `# ` at the start of a line, like in Markdown. One thing I just figured out about Bike is that you can change the `⌘-P` Focus Heading shortcut to search all rows in your document, not just Headings, by clicking the Settings gear icon in the popup window and clearing out the Outline Path. The results are fuzzy. It's not just a pure match for the string. Oh no. By editing the Outline Path, you can narrow in on all types of things, similar to how you could do a saved custom search in TaskPaper, but Bike doesn't make it as easy or intuitive in the app. Jesse says you could use Shortcuts to do saved searches/queries. Here's the [[Bike Guide page on Outline Paths|https://bikeguide.hogbaysoftware.com/using-bike/using-outline-paths]]. Here are a few I tried: * `//*` search everything * `//task` search all tasks * `//@done` search only completed tasks * `//"Tinderbox"` search for only rows that contain the exact string "Tinderbox", ignoring case * `//@text contains "Sound"`, search for only rows that contain the exact string "Tinderbox", case-sensitive
I spent a looooong time last night trying [[MindNode]] as a [[weekly project progress tracker|2019-03-21 weekly project progress tracking]]. I like that you can see things in an outline or in a map (like [[Tinderbox]]). And it's nice that I can quickly add something to the document from the phone, since [[Setapp]] allows for the full iOS version of the app as well. I don't know if it'll stick, though. I've done things like this in Microsoft Word, [[Dynalist]], Markdown files, and [[org-mode]], and all of those worked just as well. They just weren't mindmaps.
I have a lot of actual shit I need to do today, but I just discovered [[Leon Russell]] and now I'm going down a rabbit hole. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/rokNTY_qLC4' frameborder='0' allowfullscreen></iframe></div> <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/pIpYRjnpGjQ' frameborder='0' allowfullscreen></iframe></div>
5K Runner is the app I'm using for [[Couch to 5K]]: https://apps.apple.com/us/app/5k-runner-couch-to-5k-trainer/id448357306
[[A Daily Journal in Org Mode — John Jacobsen|http://johnj.com/journaling-procedure.html]] <<< The way I organize my tasks for the day (“organize” is too heavyweight a word - it’s a very light touch) goes something like this: ``` | pt exercises | | coffee | | work on =smallscheme= | | breakfast | <-- stuff I did | | | train to work | <-- stuff I'm doing now | work on blog post | | | | demo prep | <-- stuff I think I'll do | pairing | | meeting about xyz | | demo/standup/retro | | bike home | | dinner | | dishes | | meditate | | bed | ``` The [[Org Mode|org-mode]] table editing shortcuts let me reorder, add or eliminate items quickly. Anything I don’t get to by the end of the day either gets a strikethrough so I can remember that I didn’t get to it, or just removed. The point of the todo table is not simply to make sure I do certain things, but to record the trajectory of the day. <<< That's how I tend to think of tasks and change their status—by clumping them together and sliding them up or down based on their state.
> When Nixon was president, an advisor drafted a letter which he thought didn’t strike the right tone, and he sent it anyway, and repeated to an aide something that Eisenhower had once told him: “A true executive can sign a poor letter without changing it.” Gretchen Rubin pointed out this story in the Jan. 7, 2019 micro-episode of [[A Little Happier|https://gretchenrubin.com/podcast-episode/little-happier-excellent-mediocre/]]. The quote came from [[President Nixon: Alone in the White House|https://www.goodreads.com/book/show/14455.President_Nixon]], by Richard Reeves. Reminds me of Peter Drucker, [[RC]] etc. 20190108T0948
* 2019-10-31 I never cared for "Thunderstruck" (which I still think of as "new" AC/DC, 29 years later) until I heard it recently at the Altria Theater during a multi-school dance recital, and they played the original recording on a giant, loud sound system and I got really into it. You have to //feel// that song to get it.
Here's what Jack wrote yesterday in response to my ramblings about [[org-mode]] and [[org-journal]] vs. [[Markdown]]: > [[Phil struggles|https://twelvety.micro.blog/2020/04/01/losing-my-mind.html]] with the age-old Org mode vs Markdown formatting decision. I know this. Org mode, combined with Emacs, is a formidable, unbeatable combination for tasks, lists, journaling, you name it. But, and this is key for me, I don't want to be //forced// to use Emacs in order to use my stuff. Editing org files on iOS is a non-starter for me, even using something like [[Beorg|https://rudimentarylathe.org/#Beorg]], which is nice but not great. Phil references how nice it is to just click a datestamp and get a prettily-formatted Agenda view. I love that too, but in actual use find it more clever than useful. Still noodling on this. He nailed it. I'm drawn to [[Emacs]] //right now//, but I've lacked the energy to use it many times over the past year of trying it. And it does take energy and practice, and the will to punch through the awkwardness and extra work. Emacs offers so much possibility, but also carries with it the ever-present danger of becoming its own project. I don't even have the illusion that I'll get //good// at it someday; I don't have access to it during the work day, so I'll always just be good enough at it to get things in and out. And there's no way I can be sure I'll always want to use it, and then what good will my small number of perfectly formatted entries be? Also, it's one app, on one platform (for me). [[Markdown]], on the other hand, has a universe of apps that understand it. This at least is where I'm at this morning, as I write all this in [[Roam]], a web app that lives in the cloud, with a murky but hopefully promising future, run by a couple of weird dudes I know little about. I'm going to go fire up [[nvALT]] for comfort.
https://scholarsbank.uoregon.edu/xmlui/bitstream/handle/1794/782/wealth.pdf Adam Smith in //The Wealth of Nations:// <<< It will be found, I believe, in every sort of trade, that the man who works so moderately as to be able to work constantly not only preserves his health the longest, but, in the course of the year, executes the greatest quantity of work. <<<
(Stole this whole tiddler from Jack Baty) For this TiddlyWiki, I wanted to display a list of backlinks on each tiddler. This was harder than expected to figure out. In summary: First, create a new tiddler with the following content: ``` <$list filter='[is[current]backlinks[]limit[1]]' variable=dummy> <hr> Backlinks: <$list filter='[<currentTiddler>backlinks[]butlast[]]'><$link><$view field="title"/></$link>,</$list> <$list filter='[<currentTiddler>backlinks[]last[]]'><$link><$view field="title"/></$link></$list> </$list> ``` This generates a comma-delimited list of tiddlers that link to the current tiddler. It would have been easier to generate an HTML list but I wanted a more concise, comma-delimited list. Tag the new tiddler with `$:/tags/ViewTemplate`. This will display its contents at the bottom of every tiddler automatically. That's it!
https://blog.adobe.com/en/publish/2021/03/10/from-the-acr-team-super-resolution.html#gs.xr7787 https://helpx.adobe.com/camera-raw/using/enhance.html
Apparently this is more current than [[Adobe Lightroom CC]] now.
https://www.adobe.com/products/premiere.html * Even from the overview video, I can tell this is the app I need to use. I haven't used Premiere in about 17 years, but I think I'll be able to pick this back up quickly. Whew. And I can subscribe for only as long as I need it and then get rid of it. I just wish [[Adobe Creative Cloud]] wasn't so heavy and slow at installing it. There's no way that's necessary. * Oh lordy yes this is the way to go. No doubt about it. So much of what I remember from 2003 is still in there, but better.
https://www.photrio.com/forum/threads/advice-on-buying-an-enlarger.95549/
AES Technical Council Document: [[Recommendation for Delivery of Recorded Music Projects (Including Stems and Mix Naming Conventions)|http://www.aes.org/technical/documents/AESTD1002.2.15-02_1.pdf]] from http://www.aes.org/technical/documents/ via http://www.workingclassaudio.com/wca-080-jessica-thompson/
Because I'm an idiot, the other night I: # Figured it was time to clean the grossness out of the [[AirPods]] (Generation 1) and a "good" way to do that would be to use [[Blu-Tack]] and press it onto the grilles just long enough to grab the dirt and lift it out. # Pressed the Blu-Tack down too long and too hard, so that it got trapped //behind// the grille of the first AirPod I tried this on. (''Don't do this. At all.'' Blu-Tack under a microscope is much less putty-like than you think it is, and is more of a translucent goo.) # Pried the black metal grille out of that AirPod with a straight pin, thinking I could clean it out with a lit match. # Well, the match idea wasn't too bad, but I really mangled the grille and I could see under a microscope how some of the wires of the mesh came out and some were precariously hanging in there. I'm not putting an earpiece with loose microscopic pieces of broken wire mesh in my ears, so I sucked it up and ordered the AirPods Generation 2. They got here today and they are ''nice''. I guess they pair faster, but the main thing is they sound much clearer than the Gen 1 pair. And being able to just yell stuff to [[Siri]] without tapping anything is great, if only I could remember to use Siri more.
[[Albums - album focused player|https://apps.apple.com/us/app/albums-album-focused-player/id1469948986]] > Appreciate full albums again
Someone (I forget who) on M.b linked to this recently and it has been rattling around in my brain ever since. I've been trying it here and there since then and it's been a shockingly effective way to deal with beer: [[Drinking Too Much Is an American Problem – The Atlantic|https://www.theatlantic.com/magazine/archive/2021/07/america-drinking-alone-problem/619017/]] > Southern Europe’s healthy drinking culture is hardly news, but its attributes are striking enough to bear revisiting: Despite widespread consumption of alcohol, Italy has some of the lowest rates of alcoholism in the world. Its residents drink mostly wine and beer, and almost exclusively over meals with other people. When liquor is consumed, it’s usually in small quantities, either right before or after a meal. Alcohol is seen as a food, not a drug. Drinking to get drunk is discouraged, as is drinking alone. The way Italians drink today may not be quite the way premodern people drank, but it likewise accentuates alcohol’s benefits and helps limit its harms. It is also, Slingerland told me, about as far as you can get from the way many people drink in the United States.
[[Micro.blog]] : https://micro.blog/alexjj website: https://alexjj.com [[TiddlyWiki]]: https://fondoftea.com
""" By googling "org-roam mobile" I got to here: [[How do I integrate org-roam on mobile? - /r/emacs|https://www.reddit.com/r/emacs/comments/iyp2zc/how_do_i_integrate_orgroam_on_mobile/]] """ """ And then this answer from Alex Kehayias: https://www.reddit.com/r/emacs/comments/iyp2zc/comment/g6fr9a7/ """ > I had a similar issue with org-roam and mobile. I’m not a fan of the options mentioned in this thread (e.g. organice, orgzly, beorg). I ended up creating a workflow around Working Copy and Scriptable. As a developer, a git based workflow is quite natural and avoids the pitfalls of syncing files with Dropbox or god forbid iCloud. It also opens up the possibilities for what mobile editor you want to use (although I stick with Working Copy since it has an org-mode format which is fine). And then https://www.alexkehayias.com/essays/zettelkasten-setup/ > What follows describes how I implement my note taking practice using Emacs, org-roam, hugo, Working Copy, and GitHub Actions. """ And this is his finished product, a static website you can browse. So cool: https://notes.alexkehayias.com/ """ tiddlers: [[org-roam]], [[org-mode]], [[Working Copy]], [[Beorg app]], [[organice]]
<<< If I click through to some of those suggested notes, I’m taken to similar quotes on the same topics, two PDFs of reports (of dubious analytic value, but that’s a separate issue), three clippings from Kindle books where people are making reference to the relationship between the Haqqanis and al-Qaeda (the subject of the original note). Note that I didn’t have to pre-tag documents for this ‘see also’ functionality to work its magic. It analyses inside the text and makes its suggestions based on the similarities it identifies. (Needless to say, it’s not simply a matter of matching individual words. Some of the suggested notes don’t mention al-Qaeda or the Haqqanis by name, but they are implied; DevonThink catches this all). Once you start to build up a decent database of notes (my Afghanistan database has just under 65 million words of notes, including 12,800+ PDFs) this ‘See Also’ functionality really allows for some unexpected links to be made, especially when you’re at the stage of writing up a project/book. One note will lead to another note, which will lead to another note. If you follow these trails of notes (like breadcrumbs) you can develop a pretty idiosyncratic picture. //I do not know of a manual method which allows for this kind of process.// <<< from Alex Strick van Linschoten, [[Note-Taking Jujitsu, Or How I Make Sense Of What I Read|https://www.alexstrick.com/blog/2014/10/note-taking-jujitsu-or-how-i-make-sense-of-what-i-read#ffn6]]. <a href="x-devonthink-item://E1BF071F-3864-4CD5-9080-15C6CA9FF534">local archive</a>
[[Alex Johnstone]] made an awesome new blog out of a stripped-down [[TiddlyWiki]]. It reminds me of [[Drummer]]'s output, but it's totally under his control. He and [[Jack|Jack Baty]] have been talking about the idea of using TiddlyWiki for everything or nearly everything. This is the exactly the kind of thing I could see using in a local-only file on my machine as a [[daybook]] or [[journal|Journaling and logging systems]]. It's so great that it's just a flat list of days and their entries. Very nice. https://fondoftea.com/blog/
Alexander H. Stephens, vice president of the Confederate States of America, in his “corner-stone speech” in Savannah, Georgia, March 21, 1861. The referenced "idea" (that they oppose) is that the races were assumed to be equal: from https://iowaculture.gov/history/education/educator-resources/primary-source-sets/civil-war/cornerstone-speech-alexander > Our new government is founded upon exactly the opposite idea ; its foundations are laid, its corner-stone rests upon the great truth, that the negro is not equal to the white man ; that slavery—subordination to the superior race—is his natural and normal condition. [Applause.] OMFG //GROSS//.
https://letterboxd.com/film/alien/ 2021-04-18 Watched it last night for the first time. I see why all the reviews on Letterboxd are so high. WOW.
This is pretty diametrically opposed to everything I've ever tried, heard and read. But it's interesting to consider. From [[All You Can Eat? Inside the Intuitive Eating Craze – Vogue|https://www.vogue.com/article/inside-the-intuitive-eating-craze]], emphasis mine. > ''Step one'' in [[intuitive eating]], she told me, was to start a meal with a healthy hunger. Don’t eat a late lunch if you want to be excited for dinner, but don’t be so hungry you demolish the breadbasket. I was starving. I’d gotten so nervous about wanting to appear to eat intuitively that I hadn’t eaten in hours. ''Step two:'' Clear my mind and read the menu closely, attuned to which dishes would bring me pleasure and satisfaction. Should I focus on a variety of textures? Or colors? Or plants, then meat? Raw, then cooked? Resch smiled beatifically and suggested I focus on what sounded good. ''Step three:'' Believe that all foods are morally equivalent. None is better or worse than another.
https://allo.com/sparky/volt-plus-d-amp.html > Finally, the dual mono Volt amplifier is here. [[2021-12-07|2021-12-07 Journal]] Ordered from allo.com for $184.40 including 19V PSU and shipping.
Who knew that `Alt-Esc` is a [[Windows]] [[keyboard shortcut]] to send the current application to the "bottom" of the stack? It's like "minimize all" except it just does it to the one app. Nice.
[[Conor White-Sullivan]] [[pointed out|https://twitter.com/Conaw/status/1229874357431754752]] this [[Roam]] video testimonial from [[Amanda Ngo]] the other day: <<< Amazing review of [[@RoamResearch|https://twitter.com/RoamResearch]] How have I not seen this before?! https://youtu.be/eH2U02o8MaI <<< Looks like she grasped the potential early!
* 2019-11-17 My dad swears by this and it's only $13/mo. if you have Prime, so I'm doing the free trial and I'm afraid I'll get hooked forever. Only bad part is there's no [[Volumio]] plugin for it (and Amazon probably won't open up the API), so I'm playing it in the Amazon Music iOS app and streaming to Volumio over AirPlay, which is limited to 44.1k/16-bit, but that's better than [[Spotify]]. Maybe their library will be good enough for the music I don't care about enough to buy? * 2019-11-18 Canceled it. I used Spotify a ton last night and even with its lesser quality, its app and selection are way better, and I don't need another music repository to splinter my attention.
I like this [[Amazon]] URL [[bookmarklet]] from [[Ron DeVera]]. It also can immediately load the shorter URL to make sure it works. https://gist.github.com/rondevera/1306958 `javascript:(function(d){var asin=d.getElementById('ASIN'),url;if(asin){url='http://'+d.domain+'/dp/'+asin.value;if(prompt('Short Amazon URL (hit OK to load):',url)){window.location.href=url;}}else{alert("Can't find an Amazon product ID.");}}(document));`
https://twitter.com/ambernoelle/status/1297191195584663554?s=20 [[Amber Sparks]] (@ambernoelle): > Unpopular opinion: I don’t think your life has to have a purpose, or you a grand ambition; I think it’s okay to just wander through life finding interesting things until you die
https://www.clir.org/pubs/reports/pub54/care_and_handling/ > The Ampex Recording Media Corporation, a U.S. magnetic tape manufacturer, has developed many informational and training materials about magnetic tape. The “Guide to the Care and Handling of Magnetic Tape” is reproduced here with the permission of the Ampex Recording Media Corporation. Additions, changes, and comments by NML are shown in square brackets [ ]. Some of the sections of this document deal with recorder aspects that may be beyond your control, such as wind speed and tension, if you are using a simple VHS, cassette, or reel-to-reel audio deck. However, these sections still contain useful information on what to look for as signs that the tape is damaged or needs to be copied. All sections of the original document are included for completeness, but not all sections may be appropriate for your particular tape collection.
Blogger, fellow wiki-obsessive and Micro.blog user, has a whole section of his wiki on PKM. website: https://andrewcanion.com wiki: https://andrewcanion.com/wiki/doku.php?id=start
http://andysylvester.com http://micro.blog/AndySylvester
This has some handy stuff in it. From [[Anne-Laure Le Cunff]]: [[How to use Roam Research: a tool for metacognition * Ness Labs|https://nesslabs.com/roam-research]]
https://www.anyfont.app > Install and manage your fonts on iPhone and iPad
https://aoifenessafrances.bandcamp.com Had seen [[Aquarium Drunkard]] [[tweet|https://twitter.com/aquadrunkard/status/1221799165132296192]] about her the other day. Will totally buy: > Land of No Junction is @Aoife_N_Frances’ debut long-player for @badabingrecords, filled with softly psychedelic sounds, providing the perfect backdrop for Frances’ gorgeous melodies, quizzical lyrics & free-floating vocals. https://aquariumdrunkard.com/2020/01/27/aoife-nessa-frances-land-of-no-junction/
https://en.wikipedia.org/wiki/Apichatpong_Weerasethakul Director of [[Memoria (2021)]].
"Apollo 13 In Real Time" is so well done it almost brought tears to my eyes when I first loaded it. https://apolloinrealtime.org/13/ > A real-time journey through the Apollo 13 mission. > This multimedia project consists entirely of original historical mission material > Relive the mission as it occurred in 1970 ... > This project includes newly digitized and restored mission control audio. The last tapes of these recordings were discovered in the National Archives fall of 2019 and were digitized in February, 2020 and contain the time surrounding the onboard explosion. These recordings haven't been heard since the accident investigation in 1970.
https://www.apple.com/shop/product/MK0W2AM/A/lightning-to-usb-3-camera-adapter 2019-06-01 I had to order one of these today. I was going to record the [[Moog Mother-32]] into iOS GarageBand, but hadn't tried to connect the [[IK Multimedia iRig Pro]] audio interface to my iPhone 8 since I had bought it (whenever that was). When I did it I realized that there's no way to monitor the audio coming back out of the phone when there's no headphone jack (and with the iRig Pro taking up the Lightning port). Various people on the web say this thing should allow the iRig Pro or the [[Focusrite Scarlett 2i4]] (if you connect a powered USB hub) to work with the iPhone again and let me hear what I'm doing at the same time. I had tried AirPods but the latency was a deal-breaker.
https://music.apple.com I don't think I need to quote anything from their website describing what Apple Music is.
* 2019-11-19 Ooooooh. I just discovered how to "pin" notes in iOS Apple Notes, which is where I'm currently keeping a list of recipes for meal planning. (It's the simplest place that can possibly work to store a photo and some text.) Each week, I can swipe on the recipes I want to cook and pin them, which pushes them to the top. Also has the side effect of making the Notes app on the Mac wake up and sync.
https://www.apple.com/shop/product/MU7E2AM/A/usb-c-to-35-mm-headphone-jack-adapter https://www.reddit.com/r/audiophile/comments/em2m4z/the_9_apple_usbc_to_35mm_adapter_performs_on_par/ https://www.cabledo.com/apple-usb-c-digital-to-3-5-mm-headphone-adapter-teardown/ Uses a Cirrus Logic 46L06-CWZR audio/USB chip. It tops out at 24 bit/48 kHz, and won't drive needy headphones sufficiently, but it gets incredible reviews as a DAC. Reviews: * https://www.audiosciencereview.com/forum/index.php?threads/review-apple-vs-google-usb-c-headphone-adapters.5541/ * https://www.head-fi.org/showcase/apple-usb-c-to-3-5-mm-headphone-jack-adapter.23420/reviews * https://www.reddit.com/r/headphones/comments/ecf1ud/apple_usbc_to_35mm_adapter_impressions/ That last one has some good measurements on Vrms output levels.
https://www.apple.com/watch/
https://www.tweaking4all.com/software/macosx-software/applepi-baker-v2/ > ApplePi-Baker has become well known amongst Raspberry Pi users, with a Mac running macOS, to backup and restore SD-cards. Users do not just use ApplePi-Baker for this purpose anymore – I have seen users use it for backup and restore of pretty much anything not Raspberry Pi related. I have better luck with this for [[Raspberry Pi]] and [[RoPieee]] SD card images than with [[Etcher]]. ''2022-11-20 Update:'' Nope, no I do not anymore. It crashed my Mac hard twice. To uninstall: * Drag ‘ApplePi-Baker” from “Applications” to the Trash, and empty the Trash. * Delete the Preferences directory `/Users/<yourusername>/Library/Preferences/ApplePi-Baker`. * Unload and delete the Helper Tool in Terminal (sudo access is needed): ``` sudo launchctl unload /Library/LaunchDaemons/com.tweaking4all.ApplePiBakerHelper.plist sudo rm /Library/PrivilegedHelperTools/com.tweaking4all.ApplePiBakerHelper ```
https://arc.net/ I'm still stuck on this because Little Arc keeps me out of the tab-bloat problem I have in Safari.
https://www.arlo.com/en-us/accessories/VMA3600-10000S.html * Only works with Arlo Essential and Essential XL cameras
https://www.arlo.com/en_eu/cameras/arlo-essential * Direct wifi connection; no hub needed. * Does not record without a subscription.
[[Ten Simple Rules for Digital Data Storage – PLOS Computational Biology|https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005097]] That's a bit of a terrible title, but man there's some good stuff in here that gives me [[lab notebook]] ideas. <<< !!! Rule 4: Store Data in Open Formats To maximize accessibility and long-term value, it is preferable to store data in formats that have freely available specifications. The appropriate file type will depend on the data being stored (e.g., numeric measurements, text, images, video), but the key idea is that accessing data should not require proprietary software, hardware, or purchase of a commercial license. Proprietary formats change, maintaining organizations go out of business, and changes in license fees make access to data in proprietary formats unaffordable and risky for end-users. <<<
https://www.bbc.co.uk/comedy/astimegoesby/ <<< Their two characters: Jean and Lionel, fell in love during the early 1950s, but when army officer Lionel was sent to Korea they lost touch after a letter he sent her never arrived. Both assumed the other had lost interest, but 38 years later their paths cross again, when Lionel returns to England to write his memoirs of life in the army and as a coffee-planter in Kenya (imaginatively titled 'My Life in Kenya'). Seeking an agency temp to handle the typing, he is sent a young secretary in the form of Judith Pargetter and after hitting it off they agree to meet for dinner. That evening, though, Lionel also chances upon meeting her mother and his long-lost sweetheart: Jean. But could their love be rekindled after so long? <<< I'd like to think I could dress and act as cool as Lionel when I'm older.
https://andrew.hedges.name/experiments/aspect_ratio/ Handy!
* [[Feedbin]] * books * The Economist
Oh JESUS: http://www.arsc-audio.org/conference.html
https://www.athan.com/store/p166/Pinch_Roller_for_1%2F2%22_Tascam_TSR-8%2C_38%2C_42B%2C_48OB%2C_late_model_44_With_Bearings.html > New pinch roller built by Athan Corp for 1/2" Tascam TSR-8, 38, 42B, 48OB, late model 44 with bearing. Design includes new bearing. Good to know these are out there for the [[Tascam TSR-8]] if I ever decide to bring it back to life.
from: https://pandoc.org/MANUAL.html#atx-style-headings > An ATX-style heading consists of one to six `#` signs and a line of text, optionally followed by any number of `#` signs. The number of `#` signs at the beginning of the line is the heading level. [[ATX]] was the markup language written by [[Aaron Swartz]].
KabelDirekt RCA Stereo Cable/Cord https://www.amazon.com/gp/product/B00DI89I04 Last bought on 2015-12-01
https://www.audiosciencereview.com/ """ And now a [[YouTube]] channel! https://www.youtube.com/channel/UCWp1NY1KXGwcOh1RxKp_-FA """
https://audioengine.com/shop/wirelessspeakers/a2-wireless-computer-speakers/
https://audiokarma.org
* https://www.audioquest.com/dacs/dragonfly/dragonfly-red * https://darko.audio/2016/04/audioquests-dragonfly-red-puts-high-end-daps-on-notice/ On the wishlist.
https://audirvana.com/audirvana-origin/ > Back to basics. Our subscription-free solution dedicated solely to your local library. $119.99 "one-time purchase" buys 2 years minimum of OS-compatibility updates. And "at least one feature yearly updates until 2025". Huh?
Lovely thread from [[Austin Govella]] about [[time travel]]: https://twitter.com/austingovella/status/1266736176477716483 <<< Lívia Labate 🧼💦 (@livlab): Tomorrow May 30, @tinyLIpsum turns 7. What is your advice for this important big kid transition? I'll read it to her. Austin Govella (@austingovella): @livlab @tinyLIpsum HAPPY BIRTHDAY!!! SEVEN IS THE BEST AGE EVER!!! (whispers) I want to share a secret, but you can’t tell anyone it was me who told you. ''Some'' people say you can’t travel through time, but it’s like cart wheels or hula hoops. Practice enough, and it’s easy. Start to practice now, and you’ll travel through time with ease, and by the time you’re 14, you’ll never be late or early or miss anything. To travel time, close your eyes and imagine where you want to go, what you want to do, and when you want to do it. Then, write a letter to yourself in the future describing these things: where, what, and when. You might write yourself a week from now. Or more ambitious, write a letter to yourself a year from now on your 8th birthday. When the right time comes, open your letter, and read what you wanted to do at just that time. And voila, you've traveled to the future from the past. Why, earlier today, I wrote myself a letter for how I would write you a letter just now, and here I am doing just that! P.S. Always be nice to fairies. You can tell when a person is really a fairy because they sparkle. <<<
https://www.relay.fm/automators Hosted by [[David Sparks]] and [[Rosemary Orchard]]. > Automation makes your life easier and everyone can do it. We tell you how.
https://www.babbel.com I've tried [[Duolingo]] for free a couple of times, but I always come back to Babbel. I usually pay 6 months at a time for $44.70, and it's totally worth it. The audio is so much better, which makes a big difference when you're trying to get pronunciation just right.
https://www.backblaze.com/
<$list filter='[is[current]backlinks[]limit[1]]' variable=dummy> <hr> Backlinks:<br/><$list filter='[<currentTiddler>backlinks[]butlast[]]'><$link><$view field="title"/></$link><br/></$list> <$list filter='[<currentTiddler>backlinks[]last[]]'><$link><$view field="title"/></$link></$list> </$list>
* 2019-04-21 Read [[book: The Bullet Journal Method]] by Ryder Carroll * 2019-04-19 Read [[book: Content Everywhere]] by Sara Wachter-Boettcher * 2019-04-12 Make a bigger projection screen for Criterion Channel nights * 2019-04-12 Get the Olympus OM-2 CLA'd by Zuiko * 2019-04-13 Move giant IKEA desk back up to studio * 2019-04-11 Make dust covers for all the stuff I want ready to go on/near my desk (so I don't have to put these away and can just work when I'm ready) ** Moog Mother-32 ** Yamaha KX-76 ** Nakamichi DR-3 ** Focusrite Scarlett 2i4 ** Plustek OpticFilm 8200i * 2019-04-11 Mount a power strip right under the desk for charging all the things * 2019-04-11 Install hooks for headphones ** Sony MDR-7506 ** Koss PortaPro
2019-01-06 This is what was in the "$:/plugins/TheDiveO/TwFusejs/ui/fusesearchresults" tiddler before I overwrote it: \define fusesearchresults(anyterm) <$set name="fuse-options" value=<<fuse-options>> emptyValue={{$:/plugins/TheDiveO/TwFusejs/options/default!!text}} > <$set name="hits" filter="[!is[current]!is[system]$anyterm$fuse:fuse-options{$(searchTiddler)$}limit[20]]"> <small>//<$count filter="[enlist<hits>]"/> matches://</small> <$list variable="hit" filter="[enlist<hits>]"> <div class="tc-menu-list-item"> <$link to=<<hit>> ><$view tiddler=<<hit>> field="title"/></$link> </div> </$list> </$set> </$set> \end <$macrocall $name="fusesearchresults" anyterm={{$:/config/TwFusejs/allterms!!text}} />
I wish my Management Systems Engineering class in college would have dedicated three course hours to covering the concept of "Bad news only gets worse over time." It would have saved me so much trouble so many times over the years.
https://bandcamp.com/ > Discover amazing new music and directly support the artists who make it. The best way to buy lossless music, and the only way to stream that doesn't make me feel somewhat bad.
She recorded this [[Stephen Sondheim]] song for //The Broadway Album//. Just devastating. This is the best version I've heard, and I've been listening around. I've heard many different people sing this throughout my life, but as I get older the words and melody hit closer to home and is nearly unbearable. https://youtu.be/7Yu3SUlEhWA (audio only) That bridge. THAT BRIDGE.
I saw that I set the date wrong on the [[Ricoh GR (2013)]] when I got it, and all 431 photos I'd taken showed April 2020 instead of April 2021. You can fix a photo's capture time in "Metadata > Edit Capture Time...", but I thought that would only fix one photo at a time. Luckily, if you select a bunch of photos and only change the year in the Corrected Time field, you can fix the year and it'll leave the rest of the date/time info intact for all the selected photos. After that, I did batch-renames in Lightroom of all the files I'd imported from the GR, because they all had a `yyyymmdd-` prefix added to them when I imported them to Lightroom. In 95% of the files, the Preserved File Name still had the original `R#######` sequence number from the camera, so I was able to make a custom rename string of `Date (YYYY)``Date (MM)``Date (DD)``-``Preserved File Name` and then just did a couple dozen other fixes by hand. Here's everything I did: Lightroom: * Fix filenames on imported images * import new images since last import yesterday * fix capture years on those new images * fix filenames on the new images from today Fix other dates in: * Dropbox burned-photos folder ** filename ** EXIF * Google Photos albums * Flickr * Photos.app AND NEVER DO THIS AGAIN.
[[BBC Radio 4 - Desert Island Discs, Charlie Watts|https://www.bbc.co.uk/programmes/p009493z]] This was the 2001 episode mentioned in [[When Charlie Watts Finally Made It to New York City – NYT]]. It's a joy. tiddler: [[Charlie Watts]]
Did not know about this option in [[BBEdit]] until hearing [[John Siracusa]] mention it tonight on last week's [[Accidental Tech Podcast]] [[episode 373|https://atp.fm/episodes/373]]. As he said, text files are small and it's a no-brainer to leave it on. [img[https://twelvety.com/philtiddlywiki_images/2020-04-16-bbedit.png]]
[[Beabadoobee - Wikipedia|https://en.wikipedia.org/wiki/Beabadoobee]] > Laus spent seven years learning to play the violin, before getting her first guitar second-hand at the age of 17. She taught herself how to play the instrument using YouTube tutorials. She was inspired by Kimya Dawson and the Juno soundtrack to start making music.
I've played this song five times since first hearing it 24 hours ago. By [[beabadoobee]]. My god, the kids of today. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//9FpkHjJTrZY' frameborder='0' allowfullscreen></iframe></div>
https://bear.app/ > Markdown notes you’ll love
Discovered through [[Andrew Canion]] http://www.becktench.com http://twitter.com/10ch
I would really, really like to have a [[Behringer Model D|https://www.behringer.com/Categories/Behringer/Keyboards/Synthesizers-and-Samplers/MODEL-D/p/P0CQJ#googtrans(en|en)]] synth (a faithful mini-sized clone of a Minimoog at less than a tenth of the price). But even with the Moog patents expired, I don't think I'd feel right about giving money to Behringer for such a brazen copy of the design //and// the circuitry of Moog's original. That's not really who I want to be, even though I'll surely never be able to afford a real Minimoog. See: [[Attack of the clones: Is Behringer’s Minimoog a synth replica too far? - Factmag.com|https://www.factmag.com/2017/04/08/behringer-minimoog-synth-clones/]]
https://bellroy.com/products/field-notes-notebook-cover-mini/leather/charcoal I was already sold on it even before seeing this thread https://micro.blog/joshsullivan/3265294 and the [[Tools and Toys review|2019-04-24 link: Bellroy Notebook Cover Review - Tools and Toys]]. 2019-04-24 Ordered from https://gallantry.com/products/bellroy-notebook-cover-mini-caramel
Oooo! From: https://tiddlywiki.com/static/TiddlyWiki%2520on%2520Node.js.html <<< Running TiddlyWiki on Node.js brings several important benefits over and above the single file version: * You can edit your content on any suitably compatible HTML5 browser, including smartphones and tablets * Individual tiddlers are stored in separate files, which you can organise as you wish * The ability to build multiple wikis that blend different combinations of shared and unique content <<<
Two things about him: 1. This live version of "Just What I Needed" in 1978 when he sang lead vocals (which he did on a lot of Cars songs). And this part, [[at 0:40|https://youtu.be/6u32kNweIsw?t=40]], when he looks to his left and just does this //thing// with his face that I can't even understand. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//6u32kNweIsw' frameborder='0' allowfullscreen></iframe></div> 2. This interview on MTV. I know that the one hit from that LP isn't great, and some of the questions from Mark Goodman were obnoxious, or asked obnoxiously. But the manner of Benjamin Orr — the way he spoke, and his eye contact — were just intoxicating. I never knew until now. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//pHGk_BL15fM' frameborder='0' allowfullscreen></iframe></div>
https://www.benqdirect.com/bl3200pt.html """ 32" 2560 x 1440 native resolution (not 4K) video inputs: D-sub / DVI-D / DisplayPort 1.2 / HDMI """
''beorg: To-Do List & Agenda'' by Apps On The Move Limited https://beorgapp.com/ https://itunes.apple.com/us/app/beorg-to-do-list-agenda/id1238649962?mt=8 Looks very promising, and could read the [[Org-Journal]] files I copied to iCloud for testing, but it can't yet search the notes in an entry — only the headers. Someone asked about that on the forum, so maybe someday: https://appsonthemove.freshdesk.com/support/discussions/topics/14000012935 I don't trust iCloud Drive for permanent storage of journal entries, so I might use this for read-only viewing a folder of journal files periodically copied over from their permanent home in `~/org/journal/`. ----- 2019-09-04 Well, I went to add a tiddler called "Beorg app" and I had already done this long ago. One thing that's changed from then is that I probably won't use [[org-mode]] for journal entries, but org-mode does work great for project planning and just keeping things generally in order. The app still doesn't search notes in an entry, so that makes it not as useful for me for referring to stuff on mobile. I'll probably keep using [[Editorial]] for `.org` files until it dies of neglect. ----- 2019-10-01 My master outline [[org-mode]] file had grown and grown, and was too unwieldy in [[Editorial]]. I fired up Beorg last night again and it's really nice. Still can't search notes, but the ability to quickly capture something from the phone and throw it in an `inbox.org` file is so convenient.
https://www.newark.com/bergquist/k10-104/thermal-pad/dp/70C9348
http://www.giorgiosancristoforo.net/softwares/berna/ > Berna is a software simulation of a late 1950s electroacoustic music studio. Oscillators, filters, modulators, tape recorders, mixers, are all packed in a easy-to-use interface with historical accuracy. 12 Euros. TWELVE EUROS.
* [[Conrad Hoffman]]'s notes: http://www.conradhoffman.com/beseler01.htm
https://folivora.ai I have always gotten along better with BTT than with [[Keyboard Maestro]]. 2019-08-10 Didn't realize the [[Setapp]] version of this was newer (v3) than the one I had installed before!
https://www.hogbaysoftware.com/bike/ <<< """ Structured & focused writing Use Bike to think, write, organize. Make lists, take notes, create documents. Bike's an unusually fast writing app designed for your Mac. """ <<< Available on [[Setapp]]. I sometimes forget that Bike has two modes: Outline editing and Text Editing mode. You can press the Escape key to toggle between them.
This is a good one: https://bing.com/covid
https://github.com/matryer/bitbar > Put the output from any script or program in your Mac OS X Menu Bar
https://bitly.com/ Oh! I didn't realize that you can get a short [[Washington Post]]-branded link by pasting one of their full article URLs into Bitly, which then converts it into a `wapo.st/blahblah` URL.
from Nick Blackbourn: [[Digital note taking|https://nickblackbourn.com/blog/digital-note-taking]] > Your notes can be the greatest asset in your working life. This is no exaggeration. Your notes are the record of your lifetime of learning and thinking. > You are what you pay attention to. Read great books, absorb fascinating ideas, and look to make connections between them. Taking notes is how you do this. (When I say ‘read’, I also mean watch, listen, etc.) Notes are an aid for your mind as you seek to know more, acquire wisdom, and prevent important concepts slipping from your consciousness.
https://www.blender.org/ > Open source 3D creation. Free to use for any purpose, forever. via [[Catherine|https://casualbedlam.com/#Blender%20for%20Beginners%20tutorial]] Crazy example: https://youtu.be/exAwxzhBL8w?t=613
(meta: This is how I imagine I would write entries in a [[topic journal|Topic journals]]. Maybe it'll stick?) * 2019-10-30: Because of a congenital cataract, and because lens implants weren't a thing back then, I have no lens in my right eye. Never did, and got along ok mostly synthesizing depth perception, which I can't really imagine. (No ability with sports, but who cares.) I have "vision" in it, but it's about the quality of peripheral vision for most people. If it were all I had, it would be usable for not bumping into things, and unusable for reading, driving, and using a phone or computer. The left eye is pretty normal and degenerating in the near field at the rate of any middle-aged person. So I'm particularly sympathetic to the challenges that come with blindness and low vision. I would be squarely in that boat except for the luck I've had in not injuring my "good" eye (knocking on a HUGE piece of wood here). So I'm especially interested in text-to-speech, Apple's VoiceOver, and the way that people without full sight can fly around their phones and get stuff done. And talk among web designers about accessibility is just a little less abstract for me than I'd guess it is for a lot of people.
https://blot.im/ > Blot turns a folder into a website.
https://www.nelsoncounty.com/blue-ridge-tunnel/ > The Blue Ridge Tunnel was constructed between 1850 and 1858 beneath Rockfish Gap in the Blue Ridge Mountains of central Virginia. CSX Transportation generously donated the tunnel to Nelson County in 2007. > > The tunnel is located at the convergence of the southern entrance of Shenandoah National Park’s Skyline Drive, the northern entrance of the Blue Ridge Parkway, the Appalachian Trail, and U. S. Bicycle Route 76. Both Interstate 64 and U. S. 250 cross over the tunnel at Rockfish Gap.
""" This is all based on the Bogleheads asset allocation wisdom: http://www.bogleheads.org/wiki/Asset_allocation """ John Bogle (RIP) (of Vanguard funds) is a proponent of simple asset allocation portfolios. He frequently advises that most investors should allocate investment portfolios using two asset class index funds: a U.S. total market stock index fund, and a U.S. total bond market index fund. A widely held portfolio among Bogleheads Forum members is the three-fund portfolio allocating investments among: * a U.S. Total market stock market portfolio * a Total International stock market portfolio * a U.S Total bond market portfolio. This portfolio is frequently expanded to include a fourth asset class, U.S. inflation-indexed bonds.
by James Joyce in the [[Serial Reader]] app: https://www.serialreader.org/56d5079351710127a075b44d/a-portrait-of-the-artist-as-a-young-man/ """ started: 2019-03-03 finished: """
[[@kaa|https://micro.blog/kaa]] posted on [[Micro.blog|https://micro.blog/kaa/2524993]]: > Been reading [[Atomic Habits|https://jamesclear.com/atomic-habits]]. Really practical book to read if you’re trying to make changes in your life. The biggest challenge is to try and process all the information in a meaningful manner. I think this one will benefit multiple reads. [[@paulcraig901|https://micro.blog/paulcraig901]] and [[ChrisJWilson|https://micro.blog/ChrisJWilson]] agreed it was good. James Clear introduced the book on CBS This Morning: https://youtu.be/i1Xm_MA2NwA Looks really good.
https://rosenfeldmedia.com/books/content-everywhere/ by Sara Wachter-Boettcher 2019-04-19 I have a copy of this at work.
https://www.goodreads.com/book/show/2237674.Like_A_Rolling_Stone by Steven Kurutz, 2008 Started reading: 2021-08-08
by Jake Knapp and John Zeratsky https://maketimebook.com I'm still not done reading this. Why? Oh, because I got distracted by shit on my computer and phone. But that's not the fault of the authors. They accomplish a rare mixture of practical and immediately helpful advice, a friendly tone, and a lack of "do it this one way" language.
https://www.masteringemacs.org/book by [[Mickey Petersen]] [[2019-02-09 Bought "Mastering Emacs"]]
Stopping the Noise in Your Head: The New Way to Overcome Anxiety and Worry by Reid Wilson, PhD https://www.goodreads.com/book/show/26702567-stopping-the-noise-in-your-head Per Merlin on [[Back to Work #421|https://overcast.fm/+BZjKZYJs/04:10]].
https://bulletjournal.com/pages/book review: http://paulcraig.blot.im/book-review-the-bullet-journal-method started: 2019-05-09 finished: 2020-02-15
https://www.goodreads.com/book/show/35297297-the-gentle-art-of-swedish-death-cleaning by Margareta Magnusson """ Started: 2019-06-24 Finished: 2019-08-10 """ If I had to rate it, it would get 2.5/5 stars, just because there are so many asides and nothing earth-shattering in it. But I still read the whole (short) thing because it was fun to imagine this Swedish lady, aged "between 80 and 100", telling me all these charming stories. The basic message is: //Death-cleaning: Do it. Save your family the trouble of dealing with your crap. Going through old stuff can be fun and a little sad. Do the big things first and build momentum. Save sentimental stuff and photos for last.// tiddlers: [[Swedish death cleaning]]
I know `org-cliplink` will take a URL from the clipboard and paste in a titled link into [[org-mode]], but I wanted to be able to also grab any selected text and put it into a quote block, similar to what [[Anne-Laure Le Cunff]] does for [[Roam]] in her [[+Roam bookmarklet|https://nesslabs.com/roam-research-bookmarklet]]. ```javascript javascript:(function(){let%20text="";%20if(window.getSelection()!=''){text=window.getSelection().toString();}prompt("Press%20CMD+C,%20then%20escape%20and%20paste%20into%20org-mode.","%5B%5B"+location.href+"%5D%5B"+document.title+"%5D%5D%5Cn%23%2Bbegin%5Fquote%5Cn"+text+"%5Cn%23%2Bend%5Fquote%5Cn");})() ```
<<< When we open a really great book, it doesn't matter how long it takes us to get through it. It matters that //the book gets through us//. <<< Audrey Rindlisbacher, talking about commonplace books on [[YouTube|https://youtu.be/lpSdQ5fHA4A?t=155]] [img[https://twelvety.com/philtiddlywiki_images/2019-01-09-rindlisbacher.jpg]]
2019-11-12 I was reading about "Don't Look Back" on Wikipedia today and bounced around until I found this source article, which is a [[letter from Tom Scholz to Boston fans|http://www.thirdstage.ca/boston/articles/miscellaneous/350-a-letter-from-tom-scholz-to-all-who-have-supported-boston-at-bostonorg]]. It sounds like Scholz didn't make it easy for Sib Hashian to play drums on these tracks: > For many tracks on album #2, where there were no existing demos for Hashian to study, I had great difficulty getting tracks I considered useable from his attempts. Finally resorting to unusual editing techniques to make them passable, the song "Don't Look Back" had over 60 splices for drum timing corrections. (I'm now pretty good with a razor blade and tape in the studio!) I guess I can't argue with the results, but dang, 60 edits? Control freak much?
https://bottlehead.com/product/crack-1-1-otl-headphone-amplifier-kit/
https://bottlehead.com/product/kaiju-300b-amplifier-kit/
Audio engineer in L.A.
I watched this entire 26:28 video. [[Bradley Cook]] is my new hero engineer for how he made "Everlong" by [[Foo Fighters]] sound so powerful and interesting. So sharp but also apparently so laid-back. [[Foo Fighters Everlong: Inside the song - Warren Huart: Produce Like A Pro - YouTube|https://www.youtube.com/watch?v=1LDGYI2oaVI]] <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com//embed/1LDGYI2oaVI' frameborder='0' allowfullscreen></iframe></div>
https://www.breville.com/us/en/products/ovens/bov650.html Toaster oven recommended by [[John Siracusa]], which was all I needed to know to order one. https://hypercritical.co/2020/08/31/good-products Unpacked on 2022-07-22. It makes excellent frozen pizza and toast!
https://en.wikipedia.org/wiki/The_Future_Crayon [[Broadcast]]'s rarities and B-sides compilation [img[https://twelvety.com/philtiddlywiki_images/2020-06-14 broadcast the future crayon.jpg]]
https://brooklynbrewshop.com/ > Our Beer Making Kits are reusable and include the brewing equipment and ingredients for a one-gallon, all-grain batch of beer. Endorsed by a co-worker. Oh man I do not need to know about this.
https://www.theatlantic.com/magazine/archive/2019/07/work-peak-professional-decline/590650/ by Arthur C. Brooks Via [[Andrew Canion]] on his [[Drummer blog|http://oldschool.scripting.com/andrewcanion/2021/11/04.html#a070239]]. This is one of those astounding articles where I pulled so many quotes out of it that I may as well highlight the whole thing.
[[But She's A Girl...|https://www.rousette.org.uk]]: one of the first bloggers I followed after installing NetNewsWire in about 2005. Also an audiophile! Reconnected on Micro.blog.
Years ago, [[BSAG - But She's a Girl]] used [[Tinderbox]] for her [[daybook]]: https://www.rousette.org.uk/archives/tinderbox-daybook/ https://www.rousette.org.uk/archives/pomodoros-and-tinderbox-daybook-revisited/ I especially like this format she did where the notes are automatically named based on the current day: [img[http://twelvety.com/philtiddlywiki_images/2022-01-05-bsag-tinderbox-daybook.jpg]]
https://buffereditor.com/ > Code and text editor for iPhone, iPad and iPad Pro I bought it because it said it understands [[org-mode]] syntax, which it does, but it's so wonky that it's not for me. If it could search content across files, I would probably use it, at least just to view and not edit.
from https://zettelkasten.de/posts/buffer-notes/ > A buffer note is a note that is like a specific container of notes that you will use later. They buffer the gap between note production and assignment of notes to projects. My buffer notes are even more unstructured than Sascha and Christian's. They're just short timestamped entries that temporarily get prepended to a text file in Dropbox.
* ~~Why can't plain URLs pasted into Markdown render as URLs? Like this? https://tiddlywiki.com/plugins/tiddlywiki/markdown/~~ * ~~URLs should render as blue, not black~~
https://bunchapp.co/ > Bunch is a macOS automation tool that takes a folder of plain text files containing lists of apps and commands to launch and provides an easy-to-use menu for triggering them. They mentioned this on [[Automators]] the other day and I like the idea of it as being a simpler alternative to [[Keyboard Maestro]], which I have, but have never clicked with.
See it under "Belief #3: Everything flows together." on https://busterbenson.com/. I ''love'' this visualization of time. So much better than a bulleted list. > Remember we will die, and so will the universe. Good brings bad, and bad brings good. Appreciate the weeks we get. [img[https://twelvety.com/philtiddlywiki_images/2019-09-11-buster-benson-life-in-weeks.png]] He says it was inspired by https://waitbutwhy.com/2014/05/life-weeks.html
https://www.caffenol.org/recipes/ https://shootitwithfilm.com/caffenol-film-developing-tutorial/ This is what I want to do next.
2019-01-14 """ Someone here had the same problem: https://apple.stackexchange.com/questions/256908/what-is-calncservice-and-why-does-it-run-hot-in-macos-sierra """ I turned off notifications for a bunch of apps and now the CPU seems to be back down to normal.
https://www.cambridgeaudio.com/usa/en/products/hi-fi/ax/axr100 I do not need another amplifier, but if I do someday, this looks like a good one, even though it's technically a receiver. Has a subwoofer out, too. They are $600 new. One of these sold on 2021-12-04 for $425 refurbished direct from Cambridge Audio's [[eBay]] outlet, but someone in one of the reviews bought one from them on 2021-03-15 for $350 refurbished, which is insane.
Gorgeous: [img[http://twelvety.com/philtiddlywiki_images/2021-12-10-cambridge-audio-azur-651a-amp.jpg]] https://www.crutchfield.com/S-9cpsBbPPtyC/p_779651AB/Cambridge-Audio-651A-Black.html * 75 RMS into 8 ohms * subwoofer out (mono) * preamp out * 6 analog line inputs * 1 USB digital input * dual mono power supply * made from 2011–2015 * tone control bypass * CAP5 anti-clipping system
[img[http://twelvety.com/philtiddlywiki_images/2023-07-08-cambridge_cxa60.jpg]] https://www.cambridgeaudio.com/usa/en/products/cx/cxa60 > The most fun you can have with 60 watts. An amplifier is the heart of any hi-fi system and ours - What Hi-Fi?’s ‘Best Stereo Amplifier’ two years running – is hugely entertaining. With those 60 watts of power comes 4 analogue, 3 digital and optional Bluetooth inputs so your connectivity is sorted too.
[img width=50% [https://twelvety.com/philtiddlywiki_images/2021-12-06-cambridge-audio-cxa81.jpg]] https://www.cambridgeaudio.com/usa/en/products/hi-fi/cx-series-2/cxa81
https://www.cambridgeaudio.com/usa/en/products/hifi-and-home-cinema/dacmagic-100 Ordered it because: * It might be better than the [[Schiit Modi 2 Uber]] we have now? Maybe? * It has lights that show the sampling rate of the signal. * The best CD player I ever heard in a home system was a Cambridge Audio that belonged to a friend in Raleigh, NC in 2003. I've wanted one of their digital products ever since. * The price was sure right. * It seems to be made better than Schiit stuff. * It's got a Wolfson DAC chip that people seem to like. * I didn't trust the idea of the internal switching PSU in the [[Schiit Modi 3]], although it's probably fine. I hope I didn't choose the wrong thing. * I read too much about how inaccurate the [[Schiit Modi Multibit]] is, although people sure do love it. It seems the "detail" that gets the raves may just be a spray of high frequency distortion added to the signal. I guess [[R-2R/ladder DACs]] are great if they're really expensive and done just right, but I don't know if the Modi Multibit is it.
https://www.cambridgeaudio.com/usa/en/products/hifi-and-home-cinema/dacmagic-xs 2019-12-27 Since I am apparently doing unpaid endorsements for Cambridge Audio now, I caved and ordered this tonight. (It's $75 — cheap for a DAC.) As smooth as the [[Sony NW-A45 hi-res audio player]] sounded as a DAC today, I can tell it's underpowered. This Cambridge DAC has power to burn, and an ESS Sabre DAC chip, which I've been curious about. And the [[FiiO A5 headphone amp]] just sounds muddy the more I listen to it, so I'm going to need to sell that. The only drawback of this Cambridge unit is that it doesn't work with an iPhone unless you're also charging it, which is OK because I have the Apple Lightning/USB dongle that allows Lightning charging at the same time. And that's also OK because using [[Qobuz]] on the phone on wifi drains the phone's battery anyway. If I had gotten an [[AudioQuest Dragonfly Red]], that would have drained the battery even faster if it was plugged into the phone by itself. The Apple dongle is in the equation no matter what.
https://www.cambridgeaudio.com/usa/en/products/speakers/minx-x201 2019-12-04 A marvelous, small subwoofer. It looks more like a squared off little NAS than a subwoofer, and makes our Wharfedale bookshelf speakers sound geometrically bigger than they are.
https://www.nytimes.com/2020/03/18/health/coronavirus-fever-thermometers.html Sort of, apparently. Or at least the [[Kinsa US Health Weather Map]] map may predict where some hotspots might be. And now I want a [[Kinsa smart thermometer]].
No we cannot.
* 2020-06-06 Tried to copy the [[Momma]] FLAC album to the [[Roon]] [[Intel NUC]] over the network and of course couldn't again. Tried repairing permissions with the external hard drive connected to the [[MacBook]] and couldn't. Oh well. I buy music so infrequently now that it's not too much trouble to connect the drive to the MacBook directly for long enough to copy the files.
[[Apichatpong Weerasethakul]] seems delightful. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/F_vTq7sOa7Q' frameborder='0' allowfullscreen></iframe></div> [[Memoria (2021)]]
https://www.captureone.com/en/products-plans/capture-one-express/fujifilm I downloaded the trial of the free Fujifilm version, thinking that it would let me get to the Fuji film simulations on raw files, but not for the [[Fujifilm X100T]]. This page has a table that shows the cameras it fully supports. In the X100 series, it only deals with [[Fujifilm X100F]] and X100V. That's fine. * https://support.captureone.com/hc/en-us/articles/360002589937-Fujifilm-Film-Simulations ''Update:'' Goodness. Somehow I think I prefer to look of applying Capture One Express's "Fashion" preset for X100T color photos better than the Fujifilm "Classic Chrome" (either in-camera or in [[Adobe Lightroom Classic]]). And no matter what I try, Capture One Express's "Silver" grain preset is better than any grain settings I can come up with in Lightroom.
I was trying to use [[Capture One]] to edit a grayscale TIFF I had scanned a long time ago with the [[Plustek OpticFilm 8200i]] file, but couldn't edit the file. Was getting very worried about license activation going bad or file permissions on my hard drive, then found that Capture One can't edit files in a gray/grayscale color space. Converted it to RGB with [[Photos.app]] and re-imported and it was fine. Whew. https://support.captureone.com/hc/en-us/community/posts/360009978057/comments/360001808417 > Yes, that was it, thanks! I keep forgetting about the grayscale non-support.
I was mining [[Jack's|Jack Baty]] [[old blog posts tagged with|https://archive.baty.net/tags/orgmode/]] [[org-mode]] and ran across this, which is //exactly// what I was looking to do yesterday. I don't want to have a million capture templates for a bunch of different log files (which I probably have too many of already anyway). Sometimes I just want to add something to a datetree in whatever the current buffer is. The code in [[this post|https://archive.baty.net/2017/capturing-to-an-orgmode-date-tree-in-current-buffer/]] does exactly that, although I just stole a later version of it from his `orgmode.el` [[config on GitHub|https://github.com/jackbaty/doom.d/blob/main/orgmode.el]], which is slightly tweaked in that (I believe) it specifies the outline path ("olp"), which I like. It also drops the inactive timestamp, which I don't think I'll need in a datetree anyway. In mine I added a time prompt, because sometimes I want to slot something into a datetree at a date in the past: ``` ("l" "Current file log entry" entry (file+olp+datetree buffer-file-name) "* %? \n" :time-prompt t) ```
They have [[snuggle sessions|https://www.caromontcheese.com/snugglesessions]] with goats. ❤️
https://staff.fnwi.uva.nl/c.dominik/ Original creator of [[org-mode]].
https://castro.fm/ I used [[Overcast]] for podcasts for so long, but the Castro manual-queue method just fits my overloaded brain better.
''catafalque'' |ˈkadəˌfalk| noun > a decorated wooden framework supporting the coffin of a distinguished person during a funeral or while lying in state. Found in [[book: A Portrait of the Artist as a Young Man]]: > The rector would be there in a cope of black and gold and there would be tall yellow candles on the altar and round the catafalque. And they would carry the coffin out of the chapel slowly and he would be buried in the little graveyard of the community off the main avenue of limes.
This is for stuff I've recorded myself, or that I've salvaged from Dad. Helpful links: * [[Yale Library Non-Music Sound Recordings Checklist (RDA update)|https://web.library.yale.edu/book/export/html/1303]] * [[Yale Library Checklist for Cataloging Popular & Traditional Music Sound Recordings|http://www.library.yale.edu/cataloging/Orbis2Manual/soundrecpoptradmusic.htm]] * [[ECU Library Cataloging Procedures - Cassette Tape Copy Cataloging|http://web.lib.ecu.edu/music/cataloging/cassettecataloging.htm]] Ideas for call-number formats (with each number just incrementing from the last one used): * `CA-####` cassette * `DA-####` DAT * `MC-####` microcassette * `MD-####` MiniDisc * `RE-####` reel-to-reel I'm not doing this for LPs because all of mine are self-cataloguing and have unique numbers found on [[Discogs]], and I file them by artist last name, band name, or composer if classical. !! 2024-10-20 Catherine told us last night about numbering things by the date you ingest/accept them into your system. I'm finding out about accession numbers and [[object numbers|object number]]: https://collectionstrust.org.uk/resource/numbering/ https://collectionstrust.org.uk/resource/object-number/ Bitesize videos | Spectrum 5.1 | Object numbering: https://youtu.be/HgT6rgscO2o I figure I'm not going to bring more than 10 old tapes into my system per day, so it could be something like: PN20241020 or PN20241020.01 With the 20241020 part being the year, month, day I logged the item.
<<< I have close to 1,000 articles in my personal wiki at this point. I have maybe 1,000 more scattered on other sites. They are from myself and others, most simple summaries of ideas I encounter, or data, or examples of ideas. Some are the result of afternoon-long rainy Saturday coffee shop investigations, but most are like what I have just showed you here, simple knowledge that builds complexity through linking. And when you get to that point, where you’ve mapped out 1000s of articles of your own knowledge you start to see impacts on your thought that are very hard to describe. Over time these things you write up start to form a deep network that helps you think. <<< from [[The Garden and the Stream: A Technopastoral — Mike Caulfield|https://hapgood.us/2015/10/17/the-garden-and-the-stream-a-technopastoral/]]
http://www.earlytelevision.org/Reitan/color_sys_cbs.html http://www.earlytelevision.org/cbs_color_system.html > This field sequential system displayed red, green, and blue television images in sequences, and depended upon the retentivity of the eye to merge these into a single color picture. If, however, flicker and picture sharpness were to be maintained at the level of monochrome television, a field sequential broadcast signal would require three times the bandwidth of monochrome. A compromise or trade off was reached by increasing the bandwidth from 4 to 5 MHz, number of frames were reduced from 30 to 20 per second, and scanning lines reduced from 525 to 343. For this reason it was incompatible with existing black and white broadcasting. > > This was a hybrid system. It used a rotating disk, but it was not a scanning disk; it contained red, green, and blue filters arranged in radial arcs. The "color wheel" spun in front of a conventional electronic scanning tube, presenting it with successive red, green, and blue images. The receiver had a similar color wheel, displaying the successive images to reconstruct the full color image.
2022-02-19 Added a note to skip the AAC/[[iTunes Match]] steps for things that are lossless in [[Apple Music]]. 2021-12-26 Changed Qobuz to Bandcamp, and Plex to Roon. 2020-12-13 Clarified the delete-from-folder step to cover cases when it came from an online store and not a CD rip. 2019-12-15 Changed steps to [[org-mode]] plain list + checkbox format for easy copying and pasting. 2019-09-29 Ok, this is just a ''ridiculous'' process, and yet, soothing. Everything below is in an [[org-mode]] item for this particular CD: ``` TODO <artist name>: <CD title> [/] # insert timestamp and source here, like this: <2019-12-12 Thu> downloaded FLAC from Bandcamp (or "ripped CD") - [ ] rip CD with XLD to AIFF (in Seagate drive, in "XLD extract" folder), check log file for errors - [ ] print "FLAC" label and stick it to CD case/sleeve - [ ] encode AIFFs to FLAC w/xACT - [ ] run FLAC through MusicBrainz Picard to fix metadata and automatically save "cover.jpg" - [ ] (if available as lossless on Apple Music, add it to the Apple Music library and skip the AAC/Music.app/iTunes Match steps) - [ ] encode to AAC 256k w/xACT for iTunes Match - [ ] upload .m4a (AAC) files to the macOS Music app - [ ] verify album in iTunes Match - [ ] delete iTunes local downloads - [ ] tell Sarah it's in iTunes Match or Apple Music - [ ] delete AIFFs - [ ] copy FLACs to Roon server (including "cover.jpg" and XLD log file) - [ ] rescan Roon library - [ ] copy FLACs to Seagate backup drive - [ ] copy FLACs to Sony NW-A45 hi-res audio player - [ ] backup FLACs to Backblaze B2 - [ ] delete from "XLD extract" folder (or Downloads folder) - [ ] change this CD's org-mode headline from TODO to DONE ``` Software, hardware and services referenced: [[XLD]], [[FLAC]], [[xACT]], [[MusicBrainz Picard]], [[Plex]], [[Roon]], [[iTunes Match]], [[Sony NW-A45 hi-res audio player]], [[Backblaze B2]]
There's no order here, other than that the top line is always the most recent CD I thought of that I realized I needed to have a lossless rip of. Also, this can encompass things I don't own but need to buy in FLAC or on a CD: * [[John Coltrane : Coltrane ’58: The Prestige Recordings|2019-04-25 link: John Coltrane : Coltrane ’58: The Prestige Recordings : Aquarium Drunkard]] * Makaya McCraven: [[Universal Beings|https://intlanthem.bandcamp.com/album/universal-beings]] * Tortoise: TNT * Talk Talk: Laughing Stock * The Smiths: Hatful of Hollow * Neil Young: Harvest * This Kind of Punishment: In The Same Room/5x4 * Polvo: Cor-Crane Secret * Polvo: Today’s Active Lifestyles * Kitchens of Distinction: Strange Free World * Camera Obscura: Let's Get Out of This Country ----------- migrated from nvALT 2019-02-28
As far as I know, all these people are still alive: * Alan Alda * Julie Andrews * Dickey Betts * Tom Brokaw * Vashti Bunyan * Clem Burke * Kate Bush * Wendy Carlos * Jimmy Carter * Dick Cavett * Noam Chomsky * John Cleese * Sean Connery * Elvis Costello * David Crosby * Roger Daltrey * Ted Danson * Judi Dench * Donovan * Bob Dylan * Donald Fagen * Sally Field * Mick Fleetwood * John Fogerty * Harrison Ford * Peter Frampton * Morgan Freeman * Ace Frehley * Dawn French * Stephen Fry * Peter Gabriel * Ian Gillan * Terry Gilliam * Jane Goodall * Emmylou Harris * Debbie Harry * Howard Hesseman * Peter Hook * Chrissie Hynde * Eric Idle * Yusuf Islam * Joe Jackson * Mick Jagger * Billy Joel * James Earl Jones * John Paul Jones * Terry Jones * Angela Lansbury * Geddy Lee * David Letterman * Alex Lifeson * David Lynch * Steve Martin * Brian May * Paul McCartney * Michael McDonald * Roger McGuinn * John Mellencamp * Helen Mirren * Joni Mitchell * Stephen Morris * Morrissey * Graham Nash * John Nettles * Anton Newcombe * Bob Newhart * Colin Newman * Olivia Newton-John * Yoko Ono * Jimmy Page * Michael Palin * Carl Palmer * Geoffrey Palmer * Dolly Parton * Neil Peart * Steve Perry * Robert Plant * Iggy Pop * Keith Richards * Phil Rudd * Jennifer Saunders * Tom Scholz * William Shatner * Patrick Simmons * Paul Simon * Maggie Smith * Jan Smithers * Bruce Springsteen * Jody Stephens * Ringo Starr * Stephen Stills * David Suchet * Bernard Sumner * Richard Thompson * Lily Tomlin * Pete Townshend * Edward Tufte * Steven Tyler * Dick Van Dyke * Max von Sydow * Tom Waits * ~~Scott Walker (the musician)~~ * Joe Walsh * Charlie Watts * Bob Weir * Betty White * Cindy Williams * Henry Winkler * Bill Withers * Stevie Wonder * Angus Young * Neil Young
Now it's this: `YYYY-0MM-0DD Journal`
I wanted to make the [[org-journal]] `:CREATED:` property timestamp be in `yyyy-mm-dd` format instead of `yyyymmdd` so I could search for a `yyyy-mm-dd` string using any search tool and find all the occurrences, even when I'm not using `org-journal` to search. Found an `org-journal-created-property-timestamp-format` variable, which is set by default to: `"%Y%m%d"` And there's this instruction in the variable listing: > You must call `org-journal-convert-created-property-timestamps` afterwards, if you have existing journal entries. So, I added this line to my `config.el` in the `(setq ... )` part where all the other `org-journal` stuff is specified: ``` org-journal-created-property-timestamp-format "%Y-%m-%d" ``` Restarted [[Emacs]] to make it heed the new timestamp format. Then it was time to convert the timestamps in existing `org-journal` entries to the new format. Went to the scratch buffer and pasted in this, which tells it what old-format timestamp to search for and convert to the new format specified in `org-journal-convert-created-property-timestamps` ``` (org-journal-convert-created-property-timestamps "%Y%m%d") ``` and then did `M-x` `eval-buffer` and it ran on all the July entries and today's new one for August 1. I checked all the journal entries and sure enough, all those `:CREATED:` properties were updated to `yyyy-mm-dd` format. In retrospect, it was reckless to run this batch operation without backing the journal files up first, but I got lucky and didn't break my files this time.
June 2, 1941 – August 24, 2021 <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//FSNTNu_97vU' frameborder='0' allowfullscreen></iframe></div> Besides being one of the first drummers who got my attention in 5th grade, here's another reason I love Charlie Watts: Every time he hit the snare on the backbeat, it was like lighting a folded paper boat on fire, placing it on the still water of a lake, and giving it a push. Over and over. My favorite.
[[Cheap Trick: Steve Albini Sessions 1997 - YouTube|https://www.youtube.com/watch?v=6bsT3EWlsJM]] <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/6bsT3EWlsJM' frameborder='0' allowfullscreen></iframe></div> Why did it take 24 years for me to learn about [[Cheap Trick]] re-recording the entire //In Color// album with [[Steve Albini]]?
https://mediaatelier.com/CheatSheet/ > Just hold the ⌘-Key a bit longer to get a list of all active short cuts of the current application. It's as simple as that.
https://www.hbo.com/chernobyl We're almost done watching Chernobyl on [[HBO]]. Grim, bleak, and incredible. Combines two of my favorite things: nuclear fear and Russia. Just wish the actors would speak in Russian accents, but that would probably be more distracting than their British English. It's been nice to think about a 1986 disaster instead of the current 2020 one.
2019-11-11 I need an accountability coach for eating, so that when I'm lazy and want to go to the Mexican restaurant up the street, I can ping this coach or bot or whatever and it will tell me "NO, EAT A SALAD". The holidays are basically here and I'm supposed to see my doctor for a cholesterol checkup in January or February and I'm already not on a good trend. I ran across this last night when I was in my master [[org-mode]] outline, and I'm glad I just pasted it right in there so I would actually see it again later: ``` <2019-09-10 Tue> Doc said this about my lab results: Cholesterol has worsened. LDL is higher (up from 128 to 149). Triglycerides were normal and are now 198 (we want these less than 150). Total cholesterol now too high at 233 (goal is less than 200). I would like you to start 3 months of intensive diet change where you are limiting your fats. Limit or eliminate greasy fried foods, saturated fats, and full fat dairy. Schedule a follow up with me in 3-4 months to have this rechecked. I should be back from maternity leave by late January. Let me know if you are agreeable to this plan. The alternative is to start a cholesterol medication (called statins) that can bring this down for you. Some of my patients elect to start this as they know diet change is unrealistic. ``` She means business this time.
https://www.choosyosx.com > Choosy opens every link in the right browser 2019-08-10 Using it to make [[Gmail]] always open in [[Firefox]].
Whoa. This is a [[TiddlyWiki]] I could get into: http://tw.boffosocko.com/
[[Debbie Millman]] did another great interview. https://soundcloud.com/designmatters/design-matters-with-debbie-millman-chris-ware-chip-kidd [[Chris Ware]] talked about his [[Rusty Brown]] book that came out in September 2019. Favorite excerpts: * Mention of [[Richard McGuire]]’s “[[Here|https://fromdusktilldrawnblog.wordpress.com/2016/05/03/here-by-richard-mcguire-usa-1989/]]” from RAW Magazine in 1989: ** I started looking at the world in a completely different way. I thought like, I mean, everybody sort of thinks like, oh, there probably used to be a different building here, or This was here. But are you really thinking about the people who inhabited it, what was in this space 40 years ago? Just like, if you demarcate out a small square of it, what was right here in this space, what was in this space 30 million years ago, what's going to be in it 10,000 years from now? And his book answers all those questions and does it in an extraordinary and an extraordinarily beautiful way. * Mention of [[grid cells]]: ** There's that idea of grid cells that the Nobel winners, I think their surname is Moser, who discovered that there are actually cells in our minds that map out spaces with which we're familiar — x, y, z, little things like halftone dots in 3D. And so it suggests that we actually have little tiny models of the houses that we've lived in and inhabit in our brains so that we're able to access them. * About snow: ** I really, really love snow. I moved back to the Midwest because I missed it so much in Texas and to me, it's just like the most perfect thing there is. Like the best art installation ever on planet Earth. You know, when you think about it, these billions of little tiny ice flowers falling down and kind of erasing the boundaries of everything and bringing this kind of silence and reassessment of the world. I don't know, I always just look forward to it and find it so astonishing. And the fact that they form in this way by traveling through the atmosphere through various slight variations in humidity and temperature, but that humidity and temperature affects the whole shape of the thing. So it's almost like a record of a life being lived in a way.
https://chriswatson.net/gallery/ > Watson was a founding member of the influential Sheffield based experimental music group [[Cabaret Voltaire]] during the late 1970’s and early 1980’s. Since then he has developed a particular and passionate interest in recording the wildlife sounds of animals and habitats from around the world. As a freelance composer and sound recordist Watson specialises creating spatial sound installations which feature a strong sense and spirit of place.
https://www.chriswhitten.com Drummer interviewed on [[John Darko]]'s podcast. Played with Edie Brickell, Paul McCartney, Dire Straits, The Waterboys, etc. I loved the interview and especially loved seeing this old photo of him on tour with Dire Straits and his Leica M6. [img[http://twelvety.com/philtiddlywiki_images/2023-02-20-chris-whitten-leica.jpg]] ([[Instagram|https://www.instagram.com/p/ComDFj_M0zp/]])
https://emacs.christianbaeuerlein.com/my-dracula-theme.html Gorgeous. ([[shown here|https://emacs.christianbaeuerlein.com/my-org-config.html]])
[[Export Day One (macOS) Journals to Emacs org-mode Diary Entries • Christian Tietze|https://christiantietze.de/posts/2020/10/export-day-one-journal-to-org-mode/]] <<< I noticed that I still had the journaling app Day One (macOS) on my computer. I haven’t touched it in ages. So I figured it’d be time to export to plain text and then shove all the goodness from 2004 and onward into my Emacs org-mode `diary.org`. Turns out there’s no Day One to org-mode exporter. Yet! <<< [[org-mode]], [[Day One]]
https://www.econtechnologies.com/chronosync-express/overview.html > ChronoSync Express is the entry level version of ChronoSync. It provides the basic file synchronization, backup & scheduling capabilities found in ChronoSync but at a more affordable price. Conveniently part of [[Setapp]].
http://cinephobe.tv per [[Fabio Roberti]] on [[Strength Through Failure]]
[[Cliff Richard & The Shadows - Move It (The Cliff Richard Show, 19.03.1960)|https://youtu.be/k5mIq3yF6Nc]] <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//k5mIq3yF6Nc' frameborder='0' allowfullscreen></iframe></div> Widely regarded as the first British rock single. Supposedly, John Lennon said that “before Cliff and the Shadows, there had been nothing worth listening to in British music," although I can't find a definitive source for this.
https://www.clockworkpi.com > DevTerm — An Open Source Portable Terminal for Every Dev. [img[http://twelvety.com/philtiddlywiki_images/2022-03-14-clockwowrk-devterm.jpg]] https://www.clockworkpi.com/product-page/devterm-kit-a06-series You know my brain thinks "Portable [[org-mode]]" when I see something like this. That keyboard looks cramped as hell, though.
https://colinwalker.blog/rejoining-facebook/ <<< As I said, most of the services and sermons, events and activities are planned, organised and delivered via Facebook, if I'm going to know what's happening and have some kind of input, I need to be where the church is. I've put my personal feelings about Facebook aside so that I can support my wife, her work, and her congregation. Good things //can// and //do// happen on social networks. <<< And then he said this in a comment back to me: > Indeed, it’s not always all it nothing, although I would have kept nothing if left to my own devices, but I really just needed to get over myself, see the bigger picture, and ensure I am managing it properly. I would like to get to this level of not being a dick about so many things.
''collywobbles'' |ˈkälēˌwäb(ə)lz| pl. noun - informal, chiefly humorous <<< stomach pain or queasiness: //an attack of collywobbles.// * intense anxiety or nervousness, especially with stomach queasiness: //such organizations give him the collywobbles.// <<< Found in [[book: A Portrait of the Artist as a Young Man]]: > We must pack off to Brother Michael because we have the collywobbles!
Wow. I guess it pays to learn how to use your apps. Saw how Emily Hokett uses [[MindNode]]. She uses the "Compact" layout, which is much more the way my brain works – like a cross between a mindmap and an outline. https://emily-c-hokett.medium.com/note-taking-minimalism-and-central-spaces-ef3e97ab1a3b
https://conifer.rhizome.org/ <<< Collect and revisit web pages. Conifer is a web archiving service that creates an interactive copy of any web page that you browse, including content revealed by your interactions such as playing video and audio, scrolling, clicking buttons, and so forth. <<< I'm always on the hunt for something the do a 100% perfect capture of a web page, even though that's probably the last digital-hoarding tool I need to add to the toolbox. But after trying this, it seems buggy and I don't understand how to manage the collection of stuff it downloads.
founder of [[Roam]]
[[Conrad Hoffman]] has given the world so much. Here's his brilliant treatise on [[Troubleshooting Audio Electronics Without Tears|http://www.conradhoffman.com/troubleshoottut.htm]] > A good lawyer won't ask the witness a question unless he already knows what the answer should be. When you make a measurement, be sure you have some idea what the answer should be. If you don't have a range of values in mind, you need to study the circuit. Measurements steer our actions so it's important to get clear answers that prove parts are either guilty or innocent. Forward progress depends on this! You need to develop the skills and confidence to declare a part good and move on. If you don't, you'll have continuous doubt about what's working and what isn't; you'll go around in circles or end up replacing perfectly good parts. Shotgun troubleshooting is bad troubleshooting. ... > One trick I do is photograph the component side of a board, then flip or mirror the image. Print it out and outline caps and such in red. Now you can look at the back of the board and quickly probe or desolder components without constant flipping of the board or whole unit. There is so much more to digest.
[[Conrad Hoffman]]
https://www.documenta14.de/en/artists/16209/ksyme-cmrc > The Contemporary Music Research Center (KSYME-CMRC) was founded in Athens in 1979 by Iannis Xenakis, Giannis G. Papaioannou, and Stephanos Vassiliadis, with the aim of developing electro-acoustic music and sound practices in Greece. It emerged from the Laboratory of Electronic Music (ΕΡΓΗΜ), a project of the Hellenic Association of Contemporary Music. [img[https://twelvety.com/philtiddlywiki_images/2021-09-14-ksyme-cmrc.jpg]]
Via [[Jack|https://rudimentarylathe.org/#2019.09.11%20-%20Journal]]: from https://www.jamesyu.org/continuous-publishing/ <<< There’s a new crop of writers and thinkers that are publishing their thoughts online in a continuous fashion as opposed to fully formed blog posts. These may be works in progress or the seed of pieces that they’re molding. ([[Skip straight to the list|https://www.jamesyu.org/continuous-publishing/#list]]) Much of online writing has been confined by timestamps and the reverse chronology of blogs. Each post is expected to be a gem that sits in a sea of other posts. It’s not surprising, since starting a personal site is synonymous with firing up a WordPress instance. This system has carried forward to modern social media platforms as well. At its worst, blogging incentivizes authors to create a huge number of low quality posts. There is pressure to perform, and the performance is publishing complete pieces. <<< Oh my goodness, there is a whole //mess// of interesting blogs/wikis/notebooks at the bottom of that post. This could be a problem for the [[Daily Haunts]]. Maybe I need [[Weekly Haunts]] or something? This is another area where [[TiddlyWiki]] is better than anything else I've seen for delving into someone else's online notebook. Clicking around on the more traditionally-structured sites in that list (or even [[Notion]]-generated sites) feels like "Ugh, where was I? How deep did I just go?", but with TiddlyWiki, you can click on a tiddler and the opened one goes to the top of the list. There's no downside for excitedly clicking on as many things as you want. Also, maybe this further crystallizes my friction with using my hosted [[Micro.blog]]. I don't feel at home there, and because it feeds the M.b timeline, it's also where more (potentially uninterested) people are likely to see what I write. That, combined with the timestamping and finality of each post, just feel like an awkward fit for me. Far better to keep filling up this wiki at will with whatever catches my interest. And I can keep revisiting occasional old tiddlers and making them better.
This is how I converted my [[org-roam]] files to [[Markdown]] for use in [[Obsidian]]: This [[shell script]] looked handy for using [[Pandoc]] to convert from [[org-mode]] to [[Markdown]], but I couldn't get it to work without errors: https://blog.mikecordell.com/2019/04/14/bulk-org-mode-to-github-flavored-markdown.html So I went back to this original from [[Jack Baty]], which was for converting [[Markdown]] to [[org-mode]], and figured I'd reverse-engineer it: ``` find . -name \*.md -type f -exec pandoc -f markdown -t org -o {}.org {} \; ``` This was the Pandoc line in Mike Cordell's script: ``` pandoc -s --wrap=none -f org --toc -t gfm $1 -o }{' "$STATEMENT" {} \ ``` My 1st attempt at using [[Pandoc]] to convert from [[org-mode]] to [[Markdown]], but this made setext-style headings. Gross: ``` find . -name \*.org -type f -exec pandoc -f org -t markdown -o {}.md {} \; ``` My 2nd attempt, which created [[ATX-style headings]], but also introduced linebreaks for blockquotes, and it escaped a bunch of apostrophes. Needed to turn this on: `--atx-headers` ``` find . -name \*.org -type f -exec pandoc -f org -t markdown --atx-headers -o {}.md {} \; ``` My 3rd attempt, which did not escape single apostrophes, because of using `markdown_strict`: ``` find . -name \*.org -type f -exec pandoc -f org -t markdown_strict --atx-headers -o {}.md {} \; ``` My 4th attempt, with `--wrap=preserve` turned on to keep linebreaks as they were: ``` find . -name \*.org -type f -exec pandoc -f org -t markdown_strict --atx-headers --wrap=preserve -o {}.md {} \; ``` Also had to do some searching and replacing in [[BBEdit]] to fix references to [[org-roam]] files, but that was quick.
A-ha! So, to make it easier to copy and paste from [[Roam]] to [[TiddlyWiki]], I made a [[TextSoap]] custom cleaner that uses [[regex]] to convert [[Markdown]] URLs to [[TiddlyWiki]] markup. Modified from code I found from [[Davidwells.io|https://davidwells.io/snippets/regex-match-markdown-links). (His version wasn't grabbing the 2nd capture group right on my tests.]] * ~~The regex pattern is: `\[([^\[]+)\]\((.*)\)`~~ * ''2020-12-26:'' A better regex pattern is: `\[([^\[]+)\]\((.+?)\)` ** The big difference between this newer one and the first one is that I've replaced the `*` with a `+?` because that's the lazy/ungreedy way to match. The "greedy" way with the `*` was munging together any multiple Markdown hyperlinks on one line into one big TiddlyWiki hyperlink. I honestly don't 100% understand why the `+?` works better in that exact position, but it works so I'm gonna leave it. * And the replacement is `[[$1|$2]]` I could probably do this with [[Pandoc]], but I don't know that yet.
From a [[wiki entry|https://andrewcanion.com/wiki/doku.php?id=cooling_off_period]] by [[Andrew Canion]]: <<< In the financial services industry a cooling-off period allows one to revoke whatever contract they’ve entered into. It’s a Cmd-Z for decisions. Here, I’m going to use it slightly differently. This will be home to a list of things I want to buy in the moment, but don’t. Then I’ll see if I’m still into them a while later. <<< I will, too! !! Purchasing desires * 2022-04-09 [[Sony Walkman WM-150]] * 2021-09-04 [[Fujifilm X-E1]] * ~~2019-04-13 [[Ricoh GR (2013)]] again~~ * 2019-12-26 [[AudioQuest Dragonfly Red]] * ~~2019-11-03 Cambridge Audio Minx X201 subwoofer~~ * 2019-11-03 one of those crazy foam mattresses you hear advertised on on podcasts * 2019-05-11 [[Fuji Instax Square|https://copingmechanism.com/2019/fuji-instax-square/]] (I swear Jack will be the death of me and my wallet) * 2019-05-01 Sony Walkman WM-D6C * 2019-05-01 [[Olympus Zuiko 35mm f/2.8 OM-mount prime lens]] * ~~2019-04-30 [[Olympus Zuiko 35mm f/2 OM-mount prime lens]] for the [[Olympus OM-2]]~~ * 2019-04-29 [[Fujifilm X100F]]. I mean of all the things I do not need, this has got to be at the top of the list. Still... * 2019-04-21 iPad Pro/Air + Smart Keyboard (or a new iPad Mini) + pencil, ostensibly for using with Day One and for marking up PDFs, which are in fact not sufficient reasons to take on another device. * 2019-04-15 Canon AE-1 (black) * 2019-04-13 [[Luna Display]] * 2019-04-13 [[Ricoh GR (2013)]] digital camera from 2013
https://copiedapp.com I use it to copy and paste between iOS and macOS since [[Universal Clipboard|2019-01-21 How to use Universal Clipboard between iPhone and Mac]] doesn't seem to work for me.
By [[Cory Doctorow]] https://doctorow.medium.com/the-memex-method-238c71f2fb46 > Blogging isn’t just a way to organize your research — it’s a way to do research for a book or essay or story or speech you don’t even know you want to write yet. It’s a way to discover what your future books and essays and stories and speeches will be about. [[Jack Baty]] [[linked|https://copingmechanism.com/2021/the-memex-method-when-your-commonplace-book-is-a-public-cory-doctorow/]] to this and it makes me want to blog, or something. Not just toss out semi-connected thoughts in this wiki. Doctorow linked to [[Dori Smith|]]'s old blog (here on [[Archive.org|https://web.archive.org/web/20020120231027/http://www.backupbrain.com/]]) which, because I am old, looks like what I remember real blogs looking like! There was less focus on The Single Blog Post and more on just The Blog itself, and it was rich and detailed and you could take in a lot of information and get a sense of the blogger by visiting the main page. Look at all those individual time-stamped posts without titles! It makes me think that doing a single [[Daily Notes]] post in [[TiddlyWiki]] with a bunch of random thoughts in it isn't good or useful. Like I should instead use one tiddler for each thought, but then I also don't want to have to name each of them. That's one area where [[Roam]] is better. I guess old-school blogs like Dori Smith's served a need that Twitter and micro-blogs and other regrettably social media stepped in and picked up in the meantime. I still think there's something to that every-thought-has-a-timestamp model that I'm unconsciously going for with my endless search for the perfect notetaking system. I don't know where to find it.
https://www.craft.do I hate naming a tiddler "Craft.do" but oh well. This is the new hotness notetaking app. Well, not that new anymore, really.
https://craigmod.com/ https://craigmod.com/roden/
https://craigmod.com/journal/the_future_of_photography_is_software/ > This is my lens: //Moments, memory, story, beauty.// Basically in that order. Humor is also in there, above beauty. Beauty has some intrinsic value, but, in my opinion, beauty shrouded in thin story is not worth as much as great story encased in the dregs of the world. Story, for me, gives purpose to the beauty. I think I've been going about all this completely backwards. Also, I bet when [[Craig Mod]] was shooting a [[Fujifilm X100T]], he wouldn't have been worrying about X-Trans demosaicing in Lightroom.
From April 11, 2021: [[The Talk Show ✪: Ep. 312|https://daringfireball.net/thetalkshow/2021/04/11/ep-312]], With [[Craig Mod]] This was good.
[[Pizza Toast & Coffee: Kissa Būgen - YouTube|https://www.youtube.com/watch?v=i5SLi-GZ0Z4]] by [[Craig Mod]] <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//i5SLi-GZ0Z4' frameborder='0' allowfullscreen></iframe></div> Mentioned on [[Craig Mod on The Talk Show, Ep. 312]]
https://apps.apple.com/us/app/creaks/id1466040723 > Meet Your New Neighbours on [[Apple Arcade]]
[[Creating an Always On E-Ink Org Agenda - lambda.cx blog|https://blog.lambda.cx/posts/org-agenda-eink/]] > This project been hugely beneficial for me. Mostly because I can check my org agenda without even turning on my computer. Even with my PC on, I can look at it any time without having to open either a new tab in my browser or Emacs. > > Being an e-ink display, it's also not bright and distracting, and doesn't need to be turned off at night. It sort of just looks like any other appliance. > > Between this e-ink version of the org agenda and the new tab version, my usage of the org agenda has gone up substantially. I used to use org for a handful of tasks, but moved over to regular calendar apps for most things, as they were simply more accessible in many situations. Now that I have this e-ink version of the org agenda, I find myself using it for almost everything. OMG I need this.
We've been bingeing this all weekend and it's good. It's a whole mental workout just to keep up with, and that's part of the fun. But there's some great acting in it and the plot is crazy.
https://www.zengobi.com/curio/ > Curio is an intuitive, freeform notebook environment with all the integrated tools you need to take notes, brainstorm ideas, collect research, and organize your tasks and documents. A single, incredibly powerful application where you can be more productive and focus on getting things done. Mentioned by [[Jack Baty]] here: https://rudimentarylathe.org/#Curio
https://www.cyberpowersystems.com/product/surge/rackbar/cps1215rms/ > Engineered for the most demanding applications, the professional-grade Rackbar™ CPS1215RMS safeguards systems and networking equipment by absorbing spikes in energy caused by storms and electrical power surges. Designed for network environments, the CPS1215RMS also performs superbly for home office use, providing 1800 joules of protection, 15-Amp electrical capacity with circuit breaker, and 12 surge-protected outlets (6 front, 6 rear). Industrial-grade metal housing keeps this Rackbar performing flawlessly. The CPS1215RMS has a 1U racksize and can be mounted vertically or horizontally. I had always dismissed CyberPower stuff because of the dumb name, but seeing this review of a closely related 20-amp unit (with a plug I can't use) convinced me they were good, and probably better than similarly priced Furman or Tripp-Lite surge protectors. Plus, I just love this guy's manner: [[Technical Pro PS9U vs. Cyberpower CPS-1220RMS PDU (And One is a Fire Hazard) - YouTube|https://www.youtube.com/watch?v=NgfoHJEdg7Q]]
https://davidseah.com/node/compact-calendar/ I can't get through the work year without this thing.
With a nod to [[Jack Baty|https://rudimentarylathe.org/#Daily%20Haunts]] and [[Andrew Canion|https://andrewcanion.com/wiki/doku.php?id=daily_haunts]], here are mine. Man, I really just don't look at that many different sites every single day. I suppose there might be another whole category for Google searches about Emacs... !! Visited "by hand" in the browser, not always in this order * Washington Post Obituaries (I have become that guy) * [[Catherine]]'s [[TiddlyWiki|https://casualbedlam.com/]] with the best domain name ever (This is our dear friend who allowed me to help her get going on DigitalOcean) * [[Joe Jennett's]] [[TiddlyWiki|https://simply.tiddly.jenett.org/]] * [[Josh Sullivan]]'s [[TiddlyWiki|https://joshisms.io/]] * [[Jack Baty]]'s [[TiddlyWiki|https://rudimentarylathe.org]] * [[Andrew Canion]]'s [[DokuWiki|https://andrewcanion.com/wiki/]] * [[Sphygmus]]'s [[TiddlyWiki|https://sphygm.us/]] * [[@kordumb]]'s ~~[[Humdrum Life|https://humdrum.life]]~~ -> [[The Independent Variable|https://tiv.today/]] * [[h0p3]]'s [[TiddlyWiki|https://philosopher.life]] * [[Micro.blog|https://micro.blog]] on the laptop, and via the iOS app on the phone !! Via RSS feeds in [[Feedbin]] * [[BSAG - But She's a Girl]] at https://www.rousette.org.uk * [[Gabe Weatherhead]] at [[Macdrifter|http://www.macdrifter.com]] * The others in Feedbin I need to get realistic about not reading. !! Email newsletters * Jocelyn K. Glei's [[newsletter|https://jkglei.com/newsletter]] * Dave Pell's [[NextDraft|https://nextdraft.com]] !! Trying do do less of {{Daily haunts to minimize}} !! Need to do more consistently {{Aspirational daily haunts}}
* Washington Post homepage * Twitter
Sometimes I open up the MBP and for real do not know what to do first. (I've written about this [[before|2019-02-12 Journal]], like, //very// similarly I see.) Here's what I feel like I should do, and not just go scattershot-crazy when I sit down to it. Also, this can't necessarily all be done in one session and isn't listed in order. Also, this is a ridiculous list. What if I only did each of these things once a day, but did them completely? * Review [[Things]] Inbox, Today, and Projects * Review and update the current "this week's projects" tiddler. Maybe even make incremental progress on a listed project. * Check email (currently using [[Postbox]]). Maybe even deal with a few messages instead of just being a human shell script that gets new email. * Visit Micro.blog. Say something nice about at least one thing I like in the Timeline. * Write something in a TiddlyWiki Journal tiddler * Convert some entries from `buffer.txt` to new tiddlers * Review [[YNAB]] for the past day * Visit [[Daily Haunts]] * Try not to think about the ultimate futility of all these steps being repeated daily
2019-06-02 heard about this from [[Diana Winston on the 10% Happier podcast|https://www.stitcher.com/podcast/abc-news/10-happier/e/61379440]] with Dan Harris. From https://tricycle.org/magazine/eight-winds/ <<< Worthy persons deserve to be called so because they are not carried away by the eight winds: prosperity, decline, disgrace, honor, praise, censure, suffering, and pleasure. They are neither elated by prosperity nor grieved by decline. The heavenly gods will surely protect one who is unbending before the eight winds. But if you nurse an unreasonable grudge against your lord, they will not protect you, not for all your prayers. <<< Nichiren Daishonin and... <<< It is human nature to gravitate toward the pursuit of prosperity or pleasure and shun decline and pain. It makes perfect sense. Prosperity means we get more stuff, decline means we do not. Pleasure feels good; pain does not. But if we center our lives on such an outlook, we are led away from true happiness. Happiness is not simply the abundance of pleasure in the absence of pain. Rather, it is to remain confident and optimistic in the face of everyday reality. <<<
https://every.to/superorganizers/the-fall-of-roam (paywalled now, but it wasn't when I read the whole thing yesterday) > A year ago, the idea of networking our notes with bi-directional links became the biggest thing in the tools for thought space since Vannevar Bush described the memex. Top-down hierarchies and tag systems became the pet explanation du jour for everything that was wrong with note-taking. So we all hustled on to the Double-Bracket Express determined to build our own networked knowledge graphs. But where did we actually go? At least for me—and most of the people I know—we got a garbage dump full of crufty links and pieces of text we hardly ever revisit. And we feel guilty and sad about it. I'm a sucker for articles about people who went all-in on [[Roam]] and then bailed for whatever reason. I end up nodding in agreement with them more often than not. So often, the reason is: "If you're hyperlinking //everything//, then how do you find //anything//?"
https://redsweater.com/about/DanielJalkut.html https://micro.blog/danielpunkass
https://www.reddit.com/r/datacurator/ > ''/r/datacurator'' is the place for discussion about the curation of digital data. Be it sorting, file formats, file encoding, best practices, discussion of your setup, tips and tricks, asking for help etc. I'll just be here for the foreseeable future, thanks.
[[Dave Hahn|https://twitter.com/relix42/status/1199871657696849921]] on Twitter: <<< Trying to summarize a few things I've heard: Trying to learn how to keep your system healthy by only studying its failures is like trying to learn how to keep your marriage healthy by only studying divorces. <<< Was linked to in the post by [[Lorin Hochstein on learning from near misses]].
https://nice-marmot.net/ [[Tinderbox]] user, photographer, lots of other stuff.
A friend posted on Instagram this photo of a [[David Berman]] poem. He was gone way too soon. [img[https://twelvety.com/philtiddlywiki_images/2021-04-01-david-berman.png]]
http://davidsylvian.com
https://dayoneapp.com I use Day One off and on. Sometimes I get freaked out that they'll have another syncing issue and lose peoples' entries, but then I remember that making Day One is Bloom's only job (as far as I know), so that's gotta count for something. * 2019-04-18 Why is the text export format so bad? The `Date:` for each entry is tacked onto the end of the line of the text for the preceding entry. Easy enough to fix in BBEdit, but why would they do this?
https://bloomaudio.com/products/ddhifi-tc01a-tc01c-usb-a-c-converter
https://jblevins.org/projects/deft/ > Deft is an Emacs mode for quickly browsing, filtering, and editing directories of plain text notes, inspired by [[Notational Velocity]]. It was designed for increased productivity when writing and taking notes by making it fast and simple to find the right file at the right time and by automating many of the usual tasks such as creating new files and saving files. Good grief. This looks incredible.
For my use of [[Deft]], I overrode the value of `deft-file-naming-rules` with this, which takes out the `(nospace . "-")` rule that replaces spaces with dashes. I don't mind spaces in filenames, so mine is set like this in `config.el`: ``` (setq deft-file-naming-rules '((noslash . "-") (case-fn . downcase))) ``` This makes Deft that much more like [[nvALT]].
https://www.dendron.so > The note-taking tool that grows with you. > Dendron makes it easy to add, find and share anything in seconds, regardless of how much information you have. I finally read more about Dendron, which is an extension for [[VS Code]]. It looks neat and seems to be a way to apply almost [[Johnny.Decimal]]-style hierarchy to wiki-style notes. I'm not sure I'd have the patience to use it in the heat of battle, and the raw [[Markdown]] that goes with it can get pretty ugly with all those long filenames/links. Still cool to read about. Here's something the developer ([[Kevin S Lin]]) wrote about the theory behind it: [[A Hierarchy First Approach to Note Taking - Kevin's Page|https://www.kevinslin.com/notes/3dd58f62-fee5-4f93-b9f1-b0f0f59a9b64.html]]
https://www.derrickstoryphotography.com
Crazy! https://www.dialup.com/ > Reviving the magic of talking on the phone. > Dialup is a voice-chat app that connects you serendipitously to the people you want to stay in touch with. Not sure it's for me, but a cool idea.
https://pureformstudio.com/diarly via [[Jack Baty|https://rudimentarylathe.org/#Diarly]] Welp, I can see where my next rabbit-hole is located. I don't know what it is about [[Day One]] for me, either, but it has felt heavy (as [[Jack points out|https://baty.blog/2020/from-day-one-to-diarly/]]) for a long time. And the idea of one entry per day is beautiful. 11:30 pm: Just imported my Day One entries. Wow. Diarly is much cleaner and easier to understand.
https://pureformstudio.com/diarly Recommended by Steve Zeoli [[in his review of MacJournal|https://welcometosherwood.wordpress.com/2019/02/18/macjournal-still-the-best-notebook-for-macos/]], which was linked to by [[Jack Baty|https://www.baty.blog/2019/whydya-do-it-steve]].
I tried using the theory of [[2019-11-17 Adam Savage on Lists, More Lists, and the Power of Checkboxes]] in "a notetaking app" for a project at work this past week and it //worked//. I didn't use paper because I couldn't take the time to scribble tasks down and erase or cross them out, so I went digital. I used it like a mindmap, making major disconnected "nodes" for subprojects and not worrying about what order those subprojects were in. Since "a notetaking app" can do hyperlinks to any paragraph in a document, I could organize links to those subprojects or meeting agendas in "higher level" bulleted lists towards the top. Following [[Adam Savage]]'s lead, I made almost all of the items in these lists checkboxes. It really helps to have a place to think things through and dump thoughts when I'm doing something else and something pops into my head.
https://en.wikipedia.org/wiki/Direct_air_capture > ''Direct air capture (DAC)'' is a process of capturing carbon dioxide (CO,,2,,) directly from the ambient air (as opposed to capturing from point sources, such as a cement factory or biomass power plant) and generating a concentrated stream of CO,,2,, for sequestration or utilization or production of carbon-neutral fuel and windgas. Carbon dioxide removal is achieved when ambient air makes contact with chemical media, typically an aqueous alkaline solvent or functionalized sorbents. These chemical media are subsequently stripped of CO,,2,, through the application of energy (namely heat), resulting in a CO,,2,, stream that can undergo dehydration and compression, while simultaneously regenerating the chemical media for reuse. Heard it mentioned on [[this episode|https://www.nytimes.com/2021/09/17/opinion/ezra-klein-podcast-adam-tooze.html]] of The Ezra Klein Show.
https://www.emacswiki.org/emacs/DiredMode > You can use `C-x C-q` to make a Dired buffer editable. This enters WDired mode (writable Dired). For example, you can use this to bulk-rename files, or to change file ownerships and privileges. http://pragmaticemacs.com/emacs/dired-rename-multiple-files/ > use `C-c C-c` [to] apply the changes, or `C-c ESC` to cancel
https://www.imdb.com/title/tt7945720/ On [[Netflix]]. So great. We plowed through season 1 in two days.
https://www.discourse.org/ > Discourse is the 100% open source discussion platform built for the next decade of the Internet. Use it as a mailing list, discussion forum, long-form chat room, and more!
One thing I don’t know how to address in [[Johnny.Decimal]]: Where to put things along the spectrum of widely available/low security <—> reduced access/high security. Oh, and also the small capacity <—> big capacity continuum. Like, I have: * a small pile of non-sensitive random files in Google Drive that are mostly there to share with people * a bunch more less-random stuff in Dropbox that stays there because it’s easy to sync with and edit on mobile and I pay for lots of space * a ton of more sensitive documents only on my MacBook and an external drive where I have gobs of space and certain tools only available on the laptop. I don’t think I’m supposed to duplicate all of the same folders across all these storage platforms, but I guess any categories + IDs that do make it to those platforms are supposed to stay consistent, even if the platforms hold different pieces of the entire J.D universe of files?
Like GUIDs, or only unique titles?
https://www.docker.com https://docs.docker.com/get-started/overview/ > Docker provides the ability to package and run an application in a loosely isolated environment called a container. The isolation and security allow you to run many containers simultaneously on a given host. Containers are lightweight and contain everything needed to run the application, so you do not need to rely on what is currently installed on the host.
let's hope so and i can hit Return apparently whew can still hit Return.
Ok. I didn't realize how great this was, and I don't know why I was so afraid of the keybindings. They're so much easier than regular [[Emacs]]! And [[Doom Emacs]] is FAST. It's also gorgeous right out of the box. All I had to do was change the font and bump up the font size. [[org-roam]] and this are strengthening each other. Now I'm determined to make this work. I'm way, way more likely to log my days in this (maybe combined with [[Org-Journal]]) than in regular [[Roam]], at least for now. I have zero worry that anything I type into org-roam will disappear by accident (as long as I maintain sufficient backups, knock on wood).
https://github.com/hlissner/doom-emacs/blob/develop/docs/getting_started.org#package-management > **Doom Emacs does not use package.el** (the package manager built into Emacs). Instead, it uses its own declarative package manager built on top of Straight. ... > If a package is installed without an accompanying `package!` declaration (e.g. with `M-x package-install` or `M-x straight-use-package`), it will be uninstalled the next time you run `bin/doom sync` or `bin/doom purge`. ... > To install a package, add a `package!` declaration for it to `DOOMDIR/packages.el` Ohhhhh. //Now// I see why trying to install MELPA packages the regular way doesn't do anything.
I'll add to this as I learn them: |`M-SPC n r i`|`org-roam-insert`|Insert links to existing (or new) notes. Entering a non-existent title will also create a new note with that title.| |`SPC n r`| |access the [[org-roam]] commands| |`SPC o A`|`org-agenda`|| |`Z Q`|`org-agenda-exit`|while in `org-agenda`, exit the agenda and kill Org buffers loaded by the agenda| |`SPC s B`|`swiper-all`|search all open buffers| |`SPC t F`|`toggle-frame-fullscreen`|toggle between fullscreen or not| |`/`|`evil-ex-search-forward`|Search within the current buffer. Use `n` and `N` to go to next and previous matches. (`?` to search backwards.)| |`M-SPC i u`|`insert-char`|insert a Unicode character| |`SPC f r`|`counsel-recentf`|recently opened files| |`SPC <`|`switch-to-buffer`|switch to any open buffer; includes *Doom*, *scratch*, and *Messages*| |`SPC ,`|`persp-switch-to-buffer`|switch to a named open workspace buffer| |`SPC SPC`|`projectile-find-file`|jump to a project's file using completion| |`SPC w c`|`evil-window-delete`|delete the current window| And, after adding [[Ian Jones]]'s [[custom keybindings|https://www.ianjones.us/blog/2020-05-05-doom-emacs/]] for [[org-roam]], you can do this while editing a file: |`M-SPC n i`|`org-roam-insert`|Insert links to existing (or new) notes. Entering a non-existent title will also create a new note with that title.|
From //Dorothea Lange: A Photographer’s Life//, by Milton Meltzer (2000): > You put your camera around your neck along with putting on your shoes, and there it is, an appendage of the body that shares your life with you. From //Daring to Look: Dorothea Lange's Photographs and Reports from the Field//, by Anne Whiston Spirn, [[Dorothea Lange]] (2008): > One should really use the camera as though tomorrow you'd be stricken blind.... To live a visual life is an enormous undertaking, practically unattainable, but when the great photographs are produced, it will be down that road.... I have only touched it, just touched it.
[[Message to White Allies from A Black Anti-Racism Expert: You’re Doing It Wrong — Medium|https://medium.com/progressively-speaking/message-to-white-allies-from-a-black-racial-dialogue-expert-youre-doing-it-wrong-39c09b3908a5]] Thanks to Sarah, this helped me immensely today, when I would have just gotten madder and madder and more self-righteous in response to something I saw someone post: > Racism is an interconnected web in which all people are trapped. To extricate ourselves, we must work together to weaken its strands. Lashing out at those who fail to see the magnitude of the problem does nothing to dislodge the misperceptions of whites, nor does it loosen the bonds that hold us in racism’s grip. > > Fortunately, there’s a better way.
From [[Dr. Drang]] back in 2022: https://leancrew.com/all-this/2022/11/outlining-and-bike/ > I like my outlines to be very spare and unadorned as I’m working on them, but to have numbered sections and specific types of spacing when printed or displayed for review.
https://www.mzentertainment.com/studio_workshop_fostex_r8.html A gold mine. I wish this had existed back in 1997 or so when I bought the [[Fostex R8]].
https://draculatheme.com/ For [[Emacs]] and a ton of other editors. Super-nice for [[org-mode]].
https://getdrafts.com I've used it on iOS for years. 2019-05-16 installed on MacBook. Well that was pleasant. Zero configuration and it found my subscription info and iCloud stuff and there are all the drafts I've entered from the phone. Dang!
* 2019-09-08 Another revelation: You can [[export to proper Markdown|https://help.dropbox.com/files-folders/paper/export-docs]]. All the pretty headings, items, checkboxes, images, etc. are //turned back into real [[Markdown]]//. I just tried this and let out an audible, nerdy gasp when I saw the exported lines in [[BBEdit]]. So I've accidentally stumbled upon my preferred Markdown outliner. This makes Dropbox Paper exponentially more useful and dependable. If [[Dropbox]] decides to kill it someday, I'll still have my Paper-created docs in text. * 2019-07-08 Holy cow. If you use the "project plan" template to make a new document, you can make the world's easiest Gantt chart right in it. And OMG it understands Markdown. Did I know this before and just forget it?
by [[Dave Winer]] http://docserver.scripting.com/drummer/about.opml > Drummer is a multi-tab outliner that runs as a web app and as a Mac desktop app. > > Drummer as an outliner can be used for all kinds of idea processing and workflow applications, but Drummer has been especially adapted to publishing weblogs. 2021-10-21 Three things about Drummer: * I have to admit that it's nice to have a place to write that's plain old HTML again. * I'm not spamming the [[Micro.blog]] timeline every time I have a thought, which feels great. Although, if you want to subscribe to the RSS feed, that's on you. * I need to fix the CSS on the header title. I do not care for those all-caps.
https://alcoholchange.org.uk/get-involved/campaigns/dry-january > Dry January is the UK's one-month alcohol-free challenge. Also: [[NPR]]'s [[Life Kit]] episode, [[6 tips on taking a break from drinking|https://podcasts.apple.com/us/podcast/6-tips-on-taking-a-break-from-drinking/id1461493560?i=1000546178860]]
https://www.vinylengine.com/turntable_reviews.php?make=Dual&model=1219 Got mine in January 2015. No longer being used because its motor has gotten so gunked up that it won't get up to speed anymore. I should take it apart and clean and lube it, but we know that's not going to happen anytime soon.
https://dynalist.io > The best outlining app for your best work Nice features are that you can link to other items with `[[brackets]]` (like [[Roam]] does) and a "Move" command similar to Refile in [[org-mode]].
https://letterboxd.com/film/easy-rider/ 2019-07-29 Watched on [[The Criterion Channel]] last night before it goes away on 7/31. Wow. Never saw it before, I don't think. It slows me down like //The Big Lebowski// does. I'm going to need to re-watch it once a year.
Various things I learned today after he died yesterday: His first album (the one with "Two Tickets to Paradise" and "Baby Hold On") had former Steve Miller Band members Lonnie Turner (bass) and Gary Mallaber (drums). He served for a short time as an NYPD trainee, but never become a cop. Regarding "Two Tickets to Paradise", from https://www.mcall.com/entertainment/lehigh-valley-music/mc-eddies-money-songs-rocker-dissects-hits-before-bethlehem-show-20140926-column.html: > Though it didn’t chart as high as “Baby Hold On,” it has become one of Money’s signature songs. “I was going with a girl and her mother didn’t like me because I was, you know, a rock ’n’ roll wannabe,” Money says. “She used to go home on the weekends, and I would never see her. I wrote ‘Two Tickets to Paradise’ about having no money. I had a ticket for a bus ride to California — I was going to take a little bus ride. But she dumped me anyway,” he says, laughing. “Two tickets to paradise could be tickets to anywhere — it could be a Greyhound bus, it could be going down to the beach. Anybody could have two tickets to paradise — it’s a great song.” He was on Saturday Night Live on March 18, 1978, and did "Baby Hold On" and "Two Tickets to Paradise". (It's on Hulu and it's really good, although the [[Midnight Special|https://twelvety.micro.blog/2019/09/14/two-eddie-money.html]] versions are better.)
Last night I sent a friend a link to this [[Eddie Smith]] blog post about [[freezing your credit]] (that I remembered from 2012): http://www.practicallyefficient.com/2012/10/26/in-case-you-need-another-reason-to-freeze-your-credit.html > One of the simplest, cheapest, and by far the most //preventative// methods for avoiding identity theft is a credit freeze. I've talked about it before on [[this site|http://www.practicallyefficient.com/2011/06/17/chilling]], and I mentioned it recently on [[Gabe Weatherhead]]'s [[Generational podcast|http://www.70decibels.com/generational/2012/9/22/002-preparing-for-the-worst-case-scenario.html]]. > If your credit file is frozen, your social security number is useless to someone who tries to use it to apply for //any// product that requires a credit check (loans, auto insurance, credit cards, you name it).
http://snowgoon88.github.io/TW5-extendedit/
http://omz-software.com/editorial/ * 2019-09-04 I'm nervous about how long the developer is going to keep this around. I'm utterly dependent on it in iOS.
[[Edward Tufte forum: Executive decision support systems|https://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=00002r]] From [[Edward Tufte]] himself: > For information displays for management, avoid heavy-breathing metaphors such as the mission control center, the strategic air command, the cockpit, the dashboard, or Star Trek. As Peter Drucker once said, good management is boring. If you want excitement, don't go to a good management information system.
The first thing I saw after the [[macOS Catalina]] install finished was: `Your computer has detected a potential problem` and a folder with a file in it called `eficheck.dump`. That seems not-great, but everything still seems to work.
[[24" Cordless Brushless Hedge Trimmer by EGO POWER+|https://egopowerplus.com/brushless-hedge-trimmer/]] 2021-08-04: Bought one of these tonight at Lowe's and the battery is charging now. I managed to dial down the insane amount of research I usually do. One big factor was that this is the same one Dad got and is raving about. The other was this detailed explanation and demonstration of it: [[EGO HT2410 (HT2411) Hedge Trimmer Features & In Use - YouTube|https://youtu.be/SlAUuFTipwY]] We'll see tomorrow how it does on our unruly hedges! --- ''Maintenance'' * Clean the blades after use using a stiff brush and a cloth to remove any foliage. * Per this video from EGO, use 3-in-1 oil on the blades. Don't use too much, but get a good coating on the top blades around the edges. ** https://www.youtube.com/watch?v=nI5ijSduweg
https://github.com/skeeto/elfeed > Elfeed is an extensible web feed reader for Emacs, supporting both Atom and RSS.
* 2019-11-08 Listening to McCoy Tyner's "Contemplation" from //The Real McCoy//. I play drums. I know what a kick drum, snare drum, and ride cymbal are. But when I try to decompose what Elvin Jones is doing, even when it's "simple", my brain can't deal with it. I certainly can't picture it.
Fix for `Failed to initialize color list unarchiver` error when calling [[Emacs]] from the [[macOS]] terminal from https://stackoverflow.com/a/52534946 > This is a known error for Emacs on macOS [[Mojave]]. Apparently Emacs has been using a deprecated, and now removed, API. ... > The latest version of Emacs 26 (or greater) from source or https://emacsformacosx.com/ will work. If you're just now upgrading and you still get the error/crash with the latest Emacs, delete `~/Library/Colors/Emacs.clr` and restart your new Emacs. Emacs will recreate a non-corrupted version of that file...
2019-09-26 Because I'm [[still finding things faster than I can read them|2019-01-27 Journal]], I'm going to collect them here. !! To read (or watch) * (currently) re-watching [[Video: "Emacs for Writers" with Jay Dixit]] - left off at 20:00 * re-watch [[2019-02-06 Video: Carsten Dominik on Org-mode at Google]] * watch [[Evil Mode: Or, How I Learned to Stop Worrying and Love Emacs|https://youtu.be/JWD1Fpdd4Pc]] - not because I want to use [[Evil Mode]], but because he demos some cool [[Emacs]] & [[org-mode]] stuff. * [[Karl Voit: Organize Your Life With Org-Mode|https://karl-voit.at/orgmode/]] * per [[ftrx on reddit|https://www.reddit.com/r/orgmode/comments/db1qnt/starting_out_with_orgmode_storage/f1zow29]]: "Try to see videotutorials for org-mode (there are few very nice series from Mike Zamansky, emacsrocks, Howard Abrams and others...)" * [[org-sidebar]] * [[Reddit: Converting work journal to Org|https://www.reddit.com/r/orgmode/comments/aq86tq/converting_work_journal_to_org/]] * [[Karl Voit's Blog Series: Using Org Mode Features (UOMF)|https://karl-voit.at/2019/09/25/using-orgmode/]] * [[Reddit: everyone's org mode indentation preferences?|https://www.reddit.com/r/emacs/comments/97naje/what_is_everyones_org_mode_indentation_preferences/]] * [[Charl Votha's Note-taking strategy 2019|https://cpbotha.net/2019/09/21/note-taking-strategy-2019/]] (relying heavily on org-mode) * [[Orgmode.org: 15.8 A cleaner outline view|https://orgmode.org/manual/Clean-view.html]] * [[Charles Cave: Using dates and times in Emacs org-mode|http://members.optusnet.com.au/~charles57/GTD/org_dates/]] * [[Karl Voit]]'s [[Memacs]] !! Have read:
* get Mastering Emacs book * ~~figure out why the year in journal entries isn't 4 digits~~
https://embedresponsively.com > ''embedresponsively.com'' helps build responsive embed codes for embedding rich third-party media into responsive web pages. Accepts YouTube URLs, other video URLs, and other embeds as input.
https://en.wikipedia.org/wiki/EMS_Synthi_100
https://letterboxd.com/twelvety/film/enchanted-april/ One of our go-to films, up there with [[Rear Window]] and [[Top Hat]]. Maybe I'll use this tiddler to track all the times we watched it. 2019-08-22 Wised up and bought it on Amazon, finally. I feel like I finally internalized it tonight. Also: Could Michael Kitchen be any more charming?
https://encrypt.me 2019-06-14 Since the days when this was called Cloak, I've used it off and on when traveling. I just signed up for the monthly plan to try it for using on all wifi networks outside of home. Probably should have done it a long time ago. If this month goes well, I'll pay for the yearly $99.99 plan.
https://www.ephemeral.show Only 10 episodes old and already a top-10-ever podcast for me.
https://www.amazon.com/Epson-Cinema-Wireless-Miracast-projector/dp/B074FLKWSY/ resolution: 1920 x 1080 (16:9) $700 when we bought it for Black Friday 2018, but now it's $900 (eeek!)
297gsm https://www.bhphotovideo.com/c/product/632179-REG/Epson_S041945_Ultra_Premium_Glossy_Photo.html
https://www.bbc.co.uk/programmes/b006vb2f > A series which helps prospective buyers find their dream home in the country Dear lord, where has this been.
''esplanade'' |ˈespləˌnädˈespləˌnād| noun <<< a long, open, level area, typically beside the sea, along which people may walk for pleasure. * an open, level space separating a fortress from a town. <<< from [[book: A Portrait of the Artist as a Young Man]]: > He was for Ireland and Parnell and so was his father: and so was Dante too for one night at the band on the esplanade she had hit a gentleman on the head with her umbrella because he had taken off his hat when the band played GOD SAVE THE QUEEN at the end.
https://www.balena.io/etcher/ > Flash OS images to SD cards & USB drives, safely and easily. 2019-09-09 ''DO NOT USE.'' Appears to have fried a 4GB SD card. Am running [[SD Memory Card Formatter]] for macOS right now to try to salvage it, because both the GUI and Terminal versions of Disk Utility can't do it.
https://www.etsy.com/listing/1037462742/hobonichi-leather-notebook-cover-leather 2021-11-16 I was going to DIY a crude leather cover for the [[Hobonichi Techo]], but when I saw this one for $17.40 (from Ukraine!) on Etsy, I figured I couldn't even buy the raw supplies that cheap. It doesn't have nice burnished edges like the [[Bellroy Field Notes Notebook Cover Mini]] and other more expensive covers do, but even if it only lasts a year, it'll be worth a throw while I get used to the Techo.
https://www.amazon.com/dp/B000FMDIXY/ref=cm_sw_r_tw_dp_U_x_ddrkEbE6Y9HPT Seems to be well-regarded.
[[syl20bnr/evil-tutor|https://github.com/syl20bnr/evil-tutor]] > Vimtutor adapted to [[Emacs]]+Evil and wrapped in a major mode.
* [[Dan Girshovich - doom-config|https://dangirsh.org/projects/doom-config.html]] * [[Emacs Configuration - config.daviwil.com|https://config.daviwil.com/emacs]] tiddlers: [[Doom Emacs]]
Collecting examples of the Positive Film effect in the [[Ricoh GR (2013)]]. """ Some of the examples in this one are unreal: [[The original Ricoh GR after 2 years, a long-term, real-world review - Compact Shooter|https://compactshooter.com/2016/12/the-ricoh-gr-long-term-real-world-review/]] """ [img[https://twelvety.com/philtiddlywiki_images/2021-03-30-ricoh-gr-positive-film-hakone-japan-travel.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2021-03-30-ricoh-gr-positive-film-new-york-city.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2021-03-30-ricoh-gr-positive-film-hong-kong-street.jpg]]
[[Michael Becker]]: [[Tinderbox Training - Export Drafts Notes to Tinderbox (YouTube)|https://youtu.be/WThZmPPMx3s]] This is a great [[Tinderbox]] workflow that gives [[Drafts]]-originated notes just enough structure to be useful outside of Drafts.
https://addons.mozilla.org/en-US/firefox/addon/export-tabs-urls-and-titles/ I use AppleScript to do this in Safari, but I just needed a quick way to do it in Firefox right now.
Welp, I had //476// tabs open in [[iOS]] [[Safari]] on my phone. Just closed them by using this thing I didn't know was possible in [[iOS 13]]: found on https://www.cultofmac.com/639834/how-to-save-all-open-tabs-to-a-folder-in-ios-13-safari/ # Long-press the bookmark icon in Safari # Tap Add Bookmarks for //n// Tabs, give the newly created folder a name, and choose a location to save it. #* I like to name mine yyyy-mm-dd iPhone Safari Tabs, so I know when+where they came from later. # And those will sync with the Mac through iCloud.
from the Google Group: https://groups.google.com/d/msg/tiddlywiki/mDrqJJVfQbU/zYiYdHnzvlUJ I don't know if this is still the case, but this is from Jeremy Ruston, 1/19/14: <<< Re: [tw] Re: TW5: Editing/adding .tid files...and refreshing Currently, TiddlyWiki5 under Node.js must be restarted in order to reflect changes made directly to tiddler files. The plan is to support automatic refreshing. Best wishes Jeremy <<<
[[Extracting Data from an Old iOS App Broken by iOS 14.5 – TidBITS|https://tidbits.com/2021/05/20/extracting-data-from-an-old-ios-app-broken-by-ios-14-5/]] > So this is embarrassing. Back in 2013, I was looking for an app I could use for diary-like journal entries, and I settled on [[Momento|https://momentoapp.com/]]. I used it for a while, and at some point, it prompted me to upgrade to a new paid version. I didn’t want any of the new features, so I dismissed the upgrade notice. The app didn’t nag me to upgrade again that I remember, so I kept using it with no problems, apparently for years. Until, that is, Apple released iOS 14.5, which somehow prevented Momento—now called Momento Classic—from launching. Uh oh. To this day, every time I open either the old or new version of [[Momento]] I hurt, because it's still the best looking journaling app ever.
<iframe src="https://player.vimeo.com/video/400201967?h=246542338c" width="640" height="460" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe> <p><a href="https://vimeo.com/400201967">Introducing Fantastic Voyage</a> from <a href="https://vimeo.com/user1118029">Giorgio Sancristoforo</a> on <a href="https://vimeo.com">Vimeo</a>.</p> This is exactly what I'm looking for. Same guy who made [[Berna]].
Really good calendar app. https://flexibits.com/fantastical
These don't exist, but I wish they did. I don't even know what they'd do. I just want them: * `org-photos` * `org-flac`
https://www.fastmail.com/ > Email you can feel good about > > Privacy, control, and features you’ll love.
I keep a list of these because I can't get to Conversations from Favorites, and trying to go back to old threads any other way doesn't seem possible. 2019-01-29: It took me about a month to realize that it's easy to link to threads if you link to a //reply//. Linking to the original post in a thread usually links to a Micro.blog user's blog, and that doesn't always work so well to show the thread, unless that person has webmentions turned on. I'll slowly replace these bullets with links to the [[individual threads|Recording threads in the wiki]]: * [[2019-01-20 Thread: Smokey linked to my post about 'Likes']] * [[2019-01-21 Thread: Mac photo browsing apps]] * [[2019-01-24 Thread: Amit was curious about TiddlyWiki]] * https://micro.blog/jack/2025169 * https://micro.blog/jack/2026856 * https://micro.blog/canion/2017560 * https://micro.blog/Ron/2046623 * https://micro.blog/twelvety/2035950 * https://micro.blog/twelvety/2035948 * https://micro.blog/grayareas/2047240 * https://micro.blog/cheri/2074528 * https://micro.blog/jack/2063880 * https://micro.blog/Mattfinlayson/2074846 * https://micro.blog/jeremycherfas/2123050 * https://micro.blog/jack/2124048 * https://micro.blog/jack/2167721 * [[2019-02-09 Andrew Canion: I’m sure @twelvety has written on that]] * https://micro.blog/twelvety/2252651 * 2019-02-16 Josh Sullivan [[announced his TiddlyWiki going live|https://micro.blog/jack/2340922]] * 2019-02-16 Josh Sullivan and Jack Baty discussing [[TiddlyWiki Discord server|https://micro.blog/joshsullivan/2341860]] * 2019-02-17 Josh Sullivan asking about [[date/timestamp order in a single file journal|https://micro.blog/jack/2352609]] * 2019-02-23 https://micro.blog/kordumb/2430033 This is crazy, I know.
* AC/DC - Jailbreak * Alex Calder - Light Leave Your Eyes * American Music Club - Chanel #5 * Amerie - One Thing * Aretha Franklin - Until You Come Back to Me (That's What I'm Gonna Do) ''(added 2019-04-21)'' * Beat Happening - Tiger Trap * The Beatles - Every Little Thing * The Beatles - Being for the Benefit of Mr. Kite * Bee Gees - Massachusetts * Best Coast - Boyfriend * Big Country - In a Big Country * Big Star - Daisy Glaze * Billy Bragg - Greetings to the New Brunette * Black Sabbath - Supernaut * Blondie - Call Me * Blondie - T-Birds * Bob Weir - Cassidy * Boston - More Than a Feeling * Brahms/Idil Biret - 6 Piano Pieces, Op. 118: Intermezzo in A major: Andante teneramente * Brian Jonestown Massacre - When Jokers Attack * Bridget St. John - Autumn Lullaby * Broadcast - Come On Let's Go * Broadcast - I Found the F * Bruce Springsteen - Born to Run * Bruce Springsteen - The River * Bruce Springsteen - Your Own Worst Enemy * The Byrds - Eight Miles High * The Cars - Just What I Needed * The Chiffons - He's So Fine * The Chills - Night of Chill Blue * The Chills - Pink Frost * Colbie Caillat - Fallin' for You * The Clientele - I Had to Say This * The Clientele - Impossible * Chris August - 7x70 * Cream - I Feel Free * Creedence Clearwater Revival - Born on the Bayou * The Damned - Neat Neat Neat * Deerhunter - Desire Lines * Deerhunter - Like New * Destroyer - Goddess of Drought * Donovan - Epistle to Dippy * Donovan - The Lord of the Reedy River * Doobie Brothers - What a Fool Believes * Doobie Brothers - China Grove * Doobie Brothers - Here to Love You * Dungen - Panda * Earwig - Your Friends * Elizabeth Fraser & Jeff Buckley - All Flowers In Time * Emerson, Lake & Palmer - Lucky Man * English Beat - Save It for Later * Fairport Convention - Time Will Show the Wiser * The Fall - Fit and Working Again * The Fall - Totally Wired * The Fall - Prole Art Threat * Fergie - Big Girls Don't Cry (Personal) * FES - Microwave * Fleet Foxes - Ragged Wood * Fleetwood Mac - Sara * Game Theory - Erica’s Word * Gary Numan - Cars * Genesis - Turn It On Again * Genesis - Watcher of the Skies * Glenn Campbell - Witchita Lineman * Grateful Dead - Playing in the Band * Hope Sandoval - Around My Smile * Interpol - Barricade * Interpol - Number 10 * Interpol - Obstacle 1 * Interpol - PDA * Jefferson Airplane - White Rabbit * Jim Croce - Time in a Bottle * John Denver - Fly Away * John Denver - Jet Plane * John Mayer - Half of My Heart * Joni Mitchell - Cactus Tree * Joni Mitchell - Chelsea Morning * Joni Mitchell - Tin Angel * Journey - Send Her My Love * Journey - Don't Stop Believing * Joy Division - Love Will Tear Us Apart * Kacey Musgraves - Oh, What a World * Keene Brothers (Tommy Keene + Bob Pollard) - Death of the Party * Kitchens of Distinction - Drive That Fast * Led Zeppelin - Immigrant Song * Led Zeppelin - Tangerine * Let's Active - In Little Ways * Looking Glass - Brandy * Loverboy - The Kid is Hot Tonite * Makeout Videotape - Exercising With My Demons * MC5 - Kick Out the Jams * Minutemen - Paranoid Chant * Momma - Sidewalk * Moody Blues - Nights in White Satin * The Monkees - Pleasant Valley Sunday * My Bloody Valentine - Off Your Face * My Bloody Valentine - The Time of Day * My Bloody Valentine - Map Ref 41°N 93°W (Wire cover) * Motörhead - Ace of Spades * New Order - Ceremony * New Radicals - Get What You Give * Norma O’Malley - Cruella * Notorious B.I.G. - Juicy * The Ocean Blue - Myron * The Ocean Blue - Between Something and Nothing * The Ocean Blue - Drifting/Falling * Olivia Newton-John - Have You Never Been Mellow * Orpheus - I Can Make the Sun Rise * Ozark Mountain Daredevils - Jackie Blue * Patti Page - Old Cape Cod * Phil Collins - I Missed Again * Prefab Sprout - Bonny * Psychedelic Furs - Ghost in You * Psychedelic Furs - Love My Way * Queen & David Bowie - Under Pressure * Radiohead - Weird Fishes * Radiohead - House of Cards * Rainbow - A Light in the Black * Rainer Maria - Hell or High Water * The Replacements - Alex Chilton * The Replacements - I Will Dare * The Replacements - Kiss Me on the Bus * The Replacements - Johnny’s Gonna Die * Robyn Hitchcock - Madonna of the Wasps * Rolling Stones - Start Me Up * Rolling Stones - Dandelion * Sarah Harmer - Lodestar * Sarah Harmer - Pendulums * Seals & Crofts - Summer Breeze * Simon & Garfunkel - For Emily, Whenever I May Find Her * Sir Lord Baltimore - Master Heartache * Skee-Lo - I Wish * Slowdive - Alison * The Smiths - The Headmaster Ritual * The Smiths - The Boy with the Thorn in His Side * The Smiths - William, It Was Really Nothing * Soccer Team - We Closed a Record Store * Sonic Youth - Shadow of a Doubt * Sonic Youth - Teenage Riot * The Spinners - Games People Play * Stereolab - Brakhage * Stone Roses - Mersey Paradise * Stone Roses - She Bangs the Drums * Stone Roses - Going Down * Sugarcubes - Birthday * Tangerine Dream - Le Parc * Taylor Swift - Shake It Off * Teenage Fanclub - Time Stops * Thin Lizzy - The Rocker * Thin Lizzy - Soldier of Fortune * Thin Lizzy - Jailbreak * Thomas Dolby - Screen Kiss * Todd Rundgren - Couldn't I Just Tell You * Todd Rundgren - Hello It's Me * Todd Rundgren - I Saw the Light * U2 - Wire * Uncle Tupelo - Sandusky * Sharon Van Etten - Serpents * Vic Chesnutt - Stevie Smith * Washed Out - Feel It All Around (as used for the Portlandia theme) * Wire - Ahead * Wire - Two People in a Room * Swervedriver - Sunset
> So while it may seem weird to run a federated wiki server on a laptop in a way that makes federation less available, if you’ve learned the method of multi-pane wiki it’s not really weird at all, because every note taking system you’ve used besides federated wiki is unbearably slow, clunky, and burdensome. Federated wiki, in the hands of someone that has mastered it, works at the speed of thought. And it does that whether your in the federation or not. from: [[Some Notes On Installing Federated Wiki On Windows — Mike Caulfield|https://hapgood.us/2018/12/26/some-notes-on-installing-federated-wiki-on-windows/]]
''Fenian'' |ˈfēnēən| noun <<< # a member of a 19th-century revolutionary nationalist organization among the Irish in the US and Ireland. The Fenians staged an unsuccessful revolt in Ireland in 1867 and were responsible for isolated revolutionary acts against the British until the early 20th century, when they were gradually eclipsed by the IRA. # //offensive// (chiefly in Northern Ireland) a derogatory term for a Catholic or Irish nationalist. <<< from [[book: A Portrait of the Artist as a Young Man]]: > Didn't they denounce the fenian movement from the pulpit and in the confession box?
https://fig.io/ <<< !! Your terminal, reimagined Fig adds IDE-style autocomplete to your existing terminal. Move faster with Fig. <<< This looks so cool and I'm afraid if I start using it I'll become dependent on it and also make spectacularly destructive, wide-ranging mistakes very efficiently.
2019-04-04 Arrived yesterday. Until I played the Sony DAP through the Mackie mixer's headphone amp, I was a little skeptical about how much an outboard amp would really help. This little FiiO amp comfirms that outboard, even portable, amps can really help. There's more "height" to the music. It doesn't sound all squashed, even with meager headphones.
https://www.nfsa.gov.au/preservation/preservation-glossary/characteristic-curve <<< A graphical representation of a film‘s response to light. Also called the D-Log //E// curve or the HD curve. A curve plotted on a graph from two axes, exposure and density, used to describe the characteristics and performance of sensitive emulsions. A characteristic curve is a graph of the relationship between the amount of exposure given a film and it’s corresponding density after processing. A typical film characteristic curve is made by plotting density produced, against the log of exposure given (Log E). The shape of the curve represents the tonal response of the film to a wide range of exposures and to //one// particular processing condition. As the slope of the curve decreases, the ability of the film to record the contrast between different exposures also decreases, and stops completely as the curve becomes horizontal. <<< Via: * https://theonlinephotographer.typepad.com/the_online_photographer/2017/07/how-to-cure-the-digital-bw-nasties.html > May I just point out here in passing that most scanned film also looks terrible? It's because the film's characteristic curve was designed to be counteracted by the paper curve. Virtually everyone scans film and reproduces the film tones exactly—literally—which is why scanned negatives also look harsh and tonally wrong, and nothing like the same negative printed on an appropriate photo paper. * https://theonlinephotographer.typepad.com/the_online_photographer/2021/12/the-trouble-with-film.html > Kodak assigned an angle to the straight-line section of the curve in the '30s and called it Contrast Index; later it was known as the characteristic curve. It plots density against exposure. And the problem is that it is not linear! Nor does it account for human perception. To correct it, //it needs to be counteracted by the paper curve,// which is also not linear. //The matching of the film curve to the paper curve is essential to get the best results from film// because that's how it was designed to be used. So to reproduce exactly the information on the film is a bollix; it is a tragedy; a mistake; it misrepresents the tones; it is ugly; it sucks.
Ah, now I have a name for this. https://prodigium-pictures.com/wp/insight09_halation-on-film-digitally-imitating-it/ > Anatomy of Halation: the incoming light penetrates blue, green and red layers of the film stock, then only partially gets absorbed by the anti-halation backing. The strongest rays bounce back into the red layer and create halation.
https://www.fatherly.com/finding-fred-rogers-podcast/ > FINDING FRED: A PODCAST FOR NEIGHBORS > > [[Mister Rogers’ Neighborhood]] was not a simple show. And [[Fred Rogers]] was not a simple man. He was radical. Spiritual. Revolutionary. Maybe even subversive. On //Finding Fred//, [[Carvell Wallace]], the best selling author of [[The Sixth Man]], dives into the work of an idiosyncratic and profound thinker, asking what a beloved children’s show host can teach us about surviving and thriving in today’s chaotic world.
I'm not going to bother with this for now, but in case [[Firefox]]'s new expanding-address-bar behavior keeps bugging me, there's a [[CSS]] hack to get around it: https://www.ghacks.net/2020/04/08/how-to-restore-the-old-firefox-address-bar/
If the whole UI is blurry, find the app, right-click on the icon, and select "Properties". In the Properties panel, go to the Compatibility tab and turn on the checkbox for "Disable display scaling on high DPI settings".
https://www.amazon.com/Fleabag-Season-1/dp/B01J4SST1K Searingly clever and funny show. Can't believe this is the same lady behind //Killing Eve//. Or I guess I can. It's just that this is even funnier, and her comedic timing is astounding.
https://www.47-degree.com/focus-shift/what-is-focus-shift > Focus shift does what is says on the tin: it moves the focus plane backwards when you close the diaphragm to a smaller stop. Almost all lenses are spot-on wide open (the C Sonnar is an exception, but we will talk about that later); when you stop down the focus precision can suffer. The faster the lens, the more prone to focus shift.
https://focusrite.com/en/usb-audio-interface/scarlett/scarlett-18i8 <<< Four of the best performing Scarlett mic preamps the range has ever heard – now with Air – for miking up guitars or recording vocals Two high headroom instrument inputs, for plugging your guitar or bass straight in Eight balanced line inputs, for connecting synths or other line-level audio, and four balanced outputs, for monitoring and effects sends Four monitor outs, featuring anti-thump tech and speaker switching <<< This is the one I ended up getting.
https://focusrite.com/en/audio-interface/scarlett/scarlett-8i6 <<< Six balanced line inputs, for connecting synths or other line-level audio, and four balanced outputs, for monitoring and effects sends Two of the best performing Scarlett mic preamps the range has ever heard – now with Air – for recording vocals Two high headroom instrument inputs, for plugging your guitar or bass straight in Loopback, for grabbing a stereo feed of any combination of hardware inputs and software playback, no cables needed, for simple sampling, streaming or podcasting <<< I like this option because while it only has 6 inputs, I already have a [[Focusrite Scarlett 2i4]] that could handle the other 2 inputs for the purpose of bringing 8 tracks over. I don't see needing more than 6 simultaneous inputs much after the [[Dutch Treat]] project is done. And Focusrite consumer-grade mic preamps are decent. [[Focusrite product compatibility with macOS 11 "Big Sur" on Intel-based systems – Focusrite|https://support.focusrite.com/hc/en-gb/articles/360014671940-Focusrite-product-compatibility-with-macOS-11-Big-Sur-on-Intel-based-systems]] > Works with Big Sur? YES [[Focusrite product compatibility with macOS 11 "Big Sur" on Apple Silicon-based systems – Focusrite Audio Engineering|https://support.focusrite.com/hc/en-gb/articles/360017407320-Focusrite-product-compatibility-with-macOS-11-Big-Sur-on-Apple-Silicon-based-systems]] > Works with Big Sur on Apple Silicon? YES
https://www.fontsmoothingadjuster.com/ > Re-enable the font smoothing controls removed in macOS Big Sur.
* Daring Fireball (still great, but I just don't care as much about a lot of it)
A project to bring the [[Fostex R8]] back to life. I need to buy a paper notebook dedicated to logging what I've done/am doing to this machine. Looking at [[potential ways to fix Fostex R8 cracked reel pulley]]. 2021-05-01: I've now got the left reel pulley working again by threading a 1/4-20 hex nut onto it. Seems to be ok. 2021-05-02: * Blew the dust out wherever I saw it * Cleaned the pinch roller shaft and capstan with 99% isopropyl alcohol and lubed them with [[Super Lube 51004 Synthetic Oil with PTFE]], which I hope was no worse a choice than sewing machine oil would have been * Installed the new pinch roller from [[Tascam Ninja]] * Cleaned the pinch roller, heads, and all other metal parts in the tape path with [[American Recorder Technologies S-721H-2 Tape Head Cleaner]] and American Recorder wooden cotton swabs The thing looks and sounds better than ever now. I think there is hope!
[[Frank Zappa]] and the Ikettes recording "Cheepnis" at Bolic Sound in 1973 ([[YouTube|https://youtu.be/5-kXTFSswKw]]) <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//5-kXTFSswKw' frameborder='0' allowfullscreen></iframe></div> Sometimes [[YouTube]] gives you a random thing and it sticks with you for days. This is one of those things. I've watched it five times now and it's still riveting to see Zappa's omniscient focus as he conducts everyone, especially with [[George Duke]] on keyboards and [[The Ikettes]] singing backup. Also, he looks cool as shit taking a drag off that cigarette. I feel the tension as they all hope they can make it through a complete take. What a weird track, too.
https://www.nytimes.com/2022/11/23/technology/frederick-p-brooks-jr-dead.html He got a Ph.D., was project manager for IBM System/360, and wrote [[The Mythical Man-Month|https://app.thestorygraph.com/books/8215ee95-e164-4036-8959-764cc42caaf8]] without Excel, a todo app, or backlinks.
https://apps.apple.com/us/app/fsnotes/id1277179284?mt=12 https://github.com/glushchenko/fsnotes https://fsnot.es > FSNotes is modern notes manager for macOS and iOS. App respects open formats like GitHub Flavored Markdown, so you can easily write documents on iPhone and MacBook. It's simple and blazing fast!
https://fujixweekly.com > Fuji X Weekly is a photography blog dedicated to all things Fujifilm. It’s an online journal where I talk about my experiences and opinions. Yes, it’s me talking about my cameras, which are all Fujifilm X series cameras, such as the X-E4, X100V, X-T30, X-T1, etc. And these! [[Fujifilm X-Trans II Recipes – FUJI X WEEKLY|https://fujixweekly.com/fujifilm-x-trans-ii-recipes/]]
I love this dude's enthusiasm: [[Fujifilm X-E1 - My review of the one of the world's forgotten cameras - YouTube|https://www.youtube.com/watch?v=MrXW_rVH18E]]
Lens: f=23mm (35mm format equivalent: 35mm) Micro.blog threads: * Blair MacIntyre researching and ordering an X100F, and then reviewing it ** https://micro.blog/blair/3341885 ** https://micro.blog/blair/3348019 ** [[I have an iPhone XS, yet just I bought a new Camera|https://blairmacintyre.me/2019/05/11/i-have-an-iphonexs-yet-i-bought-a-new-camera/]] The longest camera review/love-letter in the history of photography: * [[Shitty Little Camera: the Fuji X100F Review - Matteo Pezzi|https://www.matteopezzi.com/shitty-little-camera-the-fuji-x100f-review/]] Great. [[Jamelle Bouie]] has one. 👀 * https://flic.kr/p/Z6pzU2
Hmm. Noticed you can use the camera finder in [[Flickr]] and filter for photos taken by people you actually follow (have to be logged in), which is a lot more useful way to see what a camera can do: https://www.flickr.com/search/?camera=fujifilm%2Fx100t&contacts=all&view_all=1&sort=date-taken-desc Shit. [[Jack Baty]] has a [[Fujifilm X100T]] and says nice things about it. Hmm. [[BSAG - But She's a Girl]] [[said this|https://www.rousette.org.uk/archives/fujifilm-x100t/]] about the optical viewfinder in her [[Fujifilm X100T]] and boy do I hear it: > It started while we were on holiday in Norfolk earlier in the year. Mr. Bsag had just got a (new to him) camera on eBay (an Olympus OM-D), and was trying it out as we wandered around enjoying the sun. I was using my Sony RX100, which I love, but in the bright sunshine, I couldn’t see what I was framing. The screen is quite good, but in bright sunlight you are basically holding the camera up, pointing it in what you hope is vaguely the right direction, and pressing the shutter. It is very hit and miss. Mr. Bsag’s Olympus had a viewfinder, and he passed it over for me to try. And oh, I had forgotten just how much I love pressing my eye up against that tiny window and looking out at the world through it. It’s not just that you can actually see what you’re doing at when it’s sunny, but — to me at least — it is a much more direct experience. That tiny window on the world is all that you can see, but that makes what you want to capture much more obvious. > > And that was it, really. While I still love the Sony for its impossibly tiny size, I really wanted to get a camera with a viewfinder again, and peer out of that little window on the world. After a lot of weighing up of pros and cons, I settled on a Fujifilm X100T, and managed to find a used, but good quality one with a lot of extras on eBay. !! Prices * 2021-09-11: $671.86 for an Excellent one at [[KEH Camera]]
I already sort of remembered that you can create an internal search link in [[org-mode]] by wrapping a word or phrase in `[[brackets]]`, but it was only searching headlines and I wanted to be able to search for anything, even a partial headline. The way to change this is by setting `org-link-search-must-match-exact-headline`. from https://orgmode.org/manual/Internal-Links.html#Internal-Links > A link that does not look like a URL—i.e., does not start with a known scheme or a file name—refers to the current document. You can follow it with `C-c C-o` when point is on the link, or with a mouse click (see [[Handling Links|https://orgmode.org/manual/Handling-Links.html#Handling-Links]]). ... > Ultimately, if none of the above succeeds, Org searches for a headline that is exactly the link text but may also include a TODO keyword and tags, or initiates a plain text search, according to the value of `org-link-search-must-match-exact-headline`.
Preamp and tube buffer. Forum threads: https://audiokarma.org/forums/index.php?threads/fx-audio-6j1-tube-preamp-a-31-wonder.848535/ https://www.audiokarma.org/forums/index.php?threads/fx-audio-tube-01j.903896/ https://www.audionirvana.org/forum/the-audio-vault/preamplifiers-and-line-and-phonostages/142755-last-call-for-the-tube-buffer-the-fx-audio-01j-the-j-for-japan-is-critical
"Gear Acquisition Syndrome"
Now I know why I've been fighting the faders every time I've made any music in [[Logic Pro X]]. I never knew about gain-staging. I just maxed out every track and then wondered why I had no headroom and the master bus had to be so artificially low. I also didn't know about pre-fader metering or the difference between the channel gain and channel fader. All of these videos are good: [[Basic Level Management/Gain Staging in Logic Pro X (and why I use Pre Fader Metering)|https://www.youtube.com/watch?v=71xgueCFHX4]] by Unlock Your Sound [[A complete guide to GAIN STAGING (your questions answered)|https://www.youtube.com/watch?v=Tq5lDHCKt84]] by Musician on a Mission [[How to Get a Perfect -6 dB Mixdown With Gain Staging|https://www.youtube.com/watch?v=nM3cjFmjOi0]] by Warp Academy/Vespers [[Gain Staging Explained - 3 things you need to know|https://www.youtube.com/watch?v=p7336oHMAbY]] by Warren Huart/Produce Like A Pro
https://www.genelec.com/8010a
Genesis Breyer P-Orridge of [[Throbbing Gristle]] died today. (2020-03-14) https://pitchfork.com/news/genesis-breyer-p-orridge-dead-at-70/ I'm listening to [[20 Jazz Funk Greats]] and didn't know this: from https://en.wikipedia.org/wiki/20_Jazz_Funk_Greats#Recording > The album was recorded on a 16-track borrowed from [[Paul McCartney]] after [[Peter Christopherson]] had worked on artwork for McCartney.
https://geopeeker.com > GeoPeeker is a tool for quickly viewing a site from different geographic locations. So handy for resolving questions about "Well, it's working when //I// load the page."
from http://balanchine.com/theme-and-variations/ > An intensive development of the classic ballet lexicon, //Theme and Variations// was intended, as Balanchine wrote: “to evoke that great period in classical dancing when Russian ballet flourished with the aid of Tschaikovsky’s music.” The final movement of the composer’s third orchestral suite consists of 12 variations. The ballet opens to reveal a corps of twelve women and a principal couple. As the ballet moves from variation to variation, the solo performances of the ballerina and her cavalier are interspersed among the corps performances. As in all classical ballets, there is a central pas de deux. A grand polonaise builds to the climactic finale for the entire cast of 26 dancers.
from Nicholas Burns: [[George HW Bush's presidency left the world a more peaceful and stable place - CNBC|https://www.cnbc.com/2018/12/02/george-hw-bushs-legacy-a-more-peaceful-stable-world.html]] > Bush's steady, civil bearing came through at the most challenging moments. When the Berlin Wall was opened to two-way East-West traffic in November 1989, his staff, many members of Congress and half the press corps urged him to go to Berlin to proclaim the end of communism. Bush's reply was: "I'm not going to dance on the wall." While there is no question that he would benefited politically at home by "dancing on the wall," Bush saw it was more valuable to avoid humiliating Gorbachev as he would surely need his trust for the even bigger challenges while communism unraveled across Eastern Europe.
[[George Saunders]] on [[The Ezra Klein Show|https://www.nytimes.com/2021/02/19/opinion/ezra-klein-podcast-george-saunders.html]] <<< ''Saunders:'' Well, I think basically, if we look at ourselves, we’re kind of set up to be these little Darwinian survivors. So we’re given this really cool sensory apparatus, and a brain, and everything. And you know, that stuff is there to help us propagate the species. And the intersection between our perceptions, and understanding, and what’s actually true are pretty small and pretty occasional. There’s a whole bunch of stuff out there that is beyond our grasp. So if you have any sense of that, then a kind of ritual humility would be the right stance. I mean, imagine if somebody saw in all the wrong colors and all the shapes that he saw were incorrect. And all of his understandings were messed up. That person would be wise to be a little humble, because the data’s coming in, and he’s messing it up. And essentially, I think that’s what human beings are doing in our little, sweet, pathetic way. So then, if you are in that kind of flawed thinking machine, and you see another flawed thinking machine, it would seem almost crazy and irrational to start judging and fighting that person. You might more reasonably say, oh, wow, you too. So I think in a lot of these Eastern systems, the delusion is that we’re trapped inside this little machine that thinks it’s central, and permanent, and all-important and is always thinking about its little victory narrative. But when you step out of it for a second, you see that it’s just a temporary construction of neurology, or karma, or whatever. And so it’s almost like, if you’re driving a really crappy car, you would want to keep that in mind in traffic, something like that. <<<
[[A Swim in a Pond in the Rain: In Which Four Russians Give a Master Class on Writing, Reading, and Life – The StoryGraph|https://app.thestorygraph.com/books/fec004e1-7319-4323-b19e-9cd9dc4e855a]] By [[George Saunders]] Saw it mentioned in the description of this episode of [[Ten Percent Happier with Dan Harris]]: https://megaphone.link/ESP8151893062 > Saunders has written ten other books, including the newly released //A Swim in a Pond in the Rain//, which is about how to become a better reader and that can tell us about how to live.
https://omscs.gatech.edu/ Online Master of Science in Computer Science (OMSCS) Not saying I want to do this now or soon, but not saying I'm ruling it out forever.
I had a mono audio track in [[Logic Pro X]] that I tried adding the [[Imaginando K7D tape delay plug-in]] to, but only the mono versions of the plug-in were available, and the plug-in didn't seem to change the signal. I had to change the Channel Mode button for that track in the Mixer from Mono ("In 1") to Stereo ("In 1-2"). Solution here: https://www.logicprohelp.com/forum/viewtopic.php?t=125313 > The default plug-in format depends on the format of the signal at the point where you insert the plug-in, and the format of the signal can switch between mono and stereo at many points between the input and the output of a channel strip. Check the format of the plug-in located just before the slot where you intend to insert a new plug-in: it determines the format of the new plug-in.
https://getyourshittogether.org <<< !! Hoping for the best is not a plan. Chanel Reynolds is the founder of internationally-praised GetYourShitTogether.org, author of //What Matters Most: The Get Your Sh*t Together Guide to Wills, Money, Insurance, and Life’s “What-ifs”//, and co-founder of GYST.com. After her husband was killed in an accident and she became a widowed, solo-parent overnight, she learned that taking care of a few, simple things like basic estate, emergency, financial, and end-of-life planning in advance can make a hard time a little softer. Her mission is to remove as much ‘optional’ suffering from life’s hardest moments by talking about what matters today – it’s easier than you think! <<< https://getyourshittogether.org/checklist/ Of all the things I need to pay attention to on the web, this should be near the top.
Ghost isn't totally my kind of metal, but I am all here for the theatrics. I can't tell if the satanic stuff is meant seriously or tongue-in-cheek, but I don't care. They're not even as scary and unsettling to watch as a band like Slipknot, but they are fun to watch. https://en.wikipedia.org/wiki/Ghost_(Swedish_band) > Ghost is easily recognizable owing greatly to its eccentric on-stage presence. Seven of the group's eight members, its 'Nameless Ghouls', wear virtually identical, face-concealing costumes. Prior to a 2017 lawsuit filed by former members of the band, lead singer Tobias Forge obscured his identity behind the character "Papa Emeritus". The character, which consists of Forge in a prosthetic mask and makeup, can be best described as a 'demonic anti-pope'. Demonic anti-pope? Hell yes! [[Ghost B.C. - "Year Zero" (Live at Webster Hall, NYC) - YouTube|https://www.youtube.com/watch?v=d8RH8RO0eR0]] [img[https://twelvety.com/philtiddlywiki_images/2021-11-22-ghost.png]]
https://www.travelchannel.com/shows/ghost-adventures
https://ginatrapani.org/
https://www.git-scm.com/ > Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Don't remember where I saw Glass mentioned first, but from the one splash page I can see, it looks potentially nice maybe? https://glass.photo/ > You make photographs, we’re building you a home. > We’re building a new community-focused app for photographers and photography enthusiasts. We’re bootstrapped instead of venture backed, so we’ll never sell your data or pollute your feed with ads. Subscribe for the latest updates.
https://glass.photo/
https://glass-ware.stores.yahoo.net/tubu.html These look neat and cheap.
[[GlobalTuners - On-line remotely controlled radio receivers|https://www.globaltuners.com/]]
https://goner-records.com/pages/gonerfest Annual music festival hosted by Goner Records. It's back as an in-person event this year! And I have a conflict and can't go.
https://cloud.google.com/text-to-speech/ 2019-05-22 I used the iOS pull-two-fingers-down-from-the-top function to read an article from The Atlantic aloud in the car yesterday. It is stunningly good now, especially on iOS 12. But Google's Cloud TTS is uncanny and on a whole 'nother level. There are stretches of audio that would fool you into thinking that a real, but boring, person was reading. You can paste in some sample text to the URL above and hear what it can do. Why can't iOS apps take advantage of this? Maybe they do and I just don't know of any. All the iOS readers I've found rely on the Apple voices. This is one of those things that makes me jealous of Android. ([[posted|https://twelvety.micro.blog/2019/05/22/google-cloud-texttospeech.html]])
https://lens.google.com On [[iOS]], you can get to it through [[Google Photos]] and the [[Google]] app. Very handy for scanning text right from a page in a book. It's not 100% perfect, but close enough to save a lot of typing if you look for the parts that need correcting, and it's better and has less friction for quick snippets than anything else I've tried. You can just tap and drag to select text in the captured image. Crazy.
https://store.google.com/us/product/pixelbook_go 2019-11-16 I saw one of these at Best Buy today and it is really nice. The most Apple-y Chromebook I've ever run across. It is overpriced for its specs, but it is very light, feels solid and well-made, has a very nice keyboard, and a lovely screen. Renders web pages quickly and seems fast enough for Chromebook kinds of things. And I wanted it, but I don't know what I would actually do with it. There's only so much you can do with a Chromebook vs. a "real" laptop. But it was still cool.
* (This was all inspired by the weather snippets in Jack's [[wiki entries|https://rudimentarylathe.org/#Saturday%2C%20January%2018%2C%202020]].) * I can't decide between these two [[wttr.in]] formats for [[weather]]: ** `curl wttr.in/23225?format="%c+%C+%t"` which returns: *** ⛅️ Partly cloudy +52°F ** `curl wttr.in/23225?format="%t+%c+%C"` *** +52°F ⛅️ Partly cloudy ** I think the second option. ** And now I just made a [[TextExpander]] shell script snippet bound to `wx` to run it. ** Huh. Saw this [[comment|https://www.reddit.com/r/commandline/comments/dhj6p7/recently_discovered_curl_wttrin_it_shows_you_the/f3p2b6m/]] on [[Reddit]]: *** > Never curl into bash directly!
https://getgrav.org/ > Grav is a modern open source flat-file CMS Just putting this here in case I need one someday. I don't know anything about Grav other than [[Eric Meyer tweeted a link|https://twitter.com/meyerweb/status/1197920242967732229]] to their [[macOS 10.15 Catalina Apache Setup: Multiple PHP Versions|https://getgrav.org/blog/macos-catalina-apache-multiple-php-versions]] tutorial.
https://www.relay.fm/mpu/519 * "...compared to a lot of people these days, I'm a relatively light iPhone user. I mean, certainly, when I'm out and about, the iPhone is what I have with me, and I use it for listening to music, listening to podcasts — you know, checking on stuff when I'm out on the go. But I'm actually pretty good at not paying attention to the internet world when I'm not at my desk. I try not to be looking at Twitter when I'm out at a restaurant or things like that, so I'm not one who pulls my phone out of my pocket excessively when I'm out and about." * He mostly uses [[Things]] for tasks and an outliner like [[OmniOutliner]] for bigger picture, more freeform projects. ** ...which makes me wonder: If Things is good enough for Greg Pierce with a big family and a full-time gig developing and supporting Drafts, why am I not using it that much? * He segments his [[Facebook]] browsing in [[Firefox]] with an extension that keeps them from tracking him, and he avoids [[Google Chrome]] whenever possible. * Sometimes he's at a higher level of discipline and keeps the [[iPad Pro]] on his desk for non-work, non-focused social media or email. He says the context switching is enough to keep him on task on the [[Mac]]. * Through user-defined [[syntax highlighting]] in the future, Drafts may get the ability to display [[org-mode]] syntax in color. 👀 * He named [[Discourse]] as one of the things that he loves and has made his life better. He uses it for the [[Drafts community forum|https://forums.getdrafts.com]]. * He loves [[Atlas Obscura]] for making [[road trips]] and [[travel]] more interesting for him and his family.
Sarah just now suggested that we do [[Gretchen Rubin]]'s [[Walk 20 in '20|https://gretchenrubin.com/2020/01/walk-for-20-in-2020]] starting on March 1st. I'm game! At this point, //any// [[walking]] is better than zero walking.
https://groktiddlywiki.com/ by [[Soren Bjornstad]] > //Grok TiddlyWiki// is a textbook that helps you build a deep, lasting understanding of and proficiency with TiddlyWiki through a combination of detailed explanations, practical exercises, and spaced-repetition reviews of prompts called takeaways. Via [[Jack Baty]]: https://jack.micro.blog/2021/05/25/i-somehow-missed.html Soren may finally get me over my resistance to using tags.
2020-04-13 Slight moment of panic as I realized that the only item in the [[Dynalist]] inbox on the [[iOS]] app stubbornly would not sync to the web/desktop versions. Was ready to ditch the service entirely, found others had had the same problem. It was related to the share-to-Dynalist extension on mobile, which doesn't appear to still be available on my phone, and which I wouldn't use anymore even if it were. """ This person reported the exact same symptoms I had: https://talk.dynalist.io/t/inbox-wont-sync-from-mobile/4838 """ > ''Actual result'' > Shows up in mobile, but items are permanently sitting on my inbox on mobile and won’t sync to desktop (we’re talking weeks and probably months, pretty much gave up on this function). I was able to enter some text on mobile in the Inbox that did sync to desktop. """ This bug report included an explanation and diagnosis from a Dynalist developer who said they've fixed it: https://talk.dynalist.io/t/lost-data-from-ios-related-to-sharing-extension/6110/17 """ It's great that they've fixed it, but this stuff makes me highly nervous and leaves me grasping for text files and [[Dropbox]] syncing.
Listening to the [[Guided By Voices]] new LP [[Surrender Your Poppy Field|https://guidedbyvoices.bandcamp.com/album/surrender-your-poppy-field]] just now and it has some real old-style underproduced gems on it. At this point, [[Robert Pollard]] has written so many songs that I have to believe he just forgets each new one as soon as he writes and records it. [img[https://twelvety.com/philtiddlywiki_images/2020-02-22-gbv-surrender.jpg]]
from: [['White Male Privilege' and Other Themes of Gun Culture — The Atlantic|https://www.theatlantic.com/notes/2018/02/white-male-privilege-and-other-underlying-themes-in-gun-culture/554030/?utm_source=twb]] A reader writes: <<< The reason guns cannot be regulated in the USA is because of the violence, not in spite of it. The violence is necessary to maintain the fear, and the fear is necessary to maintain white male privilege. The idea that white men can and do shoot people causes every interaction with a white man to carry a tinge of threat: If you disrespect him, or merely fail to please him enough, he just might explode. When they say that two dozen dead children are the price we pay for freedom, what they mean is that they are willing to pay that price to preserve white male privilege. As recent events demonstrate, white male privilege is the preeminent policy goal for them, outweighing even honor, truth, and democracy. That they pursue it through terrorism should not be surprising; it was ever thus. That they cannot admit their true goal, even to themselves, is a side-effect of the defeat of the Confederacy. They cannot bear to be called a "racist" because to them, that term evokes "loser." When the South lost, we tied the shame of defeat to the cause of racism, hoping to kill it. Instead, it appears we have killed shame. The supreme irony, of course, is that Australia still has plenty of white male privilege. While it is in retreat, it can hardly said to be dead. It's just not purchased with the blood of children. <<<
https://philosopher.life - TiddlyWiki In the world of honest and wide-ranging wikis, hop3 is the granddaddy of them all.
http://www.radioing.com/hamstart/q-signal.html > ''QSL'' Can you acknowledge receipt? (I confirm receipt of message) > ''QTH'' What is your location? (station location)
https://handbrake.fr/ > HandBrake is a tool for converting video from nearly any format to a selection of modern, widely supported codecs.
''harridan'' |ˈherəd(ə)n| noun > a strict, bossy, or belligerent old woman: //a bullying old harridan.// from [[book: A Portrait of the Artist as a Young Man]]: > Well there was one old lady, and a drunken old harridan she was surely, that paid all her attention to me.
http://hedeco.de > Lime One is a compact Light meter for analog cameras. [[Alex|Alex Johnstone]] mentioned it in [[his wiki|https://fondoftea.com/#Hedeco%20Lime%20One]]. Good option for the questionable old meter in the [[Olympus OM-2]], which I've never thought was trustworthy.
https://hey.com/ > HEY - Email at its best, new from Basecamp.
https://www.hifishark.com https://www.hifishark.com/about > Hifishark.com was born out of the frustration that we ourselves, as audiophiles, experienced when trying to find particular second-hand equipment. While it is usually possible to find such items, it often requires a lot of work sifting through multiple websites with constant changes in search criteria and pricing. I wish I had known about this years ago.
https://highlighted.app <<< Stop forgetting what you read. Capture, organize and revisit important parts of your books. <<<
https://www.bbc.com/future/article/20190129-the-plight-of-japans-modern-hermits <<< In today’s connected world it can feel difficult to disengage. An endless stream of emails, posts, tweets, likes, comments and pictures keeps us constantly plugged into modern life. But in Japan half a million people live as modern-day hermits. They are known as //hikikomori// – recluses who withdraw from all social contact and often don’t leave their houses for years at a time. A government survey found roughly 541,000 (1.57% of the population) but many experts believe the total is much higher as it can take years before they seek help. <<<
https://www.1101.com/store/techo/en/ > The Hobonichi Techo is a Life Book that’s flexible enough to fit the lifestyle and tastes of its user, allowing for freedom in how to use it.
on [[Letterboxd|https://boxd.it/1Ks2]] With [[Katharine Hepburn]], [[Cary Grant]], and [[Edward Everett Horton]]
https://en.wikipedia.org/wiki/Homoiconicity a.k.a "data as code" or "code as data" > In computer programming, homoiconicity (from the Greek words homo- meaning "the same" and icon meaning "representation") is a property of some programming languages. A language is homoiconic if a program written in it can be manipulated as data using the language, and thus the program's internal representation can be inferred just by reading the program itself. For example, a Lisp program is written as a regular Lisp list, and can be manipulated by other Lisp code. In homoiconic languages, all code can be accessed and transformed as data, using the same representation. This property is often summarized by saying that the language treats "code as data".
https://hookproductivity.com/ > Search less and focus more. > Instantly retrieve relevant information on your Mac or the web. > Use links like never before. Included in [[Setapp]], of course.
I forgot that I had set this up, but I save most of the images that I want to embed here to a local folder on my laptop called ``philtiddlywiki_images``. [[Hazel]] watches that folder and uploads anything there to a matching folder on my web server. In a tiddler, when I type ``twimg``, [[TextExpander]] expands that into ``[img[https://twelvety.com/philtiddlywiki_images/FILENAME.jpg]]``. I could make this even slicker by having Hazel copy the filename to the clipboard when it's done, but maybe later. ''2019-05-29 Update:'' I think I chose a bad title for this tiddler when I created it. I should have said that it was about how I host images on a (different) dumb web server that are then //used by// this wiki. I have not, unfortunately, figured out how to host a folder of images right alongside the TiddlyWiki installation, although maybe someone else has figured that out.
`sudo find / -name FILENAMEHERE`
A [[fredmiranda.com|https://www.fredmiranda.com]] member asked for [[Help with first time buying - “established FM members only”|https://www.fredmiranda.com/forum/topic/1634583/0]]. A couple of the answers: ''anthonysemone:'' <<< Well, Mark, you've already begun to accomplish that task. FM is pretty much a self-governing site. While the incidence of scammers is low, it is not zero, and so that "established" line you refer to represents the outcome of some folks here being ripped off, again, not many, but one is too many. You also did another thing that's important: you filled out your profile, listed your name, listed your city, listed your photographic info, equipment. All that's good. Let me suggest then this: find a Board that reflects your photo interests. Look at the posts, the pics, and offer your comments as to what you see. If you have constructive critique, provide it. Let yourself become somebody whose name a Seller will say "Hey, he's the guy on <Board>" Also, grab up your Fuji gear, take some pics, spend the 60$ and buy an Upload and Sell, so that you can post your own photos. In other words, become a member here. If you need a piece of equipment badly, head over to www.mpb.com and buy it used there. So building your presence here is the best way to reassure folks that you can be trusted, just like all the rest of us here who started from scratch. You can check on my Profile and look at my B&S posts to see how I got started back in '08. Others here may sign on as well with their own recommendations. Meanwhile, welcome to FM. We ARE a great place. So hang tough, pay your dues and get known. HTH, anthony <<< ... ''kwilliam8:'' <<< One other thing. Start your transactions with smaller items where this is a smaller risk to the other party in your transaction. I would have no problem selling something to you that is less than $300, especially if we used regular PayPal. If you wanted to buy one of my $3000 lenses, then unless you had some track record of successful transactions, then I would be reluctant too. That is how I started out here, and that is probably how many folks started out here. Start small, and build up. The other suggestions are great too! Good luck!!! Keith W. <<<
It's in [[Logseq]]'s "All Graphs" in the top-right menu. https://discuss.logseq.com/t/how-to-change-the-default-directory/479 > There you can unlink your current directory and with “open a local directory” you can choose any folder to use for your notes.
from https://9to5mac.com/2019/08/09/change-siri-voice-feedback-volume/ # Ask Siri a question or give a command # While Siri is responding, use the volume buttons to raise or lower the voice feedback volume
[[helm - How to clear recent files list? - Emacs Stack Exchange|https://emacs.stackexchange.com/questions/37191/how-to-clear-recent-files-list]] Q: > How do I remove the files that do not exist from recent files list? A: > `M-x` `recentf-cleanup` tag: [[Emacs]]
Ohhhh. Ok, it's not obvious in [[Craft.do]] when you only press `/`, because you only see Date & Time options for Today, Tomorrow, Yesterday, and Now. All of these will work if you wanted a proper logical "Sun, Sep 19" stamp: """ `/sep 19` `@sep 19` `@2021-09-19` """
Use `apropos-value`: https://stackoverflow.com/questions/9771487/emacs-how-to-find-a-variable-by-its-value <<< I have some value and know that some Emacs variable holds it. How to find, which variable has this value in it? The value can be a symbol, integer or string, and the variable may hold the value itself, but a list which contains a value. Example. A variable `default-directory` contains string `"/var/www/"`. I have that string, but i suddenly forgot the variable's name. How do i search through variables and find that `default-directory` contains that string? <<< Answer: > M-x `apropos-value` `^"/var/www/"$`
It's probably heretical, but I just did this to hide emphasis markers in [[org-mode]]. I figure the link brackets are already hidden in [[org-roam]], so why not make the rest of it easier to parse? ``` (setq org-hide-emphasis-markers t) ```
Press Cmd-up or Cmd-down to jump to the previous/next commands I entered on the command line in the Mac Terminal.
Ever since using [[Tim Gray]]'s b/w preset for RAW [[Ricoh GR (2013)]] photos in Lightroom, I've gotten used to the lens profile corrections built into it. They're very subtle, but it bugged me that they weren't usable on JPEGs. This is by design, because for cameras that correct their own lens geometry when they process in-camera JPEGs, Adobe doesn't want you double-correcting images. But as far as I can tell, the JPEGs coming out of the GR aren't corrected, because the geometry in the Tim Gray preset-applied images always looked better than the JPEGs. Other random people on the web seemed to corroborate this. So I found this workaround by an Adobe engineer and it totally worked: https://feedback.photoshop.com/conversations/camera-raw-and-dng/camera-rawlightroom-lens-profile-requests-and-information/5f5f45a84b561a3d4258a112?commentId=5f5f482d4b561a3d420ef916&replyId=5f5f4ac74b561a3d42c2679c <<< Lens profiles in Lightroom and Camera Raw generally only support Raw files since JPEGs may already have lens corrections applied. If you want to try this profile with a JPEG image, you can make a copy of the profile and change the following property. `stCamera:CameraRawProfile="True"` TO `stCamera:CameraRawProfile="False"` Then copy the modified profile to the following location. `/Users/<user name>/Library/Application Support/Adobe/CameraRaw/LensProfiles/1.0` Keep in mind the results my not be optimal. <<<
I like the `doom-one` theme, but have never liked the bolded headings and hyperlinks. Just add this to `config.el` after the `(setq doom-theme 'doom-one)` line: ```lisp (custom-set-faces! '(outline-1 :weight normal) '(outline-2 :weight normal) '(outline-3 :weight normal) '(outline-4 :weight normal) '(outline-5 :weight normal) '(outline-6 :weight normal) '(outline-7 :weight normal) '(outline-8 :weight normal) '(org-link :weight normal)) ``` [img[http://twelvety.com/philtiddlywiki_images/2022-01-26-org-mode-normal-headings.png]]
[[A guide to disassembling the Ricoh GR for sensor cleaning – Jamie Collinson|https://jamiecollinson.com/blog/disassembling-ricoh-gr-for-sensor-cleaning/]] Terrifying. Keeping this in case I have to open the [[Ricoh GR (2013)]], but hopefully won't need to.
https://discuss.logseq.com/t/how-do-you-pronounce-logseq-and-what-does-it-mean/321 > It’s pronounced “log-seek”. “Log” for “logbook” and “seq” for “sequence”. Well, that's good to know. I told Sarah and she looked at me with steely eyes and said, "That's stupid. We're not calling it Log-Seek. It's Log-Sec". 😝
Whew. I keep backups of my MBP's private and public SSH keys, but this is a relief to see: from https://www.digitalocean.com/docs/droplets/resources/lost-ssh-key/ <<< !! How to Recover from Lost SSH Keys SSH keys are our recommended method of authentication for Droplets on DigitalOcean. Password authentication is disabled by default on Droplets created with an SSH key because it increases the Droplet’s overall security. However, it also means that if you lose your SSH key, you will need to use the Droplet console to restore SSH access. ''On any version of Ubuntu, Debian, CentOS, or Fedora 27,'' the overall process to restore access will be: # ''Reset the Droplet’s root password'' via the control panel so you can connect using the Droplet console. # ''Log in using the Droplet console'' to gain access to the Droplet’s SSH configuration. # ''Enable password authentication'' by editing the SSH config and restarting the SSH service. After that, you’ll be able to log into the Droplet via SSH again by using the new `root` password. You can also then re-add new SSH keys. <<< Also from https://www.digitalocean.com/community/questions/lost-old-ssh-key-for-droplets-how-do-i-add-my-new-key > ...the console is considered by your droplet to be a local keyboard and display you can use your password there while only allowing key based authentication for ssh.
(also saved to a local text file for when I'm offline) from https://macpaw.com/how-to/7-ways-to-increase-mac-battery-life * apply latest OS patches * check stuff in Energy Saver > Battery pref pane * turn down screen brightness * turn off WiFi * turn off Bluetooth * use Activity Monitor to quit unneeded background processes ** esp. Adobe stuff from https://setapp.com/how-to/tips-to-extend-mac-battery-life * check which things are using network access (using [[TripMode]] or [[Little Snitch]] Also: * quit Dropbox and [[Encrypt.me]] if not on WiFi * quit [[RescueTime]] * close extra browser tabs
I thought https://discuss.logseq.com/t/using-time-string-as-file-name/79/3 had the answer: > in config.edn add : > > :date-formatter "yyyy-MM-dd" > then refresh. From now on, all new journal pages should follow the taxonomy you’ve defined. > I believe you still have to manually rename existing journal pages though That is indeed important because it sets the //title// pattern for the dated journal page, but that doesn't change the //filename// pattern, which still uses `yyyy_mm_dd.md`. ''Here's how to fix the filenames for new journal entries:'' Via https://discord.com/channels/725182569297215569/735747000649252894/852437992333115402 > You change file name format by [adding] a line to `config.edn`: > > `:journal/file-name-format "yyyy-MM-dd"` > > to match the display name. Do not add this line at the end, choose some place earlier in the file, like above Git instructions.
from https://forums.plex.tv/t/are-flac-files-streaming-lossless-or-is-it-transcoding/202038/3 > When playing a song, launch Plex Web, then look at Status -> Now Playing (next to Settings in top right of window). It will show if the music is being Direct Played or transcoded to another format.
Someone asked a similar question here: https://apple.stackexchange.com/questions/84433/can-i-enable-hiding-the-dock-on-my-macbook-monitor-only I'll have to use ``⌥⌘D`` when I'm on the large monitor until I can find something that can detect when a second monitor is attached. Neither [[BetterTouchTool]] nor [[Keyboard Maestro]] appear to have triggers to sense this. And ControlPlane isn't maintained anymore.
from https://9to5mac.com/2021/12/29/how-to-turn-off-in-app-review-requests-on-iphone-ipad-and-mac/ * On iPhone or iPad, open the Settings app * Swipe down and tap App Store * Swipe down again tap the toggle off next to In-App Ratings and Reviews * All done! * On Mac, open the App Store app * Click App Store in the top left corner > Preferences * Uncheck the box next to In-App Ratings and Reviews
300gsm https://www.bhphotovideo.com/c/product/813605-REG/HP_Hewlett_Packard_CR669A_Premium_Plus_Photo_Paper.html
maximum photo paper weight per the user manual: > Photo Paper: Up to 300 g/m2 (145 lb bond)
https://humdrumletter.substack.com by [[@kordumb]]
While searching for background info about [[Jonny Greenwood]]'s [[modular]] [[synthesizers]], I ran across this old [[Reddit]] post in a [[Radiohead]] forum. I really like this dude's restraint and hope I can be as in control if I ever run into a hero: [[I shopped for modular synths with Thom Yorke today — Reddit|https://www.reddit.com/r/radiohead/comments/55fhgg/i_shopped_for_modular_synths_with_thom_yorke_today/]] > We stay for a while and listen to the store clerk and Thom talk, playing it cool and just trying to soak up this incredible interaction. Thom walks away and I sit back down to keep testing modules. I was determined not to make this a fan moment, because I knew the most valuable thing I could give him was a normal moment in a synth shop. ... > That's about it. I feel like I'm both here and not here. It was really beautiful and validating seeing my absolute hero geeking out over the same convoluted hobby that I do. We didn't discuss who they were, we didn't discuss the show, and we didn't discuss how I was about to pass out from joy.
like this: `[img[https://twelvety.com/philtiddlywiki_images/2019-01-07-federated-wiki.png]]` renders: [img[https://twelvety.com/philtiddlywiki_images/2019-01-07-federated-wiki.png]]
2021-03-12 I spent a lot of today switching back and forth between two DACs and two headphone amps: * [[Pro-Ject DAC Box S FL]] vs. [[Schiit Modi 2 Uber]]. * [[Schiit Magni 3+]] vs. [[FiiO A5 headphone amp]]. The funny thing about having something as high-resolution as the [[Massdrop X Sennheiser HD6XX Headphones]] is that they magnify the tiniest differences between gear connected to them. I can now hear that: * The FiiO has a touch more bottom end (maybe too much) and also less current with which to supply that bottom end. * The FiiO is a hair smoother- and slower-sounding than the Magni 3+, which can be flattering if a DAC has too many hard edges. * The minor channel imbalance I've been hearing is probably down to the Pro-Ject DAC, but what are you gonna do other than order a fancy extra passive volume control for it? * The Pro-Ject DAC is just a bit more grainy than the Modi 2 Uber, but also sounds more real. I listen to the music instead of the recording when it plays. I realized the other day that I'm actually a distortion guy, not a perfect-clean-accurate reproduction guy. I like LPs, cassette tapes, reel-to-reels, and filterless [[non-oversampling DAC]]s (aka [[R-2R/ladder DACs]]) to turn PCM into analog. If the distortion this Pro-Ject DAC is adding is helping me hear as many new things as I'm hearing in old familiar recordings, then so be it.
https://en.wikipedia.org/wiki/I%C2%B2S > ''I²S (Inter-IC Sound)'', pronounced eye-squared-ess, is an electrical serial bus interface standard used for connecting digital audio devices together. It is used to communicate PCM audio data between integrated circuits in an electronic device. The I²S bus separates clock and serial data signals, resulting in simpler receivers than those required for asynchronous communications systems that need to recover the clock from the data stream. Alternatively I²S is spelled ''I2S'' (pronounced eye-two-ess) or ''IIS'' (pronounced eye-eye-ess). Despite the similar name, I²S is unrelated to the bidirectional I²C (IIC) bus. The separation of the clock and data signals is what makes it so much better than [[S/PDIF]].
https://i3wm.org > i3 is a tiling window manager, completely written from scratch. Wow. Saw [[h0p3]] mention this in a [[letter to KK|https://philosopher.life/#2019.03.04%20-%20Kevin%20Kovacs%3A%20Unfolding]]. He also has an [[i3 tiddler|https://philosopher.life/#i3]]. After seeing the screenshots, this makes so much more sense than a bunch of overlapping windows, although it seems way over my head.
I never got what the fuss was about Ian Hunter until Matt told us to listen to him doing this track live in 1979. //Ohhhhh.// <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//OSmYx0kg7bc' frameborder='0' allowfullscreen></iframe></div>
[[Own Your Second Brain: Set Up org-roam on Your Own Machine|https://ianjones.us/own-your-second-brain/]] [[via Jack|https://micro.blog/jack/9683665]] Since I don't use [[Emacs]] that much anymore, it might be fun to try [[Doom Emacs]] along with a fresh install of [[org-roam]] since all the instructions are wrapped up together here.
I wish I knew enough about programming to write an [[org-journal]]-browser iOS app. It would allow for searching and browsing through a folder of files in a nicely formatted way, like book pages instead of a list of filenames. And it would be able to show images like [[Day One]]. But I also want it to render more like [[Momento]].
https://www.sweetwater.com/store/detail/iRigPro--ik-multimedia-irig-pro-audio-midi-interface-ios-mac
https://ilford.com/product/gloss/ 260gsm > GALERIE Glossy Photo 260gsm is a heavy weight, high quality inkjet photo paper offering accurate reproductive qualities, extended longevity and a robust surface for exceptional yet durable prints. https://www.bhphotovideo.com/c/product/1506092-REG/ilford_2004023_galerie_prestige_glossy_5x7.html
https://www.imaginando.pt/products/k7d 2019-06-10: Trying the demo of this in GarageBand.
Tonight I downloaded all the rest of the video snippets from Will for our project. Started putting things into [[iMovie]] but the latest version on [[macOS]] sucks really, really bad. You can't just drag stuff around on the timeline anymore, and most annoyingly, you can't name clips, which makes them impossible to organize. Need to find something way better. Hmm. Jack has [[this bullet|https://roamresearch.com/#/app/jackbaty/page/xr3Gm2TQ4]] mentioning [[Filmora9]]...
https://wtfamps.com/inputoutput-impedance/ > If we want to see as much of the (fixed) source voltage as possible across R2, we need to either maximize R2’s value or minimize the value of R1. Now here comes the meat and taters. Ready? Impedance is the AC equivalent of DC resistance. Sink that into your thinker and replace R1 with the output impedance of your source and R2 with the input impedance of your amp. Higher input impedance (R2) or lower output impedance (R1) means better voltage transfer. Congratulations, you now successfully understand the basics of the most mysterious DIY audio topic: impedance matching and signal transfer. Holy cow, this is the closest I've ever come to grasping impedance matching.
https://en.wikipedia.org/wiki/In-band_signaling > In telecommunications, ''in-band signaling'' is the sending of control information within the same band or channel used for data such as voice or video. This is in contrast to out-of-band signaling which is sent over a different channel, or even over a separate network. In-band signals may often be heard by telephony participants, while out-of-band signals are inaccessible to the user.
These are my current inboxes or places I think I need to keep updated: (An earlier iteration of this list is in [[2019-04-11 Not making enough things]]) !! Theoretically really important (break these into external/unknown vs. things I’ve looked at?) * bills due * phone calls and voicemails * [[YNAB]] imported transactions * [[Reminders.app]] * [[Bullet Journal]] todo’s * paper mail * Email about bills/doctors/etc. * [[Dynalist]] * [[Google Calendar]] !! Should keep up with better than I do now * texts * [[Tot]] * [[Things]] inbox * [[Bullet Journal]] notes * [[Dropbox]] `inbox` folder * Email from friends * [[Drafts]] inbox * [[Day One]] (i.e., the ever-present need to put stuff *in* it) !! Useful or for learning/reference * Print version of [[The Atlantic]] * [[Instapaper]] queue * [[Castro]] inbox * `buffer note.md` for things to put in `Roam` + `TiddlyWiki` * [[Otter.ai]] captured notes * [[DEVONthink]] inbox !! Nice to keep up with so I’m not totally rude * [[Micro.blog]] mentions * [[Twitter]] DMs and @-replies * [[Instagram]] messages and likes/comments * [[Facebook Messenger]] !! For fun or news * Various friends' wikis * [[RSS]]/[[Feedbin]] * [[reading news on the iPad Pro]] * [[Nuzzel]] * [[Twitter]] timeline * [[Micro.blog]] timeline * [[Instagram]] !! To keep things tidy * [[MacBook]] `Downloads` folder * [[Photos.app]] camera roll
started 2019-11-28 I think Facebook is evil, harmful and negligent, but apparently only so much, because I still have an account with them although I don't post to the wall anymore. I do still use FB to occasionally learn about upcoming events and keep in touch with people with Messenger. And I still have an Instagram account that I use fairly regularly, and they are essentially Facebook. I "care about privacy" and also know about Google's insatiable desire for data, so I turn off Web History, but I use Google Search, Gmail, Google Photos and Google Calendar with abandon. I disagree with Tim Cook's lack of correcting POTUS on what he said in the Apple plant last week, but I generally think Apple tries to do the right thing, or at least values user privacy to the point where it does them financial good, so I keep investing dollars and time heavily in the macOS and iOS platforms because they overall feel like the best-made things out there for now. I know that my eating habits won't change the world, or have practical effects of saving animals, but I [[generally end up eating pescetarian|2019-07-30 Journal (vegetarian-ish)]], because I personally don't want to be one more contributing factor to inhumane living conditions and gross deaths for chickens, turkeys, pigs and cows. Except when I'm at a friend's house and they don't know my eating habits, and chicken, turkey, pig or cow is the main dish and it would be rude to not eat what they made. Or when I'm at a conference and there's no time to eat anything else between sessions other than the chicken taquitos on the buffet table and then you bet I'll eat some chicken. And factory farming and killing sea creatures (tuna, salmon, shrimp, squid) doesn't keep me up at night. I'd eat salmon every day if I could. I hate cars and city space wasted on parking spots as much as the next person, but I still use my own Honda Fit for little else besides driving the three miles to work every morning because I'm too afraid to fight traffic with a bike and the bus route would take forever. I know CNN is a huge part of the media/news problem, but I end up checking their homepage at least once a day because the dopamine hit is so big. And I watch their TV stream/channel every day for a bit (for now). And sweet lord, Amazon has its priorities all wrong, [[costing workers' injuries and lives|https://www.theatlantic.com/technology/archive/2019/11/amazon-warehouse-reports-show-worker-injuries/602530/]]. Whenever B&H has some gear I want, I try to buy from them, but for the 90% of other things we buy online, I'm yet another paying Amazon Prime customer putting the pressure on by opting for 1- or 2-day delivery every chance I get. I should feel way worse about this, but I file it away. All of this reminds me of this quote [[Jack found|https://rudimentarylathe.org/#Quote%3A%20Yessenia%20Funes%20on%20shaming]] from Yessenia Funes: > I refuse to believe people should be shamed for living in the world we’ve built.
From the [[Polar]] [[website|https://getpolarized.io/docs/incremental-reading.html]]: > Incremental reading is a strategy around suspending and resuming reading of a document over time. Reading the documents in chunks and coming back to the document at any future point in time.
https://www.infineon.com/cms/en/product/power/class-d-audio-amplifier-ic/integrated-class-d-audio-amplifier-ics/ma12070/ > MA12070 is a highly efficient, fully integrated, digital audio power amplifier IC, based on multi-level switching technology. It supports a 4-26V supply voltage range, allowing it to be used in many different audio applications.
from [[RC]]
Ah! Handy for inserting, say, the `°` (degrees) symbol. Just do `M-x``insert-char` or `M-SPC i u` in [[Doom Emacs]] and then type the name of the thing you're looking for and hit Return to enter it.
https://www.somewhereintime.tv/insite.htm 2024-07-08 Just joined so we can get the three printed issues each year.
http://contextplugin.tiddlyspot.com/ ...but I uninstalled it shortly after. Didn't like the way it worked.
The [[YMDK ISO OEM PBT keycaps]] work wonderfully on the [[Keychron K2]]. They do transform it into a different keyboard entirely. I kept the WASD red o-rings on each key. And I left all the stock multimedia function keys except for F2, F5, and F9, which I use at work all day every day. I figure if they feel slightly different than the rest of the original function keys, I'll eventually be able to find them without looking. The only bad thing about this set of keys is that there are no Mac keys for Option and Command, but that's ok. I just put Windows and Alt in their normal PC places and my muscle memory will know what they really mean in macOS. Also, the Home key on the right sticks out because it was made to be on a higher (proper) row, but I'm glad because it'll be easier to grope around for. [img[https://twelvety.com/philtiddlywiki_images/2020-07-31-switching-keychron-k2-keycaps.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2020-07-31-keychron-k2-with-pbt-keycaps.jpg]]`
from here: https://thediveo.github.io/TwFusejs/output/twfusejs.html And I changed the "$:/plugins/TheDiveO/TwFusejs/ui/fusesearchresults" shadow tiddler to this, so that the unrendered beginning of each tiddler would show up under the title of each fuzzy-match search result hit: \define fusesearchresults(anyterm) <$set name="fuse-options" value=<<fuse-options>> emptyValue={{$:/plugins/TheDiveO/TwFusejs/options/default!!text}} > <$set name="hits" filter="[!is[current]!is[system]$anyterm$fuse:fuse-options{$(searchTiddler)$}limit[20]]"> <small>//<$count filter="[enlist<hits>]"/> matches://</small> <$list variable="hit" filter="[enlist<hits>]"> <dt> <!-- render matching titles as tiddler links --> <$link to=<<hit>> ><$view tiddler=<<hit>> field="title"/></$link> </dt> <dd> <!-- render the (beginning) of a matching tiddler as pure text without any markup --> <$list filter="[<hit>rendertext[]stringlimit[300]]"> <$view field="title" format="plainwikified"/> </$list> </dd> </$list> </$set> </$set> \end <$macrocall $name="fusesearchresults" anyterm={{$:/config/TwFusejs/allterms!!text}} />
! 2019-01-31 I already love Tinderbox and think it will be great for things I want to quantify/measure, but for a [[Daybook|2019-01-22 keeping a daybook journal]], I think I want to get [[Org-Journal]] running. I installed the macOS pre-built Emacs (see [[2019-01-24 installing Emacs]] and am now trying to figure out how to get Org-journal to work on it. These currently look useful, but I'm not sure about where config files and stuff go when using this version of Emacs: * https://camdez.com/blog/2015/04/03/switching-to-melpa-stable/ * https://stackoverflow.com/questions/22219131/customize-emacs-for-mac-osx-app says I should put the file in `~/.emacs.d/init.el` I have a `~/.emacs.d/` directory, so that's good. Ah, but I see that if I do `C-h v user-init-file RET`, Emacs says, ``` user-init-file is a variable defined in ‘C source code’. Its value is "~/.emacs" ``` So I copied the `.emacs` file to `~/.emacs.d/init.el` because the common wisdom is that it should go there. And when I restarted Emacs and did `C-h v user-init-file RET` ``` user-init-file is a variable defined in ‘C source code’. Its value is "/Users/phil/.emacs.d/init.el" ``` So that's good. From https://camdez.com/blog/2015/04/03/switching-to-melpa-stable/ <<< The first step, naturally, is to open your `.emacs` (or `.emacs.d/init.el`) and change your `package-archives` form to look like this: ``` (add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t) ``` <<< ! 2019-02-01 In the menu, I clicked on Options > Manage Emacs Packages, and then saw "org" and clicked on it and then clicked ''Install''. Then I restarted Emacs and went to Manage Emacs Packages again and saw a ton more stuff, including "org-journal", so I clicked on that and then clicked ''Install''. I did `C-h v org-journal-dir RET` to show the current settings for where the journal files were stored. Where it said, "You can __customize__ this variable, I clicked on that and `~/org/journal/`, which I stole from [[Jack Baty]]'s [[GitHub|https://github.com/jackbaty/emacs.d/blob/master/config/orgmode.el]], and which makes sense anyway. It works! I typed `C-c C-j` and lo and behold a new entry appeared! Also stole these variable settings from Jack's config: * `org-journal-file-format "%Y-%m-%d.org"` * `org-journal-date-format "%A, %B %d %Y"` I am probably doing this all wrong and sloppily, but it seems to work well enough so far. ! 2019-02-02 {{2019-02-02 timestamps in Org-Journal}} {{2019-02-02 files ending in "~" are Emacs backups}} {{2019-02-02 mapped CapsLock to Ctrl}}
As our "graphs" of notes and knowledge grow without limit, what kind of integrity checks can there be to make sure all the bits and blocks and their relationships are all preserved and nothing's being lost by accident?
2019-12-18 Got the NUC8i3BEH to run [[Roon]] Optimized Core Kit on. Alas, I can't get into the BIOS with the old-ass Key Tronic USB keyboard from 2002. The function keys don't appear to work. Hopefully the $15 Microsoft keyboard I ordered will do the trick.
[img[https://twelvety.com/philtiddlywiki_images/2021-03-17-interpol.jpg]] I often go for months without thinking about Interpol, and then I hear one song and it triggers days of me thinking about all the dudes in the band, including the sadly ex-bassist [[Carlos Dengler]]. He and [[Sam Fogarino]] together were the best rhythm section in rock in decades, and both of them individually are/were the absolute best at composing and playing their own parts. There's just so much with this band. [[Paul Banks]] and his self-consciously cool manner and voice, and [[Daniel Kessler]] wearing suits every day of his life.
from [[Adam O'Brien]] on [[Slack|https://roamresearch.slack.com/archives/CN10T100K/p1579329246010300]] > Is there an iOS shortcut to share web articles/links to Roam? I have been using this shortcut to format/save tweets to Roam and would love a similar solution for articles > > https://www.icloud.com/shortcuts/d7bcce2b08604dbf9586a49c2cb49c7c Note that it doesn't actually put the Tweet //into// [[Roam]], which is fine by me. It just puts a nicely formatted tweet with attribution and Roam-formatted hyperlinks and a source URL on the clipboard, and then you paste it where you want. I paste mine into [[Drafts]] and then I have another shortcut that prepends that draft to my [[buffer notes]] text file in [[Dropbox]], which I periodically put into Roam on the [[MacBook]]. I should really extend this shortcut to do all that automatically.
I thought I already had a running list of words and phrases that press my buttons, but I sure can't find it now. * I don't know who needs to hear this, but... * What's the German word for... ? * Tell me you don't understand [blah] without telling me you don't understand [blah]. * How it started/How it's going * "Definitely". Bad enough in speech, but I have got to banish this word from my writing. It has infected this wiki and my emails for long enough. * Hey what's up guys * Referring to specific people as `a <THEIR ACTUAL NAME>`. Like, "We should get a Roger or a John to weigh in on that", when there's only ONE FUCKING ROGER OR JOHN in the company/department/team and they do very specific jobs. There are no more! * "Through the lens of `<insert some word here>`" * kind of * sort of * Where was the outrage about... * the American people * Thoughts? * Totally * Completely
Gillies played Elliot Stabler's wife on //Law & Order: Special Victims Unit//. There's some more detail that has come out since her post went up, revealing that the photo Gillies saw on Twitter and included in her blog is actually a screenshot/meme from //Mean Girls// and the person who posted that happens to be an SVU fan and there may be some sort of misunderstanding about that one case. I don't care about all that and I'm sorry I even read that much about it. Gillies' message still applies. [[T.H.I.N.K - by Isabel Gillies - Isabel’s Newsletter|https://isabelgillies.substack.com/p/think]] > Can we please all take it down a notch? No matter what our personal views are about TV love stories or climate change or the Senate parliamentarian, can we pause? There is the acronym T.H.I.N.K. Is it thoughtful? is it honest? Is it interesting? Is it necessary? Is it kind? I’m going to try to put everything I say or write through this little fail-safe. Goodness knows we’ve all been through the ringer. I often feel the urge to spew a nasty rant as much as the next person, but if a second-tier character on a primetime drama can be the victim of a ferocious online melt-down because of //make-believe//, it kills me to think what actual important civil servants must have to endure. It seems we’re all screaming at each other all day, every day. Is it worth it? Can we stop? > > Can we think?
https://www.isabelledervaux.com > Photo organizer and visual storyteller Heard her on the [[What to Do About All Those Digital Photos?|https://thedigitalstory.com/2020/12/What-to-do-About-All-Those-Digital-Photos-TDS-Podcast.html]] episode of [[The Digital Story podcast]]. She sounded delightful.
https://www.imdb.com/title/tt0472954/ These days, when Sarah and I turn to each other and say "TV?", we implicitly mean, "Are we watching It's Always Sunny in Philadelphia?"
from [[Tape Op magazine]] on [[Twitter|https://twitter.com/tapeopmag/status/1220378352562790400]]: > Jack Antonoff: "I don't store patches, ever, and I won't use soft synths, not even to mess around. If I know I can pull up the exact same sound [a second time], part of me dies." https://tapeop.com/interviews/135/jack-antonoff-home-brooklyn/
Blogger, TiddlyWiki, Emacs, Tinderbox and Micro.blog user, lots of overlapping interests with me. website: https://www.baty.net/ wiki: https://rudimentarylathe.org
from [[Jack Baty|https://rudimentarylathe.org/#2019.01.18%20-%20Journal]]: > I have a couple of digital private journals (one in Day One and one in Org-Journal) and a paper notebook journal. These are all terrific, so why do I feel like putting everything I write into this silly wiki instead? It's certainly not private here, but there's something compelling about the //possibility// that someone will stumble across things I've written here, even if they weren't meant to be seen by anyone but me. Still hashing all this out, I guess.
[[Jack Baty|https://rudimentarylathe.org/#2019.01.23%20-%20Journal]]: > TiddlyWiki is Tinderbox we can immediately share. Man. Indeed! This public display and sharing of TiddlyWiki installations is the most exciting thing I've seen on the web since RSS. Just breaks the mold in all kinds of ways. What an amazing way to share things in a completely opt-in way for an intended "audience". Non-pushy, organic, simple to follow, but also potentially inscrutable depending on how people set up TW. And here I was, initially afraid that if I made this wiki public, I wouldn't have enough to put in here to be interesting to others.
Correspondent for [[The Atlantic]], writer, journalist, former White House speechwriter, [[Tinderbox]] user.
https://www.theatlantic.com/politics/archive/2020/06/james-mattis-denounces-trump-protests-militarization/612640/ I could just copy and paste the whole thing, but here's this: <<< I have watched this week’s unfolding events, angry and appalled. The words “Equal Justice Under Law” are carved in the pediment of the United States Supreme Court. This is precisely what protesters are rightly demanding. It is a wholesome and unifying demand—one that all of us should be able to get behind. We must not be distracted by a small number of lawbreakers. The protests are defined by tens of thousands of people of conscience who are insisting that we live up to our values—our values as people and our values as a nation. When I joined the military, some 50 years ago, I swore an oath to support and defend the Constitution. Never did I dream that troops taking that same oath would be ordered under any circumstance to violate the Constitutional rights of their fellow citizens—much less to provide a bizarre photo op for the elected commander-in-chief, with military leadership standing alongside. We must reject any thinking of our cities as a “battlespace” that our uniformed military is called upon to “dominate.” At home, we should use our military only when requested to do so, on very rare occasions, by state governors. <<<
I re-found this on my https://twelvety.micro.blog/favorites/ page: from [[James Shelley]] https://jamesshelley.com/2018/01/07/if-i-could-go-back-in-time/ > If I could go back in time, I’d tell my former self to begin compiling a bibliography of citations much earlier than I did. If it is worth reading, it must be worth notating, cataloguing, and archiving in a trustworthy system for future reference.
Science writer, journalist, and storytelling teacher Appears in [[Video: "Emacs for Writers" with Jay Dixit]] His Emacs settings are at https://github.com/incandescentman https://jaydixit.com https://twitter.com/jaydixit
https://micro.blog/jean http://micro.welltempered.net Co-host of [[The Weekly Review]].
[[Transcript: Ezra Klein Interviews Jeff Tweedy - The New York Times|https://www.nytimes.com/2021/07/02/podcasts/transcript-ezra-klein-interviews-jeff-tweedy.html]] <<< EZRA KLEIN: So there’s a line in your book that I just loved. You say that, quote, “disappearing is the most sustaining part of what I do.” Tell me about that. JEFF TWEEDY: Yeah. I think it’s kind of what everybody wants all the time, is to be free from worry, unburdened by a sense of self. That’s what I think of as disappearing. I think people do it a lot of different ways that I don’t think are particularly creative or productive, and I would argue maybe not as good for you. I think people disappear when they play games on their phone and do things like watch sporting events. And I think that’s good. I think everybody kind of needs to check out a little bit. But I think it’s kind of incredible when you can do that and somehow be present at the same time, which is what I think happens when you create. EZRA KLEIN: What makes it more or less likely for you that during a creative session you’ll be able to disappear? JEFF TWEEDY: I think it’s really when I’m asking the least of it. I think if I’m putting really high demands on what I want to come out of myself or when I’m just coming at it wanting to get something out of it — basically, I guess, thinking, oh, I’m going to get a song out of this. I feel like I’m aiming at the wrong thing. But when I allow myself to just discover, looking forward, focusing my eyes more on just the act of what I’m playing around with — I guess it’s just a difference between play, I guess, and some sort of mistaken notion that you can kind of direct your creativity all the time. <<<
To install: # Download plugin from http://regex.info/blog/lightroom-goodies/flickr # Copy to `~/Lightroom Plugins` # Restart Lightroom # Add to LR Export screen with Plug-in Manager
https://micro.blog/jessekelber
https://www.jetbrains.com/lp/mono/ > A typeface for developers Saw it mentioned in two places: * [[Craig Mod]] on [[Twitter|https://twitter.com/craigmod/status/1220725289602441219]] * [[Merlin Mann]] on [[Back to Work]] ** http://5by5.tv/b2w/461
Inventor of [[org-roam]]
https://blog.jethro.dev/posts/migrating_to_doom_emacs/ [[Jethro Kuan]] is the [[org-roam]] dude. I feel a [[Doom Emacs]] rabbit hole coming on.
https://www.jico-stylus.com/product/n97xe-sas-b/ Replacement stylus for [[Shure M97xE]] cartridge. 2024-06-16: Recommended to Butch to buy one for his [[Dual 1219]]. This is what I texted him: > Yes! The N-97XE SAS/B is a great stylus/needle. Jico makes great stuff. Swapping your old stylus for that one will likely sound better than the original ever did. I wouldn't bother putting a new cartridge in. It's such a fiddly process, especially to get the angle and reattach those tiny wires that are easy to break. It sucks that the stylus alone is so expensive, but a good new cartridge these days will be just as much $$$ anyway. I can't believe how expensive that M97xE cart is now that Shure has stopped making them! > > And as you can see, popping in a new stylus will be easy. And think of the hundreds of hours of quality listening you'll get in with this new stylus. If my Gmail is right, you've been running that original stylus and cart since December 2013, so it'll be pennies per LP over time with the new stylus!
Last night, Sarah and I went to the [[VMFA]] to see the [[Edward Hopper]] exhibit about hotels. Really good. It would have been a plenty big show even if it had been just his stuff. There were a lot of related artists' things, too. I took photos of [[Jo Hopper]]'s [[journals]]. It was like she did anti-[[bullet journal]]ing. [img[https://twelvety.com/philtiddlywiki_images/2020-01-31-jo-hopper-diaries.jpg]]
from: [[Slouching towards Biloxi: Joan Didion on life in America's south — The Guardian|https://www.theguardian.com/books/2017/sep/23/joan-didion-slouching-towards-biloxi-south-and-west]] > I have kept notebooks since I was a child. They are a fundamental part of my process. The next stage is to polish them, to retype them and see what’s there. If I’m very lucky, something is there. If I’m not very lucky, I do another draft of them. I still keep notebooks. I don’t have plans to publish others, but that may change. Saw it referred to from this post on Taking Note: [[Didion on Her Notebooks, Again|http://takingnotenow.blogspot.com/2017/09/didion-on-her-notebooks-again.html]] 20180223T1224
https://www.adultswim.com/videos/joe-pera-talks-with-you
https://www.talkhouse.com/artist/john-colpitts/ > John Colpitts, aka Kid Millions is a drummer, composer, drum teacher and writer based in Queens, NY. He is best known for his work in the experimental rock band Oneida and his percussion group Man Forever. His latest album with Oneida, Success, is out now on Joyful Noise. https://johncolpitts.bandcamp.com/ [[Oneida]]
Oh my goodness. [[Join NPR Music's Listening Party for John Coltrane's 'A Love Supreme: Live in Seattle'|https://www.npr.org/sections/allsongs/2021/10/18/1046106013/listening-party-john-coltrane-a-love-supreme]] > //A Love Supreme: Live in Seattle//, out Oct. 22 via Impulse! Records, captures a 1965 date that expands //A Love Supreme//'s universe. On this album, Coltrane's rhythm section — McCoy Tyner on piano, Jimmy Garrison on bass and Elvin Jones on drums — is joined by tenor saxophonist Pharoah Sanders, alto saxophonist Carlos Ward and a second bassist, Donald "Rafael" Garrett.
https://darko.audio/ https://www.youtube.com/@DarkoAudio
[[John Dickerson]] [[thread|https://twitter.com/jdickerson/status/1222884434774568960]] on [[Twitter]] <<< Thinking about this argument against checking [[presidential power]], it's actually an argument for doing so. Here's how: Dershowitz was arguing that all politicians think their re-election is in the national interest. > ([[embedded tweet|https://twitter.com/jdickerson/status/1222599449328979975]]) If we go all the way down this road isn't the maxim then: Because a president thinks his re-election is in the national interest he can take no action related to his campaign that is not in the national interest. The [[framers]] knew this. They harnessed it. They wanted presidents of ambition. When Gouverneur Morris argued for more than one term he appealed to the beneficial nature of ambition. To stop a president at one term, he said, "may give a dangerous turn to one of the strongest passions in the human breast. The love of fame is the great spring to noble & illustrious actions. Shut the Civil road to Glory & he may be compelled to seek it by the sword." So they recognized that ambition was crucial to the job. Seeing your success in the national interest would match that notion. But at the same time, this terrified them. Ambition, they knew was a rapacious force. They called it a cancer. [[Samuel Adams]]: "Such is the depravity of mankind that ambition and lust of power above the law are predominant passions in the breasts of most men...[Power] converts a good man in private life to a tyrant in office." So what to do? The presidency needed ambition but also a way to control that unstoppable force? Two solutions: virtue of the president and [[Congress]]. They knew that presidents would see their success in the national interest, but encouraged norms to shame and ostracize those who would cross the line. Washington, for example, was constantly fretting about his ambition. Jefferson said the health of the republic depended on studying the historically baleful ruin that resulted from excessive ambition. When those norms failed, though, (as they knew they would because humans are sinful and power-mad) they expected the other branches to step in to check the executive's power. A tool they designed for this purpose: [[impeachment]]. <<<
[[John Dickerson]] on [[near-miss learning]] in the time of [[COVID-19]] (I //love// near-miss learning. That's one thing I didn't forget from [[Industrial & Systems Engineering]] at [[Virginia Tech]].) From [[Slate]]'s [[Political Gabfest]] ([[The “Two Trillion Dollars” Edition|https://slate.com/podcasts/political-gabfest/2020/03/enough-with-false-choices]]) > ...This should cause a gargantuan case of [[near-miss learning]], which is when you fall asleep at the wheel and almost hit the oncoming semi-truck, you don’t keep driving, or you don’t make it a pattern in your life to drive when you’re really, really tired. You say, "I’m going to set up my life in such a way that I’m not going to be asleep at the wheel and liable to get hit by a semi-truck again." The near-miss learning that should engage here about the inequities in the economy, the inequities in the healthcare system, the way we talk about the economy—[i.e.,] that we should stop talking about it in terms of the stock market—there are a series of global questions: the way we think about the presidency and the way we look to it for solutions when in fact we should look to the local level, all of that near-miss learning should take place. And the challenge is if you bring it up now, there’s too many big, complicated things to talk about. If you bring it up too late, you won’t have the thrust of the disaster to prompt you.
Robison is the guy who built amps and custom special-effect guitars for [[Kiss]], like [[Ace Frehley]]'s light-guitar.
I found him by googling "[[org-mode]] daily journal". ''Warning:'' rabbit hole ahead personal/art website: http://johnj.com technical website: http://eigenhombre.com
Another gem from [[John Jacobsen]] http://eigenhombre.com/communicating-with-humans.html <<< The best way I know to think clearly about a problem is to write about it – the harder the problem, the more careful and comprehensive the required writing. Writing aids thinking, because it is slower than thought... because you can replay thoughts over and over, iterate upon and refine them. Because writing is explaining, and because explaining something is the best way I know to learn and understand it. <<<
<style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//T81oiXvFK4U' frameborder='0' allowfullscreen></iframe></div> What a nice way to start the weekend, watching [[John Peel]] play records and gush on about new bands in 1990.
Tagx: #life #work #compass #podcast On a recent Slate Political Gabfest, John Dickerson pointed this out and said he was a big fan of them. John Perry Barlow was a lyricist for the Grateful Dead and founding member of the Electronic Frontier Foundation. From [[www.mail-archive.com|https://www.mail-archive.com/silklist@lists.hserus.net/msg08034.html]] <<< FINALLY, A LITTLE GIFT FOR US ALL... I didn't think I would live to 30 either. I was shocked, shocked I tell you, to find myself on the eve of my 30th birthday, weirdly alive. In this, I was quite out of step with most of my friends to that point, more than half of whom were already back in the sweet realm of infinity and love. Chickenshits. If you're going to volunteer in the first place, go right into the Special Forces. In any event, it occurred to me that, past 30, I could no longer defend my peccadillos on basis of youth. I would have to acquire some minimal sense of responsibility. While I didn't want to be a grown-up, I wanted at least to act like one in the less toxic and stultifying sense of the term. So, I sat down around 2 am on October 3, 1977 and I drew up this list of behavioral goals that I hoped might assist in this process. Now, thirty years later, I can claim some mixed success. Where I've failed, I'm still working on it. I give these to you so that you can provide me with encouragement in becoming the person I want to be. And maybe, though they are very personally targeted, they may even be of some little guidance to you. Anyway, this is what I wrote that night: PRINCIPLES OF ADULT BEHAVIOR # Be patient. No matter what. # Don't badmouth: Assign responsibility, never blame. Say nothing behind another's back you'd be unwilling to say, in exactly the same tone and language, to his face. # Never assume the motives of others are, to them, less noble than yours are to you. # Expand your sense of the possible. # Don't trouble yourself with matters you truly cannot change. # Expect no more of anyone than you yourself can deliver. # Tolerate ambiguity. # Laugh at yourself frequently. # Concern yourself with what is right rather than whom is right. # Never forget that, no matter how certain, you might be wrong. # Give up blood sports. # Remember that your life belongs to others as well. Do not endanger it frivolously. And never endanger the life of another. # Never lie to anyone for any reason. # Learn the needs of those around you and respect them. # Avoid the pursuit of happiness. Seek to define your mission and pursue that. # Reduce your use of the first personal pronoun. # Praise at least as often as you disparage. # Never let your errors pass without admission. # Become less suspicious of joy. # Understand humility. # Forgive. # Foster dignity. # Live memorably. # Love yourself. # Endure. I don't expect the perfect attainment of these principles. However, I post them as a standard for my conduct as an adult. Should any of my friends or colleagues catch me violating any one of them, bust me. John Perry Barlow October 3, 1977 <<<
[[Roberts Rules Trump Out of Order - The Atlantic|https://www.theatlantic.com/ideas/archive/2020/06/roberts-rules-trump-out-order/613252/]] I feel like all the fist bumps about the DACA decision are missing this (like I was missing it before I read this). And the thing is, as much as I'm pro-DACA and pro-DREAMer (what an awful acronym), the tiny vestigial conservative bone somewhere in my body actually respects that Roberts is trying to follow the right process, but it's just scary that the Trump administration's lack of following the process is what saved us: > On Thursday, Roberts joined with the four Democratic appointees on the Court to invalidate the Trump administration’s decision to repeal the Obama-era Deferred Action for Childhood Arrivals policy, which has shielded about 700,000 undocumented immigrants brought to the U.S. as children from deportation. The decision states that the Trump administration has the power to rescind the policy, but that the “arbitrary and capricious” manner in which it did so violated the Administrative Procedure Act, which governs decisions made by government agencies. The Department of Homeland Security, Roberts writes, was obliged to consider all of its options before repealing DACA wholesale. “Making that difficult decision was the agency’s job,” Roberts argues, “but the agency failed to do it.” ... > Roberts’s decision does not voice opposition to prejudice, the harm the Trump administration’s decision would cause, or DACA’s repeal itself. Rather, he wrote that the Trump administration simply did not do the minimum amount of work required to implement its desired policy.
https://hypercritical.co/
Creator of the [[Johnny.Decimal]] organizing/filing system. https://twitter.com/johnnydecimal https://www.reddit.com/user/johnnydecimal https://www.reddit.com/user/jen729w
[[Johnny.Decimal]]: [[working in the Terminal on Vimeo|https://vimeo.com/132594706]] by [[Johnny “Decimal” Noble]]. Very cool. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://player.vimeo.com/video/132594706' frameborder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div>
With one [[Micro.blog post|https://micro.blog/jack/11164989]], [[Jack Baty]] has hijacked my weekend. :) https://johnnydecimal.com/ > ''A system to organise projects'' > > When we kept everything on paper, organised people had these things called filing cabinets. They stored all of their documents in them in a structured way so that they could find them again. > > Now those same people store all of their files in arbitrarily named folders on their company’s shared drive and wonder why they can’t find anything. I think this imperfect system may fall squarely in the "good" category of [[Perfect is the enemy of good]], which is good enough for me to start playing with it. [[Johnny “Decimal” Noble]] post in [[Data Curator on Reddit]]: https://redd.it/i6bjza !! Examples in the wild: * https://www.reddit.com/r/datacurator/comments/lfbzu0/how_do_you_organize_your_data/gmmkeyr/
I have a theory that one of the intended or unintended benefits of [[Johnny.Decimal]] is that it helps you build a mental model around your [[areas of responsibility]]. Like "what am I not allowed to let die here?" And I also theorize that an emergent benefit of putting Johnny.Decimal in place in multiple places (filesystem, task system, email, etc.)—besides the efficiency gains from removing deliberation about where to put stuff—is that all those places reinforce the "[[Get your house in order]]" message to your brain and remind you over and over what's important and what things need tending, what new branches should be put in place, what can go away, etc. Although I really doubt that filing emails is worth doing.
This Discourse post will be a good one to watch. From the man himself, [[Johnny “Decimal” Noble]], on what the [[Johnny.Decimal]] index format is or could be, with requests for feedback from the peeps: [[JD index text format - ideas and comments, please|https://forum.johnnydecimal.com/t/jd-index-text-format-ideas-and-comments-please/48]] <<< !! The (suggested) solution First, the solution. And this is the endorsed-by-JD, will-be-supported-by-software format. Do this: ``` 10-19 Area whatever 11 Category you-know-what 11.01 My item in one place - Location: Pinterest[1] 11.02 My item in another place - Location: Google Drive 11.03 One more item - Location: MacBook/~ [1]: And you’ll be able to [markdown](URL here) format links here so that they become clickable. ``` <<<
Another thing I wonder about: If we have a bucket of notes in nvALT, or Obsidian, or Roam, or TiddlyWiki, those are all effectively in one "folder" each. And I agree we should mention a `Category.ID` in the notes that need to correspond to places in our [[Johnny.Decimal]] scheme. We probably have no other choice but to tie things together that way, but those `Category.ID` mentions are effectively "tags", right, with all their potential for being left out by the human that should write them? I feel like the point of J.D is to get away from tags as much as we can and put things in a hierarchy, but I suppose this is an area where we have to work with the tools we have in the way they want to work, especially when it would be impossible or messy to introduce sub-folders to a particular notetaking tool. (Of course, in nvALT you can put the `Category.ID` right in the filename, so that's easier to make yourself remember to add it.)
https://gisanddata.maps.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6
[[#313 National Trauma--Now What? – Jon Kabat-Zinn Special Edition --- Ten Percent Happier|https://www.tenpercent.com/podcast-episode/jon-kabat-zinn-313]] I'd heard of [[Jon Kabat-Zinn]] a bunch of times, but this was so full of wisdom about [[meditation]] that I didn't know where to start and stop taking notes. Listen to this every year.
I heard this at around ~1:14:30 on [[Fabio's "Strength Through Failure" from 2019-01-24 on WFMU|2019-01-24 Strength Through Failure dedicated to Jonas Mekas]]. It originally came from [[Jonas Mekas: Advice to the Young — Vimeo|https://vimeo.com/135953890/description]]. Jonas Mekas: > I met friends there [at film school]... It helped me to form my own thinking. So when you go to a film school, you meet others, otherwise, I say don't go to film school. Get a camera, because you don't know what you really are all about, what you really want to make. You say "I want to make films", but what kind of films? When you go and begin to do what you think you want to do, and you discover, "Ah, for what I'm doing, I have to know more about lighting." //Then// you go and study lighting. Or, "I have to know more about lenses." Then you go and study lenses. But not everything. Why do you need everything? Maybe you will never need [it] for what you want to do.
from [[Jonas Mekas obituary|https://www.washingtonpost.com/local/obituaries/jonas-mekas-a-godfather-of-american-avant-garde-film-dies-at-96/2019/01/23/6d7a0d2e-1f46-11e9-8e21-59a09ff1e2a1_story.html]] in the Washington Post: <<< He grew more prolific with age. In 2007, when he turned 85, he posted a new short film online for every day of the year. In his 90s, he was still regularly adding videos to his website, whether shots of rain falling in Brooklyn or a mealtime conversation with fellow documentary maker Agnès Varda. In an interview with the Times published earlier this month, Mr. Mekas calmly ruminated about death. “It’s a very normal transition,” he said. “What’s beyond that line, it’s where the mystery begins, where it becomes interesting. There are glimpses in the messages that come from there, some of the old Scriptures. Indications are there, and I believe it all. I believe it much more than anything that’s written since the 12th century.” <<<
found here: https://jordanbrittley.com/blog/lightroom-to-instagram-export-settings Her IG export renders the image down to a maximum of 1080 pixels in one direction, which Instagram would do anyway, per this: https://help.instagram.com/1631821640426723 To install: # Download presets to `~/Lightroom Presets` # Copy from there to where Lightroom expects to see user presets for Export (not for Develop): `~/Library/Application Support/Adobe/Lightroom/Export Presets/User Presets` # Restart Lightroom # Add to LR Export screen My tweaks to the preset: # Change Export Location folder to be `~/Instagram export temp folder` (because I'm exporting these versions just for IG and I don't care about them after that) # Change Existing Files to "Overwrite WITHOUT WARNING" # Turn off file renaming # Change Post-Processing > After Export to "Open in Other Application..." and then pick `/Applications/Photos.app`
<style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/uuy2Ft4daAw' frameborder='0' allowfullscreen></iframe></div>
TiddlyWiki: https://joshisms.io/ (Woot! Josh's TW instantly became part of my "wikitown" bookmark group in Firefox, along with Jack Baty, Andrew Canion, and sphygm.us) DokuWiki: https://wiki.joshsullivan.io/doku.php?id=start
The 10 most recent Journal entries: <<list-links "[tag[Journal]!sort[created]limit[10]]">>
I expect this tiddler to change over time. !! 2019-04-17 * Field Notes * TiddlyWiki * Day One * Dropbox Markdown files edited in [[VS Code]] on the Mac and Editorial on the iPhone. * [[Standard Notes]] * Google Docs (for home/appliance maintenance, car maintenance, etc.) !! Requirements and Thoughts * It would be great, but seems impractical, for one search of a `yyyy-mm-dd` string in Finder or whatever to show all the entries and photos from all these systems (except the paper ones) on a certain date, but I guess I don't //really// need that. * It's never bothered me that my processed photos for whatever day are kept in a separate folder from my Markdown journal files. They're different things, so why would I need all these systems to congeal together in a way they never have before? * Dangit, the only way I'm going to figure out whether [[Day One]] can work as a suitable Daybook is by actually trying it.
https://jrnl.sh/en/stable/ > Collect your thoughts and notes without leaving the command line. I'm such a sucker for stuff like this. [[Via|https://fondoftea.com/#2021-09-22%20Wed]] [[Alex|Alex Johnstone]].
http://justine-haupt.com Made a refrigerator-sized 3D printer in her basement, and a rotary cellphone among many other things. Her personal/professional project list makes me realize how little I accomplish, and how many ways I waste time and attention. But inspiring!
My friend Dave played her [[Golden Hour|https://en.wikipedia.org/wiki/Golden_Hour_(album)]] LP for me two nights ago and (thanks to Spotify) it has been in my head ever since. There are so many flawless pop gems on this record I can't stand it. Some of it reminds me of Dolly Parton, some of it Kathleen Edwards. It's weird that it's categorized as "country", because it wanders far away from that genre. Whatever it is, it is unironically great.
Band recommended by Dave B, who emailed this to the dudes the other day. He included a link to “[[I Am The Seer|https://www.youtube.com/watch?v=ZmbpWfTKdv4]]”: > Have any of y'all heard Kaleidobolt from Finland? I heard this tune on [[WXDU]] a month or so ago, and have been pretty obsessed with it ever since. The whole record is pretty great, but I especially dig this tune. It's kind of like if [[King Crimson]] were a stoner metal band. I love that album art too. They also sound a bit like [[Focus]] to me, which is good. And this album, “[[Bitter|https://kaleidobolt.bandcamp.com/album/bitter]]” is totally great. And they look like this, which, HELL YEAH. [img[https://twelvety.com/philtiddlywiki_images/kaleidobolt.jpg]]
https://karabiner-elements.pqrs.org > A powerful and stable keyboard customizer for macOS. It's so good. And free. Works wonderfully with the [[Keychron K2]] when I leave it in Windows mode. This could justify me ordering a [[Leopold FC660C]] and not worrying about having to switch it between Windows and Mac modes.
[[Karen McGrane]] on [[Twitter|https://twitter.com/karenmcgrane/status/1222628115710709761]]: > I have hearing loss. Please do not ask me to close my eyes and envision whatever you're talking about as part of a workshop exercise or other feel-good activity. I cannot hear you. Asking people to shut off one of the senses they need is ableist
[[UOMF: How to Start With Emacs Org Mode – Karl Voit|https://karl-voit.at/2020/01/20/start-using-orgmode/]] I am such a sucker for the combination of [[Karl Voit]] and [[org-mode]]. <<< In general, I advise you limit yourself to the absolute minimum for now. For example, this relates to the common mistakes: * Learning tons of keyboard shortcuts (bindings) you'll never need. * Reading the whole manual and trying all kind of features. * Assuming that you have to come up with the best file and heading concept there is. * Giving up because you can't deal with the vast amount of things Org mode is able to offer you. * Not understanding Org mode topics what people are discussing on the Internet. <<< ... <<< Within the Org mode file(s), the structure of your headings will change. This is a natural process. Don't try to invest too much thoughts on "the perfect system". It does not exist as long as your life is advancing and your personal requirements will change as well. A common question is, whether something should be a heading or a list item. Nobody can come up with a rule that satisfies everybody here. My personal approach is: * If something is a todo which loves to be tracked until it is done, it has to be a heading. * If it is a "concept" that will potentially hold sub-headings, it's a heading. * If you only need a short list of sub-tasks, list items (with optional check-boxes) will do as well. * If it does not reflect anything that should be "done", it may also be just (additional) text, appended to any given heading. You will develop a similar mental concept for your situation. <<<
https://karl-voit.at/2019/08/29/switching-tools/ <<< While I was a student and playing around with technology, I was switching tools without reasons all the time. I did not think of the consequences. This was fruitful in order to learn about technology and different approaches for similar requirements. On the down-side, I had constant data-loss because of migration, I did not care about the future too much. <<< 😭
[[UOMF: My Current Org Mode Files and Heading Structure|https://karl-voit.at/2020/05/03/current-org-files/]] - [[Karl Voit]] > Similar to [[my article explaining my file hierarchy|https://karl-voit.at/folder-hierarchy]], this long article describes my current [[Org mode|https://karl-voit.at/orgmode]] files, how they are named, what main headings they contain and some statistics. ''If you're not an Emacs [[Org mode|org-mode]] fetishist, this is probably not going to be of high interest to you.'' I guess I know what I am now! I really dig the `~/org/hardware.org` file. He says it's: > really all of my items, computers, … with all TODOs that are associated to them → engineering diary per device
https://www.katebingamanburt.com
[[Drummer]] blog: http://oldschool.scripting.com/KenSmith/ <-- I always feel smarter after reading what he writes here.
https://6x6portraits.wordpress.com > Legacy Portraits on Film and Inspiring Photo Essays Wow. What a rabbit hole. Via [[Jack|Jack Baty]]
[[Kenneth Wajda]]: [[Photographing Life’s Little Moments|https://6x6portraits.wordpress.com/2021/10/13/photographing-lifes-little-moments/]] <<< Any photographers who are looking for subjects, I say photograph the ordinary, the things in your world that tell your story. Tuesday night dinner of leftovers. Playing Boggle with your spouse. Reading in bed. The dog waking your spouse up with a lick on a sleepy Sunday morning. If you’re in college, photos of you hanging out with friends. //The Newsweek// photojournalist David Burnett who has traveled the world making historic photographs has said of all the photos he’s made, he wishes he had some of his pals in college just hanging out together. Sharing time, being buds. But back then, nobody made those photographs. No one thought to, they were busy making jokes and having fun. It takes effort to pick your camera up in the middle of a game night with friends, to step out of the activity to frame it and photograph it. But if we don’t, the moment will be a memory only. <<<
[[Kenneth Wajda]]: [[The Difference Between Going Out to Make Photos and Simply Going Out to Live (and Finding Photos)!|https://6x6portraits.wordpress.com/2021/09/12/the-difference-between-going-out-to-make-photos-and-simply-going-out-to-live-and-finding-photos/]] > There is one way to make photos that involves taking the camera down off the shelf, dusting off its (n)everyready case, peeling that leather wrap off and setting it aside, removing the lens cap, putting the camera in hand and heading out to make photographs at the birthday party, holiday celebration, or __ __ (your event here). That’s one way we make photographs, the way we’ve made snapshots since the invention of George Eastman’s Brownie that put a camera in virtually everybody’s hand. This way is practically guaranteed to make pictures. This one has the camera never at the ready until it’s deemed “picture time”. > > The other way is to go through life and look for photos with camera in hand at the ready as you go about your daily itinerary. That one has no dust. No case or lens cap. Nothing in the way of making photos. ... > ''The camera is always in hand. Never over my shoulder. Never in a case. Never tucked away–to me, that’s like not bringing a camera at all.'' I’ve learned that if I set the camera by the front door of a friend’s house, or on their counter out of reach, I don’t make any photos. The only way I do make pictures is by having the camera on and set for exposure and focus (zone focus) and my finger on the shutter release in the event something happens in front of me.
Why does he have to keep pointing out the fact that I am the only one standing in my way??? That first paragraph is me. <<< ''I can’t think of a worse way to make photographs than to get a camera that’s so clean, so beautiful, that you don’t want to use it.'' That you’re afraid to touch it. That [it] gets put onto a shelf behind glass. It‘s //too nice.// You don’t want spectacular because then you can’t use it. Don’t buy perfect items for that reason. It’s as bad as leaving the lens cap and case on the camera while you’re shooting. Everything that’s in the way has to go. No cap. No bag. No case. Just the camera turned on and ready to shoot, finger on the shutter release button. <<<
from https://en.wikipedia.org/wiki/Kenny_Rogers > At a former estate in Colbert, Georgia, Rogers kept a pet goat named Smitty, having originally acquired the animal from a friend in 2008. According to Rogers, the goat was "(his) center", providing a calming influence after long and stressful touring schedules.
2-Speed Quartz-locked Direct-Drive Turntable https://www.vinylengine.com/library/kenwood/kd-600.shtml Given to us by Eric when his father (the owner) passed away.
Documentary wedding photographer. Uses various [[Fujifilm]] gear. https://www.kevinmullinsphotography.co.uk https://www.f16.click
[[Kevin Mullins]]: [[My Fujifilm JPEG Settings|https://www.f16.click/blog/tips/fujifilm-jpeg-settings.html]] <<< One of the reasons many of us fell in love with the Fujifilm X-Series was because of the gorgeous jpeg engine that was built into every camera from the X100 all the way up to the more recent X-H1 and GFX. For me, when I first shot with the X100 back in 2011 I couldn't get over how the jpeg in the camera saved me so much time in post-processing. Over the years, I've adapted and changed my various Fujifilm jpeg settings and for a good period of time, I shot exclusively in jpeg. These days, because we have dual card slots, I find myself shooting both RAW + JPEG but I still rely on the in-camera jpegs to produce the images that I want. <<<
[[Kevin Mullins]] https://www.f16.click/blog/wedding-photography/shooting-p-mode-with-fujifilm-cameras.html > For me, at least, the absolute most important thing is getting a sense of the moment, a sense of emotion, a sense of empathy and a sense of reality in my pictures. How I try to achieve that, I don't really care. And ultimately, how I try to achieve that doesn't really matter either. ... > ...I believe for candid, documentary, storytelling images, many of us will miss moments because we are trying to set the camera up, or make the exposure perfect.
Another [[Roon]] recommendation. This [[Khruangbin]] and [[Leon Bridges]] collaboration is really great. https://khruangbin.bandcamp.com/album/texas-sun [img[https://twelvety.com/philtiddlywiki_images/2020-02-20-khruangbin-leon-bridges.jpg]]
https://www.nytimes.com/2022/07/15/podcasts/transcript-ezra-klein-interviews-kim-stanley-robinson.html This is one of those great podcast episodes I should save and replay later. Didn't know about [[Kim Stanley Robinson]] until now. What a smart dude. He talked about [[ultralight hiking]] and read from his book, //The High Sierra: A Love Story//: > It's the younger hikers who have simply gone into the adventure stores and bought whatever is offered that I find depressing. I wonder about them as consumers and as critical thinkers. I suppose they're strong enough to carry the extra stuff, most of the time, so it doesn't really matter to them; and they get the joy of doing something hard. But it could be more fun for them if they distrusted American commerce and thought it through. There they are on the Muir Trail, staggering under enormous backpacks, hustling along to keep to a timetable, having somehow managed to turn backpacking into a job. They are the equivalent of commuters in SUVs on the highways of America. A national weakness for overkill, even for conspicuous consumption. That they suffer for it when hiking uphill on their first day is often very evident when you pass them on the trail, sweaty, red-faced, dismayed, getting desperate, about to cry, even actually crying. We’ve seen it all. But they haven’t twigged that there’s a better way. I don't want to hike or camp out, but I love this idea, and realizing that you can't just buy your way into it.
https://www.kinsahealth.co/products/#buynow
https://healthweather.us
[[lesson learned]]
Not to be confused with the [[Massdrop Koss KSC75X headphones]]. [img[https://twelvety.com/philtiddlywiki_images/2019-08-23-koss-headphones-ksc75-ear-clips.jpg]] https://www.koss.com/headphones/ear-clip/ksc75 Holy shit these are good. Not just "good for being cheap", but actually good to listen to. Smooth, not weirdly pronounced or squished. Just a little light in the bass, but overall, a pleasure. They look //ridiculous//, and the manufacturer's website cleverly angles the person in the photos so you don't see how comically the headphones stick out from his head. Without a headband to make them look normal, they just look goofy. But they really, really sound more expensive than they are. Fortunately, I found [[this video|https://youtu.be/kdtadOpBU_M?t=2023]] that shows (among other mods) a way to add a $6 headband to them. Just ordered this: https://www.parts-express.com/parts-express-mini-stereo-lightweight-headphones-with-4-ft-cord--240-015
My god. [img[https://twelvety.com/philtiddlywiki_images/2020-05-08-kraftwerk-1981.jpg]] source: [[Reddit|https://www.reddit.com/r/OldSchoolCool/comments/73v3yz/kraftwerk_1981/]]
[[Kraftwerk - The Gardens, Vancouver, British Columbia, Canada, May 7, 1975|https://doomandgloomfromthetomb.tumblr.com/post/616929510869352449/kraftwerk-the-gardens-vancouver-british]] I listened to this while working yesterday and it's fantastic. What they could do with relatively primitive instruments before [[MIDI]] was astounding. And it was far from being all sequenced. There was a lot, lot, lot of live playing and improvising there. It is humbling. And of course, R.I.P., Florian Schneider. Holy moly this is a great article: https://www.npr.org/2020/05/07/852081716/how-florian-schneider-and-kraftwerk-created-pops-future
[[On Zettelkasten purism and the misdirection of backlinks – Kristoffer Balintona|https://www.kristofferbalintona.me/on-zettelkasten-purism-and-the-misdirection-of-backlinks/]] > I ask: from what does most of your mastery over new material arise? How does Zettelkasten facilitate idea mastery and emergence? Most would turn to the feature of backlinks because of its perceived novelty. However, I counter the common sentiment by claiming that idea mastery mostly arises from the //practice// associated with maintaining a Zettelkasten. I argue Zettelkasten's essence is to ''repeatedly revisit, recall, and engage with that which you have learned, iterating upon the writing artifacts of that process---your crystallized thoughts---over time.'' Engaging with what you learn is the crux to a successful knowledge management system. And OMFG, now "`≠`" [[is considered a hate symbol|https://www.adl.org/education/references/hate-symbols/not-equal]]. Thanks for that.
https://www.obdev.at/products/launchbar/index.html 2019-08-10 I've used [[Quicksilver]] since forever, but it feels creakier all the time, and a bunch of the old plugins don't work anymore. Trying the LaunchBar trial now. Helpful stuff from Jack here: https://rudimentarylathe.org/#LaunchBar --- 2019-08-10 It doesn't want to index [[Firefox]] bookmarks. * See https://forums.obdev.at/viewtopic.php?f=4&t=11590&p=34958&hilit=firefox+bookmarks#p34958 * Trying to export bookmarks HTML and index that way: https://forums.obdev.at/viewtopic.php?f=4&t=8362&p=25342&hilit=firefox+bookmarks#p24993 --- 2019-08-11 Oh but now it appears to have indexed them by itself. --- 2019-08-18 Such a solid and good utility app. Should have switched to this years ago. Just turned off the ``⌘\`` shortcut under Clipboard History > Select from history, because it was firing off every time I tried to insert a password from [[1Password]]. If I need to turn it on later, I'll assign a different shortcut to it. --- 2019-09-09 Registered.
! Resources: * https://www.ledger-cli.org * http://sachachua.com/blog/2014/11/keeping-financial-score-ledger/ * https://www.pgrs.net/2016/10/19/exporting-ynab-to-ledger/ * https://www.reddit.com/r/plaintextaccounting/comments/94333p/how_i_emulated_ynab_in_ledgercli_saved_the/ * https://www.reddit.com/r/plaintextaccounting/ * https://emacs.cafe/ledger/emacs/ynab/budgeting/2018/06/12/elbank-ynab.html
https://addons.mozilla.org/en-US/firefox/addon/leechblock-ng/ > LeechBlock NG is a simple productivity tool designed to block those time-wasting sites that can suck the life out of your working day. All you need to do is specify which sites to block and when to block them. 2019-08-10 I'm setting a 20-minute/day timer for Gmail.
[[Why Do “New” Leica Film Camera Owners Always Seem to Want the M3? - Leicaphilia|http://leicaphilia.com/why-do-new-leica-film-camera-owners-always-seem-to-want-the-m3/]] > The results of long experience with M’s by serious photographers seems to have confirmed the belief that the true “native” focal length for the 35mm rangefinder camera is a 35mm lens, itself a perfect combination of focal width with “normal” perspective. The 50mm focal length, especially when used on a rangefinder, seems just a bit too narrow, a bit too restricted in venues like enclosed low-light spaces where M’s have traditionally been most effective. The downside of the M3 is its .91 viewfinder magnification, a life-size magnification perfect for using a 50mm Noctilux, Summicron or Elmar and longer 90 and 135mm lenses but too narrow to use with a 35mm focal length without auxiliary finder. Hence the M2 with .72 magnification viewfinder allowing native framelines for 35/50/90 focal lengths – offered by Leitz a few years after the introduction of the M3 – as much a response to the limitations of the M3 as it was a “reduced-cost” alternative. It’s no coincidence that the M2 became the M of choice for working photographers using Leicas in the 1960s. It was, and remains, the more practical alternative if your interest is using the camera. Pretty sure I want to start with a 35mm lens, which would mean the M2 would be a better start than the [[Leica M3]]. https://twelvety.blot.im/posts/2022/09/2022-09-10-leica-m2-research
Micro.blog threads: * Jason Burk ordering a Q2: ** https://micro.blog/Burk/3345287
https://en.wikipedia.org/wiki/Leon_Russell
https://letterboxd.com 2019-05-10 Finally signed up for the Pro level. At $19/year that's nothing. Paying for things I love is always fun.
https://www.npr.org/lifekit on [[NPR]]
They only made one studio album, //[[Any Other City|https://www.discogs.com/release/754791-Life-Without-Buildings-Any-Other-City]]//. [img[http://twelvety.com/philtiddlywiki_images/2022-01-22-life-without-buildings-any-other-city.jpg]]
http://linkding.link > A self-hosted bookmark manager designed be to be minimal, fast, and easy to set up. I love this service. Trying it on [[PikaPods]] with the $5 credit, but I'm already sold.
I wondered: Does [[DEVONthink]] know how to deal with [[org-mode]]? And found: [[Org Mode shenanigans for task management, notes, etc - Software - MPU Talk|https://talk.macpowerusers.com/t/org-mode-shenanigans-for-task-management-notes-etc/21005/7]] > I find when making notes in Obsidian (or other backlink-centric apps), that the linking becomes the focus, rather than the thinking. That is, my thinking becomes fragmented by interruptions to curate links. BAM.
https://www.wharfedale.co.uk/linton-heritage/ Don’t need these speakers, either. Want them, but they’d be “too much speaker” for our small living room.
from the FunnelWeb reference manual by Ross Williams: [[1.1 What Is Literate Programming?|http://ross.net/funnelweb/tutorial/intro_what.html]] <<< A traditional computer program consists of a text file containing program code. Scattered in amongst the program code are comments which describe the various parts of the code. In literate programming the emphasis is reversed. Instead of writing code containing documentation, the literate programmer writes documentation containing code. No longer does the English commentary injected into a program have to be hidden in comment delimiters at the top of the file, or under procedure headings, or at the end of lines. Instead, it is wrenched into the daylight and made the main focus. The "program" then becomes primarily a document directed at humans, with the code being herded between "code delimiters" from where it can be extracted and shuffled out sideways to the language system by literate programming tools. The effect of this simple shift of emphasis can be so profound as to change one's whole approach to programming. Under the literate programming paradigm, the central activity of programming becomes that of conveying meaning to other intelligent beings rather than merely convincing the computer to behave in a particular way. It is the difference between performing and exposing a magic trick. <<<
[img[https://twelvety.com/philtiddlywiki_images/2019-05-24-lizzo-cuz-i-love-you.png]] 2019-05-23 Downloaded hi-res version from [[Qobuz]] store. 2019-05-24 She is like Prince-level genius.
I could log life/house/car/medical/financial things in various ways: * future-proof, relatively secure in local [[org-mode]] files, and sadly inaccessible to Sarah * future-proof, not very secure, in Dropbox [[org-mode]] files, and a pain to access for Sarah * non-future-proof, not very secure, in Google Docs, and easily accessible for Sarah * a future-proof-ish clunky hybrid where files are based in [[org-mode]] and I periodically (oh sure) [[Pandoc]] (or just HTML export) them over to rich-text in Dropbox or Google Docs that Sarah can get to * a fairly future-proof clunky hybrid where I don't involve Dropbox or Google Docs, but I periodically print out nicely formatted/exported [[org-mode]] files and keep them in a binder here. Sarah loves paper. What a mess. Insanity to even be considering these options, but I don't want to be the bottleneck if she needs to get to something and I can't do it for her for whatever reason. (You know, you get just slightly older and you start thinking about this stuff.) Complicated by the fact that different spheres of information are sometimes needed on laptops at home, or unexpectedly out in the wild (on mobile). And security requirements aren't the same for all of them. And then there's the "friction vs. fun" factor: Which is the fastest and most fun way to get the information //into// the repository, and with little enough hassle that I'll actually keep doing it? And without so much delay between the initial capture system (either scanned receipts/documents/etc. or a [[bullet journal|2019-04-22 bullet journal experiment]]) and the final digital destination that the information becomes moldy, or gets trapped in purgatory between the two? See also [[Journaling and logging systems]].
https://www.apple.com/logic-pro/trial/ 90 days is a pretty nice trial period.
This is the clearest explanation I've seen of how to use automation in [[Logic Pro X]]. I'm just glad it isn't a YouTube video: [[Logic Pro X Automation: Your Secret Weapon For Mixes That Move|https://whylogicprorules.com/automation/]]
https://apps.apple.com/us/app/logic-remote/id638394624 You run this on an iPad or iPhone and it can remotely control GarageBand (in addition to Logic) and it gives you a couple of fader/solo/mute controls, too. Very nice, but no substitute for physical faders you grab and don't have to look at.
https://www.logitech.com/en-us/products/mice/m585-wireless-mouse.910-005012.html Bought 2022-01-11
[[logseq: A privacy-first, open-source platform for knowledge sharing and management. – GitHub|https://github.com/logseq/logseq]] - Via Jack Sweet Jesus, that didn't take long. I knew that the [[open-source]] [[Roam]] clones would get good, but I didn't know it'd be this close, this fast. """ Me: Well, Jack Baty may ultimately end up in logseq instead of Roam. Sarah: Are you gonna follow suit? Me: No, I'll let him try it for a while and see what happens. Sarah: So he's gonna be your //Baty//-tester, get it? """
https://github.com/dangermccann/logseq-metrics > A [[Logseq]] plugin for tracking and [measuring] personal habits, goals, business results and just about anything else that can be counted and displayed on a chart.
[[Adam Hall]] on [[Twitter|https://twitter.com/adhall_msft/status/1274529550089637888]]: > Pre internet and definitely pre cloud, multiple years of uptime was not unusual. I remember having to shut down a server over 4 years uptime for Y2K and being worried it might not come back. > > I see long uptime now, all I see is an unpatched opportunity for bad actors. And this [[reply|https://twitter.com/cyphoid_mary/status/1274819850737610752]] from [[cyphoid_mary]]: > The thing about uptime like that it also implies there's no HA/DR in place for that system, you should be able to reboot at any time and still have services up and running, if it doesn't need HA/DR then it isn't a system that matters if it doesn't come back online after a reboot
https://www.lookingglassphoto.com/ Berkeley, Ca. Seriously nice people and a great collection of used stuff. Will totally buy from again.
I'm following the example of [[The Loop on Ground Antenna by Matt Roberts]]. Ordered a bunch of stuff from Amazon: * 1 of: Superbat 10 ft SMA Male to SMA Female Coax Cable + 5pcs Coax Adapter Kit * 1 of: Southwire 56422023 Primary Wire, 16-Gauge Bulk Spool, 100-Feet, Green * 1 of: [[NooElec V2 balun]] * 1 of: Exgoofit F Type To SMA Male-Female Coax Adapter set (6 pcs) * 1 of: 6" Landscape Staples 50 pcs + 50 pcs Plastic Pieces * 1 of: Fancasee (2 Pack) F Type Female to 1/8" 3.5mm Male Mono Plug Adapter Still need this stuff if the proof-of-concept works: * enclosure ** make sure it can fit the [[NooElec V2 balun]] + the weatherproof SMA male-female adaptor * 16-ga lugs * 1 weatherproof SMA male to SMA female adaptor to connect the balun to the outside world * 2 weatherproof binding posts * sealant or foam for inside the enclosure * heat shrink tubing for external SMA connector * 30-foot weatherproof SMA male-male cable * Something to accomplish this: > The coaxial cable shield is grounded at the building entry point, providing lightning and static immunity similar to that of a properly constructed Beverage antenna.
from [[OOPS! Learning from the incident you didn't have — learningfromincidents.io|https://www.learningfromincidents.io/blog/oops-learning-from-the-incident-you-didnt-have]] <<< And, if we can learn just as much from smaller incidents as we can from larger ones, we can also learn just as much from an "incidents" when there is no impact at all! These are the kinds of things we call //close calls// or //near misses//. Any time we encounter an //operational surprise//, something that happened in operations that we didn't expect, there's an opportunity for us to discover how the observed system behavior deviated from our mental model of how the system is supposed to behave. <<<
DAMMIT I was //this close// to—no, actually, I was in the process of—abandoning [[org-journal]] in favor of dumber, easier [[Markdown]] files (using [[Drafts]] and [[BBEdit]] on the [[Mac]] and [[Editorial]] on [[iOS]]) to track [[daybook]]-things like when I paid bills and put paper checks in the mail. I thought [[org-mode]] files were too ugly when viewed in any non-org-aware text editor, especially on the space-cramped [[iPhone]]. I thought, "well, if nothing else, all this [[COVID-19]] stuff is making me realize that life is too short to waste any more time than necessary on having a perfect system, and I might as well abandon having a perfectly consistent format since getting info into and out of Markdown is so easy, and I know I'm never going to back-enter all the old Markdown things into org-journal, so anything I search for in [[Emacs]] is going to be incomplete anyway, so why bother?" So I started trying to figure out the One Perfect Date+Time+Heading+Notes Format for each entry in a Markdown file, and then I opened an org-journal file that had some old entries in it, and I thought, "well there's the perfect format right there, already, and why am I reinventing the wheel?", and then I clicked on a datestamp in an org-journal entry and up popped [[org-agenda]] and it all felt so nice and nimble and clean and fast and gorgeous. And then I thought, well, yeah, sure, but you can't do a [[Spotlight]] search in [[Finder]] for the contents of an `.org` file, and then I started searching for why the hell that is the case, and that became a rabbit hole, and then I tested Spotlight searching for the contents of an `.md` file and dammit THAT doesn't work, either. (Yes, [[nvALT]] solves this, but I want to be able to search for a string in the Finder and find //everything// that matches.) And sure, I could use [[grep]], but I'm not gonna do that in real life. So here I am again and I'll just never figure this out. Also, [[beorg]], the brilliant [[ios]] [[org-mode]] editor, doesn't load subfolders of org-mode files. It just loads one directory of files, so that doesn't help with [[org-journal]] files, which for me are all in `/SOMEDIRECTORY/org/journal/`. I mean, just look at this. This is amazing, right? [img[https://twelvety.com/philtiddlywiki_images/2020-04-01-org-journal-org-agenda.png]] --- [[posted|https://twelvety.micro.blog/2020/04/01/losing-my-mind.html]] on M.b
[[My favorite Fujifilm film simulation recipes – Life, Unintended|https://lifeunintended.com/articles/my-favorite-fujifilm-film-simulation-settings/]] No X-Trans II recipes, but these are downright inspiring.
https://lunadisplay.com/?utm_source=Back%20To%20Work&utm_medium=Podcast%20Show%20Notes&utm_campaign=Back%20To%20Work%20Podcast%20Sponsorship Crazy USB-C or Mini DisplayPort wireless dongle that turns an iPad into a second display, with multitouch and Apple Pencil compatibility. Sponsor of Merlin and Dan on [[Back to Work #421|http://5by5.tv/b2w/421]].
https://lunchmoney.app/ > Delightfully simple personal finance & budgeting That's an accurate description! I just accidentally started a trial of it because it was so easy to get started. Makes [[YNAB]] look rigid and rickety in comparison, and YNAB was getting good, too. Via [[Jack|Jack Baty]]: https://rudimentarylathe.wiki/#Lunch%20Money
https://www.m-audio.com/air-192-14 > The M-Audio AIR 192|14 is an 8-in 4-out feature-packed USB audio/MIDI interface that provides all of the connections and software you need to easily create professional 24-bit/192kHz studio-quality recordings. The AIR 192|14 features (4) XLR+¼” TRS combo inputs, (2) ¼” line inputs and (2) ¼” instrument inputs that have a specially designed gain and impedance stage to provide the most accurate representation of your guitar or bass when plugged directly into the interface. There is also MIDI input and output connections so you can connect any external midi gear that you may have such as external sequencers, drum machines and controllers. I like that it has a full 8 simultaneous inputs, but not crazy about how the mic preamps are reported to have weird gain structure. [[macOS 11 Big Sur and iOS14 Compatibility – M-Audio|https://inmusicbrands.force.com/maudio/s/article/macOS-11-Big-Sur-and-iOS14-Compatibility]] > M-Audio has been actively testing all applicable hardware and software products with each beta release of macOS 11 Big Sur. We understand how important it is for all our users to know exactly what works before they make the jump on any new updates. Please refer to this article for all M-Audio hardware and software compatibility with macOS 11 Big Sur. > > For this reason, we encourage all our dedicated M-Audio hardware and software owners to refrain from updating to macOS 11 Big Sur until compatibility with the new operating system can be confirmed. Hmm.
https://www.relay.fm/mpu/613 This was a landmark episode of [[Mac Power Users]]. Sean McCabe showed what it's like to have a whole new level of thinking about productivity, automations, and time off from work. He believes in having the cross-training, documentation, and trust in place to allow his employees to take every-7th-week sabbaticals like he does.
https://github.com/lra/mackup > Keep your application settings in sync (OS X/Linux) Via [[Merlin Mann]] on [[Back to Work]]
https://github.com/lysyi3m/macos-terminal-themes I'm trying `Ayu Mirage.terminal`
https://maestral.app > Maestral is a lightweight Dropbox client for macOS and Linux. It provides powerful command line tools, supports gitignore patterns to exclude local files from syncing and allows syncing multiple Dropbox accounts. [[Daniel Jalkut]] mentioned it on his [[Mac Power Users]] appearance. I'm so tempted to try it, but also wary.
Oh lordy, this app is almost too powerful. I got into a mess where I had been playing with the Smart Tempo function, but then I just wanted a bunch of dumb audio tracks in there and I didn't want the tempo of the project to affect the speed of audio playback. The way to do it is: # Click View > Show Inspector, to show the Region and Track inspectors on the left. # Select the Region you want to remove tempo following from. # In the Region inspector, set "Flex & Follow" to Off. # In the Track inspector, set "Flex Mode" to Off.
https://jblevins.org/projects/deft/ > By default, [[Deft]] only searches for files in `deft-directory` but not in any subdirectories. All files in `deft-directory` with one of the specified extensions will be included except for those matching `deft-ignore-file-regexp`. Set `deft-recursive` to a non-nil value to enable searching for files in subdirectories (those not matching `deft-recursive-ignore-dir-regexp`): >> (setq deft-recursive t)
It bothered me that the tag cloud in [[linkding]] was capitalizing the first character of the first tag for each letter of the alphabet, so I added this to the custom CSS in Settings: ```css .tag-cloud .highlight-char { text-transform: none !important; } ```
2021-06-13 This is a good thread that brings together a lot of stuff I was just trying to figure out about [[Logseq]] + [[Obsidian]]: * https://discuss.logseq.com/t/making-obsidian-play-nice-with-logseq/1185
https://en.wikipedia.org/wiki/Manchester_code > In telecommunication and data storage, Manchester code (also known as phase encoding, or PE) is a line code in which the encoding of each data bit is either low then high, or high then low, for equal time. It is a self-clocking signal with no DC component. Consequently, electrical connections using a Manchester code are easily galvanically isolated. [img[http://twelvety.com/philtiddlywiki_images/2022-01-22-manchester-encoding-both-conventions.png]]
[[Marco Arment]] on relying on third-party [[code]]: > One of the greatest fallacies in modern software development is how much everyone seems to completely ignore the time, complexity, risks, and long-term maintenance costs of adding so much third-party code and infrastructure to everything. https://twitter.com/marcoarment/status/1254464996018446338
https://www.imdb.com/title/tt10155688/ What an incredible show. Expansive, real, and uncomfortable.
https://fixyouraudio.com/ Marian Mihok, also known as [[mihokm on eBay|https://www.ebay.com/usr/mihokm]] and [[mihokm on Stereo2Go|http://stereo2go.com/forums/members/mihokm.273/]], is //the// guy for Walkman spare parts, and it sounds like he's gotten back into repairs, too.
Mark Rainey, [[Phred Rainey]]'s brother, wrote this about him. It still doesn't seem real that he's gone, but I figure as long as I can remember Phred's melodies and lyrics, I'll always carry a part of him around. https://stephenmarkrainey.blogspot.com/2021/01/the-universe-takes-good-one.html
https://www.workingclassaudio.com/wca-034-with-mark-rubel/ The interview is from 2015. Mark passed away in March 2024. Sounded like a gracious, patient prince of an engineer. Three things I want to remember from this: # Don't look at the screen when you're mixing. Use your ears. # Don't buy gear. Buy capabilities. # He paid for all of his studio gear in cash.
! Don’t Hesitate """ If you suddenly and unexpectedly feel joy, don’t hesitate. Give in to it. There are plenty of lives and whole towns destroyed or about to be. We are not wise, and not very often kind. And much can never be redeemed. Still, life has some possibility left. Perhaps this is its way of fighting back, that sometimes something happens better than all the riches or power in the world. It could be anything, but very likely you notice it in the instant when love begins. Anyway, that’s often the case. Anyway, whatever it is, don’t be afraid of its plenty. Joy is not made to be a crumb. """ — Mary Oliver, //Swan: Poems and Prose Poems//
Recommended by my friend Joan: !! Marengo """ Out of the sump rise the marigolds. From the rim of the marsh, muslin with mosquitoes, rises the egret, in his cloud-cloth. Through the soft rain, like mist, and mica, the withered acres of moss begin again. When I have to die, I would like to die on a day of rain– long rain, slow rain, the kind you think will never end. And I would like to have whatever little ceremony there might be take place while the rain is shoveled and shoveled out of the sky, and anyone who comes must travel, slowly and with thought, as around the edges of the great swamp. """ //- Mary Oliver//
https://www.nytimes.com/2022/11/22/opinion/ezra-klein-podcast-maryanne-wolf.html Maryann Wolf makes me want to set aside regular time to read deeply. I’m going to need to retrain my brain to do this and not want the instant gratification that comes from the mobile internet. Also makes me wonder: How can we make our website content and design more hospitable to deep reading like this? We so frequently say, "Boy, that’s a lotta text on a web page" because we presume "people don’t read on the web." But how can we not just give up and instead encourage people to read our stuff deeply? Doesn’t it mean there’s still a purpose for printable academic PDFs like Working Papers, etc.? //What do we want people to DO after they read our stuff?// Or are we just satisfied if they skim or scan our articles as long as we get the page loads? I wondered, though, why Wolf didn’t talk about blind or visually impaired people when she talked about printed books vs. audiobooks vs. reading on screens. Found this webinar she did with the Perkins School for the Blind (but haven't watched it yet): https://youtu.be/_5kLs8QMIOs
https://drop.com/buy/massdrop-x-koss-ksc75x-on-ear-headphones 2019-08-22 It would have been great if I had thought to check Massdrop yesterday and discovered these before ordering the non-Massdrop version on Amazon. Oh well. I just ordered these, too. They're only $17. I don't think they'll sound any better, but at least they don't have silver-painted plastic.
Oh my lord. I just looked at our credit card and checking statements. There is //no way// the balance on the credit card would be as low, and the checking as high, on this day of the month, if we weren't in stay-at-home status. We spend, like, a //lot// of money on eating out and other crap. All the time. When things are normal. Without the ability to leave the house, that money just sits there. Which is a great reason to justify buying the Massdrop X Sennheiser HD6XX Headphones probably sooner rather than later. I mean, I'm working from home for quite a while longer, and if you amortize the money over 8 hours a day, well, it's just pennies per hour. https://drop.com/buy/massdrop-sennheiser-hd6xx
On [[YouTube|https://www.youtube.com/watch?v=sKEzHie9tAI]] from AES Melbourne 2016. I'm only halfway through it and it's gripping. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/sKEzHie9tAI' frameborder='0' allowfullscreen></iframe></div> [[Steve Albini]]
https://mastodon.social/
Neuroscientist [[Matthew Walker]] on [[It Takes Time: TED Radio Hour|https://www.npr.org/2021/02/05/964209001/matthew-walker-why-is-it-essential-to-make-time-for-sleep]] > So let's say that, normally, you would sleep eight hours, but today, you want to get a jump start, and you've got an early morning meeting, or you want to get to the gym. And so instead of going to bed, let's say, at 10 p.m. and waking up at 6 a.m., you're going to wake up at 4 a.m. > > How much sleep have you lost? Well, you've taken away two hours from your eight-hour night of sleep, so you've lost 25% of your sleep. Well, yes and no. You've lost 25% of your total sleep, but you may have lost 60, 70, 80% of all of your REM sleep because that's when you're getting your REM sleep in those last morning hours. So there are ramifications there.
https://cycling74.com/products/max
Maybe I need to follow the lead of [[Jamelle Bouie]] and all the others who apply filters and add grain to their digital photos. Maybe it's no different than when I record my [[modular synth]] digitally in [[Logic Pro X]], but I never end up using a totally dry, unprocessed track. I always add something or distress it in some way and it doesn't feel like I'm trying to cheat in that case. Maybe digital photos out of the camera are just a starting point.
In the same way that the perfect (//processing// every email fully in the midst of a scheduled batch) was the enemy of the good (reading every email as soon as I could so I know what's going on), I'm starting to think that the perfect (all the logs tidily formatted in [[org-mode]] or [[org-journal]]) is the enemy of the good (dumb [[Markdown]] log files I can read wherever). I tend to build up these mountains of things that I'm theoretically gonna process and plop into [[org-mode]] "someday" and then everything will be all nice, in one place, "future-proof". But what it means is that I never get around to it and all that data sits in limbo, never doing anyone any good. How much better (and messier) would it be to have `.md` files for music to check out, [[daybook]]-kinds of things, health, finances, etc.? And then I could add to them way more quickly from the phone or computer, I could read and edit them in tons of text editors on the phone or Mac, find them from anywhere, and a search of a pile of files would almost certainly catch whatever phrase I was looking for? Also, don't tell [[Emacs]], but I would have zero fear that an errant keypress would nuke a file or a line or a sentence. Is this me giving up on learning __the Emacs way__? Maybe a little, and maybe [[org-mode]] is still great for me for some project-kinds of things. But for the long-term log kinds of stuff, for me, for reality, I don't know.
Meanterm MIDI Thru app for [[macOS]] https://apps.apple.com/us/app/midi-thru/id873634211?mt=12 > Light menu bar app which simply links all MIDI inputs with all MIDI outputs connected to your Mac. Very useful when you just want to play your MIDI keyboards with your MIDI modules.
https://www.mediafire.com 2019-06-09 MediaFire was a great place to store lossless audio files for cheap, but I haven't been using it regularly for a long time, and I really haven't been using it lately since I got the [[Sony NW-A45 hi-res audio player]]. When I signed up, it was $2.50/mo for 1TB, and I guess I had been grandfathered into that plan for a while, because I just canceled my subscription and now it looks like the 1TB tier is between $7.50/mo and $10/mo. Anyway, I don't need it anymore, so it's going.
> The median income for Richmond singles is $39,115, compared to $87,348 for couples, per Point2 data. – from [[How long it takes single people and couples to save for a house in Richmond - Axios Richmond|https://www.axios.com/local/richmond/2024/03/14/single-couples-downpayment-homebuying]] Point2 data, reported 2024-02-12: https://www.point2homes.com/news/us-real-estate-news/singles-vs-couples-homeownership-savings.html
https://github.com/novoid/Memacs By [[Karl Voit]] <<< What were you doing on February 14th of 2007? On which tasks were you working on that very day you met your girl friend? When was the last appointments with your dentist? Who called you on telephone during that meeting with your customer last month? Most people can not answer such questions. With Memacs you can! Memacs extracts metadata (subjects, timestamps, contact information, …) from many different existing data sources (file names, emails, tweets, bookmarks, …) on your computer and generates files which are readable by GNU Emacs with Org-mode. <<< Also mentioned by Jack at https://www.baty.net/2018/using-karl-voits-file-naming-system/
https://letterboxd.com/film/memoria-2021/ Bizarre, slow, shot on film, and the most carefully constructed movie sound I’ve heard in years. Great!
<$button class='tc-btn-invisible' tooltip='Jump to top'> {{$:/core/images/up-arrow}} <$list variable='Target' filter='[list[$:/StoryList]first[]]'> <$action-navigate $to=<<Target>>/> </$list> </$button>
[[Merlin Mann]] on not shaming strangers during [[stay at home]] From [[Back to Work]] [[episode 472|http://5by5.tv/b2w/472]] > Let's try and get real for a minute, and let's admit that we're all super screwed up right now. And let's cut each other a little bit of slack to explore the different things that we're trying, to cope, and... I'm gonna say, let's try to not shame people because they found something that makes them not sad right now. I think we don't need to have our brand be shaming strangers about things that we can't or don't understand.
An oldie but such a goodie, from 2008: <<< Creative work, summarized: In the time you set aside each day to work your ass off, ignore anything that makes you consider stopping. <<< Merlin Mann, [[Twitter|https://twitter.com/hotdogsladies/status/869236992?s=20]]
https://www.gometa.com/ Looks cool, creepy, and I'm not sure if it's necessary. I've seen things that attempt to do "smart tagging" since about 2002 and it's never seemed like an actual need I have. And the automatic management of workspaces just seems like overkill. I love reducing friction, but this seems like handing over the keys to your computer.
Obviously passionate about [[Tinderbox]]. His channel: https://www.youtube.com/channel/UCpnj2U37aI108YoO1L8leYw
from https://randsinrepose.com/archives/the-leaper/ > On my short list of professional competitive differentiators, I would list my inbox strategy. I have a zero tolerance policy for unread mails. Zero. Any mail, however big or small, which lands in my inbox, is instantly read. There is an industrial strength set of mail filters that move mailing list noise out of the way, and yes, that means I ignore a good portion of my incoming mail, but most mail addressed directly to me is consistently and expediently read. I probably first read this shortly after it was originally posted almost 11 years ago and it has rattled around in my brain ever since.
https://m.b.wiki.eli.li Maintained by [[@eli|https://micro.blog/eli]]
2019-05-29 This past weekend, a few random things led me to look up what had been happening with e-scooters, bikes, e-bikes, e-trikes, velomobiles, and neighborhood electric vehicles (NEVs). I've gone deep, deep into learning about it and am totally sold on the idea that the landscape for these technologies is changing very quickly and I'm glad. It's the thing that has given me more hope about the future than anything else has in a long time. And now I just see cars and parking lots everywhere. https://micromobility.io - My hub for learning more about all this. Horace Dediu (one of my favorite podcasters from when 5by5 was newer) and Oliver Bruce do a [[brilliant podcast|https://micromobility.io/podcast]] that I swear makes me smarter every time I listen. [[Episode 25: The Case For Micromobility - A Recap Summary|https://micromobility.io/podcast/25-the-case-for-micromobility-a-recap-summary]] was a wonderful starting point. This was the first episode I listened to. Dates listed beside the items below indicate when I found them. !! Articles 2019-05-28: [[I rode a Bird scooter 14 miles in one day. Here's what I learned - Charlotte Agenda|https://www.charlotteagenda.com/132528/i-rode-a-bird-scooter-14-miles-in-one-day-heres-what-i-learned/]] 2019-05-27: [[Bird and Lime aren’t the problem. Your streets are. - Curbed|https://www.curbed.com/word-on-the-street/2018/7/13/17246060/scooters-uber-lyft-bird-lime-streets]] !! Vehicles and manufacturers to watch 2019-11-10: [[Arcimoto’s finally delivering its weird, fun electric trike - The Verge|https://www.theverge.com/2019/9/19/20873475/arcimoto-srk-deliveries-production-reservations-ev]]
https://www.microsoft.com/en-us/power-platform
This is my favorite direction because of the potential for doing point-to-point wiring instead of a PCB. Also, tube hybrid headphone amps tend to be more flexible with the kinds of headphones they drive. Units like the [[Bottlehead Crack headphone amp]] are only really happy with high impedance headphones like the [[Massdrop X Sennheiser HD6XX Headphones]]. https://www.head-fi.org/threads/millett-starving-student-hybrid-amp.319231/ http://www.pmillett.com/starving.htm
https://www.mindnode.com/ > MindNode is an award-winning visual brainstorming and mind mapping app that helps you connect your thoughts and clarify your ideas.
https://www.moogmusic.com/products/minimoog-model-d-synthesizer-app > The Minimoog Model D App is a mobile transmutation of the world’s first portable synthesizer, the Minimoog Model D. Well now I have a solid reason/excuse to want a newer, bigger iPad than the useless (incompatible) iPad 2 we still have. I bought this app for the iPhone 8 and played with it and it's as close as you can get to the real thing without having one. And even though spending $1000 on a 12.9" iPad that'll be usable for five or so years will let you do a lot of other things besides run virtual synths, the $1500 sale price of the real Model D from Moog (when they were still selling them) doesn't seem as high as it once did. That keyboard would have lasted the rest of my life.
300gsm https://www.bhphotovideo.com/c/product/502814-REG/Moab_R08_ERB3005725_Entrada_Rag_Bright_300.html
235gsm https://www.bhphotovideo.com/c/product/502413-REG/Moab_F01_LSM2355750_Lasal_Photo_Matte_Paper.html
Bought new on 2022-06-09 from [[B&H Photo]]. Arrived on 2022-06-12. I love it! It's the most analog-sounding digital [[synthesizer|Synthesizers]] I've ever heard. Not intuitive to program, but it has enough knobs to reach for that I'm happy.
! modular gear to buy soon !! case * portable, close-able ** good for putting the Mother-32 in there with other modules so I can close it up whenever I need to step away or shut down for the night. * non-portable ** (will need some kind of plexiglas or fabric cover) *** https://www.modbang.com/modbang-store/k8ml8e4wlv0674wdslmhxo1jmn0wid ** ''4/19 waiting:'' ordered TipTop Mantis from Perfect Circuit *** plastic *** ''Max depths:'' **** top tier: ''50mm'' **** bottom tier: ''61mm'' *** Module space: 208HP *** Bus board: Zeus Powered Mantis series with 36 Eurorack keyed connectors *** Input Voltage: 13VDC *** DC Regulator model: Zeus DC4000 *** DC4000 maximum output current: **** +12V@3A with split zone topology (1A per zone, 3 zone total) **** -12V@1.1A **** +5V@300ma *** http://tiptopaudio.com/mantis *** https://www.reddit.com/r/synthesizers/comments/53qtmr/mantis_tiptop_audio_hopefully_that_affordable/ *** https://www.gearslutz.com/board/showpost.php?p=13859704&postcount=7 **** > I got the Mantis as my first case a couple of months ago when I started this eurocrack. I think it's a popular case for a good reason. It's very ergonomic, all the 3 positions are nicely sturdy despite the lightness. The lightness is great for me as I'm constantly moving it between my desk and living room couch table where I hook it to my living room hifi and just have fun. It's just heavy and sturdy enough for comfortable patching, but I think something heavier with wood would be even more comfortable in that regard. **** > I've been considering the decksaver dust cover which is a big plus. But I see my Mantis getting full within the next a few months so I might replace it with a 9 U or 12 U that would fit some ancient deep modules. I would get/try to build a linear psu for it. *** https://youtu.be/nF8KQoGUUKU **** shows how not-sturdy it can be standing up, but is sturdy lying down *** https://www.modulargrid.net/e/forum/posts/index/8492 ** Arturia RackBrute 6U *** metal and wood *** 171HP available when power supply module is connected *** Power supply (5HP width) **** 1600mA +12V output **** 1600mA -12V output **** 900mA +5V output *** https://youtu.be/Zx3-PDz-JzQ *** problems reported **** [Power issue with Rackbrute 6U](https://www.modulargrid.net/e/forum/posts/index/8190) **** [RackBrute 6U annoying tone](https://www.modulargrid.net/e/forum/posts/index/8223) **** [Rackbrute ac leakage](https://www.modulargrid.net/e/forum/posts/index/3874) ** Modulaire Maritime *** https://www.etsy.com/shop/BoitedeCassis *** has sliding nuts. ehhhh. *** “Absolutely fantastic. Build quality is incredible. Highly recommend if you're looking for a case that's equally as aesthetic as it is practical.” !! blank panels * make my own from Plexiglas scraps !! case cover * ''4/19 waiting:'' ordered Decksaver for TipTop Mantis from Perfect Circuit ** https://www.perfectcircuit.com/decksaver-tiptop-audio-mantis-cover.html !! mixer * Intellijel Mixup Eurorack Mixer Module (per Andrew Huang) !! headphone amp/line out module * ''4/21 waiting:'' ordered Pittsburgh Modular Outs Stereo Headphone Amp and Line Output Module from Reverb person ** https://www.sweetwater.com/used/listings/2343-used-pittsburgh-modular-outs-eurorack-stereo-headphone-amp-line-out-module ** https://reverb.com/item/33157891-pittsburgh-modular-outs-stereo-headphone-amp-and-line-output-module !! hardware * ''4/21 waiting:'' ordered 20 medium M3 screws from Perfect Circuit * ''4/21 waiting:'' ordered 50 plastic M3 washers (arriving @ Perfect Circuit soon) * Befaco M3 Knurlies (100 Pack) * ModularSynthLab [Eurorack Anti Rack Rash Screws M3x6mm, Nylon Screews, Black, 50pcs](https://www.etsy.com/listing/756705071/eurorack-anti-rack-rash-screws-m3x6mm) !! filter * Doepfer A-120 VCF1 Low Pass Filter * Tiptop Audio Forbidden Planet - Analog Filter !! multifunction module * Expert Sleepers Disting !! patch cables * ''4/22 waiting:'' ordered 2 TipTop patch cables and 5 LMNTL cables from Perfect Circuit !! cable hanger * [Eurodesk-Z HEX-01 Eurorack Patch Cable Hanger](https://www.perfectcircuit.com/eurodesk-z-hex-01.html) per Andrew Huang ! wishlist !! oscillators * ''4/21 waiting:'' ordered 2hp VCO from Perfect Circuit ** CEM3340 chip ** Depth: 42mm * Intellijel Dixie 2+ Full-featured Eurorack Triangle Core VCO / LFO Module * Tiptop Audio Z3000 Smart VCO MKII ** but this is a sawtooth core * AJH Synth – MiniMod VCO ** most Moog-like per https://www.musictech.net/guides/buyers-guide/6-best-eurorack-oscillators/ ** sawtooth core !! effects * Erica Synths Black Hole DSP * Tiptop Audio Z5000 Multi-Effects !! function generator * Make Noise Maths ** http://www.makenoisemusic.com/modules/maths ** and Maths panel: https://grayscale.info/panels/make-noise-maths-v2/ !! envelope generator * some ADSR !! audio manipulator * Make Noise Phonogene * Make Noise Morphagene * Make Noise Mimeophon Audio Repeater * https://www.whimsicalraps.com/products/wslash * Instruo Lubadh Tape Emulator / Looper !! sampler * Tiptop Audio One Digital Audio Flux Sampler !! more filters * AJH Synth MiniMod VCF !! Analog delay * Pittsburgh Modular Analog Replicator Eurorack ** oops, nope -- bad reviews: https://www.sweetwater.com/store/detail/AnalogRepLF--pittsburgh-modular-analog-replicator-eurorack-analog-delay/reviews !! Other ideas * something to mount the Yamaha SU-10 * Erica Synths Pico MScale Precision Scaler for Mother-32 ** The Pico MScale, from Erica Synths, is a precision scaler module specifically designed to conform the Moog Mother-32 to 1V/Oct control voltages. While the Eurorack standard is 0V to +10V, the Mother-32 module requires -5V to +5V on a 1V/Oct input for full range. The MScale fills in the missing pieces by biasing incoming and outgoing voltages; the module's upper section imparts 5V on the input voltage, while the lower section subtracts the same increment. * https://magpie-modular.myshopify.com/products/magpie-custom-mother32-panel * [Intro to Eurorack (Part 1): Tiptop Audio/Ikea DIY case](https://www.youtube.com/watch?v=ibpwU8RgcpE) * https://www.ginkosynthese.com/product/758573/wooden-diy-case-114hp * Look at what Dave Grant has: ** https://www.instagram.com/p/BBTqFP_k2KO/?utm_source=ig_web_copy_link
Here's the stuff I've been trying in ModularGrid: https://www.modulargrid.net/e/users/view/174327
https://momentoapp.com > Momento is a smart private journal that stays up to date effortlessly. Capture and collect moments to explore, relive and share your life story. Still my favorite journaling app ever. They nailed it. The problem is that I never trusted it for the long term.
Monoprice 100ft 12AWG https://www.amazon.com/gp/product/B003L14ZAQ Last bought on 2015-08-17
Ugh. I may eventually run into issues with the [[Moog Mother-32]]'s CV pitch out not tracking the keyboard perfectly if you add a 2nd oscillator: from https://www.muffwiggler.com/forum/viewtopic.php?p=2731339#p2731339 > So, like a lot of people I have started with a mother 32 - then started to build a eurorack with a 2nd Oscillator and had issues with tracking. I didn't understand why my 2nd VCO sounded out of tune when I played my keyboard and thought my VCO/Mother32 may be faulty. > Eventually, after reading lots and lots of posts like this on the internet. I went ahead and bought a powered buffered mult - my problem was solved.
2019-07-03 Ordered [[MoonGel pads|https://www.amazon.com/RTOM-Moongel-Damper-Pads-Original/dp/B00F2PKRJW]] for $7. ''2019-07-07'' 100% great. I inspected with a microscope before and after and it truly pulls gunk off the stylus. Crazy. from https://www.reddit.com/r/vinyl/comments/2dqgnb/the_greatest_and_most_effortless_stylus_cleaner/ <<< The wildly expensive Onzow Zerodust stylus cleaner is often regarded by vinylphiles as the best and safest way to clean a stylus, but some of us have found that Moongel drumhead damping strips are made of a slightly softer version of the same stuff which provides identical results. I used slices of Magic Eraser for years, but this is better IMO because it doesn't leave any abrasive residue or shove the gunk up the stylus shank. Having spent some time viewing the results of both with my ancient Shure stylus microscope, I like this a lot. Every micron of crud is captured and the stylus is left clean as a whistle. Turns out a Listerine Breath Strips container is exactly the right size to hold a single strip of Moongel. These containers split in half like a clamshell for easy loading. Pick one up at the grocery store or buy a pack on Amazon, because if you're like me you're breath is pissing everyone off anyway. To use, open the container and place it on your platter, then dip your stylus into it two or three times. Since the stylus cleaner container is free to move in any direction, you can use your cueing lever or just freehand it without fear of breaking your cantilever if you spazz out. <<<
https://www.instagram.com/moonshake3d/ Sweet lord I don't know how this person does it. All of this stuff is built and rendered in [[Blender]]. Aside from the technical skills, the artistry and vision is insane.
[[Tango + Photos — laROQUE|https://www.laroquephoto.com/blog/2021/3/29/tango-photos]] > For those who didn’t read [[the original post|https://www.laroquephoto.com/blog/2021/3/23/shoebox-project]], I want to reiterate the motivation behind this whole endeavour: the Shoebox Project isn’t about perfect prints—it’s about prints, period. The HP Tango is not a super high end photo printer with perfect gradation, minimal gloss differential etc...it’s a consumer machine that uses two cartridges. It’s not going to rival 8-ink pigment-based behemoths. But thanks to HP’s Instant Ink program, I find myself printing with something close to wild abandon. Beyond the 5x7 images on Ilford paper, I also have a box of matte Moab 4x6 that I’m using to print mostly black and whites—because I love how the texture of that paper enhances the painterly mood of certain pictures—medium-format, especially. And I’m not framing these, but just leaving them around the house, on shelves or tables. I love this. I love the lack of solemnity that comes from no longer worrying about the cost of ink. I love printing whenever I feel like it and dropping a print somewhere, a few minutes later. Paper isn’t cheap but it’s just one element to manage—the rest is taken care of, without even having to think about it.
Ah! [[Drafts]] version 18.0 has added some [[TaskPaper]] smarts in the latest release: * https://docs.getdrafts.com/docs/misc/changelog-mac * https://docs.getdrafts.com/docs/misc/changelog-ios * and a TaskPaper action group: https://actions.getdrafts.com/g/14k
<$list filter="[tag[Journal]sort[created]last[]]"> <h2>Journal for <$view field="created" format="date" template="DDD, DDth MMM YYYY"/></h2> <$transclude mode="block"/> <br><br> <hr> <small><$link>View</$link></small> or <$button message="tm-edit-tiddler">Edit</$button> </$list> <<open-all filter:"[tag[Journal]!limit[10]]" label:"Open last 10 Journal entries">>
2020-04-17 This is no revelation, but Motörhead's [[Ace of Spades|https://www.discogs.com/Motörhead-Ace-Of-Spades/master/38512]] is a perfect album. [img[https://twelvety.com/philtiddlywiki_images/2020-04-17-motorhead.jpg]] Speaking of which, learned this about [[Phil Taylor]]: https://en.wikipedia.org/wiki/Phil_Taylor_(musician) > Shortly after recording the classic [[Ace of Spades|https://en.wikipedia.org/wiki/Ace_of_Spades_%28album%29]] album in 1980, Taylor broke his neck after being lifted above the head of a friend in a test of strength, only to be dropped on his head. Taylor continued to play in Motörhead with the aid of a neck brace, as is visible in the music video for "[[Ace of Spades|https://en.wikipedia.org/wiki/Ace_of_Spades_%28song%29]]". I can't find any videos ("Ace of Spades" or otherwise) that show him playing with a neck brace, but what a story.
That's it. Inspired by [[Johnny.Decimal]], I'm done logging found music in [[Roam]]. Not that I'm going to actually //use// Johnny.Decimal to organize found music notes, but I think there's wisdom in using text files for certain groups of like things. I'm going back to logging found music in yearly or monthly Markdown files in [[Obsidian]], managed in Dropbox (easier on the phone), and monthly tiddlers in [[TiddlyWiki]] (like [[2021-01 found music]]). In Roam, the editing/refactoring is a pain because there are too many bullets, I'm always moving the cursor into and out of editing mode, I don't care about backlinking/hyperlinking all of the band names, I never feel like searching it later, and month or year chunks are easier to scroll through in text files than by using date filters in Roam. Also, if I stick to running text files or tiddlers, I don't have to remember to put `#music` after every music bullet, or worry that I forgot it. And when I get in front of my laptop to work in Roam, I won't have to wade through cleaning up a bunch of music notes and I can use Roam for stuff that it's better suited to.
https://addons.mozilla.org/en-US/firefox/addon/multi-touch-zoom/ It's not as good as pinch and zoom in [[Safari]], but at least it sort of works. Much better than nothing.
https://museapp.com/ > Your tool for thought. > > Muse is a spatial canvas for your research notes, reading, sketches, screenshots, and bookmarks. Because deep thinking doesn’t happen in front of a computer. Via [[Jack Baty]]'s public [[Roam]]: https://roamresearch.com/#/app/jackbaty Lordy I do not need this, but I want it. Sarah thinks it looks cool, too.
<<list-links filter:"[tag[music]]">>
I just emailed [[Jim Whithorne]] at [[Butcher Block Acoustics]]. Holy smokes this platform is amazing. <<< """ Jim, The 1.5" platform arrived last night and I am super impressed. Before installing it, I figured it might be noticeable, but I didn't foresee that it would be the single biggest improvement to my [[Kenwood KD-600]] since putting a new arm on it. It's almost like I got a new cartridge! Everything across the spectrum is smoother, more unified and whole, and the music coming out of the speakers sounds less like a recording and more like people. I can finally turn up the volume without a runaway bass "bloom", and I can hear details in cymbals and drums that just weren't there before. Suddenly, my own analog system reminds me of what I've heard at audiophile shows. I used to think my turntable by itself did an okay job at insulating the arm and cartridge from vibrations, but obviously not. I don't know why I didn't order this thing sooner. I feel like the world needs to know how they're missing out if they don't have their turntable sitting on one of your platforms. Please feel free to use these comments on your website. Thank you for making such a great piece of equipment for so little money! Phil Nunnally Richmond, Va. """ <<<
[img[http://twelvety.com/philtiddlywiki_images/2023-07-08-nad-c-316bee-v2.jpg]] https://nadelectronics.com/product/c-316bee-v2-stereo-integrated-amplifier/ > NAD’s PowerDrive Circuit has been proven to offer a remarkable combination of high current drive needed for complex loudspeaker loads, and high levels of undistorted dynamic power. By monitoring the precise operating condition of the power amplifier, PowerDrive uses this intelligence to automatically optimize the power supply settings for uniformly low distortion and maximum power in the real world of music listening. As featured in our top Masters Series models, PowerDrive uses a complex ‘analogue computer’ to determine the optimal settings. For the C 316BEE V2, NAD’s Director of Advanced Development, Bjorn Erik Edvardsen, developed a clever new computation circuit requiring fewer parts at a much lower cost without any reduction in effectiveness. > > All the hallmarks of NAD technology are present, from the generously sized toroidal power transformer and low ESR smoothing capacitors, to the multiple regulated secondary supplies, to the heavy duty discrete output transistors, the C 316BEE V2 is every bit as refined and sophisticated as other NAD amplifiers. Both [[John Darko]] and [[Steve Guttenberg]] both personally own this amp (or the v1) and love it.
[img width=40% [https://twelvety.com/philtiddlywiki_images/2021-12-06-nad-d-3020-v2.jpg]] https://nadelectronics.com/product/d-3020v2-hybrid-digital-amplifier/ Hybrid Digital DAC Amplifier """ Rated Power at 8 ohms: 2 x 30 Watts IHF Dynamic Power 8 ohms: 2 x 60 Watts """ Pros: * Subwoofer out * Preamp out * Bass management for the main speakers Cons: * Plastic enclosure, cheap plastic volume knob * Only looks correct when it's standing vertically. I can't have a vertical amp. * No physical buttons on the unit * Only one analog line-level input in addition to the phono input * Cheesy remote, with a bass boost button too easy to hit directly below the volume-down button
https://nadiaeghbal.com/ > I'm a writer and researcher who likes to understand how people work. I try to engage in both theory and practice, which means I'm always cycling between writing to understand a topic, then finding ways to test those ideas in the "real world." Nadia's [[Notes page|https://nadiaeghbal.com/notes/]] is one of my favorite things on the web, and somewhat resembles the way old blogs used to look, kind of like what [[Dori Smith]]'s blog was, as mentioned in the [[Cory Doctorow: The Memex Method]] essay.
https://vintage-turntable.com/nakamichi-dragon-computing-turntable.html > Those not familiar with the Dragon CT may wonder why it has two tonearms. Well, actually, the arm in the back is not a tonearm but rather a self-centering sensor arm. The Nakamichi Dragon CT incorporates a self-centering mechanism designed to accurately center an LP. If the LP spindle hole is punched slightly off center or worn this will introduce Wow, or pitch distortion, into the playback. Nakamichi called it “Groove Eccentricity”. Nakamichi adjusted for this by having the sensor arm come down on the outer ring of the LP and measure the amount off-centeredness. It would then adjust for it by slightly moving the top platter. The platter is actually a two piece platter comprised of a glass top platter which sits atop a metal sub platter. The glass platter is moved by the self-centering mechanism to reduce Wow caused by off center or worn LP spindle holes. The holy grail.
[[Interruption as Assault|https://www.timetothink.com/wp-content/uploads/2019/10/interruption-as-abuse-.pdf]] by [[Nancy Kline]] This is a life-changingly accurate essay and feels exactly like I feel when using [insert chat groupware app here]. > Our minds are creating when they are thinking. They are more gifted at this than they usually have any opportunity to demonstrate. Surely it is time in our organizations and our relationships to see what new and useful, accurate and ingenious ideas would form, in less time, if the thinking process were freed from the threat of assault and promised the ground of respect. Via [[David Johnson]] in this post: [[The Harshness of Interruptions|https://www.crossingthethreshold.net/2021/06/23/the-harshness-of.html]] > I can feel the others’ presence in my body, and wait anxiously for the interruption. I'm not alone in this. And then I got mad and tweeted: <<< I think I'm done texting "interesting" links to people. That's what email should be for. <<< Because sending someone an SMS or iMessage or whatever instant-thing just because you found something cool right that second is annoying.
A drummer recently featured in [[Tape Op magazine]]. I can't process what he's conceived of or executed here. How do people get this good? <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/5ZKpAPpHm2Q' frameborder='0' allowfullscreen></iframe></div>
I wish I had written this [[Roam]] [[keyboard shortcut]] down earlier: To go to the ''previous'' (or ''next'') day of [[Daily Notes]], hit `Ctrl-Opt-P` (or `Ctrl-Opt-N`). This is also a really fast way to create dated pages for days you've missed when they were today's Daily Notes.
I saw in the [[help database|https://roamresearch.com/#/v8/help/page/uuidafc50fba-4b08-4aad-a749-7a02e64fd63b]] that [[Roam]] uses ~~[[Emacs]]~~ keybindings for selecting autocomplete options or tags in a dropdown. That means that you can press `Control-J` to go down the list and `Control-K` to go up. Better than using up and down cursor keys!
https://www.negativelabpro.com/ > NEGATIVE LAB PRO brings impossibly good color negative conversions right into your Lightroom workflow. No more messing around with tedious exports and hand-edited curves. With Negative Lab Pro, lab-quality tones and colors are just a click away. I should get Negative Lab Pro and see if I can get color scans to look decent with it.
2020-01-21 He's been gone two weeks and I'm still obsessing. Doesn't seem real.
The more I read about Neil Peart, the more I love him. What a force for good. from [[americanmotorcyclist.com|https://americanmotorcyclist.com/rock-roller-rush-drummer-neil-peart-lives-for-motorcycles-hes-also-one-incredibly-thoughtful-guy/?fbclid=IwAR0nruJDRlLLKqOGriiNDir9oVwuCQc8UTXCUcl6eEUi0v6mEpsdLpYNKzE]] On prioritizing getting to the show on time: <<< Our ETA on the show day is very important. Sound check is 5 p.m., so I like to be there by 3 p.m. or so to have time to look after the bike and myself—but at least an hour early. When I first started touring by motorcycle in 1996, the instructions I gave to my riding partner were, “If we’re not there an hour early, we’re late.” I decided from the beginning that there was so much at stake with a show—you know, 10,000 people waiting for me to show up for work—I didn’t ever want to be in that situation, so I have someone with me. If I have a problem that might cause a delay, I’ll have to take my riding partner’s bike and say, “Sorry, you deal with this!” Though I’m glad to say that’s never happened. <<< On the need to concentrate on a bike or on stage: <<< Here’s a motorcycling and drumming analogy—it kills me, metaphorically, to make a mistake on stage. It’s the worst feeling, especially because it’s usually a loss of concentration—my thoughts have drifted when they shouldn’t have. Maybe I’ve played something, literally, a thousand times, and I’ll slip into that autopilot groove. Suddenly, I’m asking myself, “Am I playing the right verse?” As soon as I ask myself that question, I’m lost. But the consequences are only humiliation—I just feel like I’ve made a naked fool of myself in front of a large number of people. On the road, the fear of mistakes—and their consequences—is the reason I’m so strict with myself. I concentrate, make sure I’m in the best place on the road, and try to do the right thing all the time. I don’t want to be frightened or surprised, and I blame it on myself when I am. <<< On smoothness and poise: <<< On the bike, I work on smoothness all the time—with every aspect of bike-handling. I feel myself progress over time, and just this year I’ve felt an improvement in the seamlessness of my upshifts, for example—that perfect change in pitch you hear as racetrack pros change gears. Smoothness through corners can get better all the time. Dealing with traffic is a constant study. Smoothness through a corner is control. Your smoothness will allow you to cut in a little sharper or go wider around a patch of gravel—you’re equipped, because you’re poised. That’s what it is, poise in motion. “Poise” doesn’t sound like a kinetic word that would apply to motorcycling and being in motion, but if you feel that way, you’re always ready for any obstacle or unexpected move from someone else. <<< On looking ahead: <<< Reading the road is an art form That’s another thing that gives you poise in motion—not just looking ahead of the bike, but looking as far as you can possibly see, at every inch of pavement as it appears around a corner. I’ve noticed that I’ve become so used to that mode of perception. Even in a car, if the road is curving, I’ll find myself looking through the side windows at what’s coming up. <<< On mitigating risk: <<< Safe riding gear is something I’m a bit of a missionary about, because I believe in it so much. Armored suit, boots, gloves and full-face helmet—that’s my basic wardrobe on the bike. Fortunately, in my case, it’s not so much from experience, but observation. One November my friend, Brutus, went around a corner, and he hit a patch of ice and went down, going about 50 mph, sliding down the road on his back. He was wearing full armored gear, and the worst injury he suffered was when the luggage case landed on his foot. <<< On responsibility and motorcycling: <<< I feel a responsibility to traffic around me. One of my rules is not to be surprised on the road, and I don’t want to surprise anyone else, either—do anything unpredictable or make any sudden move that is going to cause worry or fear for anyone else. The best I can do is set a good example, dress and ride properly. Signal every maneuver, position myself in the right place in the lane, and consider other drivers—not make a nuisance of myself. But I’m only one guy. I hope that, through forums like this, and when I write about motorcycling, the word is spread about the good way to do things. That’s all you can do. <<<
http://andrewolson.com/Neil_Peart/drums/drumkits/before_rush.htm So much to nerd out on here.
http://mutablecode.com/apps/nerdtool.html Years ago I used GeekTool, and was about to re-install it to add a plaintext todo list to the macOS desktop. I found some references to Nerdtool as an alternative. While searching "GeekTool vs Nerdtool", I came across Dr. Drang (of course) saying he switched to Nerdtool as it was less resource-intensive, at least when he wrote this in 2011: https://leancrew.com/all-this/2011/09/nerdtool-over-geektool/ Huh. The software isn't downloadable anymore from mutablecode.com, but I grabbed it from here: https://download.cnet.com/Nerdtool/3000-2072_4-75828148.html
https://netnewswire.com/ > NetNewsWire is a free and open source RSS reader for Mac, iPhone, and iPad.
<$macrocall $name="timeline" format={{$:/language/RecentChanges/DateFormat}} dateField="created" limit="30" />
from [[Mayor Mitch Landrieu's Speech on Confederate Monuments - The Atlantic|https://www.theatlantic.com/politics/archive/2017/05/we-cant-walk-away-from-this-truth/527721/]] > So I am not judging anybody, I am not judging people. We all take our own journey on race. I just hope people listen like I did when my dear friend Wynton Marsalis helped me see the truth. He asked me to think about all the people who have left New Orleans because of our exclusionary attitudes. Another friend asked me to consider these four monuments from the perspective of an African American mother or father trying to explain to their fifth grade daughter who Robert E. Lee is and why he stands atop of our beautiful city. > > Can you do it? > > Can you look into that young girl’s eyes and convince her that Robert E. Lee is there to encourage her? Do you think she will feel inspired and hopeful by that story? Do these monuments help her see a future with limitless potential? Have you ever thought that if her potential is limited, yours and mine are too? > > We all know the answer to these very simple questions. > > When you look into this child’s eyes is the moment when the searing truth comes into focus for us. This is the moment when we know what is right and what we must do. We can’t walk away from this truth. I remember when I heard the audio of this three years ago. That was when I //got it//.
from [[Consider Yourself on Notification — Dave Pell|https://startupsventurecapital.com/consider-yourself-on-notification-bc9612318b69]]: > The notion that you need to know about world events right when they happen is a marketing creation of media brands. And yet, those news stories exist in the same timeline along with the personal exchanges you share with friends and family. The stuff that has something to do with you is now almost impossible to distinguish from the stuff that doesn’t. 20181104T0819
https://nextdns.io/ > The new firewall for the modern Internet.
https://github.com/mcclure/NFTBlocker >Browser plugin to autoblock NFT users on Twitter. <<< !! Why would you want to block NFT users? Three reasons. # Because it is designed in a foolish way, the NFT system has a shocking amount of impact on global warming. The more demand there is to buy and sell NFTs, the higher the value of energy-wasting ("proof of work") cryptocurrencies goes and the more coal and oil these networks will burn. I don't want to be in a community with people who support that. # The NFT market is rife with scams and art theft. Some people push back on NFTs because of this. # In short, NFT users are just irritating to be around. People who bought NFTs have to keep hyping other people to buy NFTs or the NFTs they bought will lose value. Twitter NFT cliques are rife with sockpuppet accounts, dogpiling and indifferentiable monkey clones. Blocking NFT users just makes Twitter nicer. <<<
From [[Nick Cave]]'s [[The Red Hand Files]] [[newsletter|https://www.theredhandfiles.com/do-wish-more-politically-outspoken/]]: > I guess I could write a protest song, but I think I would, in the end, feel compromised in doing so, not because there aren’t things I am fundamentally opposed to — there are — but because I would be using my particular talents to deal with something I consider to be morally obvious. Personally, I have little inclination to do that. It’s just not what I do. ❤️
https://www.theredhandfiles.com/what-are-the-red-hand-files/ > You ask me, John, what I want from The Red Hand Files. Well, the answer is this – I want to facilitate, in some small way, a mutual journey toward meaning; to decrease the dimensions of our emptiness and draw us closer to love and to beauty. I understand that these sound like grandiose claims, but they are not. This common project – to improve matters – is available to all of us, at every moment, and in a multitude of ways, and exists in the smallest kindness, the most rudimentary act of tolerance, or in the simplest generosity.
[[‘There Are Better Riches Than Commerce’ and Other Lessons From Nick Offerman - The New York Times|https://www.nytimes.com/2021/10/12/opinion/ezra-klein-podcast-nick-offerman.html]] > But there’s more to Offerman than Swanson: His new book, “Where the Deer and the Antelope Play,” was inspired in part by his conversation with the agrarian poet-philosopher [[Wendell Berry]], and a hiking trip he took with the writer [[George Saunders]] and the musician Jeff Tweedy (both of whom you may remember from past episodes of this show). I don't think [[Nick Offerman]] has any kids, so I'd like him to adopt me.
from [[Friedrich Nietzsche]]'s [[book]] //[[Human, All Too Human]]// > ''Joy in Old Age.''—The thinker—and similarly the artist—who has put the best of himself into his work, experiences an almost malicious joy as he watches the erosion of his body and spirit by time. It is as if he were in a corner watching a thief at his safe, while knowing that it is empty, his treasure being elsewhere.
[[The Nikon FM is All the 35mm Film Camera You Really Need – Casual Photophile|https://casualphotophile.com/2018/05/11/nikon-fm-35mm-film-camera-review/]] <<< All minor flaws considered, the FM is one of Nikon’s masterstrokes. It’s a perfectly designed, finely built, and compact mechanical camera that can handle any shooting situation in any environment. A camera with this sort of superlative talk would normally bring with it an insane price tag, but this isn’t the case. Nikon produced these cameras by the droves, which means that prices of perfect FMs on today’s market are quite low. As somebody who regularly shoots a Leica M2 and a Nikon F3, the FM makes both of them seem needlessly overpriced, and I often wonder why I don’t just sell them both and buy more lenses for the FM. When a basic camera can be done this well and at this price, why complicate things? And while sitting on a dirty curb with tacos in hand, I mulled that very question. In my quest for the perfect food I’d walked past artisanal pizza shops, entirely too expensive vegan restaurants, and absurdly fancy coffee shops, all of which sold food which, while certainly healthful and tasty, just wouldn’t satisfy me the way a perfectly made street-side taco can. In that way, the FM’s exactly like a taco. It’s simple, sure, but it hits the spot every single time. <<<
https://www.bhphotovideo.com/c/product/1560218-REG/nisi_nisi_x100v_blk_uhd_uv_filter_for.html 2021-10-07 Ordered for the [[Fujifilm X100T]]. I know these things are overkill and most people don't use anything, but that lens glass is just sitting out there otherwise. I wouldn't forgive myself if I scratched it, cracked it, or let dust get in it. This filter looks like the lowest-profile way to go anyway, and I hope it'll let me relax about not using a lens cap.
I'm going to keep naming all non-[[Daily Notes]] [[Obsidian]] pages with no timestamps in the filenames, because: # Dates would junk up the markup. # I'm pretty sure I don't need them. # I used to use dates in tiddler names in [[TiddlyWiki]] and then realized I didn't need them. # I'm usually putting `YYYY-MM-DD` dates in any non-Daily Notes pages that have significant amounts of content anyway. # It makes it a lot easier to copy and paste to [[TiddlyWiki]] if I don't have to remove dates from bracketed wiki links.
https://org-roam.discourse.group/u/nobiot/ Core contributor to [[org-roam]], active on the Discourse group.
https://noelwelsh.com/posts/doom-emacs/ > I recently switched to Doom Emacs from Spacemacs. The Doom documentation is currently quite sparse, so I've posted here my personal notes on using Doom along with a description of my workflow (something I find vital but missing from most documentation). tiddler: [[Doom Emacs]]
* 2019-09-03 --- * 2019-09-02 Unpacked all the remaining cassette tape archiving boxes and loaded them with all the cassettes I could find in the basement. Must have been about 175. Moved a bunch of reel-to-reel tapes to a better, higher shelf away from moisture and windows. Moved the [[Akai GX-4000]] to the IKEA desk, up higher and away from an outside wall. * 2019-09-01 Tested using a random 80 BPM pattern from [[Teenage Engineering PO-16 Factory]] as accompaniment to Will's sci-fi track. The tempo drifts on the PO-16, so I'm going to have to do this in [[Reaper]]. But I liked the melody that went with the pattern, and I recorded it into the iOS [[Music Memos]] app so I wouldn't lose it. At least I started! * 2019-08-31 Ordered Makita impact driver. Picked up $200 worth of lumber from Home Depot, took it home, laid it out to dry on front porch steps. * 2019-08-30 Exported WAV files from '68 Youth Riot's 5-song demo from 1993 (from fixed Audacity project). * 2019-08-29 Ordered from Home Depot all the pressure-treated lumber we'll need to re-do rotten front porch steps. * 2019-08-28 Took our niece to see //Ghostbusters// at the Byrd. Fun night, but Sarah and I agreed that we don't need to see that movie again in the future. But Bill Murray and Harold Ramis were better than I remembered. * 2019-08-27 Inspired by the [[Jack White "Tape Op" interview|2019-08-27 Jack White in Tape Op]], seeing possibilities for an overdue [[audio desk|2019-08-27 Journal: audio desk]], and feeling sad about the neglected [[Tascam TSR-8]] reel-to-reel machine in the basement, I moved it from the low shelf near the basement wall to the IKEA desk so it won't be close to potential moisture anymore. (I know. Damn.) I can tell the pinch rubber roller is already gooey and yet brittle. That alone will need a re-do by [[Terry's Rubber Rollers]], but the deck will also need a [[going-over|Tascam TSR-8 repair shops]] in general. * 2019-08-26 Found proper wooden decking boards at Home Depot to use for treads on front porch steps. * 2019-08-25 Finished final mix of podcast audio for Bird; emailed to her. ----- See [[2019-08-24 No more zero-days]] for where this idea comes from.
https://en.wikipedia.org/wiki/Slow_television#NRK_(Norway) > ''Slow television'', or ''slow TV'' ([[Norwegian|https://en.wikipedia.org/wiki/Norwegian_language]]: //Sakte-TV//), is a term used for a genre of "marathon" television coverage of an ordinary event in its complete length. Its name is derived both from the long endurance of the broadcast as well as from the natural slow pace of the television program's progress. It was popularised in the 2000s by the [[Norwegian Broadcasting Corporation|https://en.wikipedia.org/wiki/NRK]] (NRK), beginning with the broadcast of a 7-hour train journey in 2009.
''novitiate'' |nə(ʊ)ˈvɪʃɪət, nə(ʊ)ˈvɪeɪt| (also noviciate) noun the period or state of being a novice, especially in a religious order. * a novice, especially in a religious order. * a place housing religious novices. Seen in [[I Used to Be a Human Being — NY Mag Intelligencer|http://nymag.com/intelligencer/2016/09/andrew-sullivan-my-distraction-sickness-and-yours.html]], by Andrew Sullivan: > I was sitting in a large meditation hall in a converted novitiate in central Massachusetts when I reached into my pocket for my iPhone.
https://emacs.cafe/emacs/org-mode/org-roam/2021/03/11/introduction-to-nroam.html > nroam is a supplementary package for [[org-roam]] that replaces its backlink side buffer. Instead, it displays org-roam backlinks at the end of org-roam buffers. The user can also click a button to see unlinked references, all in the original [[org-mode]] source buffer.
http://j.d.ntfs19.tiddlyspot.com/ > Create tiddler from searchbar query via keyboard shortcut ctrl+space, or the "+" button beside the searchbar. ... > ''Not compatible with TW5.1.18 and below'' Bad-ass. ''Update:'' Something about my config doesn't like this plugin and it's breaking all the searches. Turning off for now.
[[NumWorks --- A Straightforward Graphing Calculator|https://www.numworks.com/]] > The graphing calculator that makes everybody a math person. Via [[Scott Hanselman]] [img[https://twelvety.com/philtiddlywiki_images/2021-01-16-numworks-calculator.jpg]]
https://nuphy.com/collections/keyboards/products/air96-v2?variant=40735414747245 Endorsed by Winnie Lim: https://kopiti.am/@wynlim/112675900630027104 > @nazhamid@mastodon.social this one is my favourite for now, but just so you know it is a chinese company: https://nuphy.com/collections/keyboards/products/air96-v2 and Anthony Baker: https://mastodon.social/@AnthonyBaker/112680166207126793 > @wynlim@kopiti.am @nazhamid@mastodon.social I can second this. I absolutely adore it. My third mechanical in 18 months. Buttery delicious.
For quickly editing and browsing a single directory of not-huge plaintext files on a Mac, there's nothing better. from https://brettterpstra.com/projects/nvalt/ > nvALT 2 is a fork of the original [[Notational Velocity|http://notational.net/]] with some additional features and interface modifications, including MultiMarkdown functionality. It has been developed by [[Elastic Threads|http://elasticthreads.tumblr.com/]] (David Halter) and [[Brett Terpstra|http://brettterpstra.com/]], and made available for free (donations accepted). and > Notational Velocity is a way to take notes quickly and effortlessly using just your keyboard. You press a shortcut to bring up the window and just start typing. It will begin searching existing notes, filtering them as you type. You can use ⌘-J and ⌘-K to move through the list. Enter selects and begins editing. If you’re creating a new note, you just type a unique title and press enter to move the cursor into a blank edit area. Check out the descriptions at [[notational.net|http://notational.net/]] for a more eloquent synopsis.
by [[Brett Terpstra]]. Hope to see it released at some point.
https://collectionstrust.org.uk/resource/object-number/ <<< !! Definition A unique number identifying an object or specimens, including any separated parts. !! How to record The following points should be considered when assigning an //Object number//: Only use a single number to describe a group of objects if they are too numerous to number individually and either contained in a single container or separately accounted for, eg a box of sherds or an archaeological archive Do not include in the number any classificatory components as these may change Avoid alphabetical components !! Examples 1992.1234; 1992.12.1 !! Use Assign a unique Object number to each separated or separable part of an object. <<<
[[How to Sell UX Research with Two Simple Questions – A List Apart|https://alistapart.com/article/how-to-sell-ux-research/]] by Sophia V. Prater <<< In this article, I’ll show you how to collaboratively expose misalignment and gaps in the team’s shared understanding by bringing the team together around two simple questions: # What are the objects? # What are the relationships between those objects? !! A gauntlet between research and screen design These two questions align to the first two steps of the ORCA process, which might become your new best friend when it comes to reducing guesswork. Wait, what’s ORCA?! Glad you asked. ORCA stands for Objects, Relationships, CTAs, and Attributes, and it outlines a process for creating solid object-oriented user experiences. [[Object-oriented UX|https://alistapart.com/article/object-oriented-ux/]] is my design philosophy. ORCA is an iterative methodology for synthesizing user research into an elegant structural foundation to support screen and interaction design. [[OOUX|https://alistapart.com/article/ooux-a-foundation-for-interaction-design/]] and ORCA have made my work as a UX designer more collaborative, effective, efficient, fun, strategic, and meaningful. <<< I wonder if there's such a thing as "object-oriented [[notetaking]]". I hate that I have a "UX" tag, but at least it's a term where I know what to expect when I look for it.
https://obsidian.md > Take great notes that outlive you. > Finally, a safe vault for all your notes, in Markdown. Start building your second brain today. ... > Future-proof. > Obsidian works with plain text Markdown files that sit on your computer. No vendor lock-in, and zero risk of the service getting bought or shutting down. > > Long-lasting. > If you're in it for the long haul, this is the single most important prerequisite for building your second brain. Another app/service gunning for [[Roam]], but doesn't appear to be an outliner. People say it's one of the same developers as from [[Dynalist]]. Hmm.
https://github.com/insanum/obsidian_nord > This is a nord theme for [[Obsidian]].
* [[Obsidian]] ** pros *** don't need to use [[Doom Emacs]] *** I have TONS of old [[Markdown]] files to harvest *** Unlinked References *** embedded images are so easy and look nice *** Does [[transclusion]] *** syntax highlighting is cleaner in Preview mode, but uglier in text mode *** [[Markdown]] in its native form is generally easier on the eyes *** don't have to learn new commands to select and edit text *** very high likelihood that someone in the future will make an app that can use [[Obsidian]]'s linking structure if this app goes bust *** [[Markdown]] is the clear winner for blockquote formatting *** more likely to be the one I use when things are hectic or I'm tired *** less likely to become its own project *** `⌘-P` shows the palette of commands ** cons/questions *** currently don't get WYSIWYG *** could bloat with features in the future *** how fast will it be with tons of notes? * [[org-roam]] ** pros *** get to use [[Doom Emacs]] *** definite nerd cred *** easier to go org > [[Markdown]] than the reverse *** easy to move lines up and down with standard [[org-mode]] commands *** [[Jethro Kuan]] at the helm means development is likely to be deliberate and careful *** syntax highlighting works immediately in text mode, but isn't as pretty *** highly structured files can do tricks when parsed in [[org-mode]] *** auto-suggests links as you type *** you don't have to remember to set aliases on every reference to a link *** fast and nimble *** free and open-source, likely to be usable forever *** would feel good about supporting [[Jethro Kuan]] ** cons/questions *** more likely for me (novice) to delete or corrupt data
https://ohmygit.org > An open source game about learning Git!
https://oldschoolphotolab.com/ This is where I send color film, and until now, b/w.
https://casualphotophile.com/2017/01/22/olympus-infinity-stylus-mju-point-and-shoot-camera-review/ I have one and it's great. It does miss focus a lot indoors, though.
* 2019-11-10 I won an auction yesterday (for $100!!) for an Olympus XA to replace my beloved first XA whose lens went hopelessly out of alignment in mid-2018. Which is, huh, just a little bit before when I dropped out of taking film photos regularly. Fingers are crossed that the lens on this one is still good. There is nothing like an Olympus XA: ** no flash to remember to turn off every time ** built-in lens protection ** a low-profile lens geometry that seemingly defies physics and is as sharp as I'll ever need ** manual rangefinder focus, so no "hoping for the best" ** the most likely camera I'll carry with me when I don't want to worry about taking a camera with me ** ultra-quiet * 2019-11-14 It arrived and it's in perfect shape! A little scuffed on the back case, but I knew that from the photos in the eBay listing. The lens looks great, the viewfinder is cleaner than the previous XA, and the shutter sounds fine. I'll bust it out this weekend!
2019-05-01 update: Now leaning more towards the [[35mm f/2.8|Olympus Zuiko 35mm f/2.8 OM-mount prime lens]]. People //love// the f/2 if they happen to get a good sample, but not everyone does. * Go with an MC version. Higher serial numbers may be better. * https://www.keh.com/shop/olympus-35mm-f-2-om-mount-manual-focus-lens-55.html * http://www.photographyreview.com/product/lenses/35mm-primes/olympus/om-zuiko-35mm-f2-0.html * https://paulamyes.com/2016/07/24/olympus-om-zuiko-mc-35mm-f2-0/
''This'' — the 35mm f/2.8 — seems to be the way to go. I initially had thought the [[35mm f/2|Olympus Zuiko 35mm f/2 OM-mount prime lens]] would be better for me. The f/2.8, while slower, seems to be a tad sharper and, from what I read in the Flickr forums, may have more consistent quality control. Also, 35mm is the same focal length as my dear departed [[Olympus XA]]. * https://www.flickr.com/groups/15007408@N00/discuss/72157658285614340/ <a data-flickr-embed="true" href="https://www.flickr.com/photos/59259028@N00/37514077372/" title="Untitled"><img src="https://live.staticflickr.com/4496/37514077372_d3dcc57884_z.jpg" width="100%" alt="Untitled"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> <a data-flickr-embed="true" href="https://www.flickr.com/photos/156884925@N04/32201618177/in/photolist-R4xHcp-qMTVyp-qakxiw-qMGwXL-bYc13L-dQwf7G-dWrtuF-pXxF8E-qXiGpN-eYkFyQ-7BYgZp-eK2589-5TU2EM-o9Tg8o-qTrx2U-qPShPc-qNTMaW-axnxg3-pTqr81-25qaCuR-qnWQc5-gh2mJF-S4koLJ-nNMkWm-qSNdkj-bUwg2r-nSosmj-oqfaY-Uhx3oV-bfZ9Ci-pupr3R-q6kRbu-qukhUk-q2pEbZ-nSxkzD-s75oTb-Ccejid-epfuWx-dQMMAU-qoLZh7-GPW6wi-iv1Lxo-fXCC1M-ob3VZR-bfwqir-ank5vW-qR4Eh5-fUFJbq-h2WoSB-9yRHGp" title="Se mig, en fjädrat fä"><img src="https://live.staticflickr.com/7874/32201618177_d8a926fe08_z.jpg" width="100%" alt="Se mig, en fjädrat fä"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> <a data-flickr-embed="true" href="https://www.flickr.com/photos/15481483@N06/8057596287/in/photolist-R4xHcp-33EQTR-DpVYsm-GBQbUf-23EnNjg-FLQ7CQ-saKx54-27Sfewm-27vSo2y-T8Y5H3-5nen6h-5xeEqS-pm3ffE-Dfqox6-X2w37W-H5NieY-25cYbCk-23K2KuE-N8p3hh-2e1Bjzx-Fpf9JT-pm3ff9-9bWYYt-bTSQ3P-9bE44Q-9bPbKb-XvpPsB-YueYwN-GWQTyP-24uqa8f-W1KgDH-2dDHnja-XuujJo-khUP7-dckx5A-79czQz-25Gymy5-fAXU5N-NKjgJF-FHVHde-cACs77-QjrLvQ-9bAWMz-Fr9Dbn-25icEM9-LHCaF1-rnmsVA-nRiBno-dh2hDV-8GDQRb" title="Lunch 12.99 dinner 19.99"><img src="https://live.staticflickr.com/8041/8057596287_aa7173c23a_z.jpg" width="100%" alt="Lunch 12.99 dinner 19.99"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
Many flavors of this: https://theonlinephotographer.typepad.com/the_online_photographer/2014/11/one-camera-one-lens-one-year-the-digital-version.html https://theonlinephotographer.typepad.com/the_online_photographer/2009/05/a-leica-year.html https://theonlinephotographer.typepad.com/the_online_photographer/2009/05/why-it-has-to-be-a-leica.html https://www.35mmc.com/22/02/2022/the-leica-for-a-year-project-by-patrick-medd/
https://oneida.bandcamp.com/ drummer: [[John Colpitts]]
2019-08-15 Turns out you can log into the https://www.onkyomusic.com site with the same credentials as the https://us.7digital.com site, since I believe it is all powered by 7digital anyway.
[[openmediavault - The open network attached storage solution|https://www.openmediavault.org/]] > openmediavault is the next generation network attached storage (NAS) solution based on Debian Linux. It contains services like SSH, (S)FTP, SMB/CIFS, RSync and many more ready to use. Thanks to the modular design of the framework it can be enhanced via plugins. openmediavault is primarily designed to be used in small offices or home offices, but is not limited to those scenarios. It is a simple and easy to use out-of-the-box solution that will allow everyone to install and administrate a Network Attached Storage without deeper knowledge.
https://en.wikipedia.org/wiki/Opportunistic_TLS > Opportunistic TLS (Transport Layer Security) refers to extensions in plain text communication protocols, which offer a way to upgrade a plain text connection to an encrypted (TLS or [[SSL]]) connection instead of using a separate port for encrypted communication. Several protocols use a command named "STARTTLS" for this purpose. It is primarily intended as a countermeasure to passive monitoring.
This past weekend I ordered the [[As Time Goes By]] Complete Series 1–9 on PAL format (11 DVDs) from Amazon. This was a fraction of what the NTSC converted discs would have been, and we can rip them in [[HandBrake]] to 25fps files, the way nature intended them to be watched.
https://github.com/oantolin/orderless > This package provides an `orderless` //completion style// that divides the pattern into space-separated components, and matches candidates that match all of the components in any order. Each component can match in any one of several ways: literally, as a regexp, as an initialism, in the flex style, or as multiple word prefixes. By default, regexp and literal matches are enabled. [[Recommended|https://org-roam.discourse.group/t/finding-nodes-using-multiple-tags/1615/2]] by [[nobiot]] on the [[org-roam]] forum. To use it in [[Doom Emacs]], add it to `packages.el`: ``` (package! orderless :recipe (:host github :repo "oantolin/orderless")) ``` and to `config.el`: ``` (use-package! orderless :custom (completion-styles '(orderless))) ```
Holy crap: I finally realized I could use [[org-agenda]] to browse [[Org-Journal]] entries (and anything else [[org-mode]]-related). Why didn't I do this before?? This kind of setup can allow me to track stuff in my fiddly little individual log files like `health log.org`, `music to check out.org`, `TCB.org` (for tracking paying bills and stuff) AND show them all at a high level in context with other date-stamped things and regular [[Org-Journal]] entries. Holy cow.
Ohhhhhh. All this time I didn't know why I had so many buffers open all the time. It was because [[org-agenda]] opens a buffer for every [[org-mode]] file specified in `org-agenda-files`. If you leave the org-agenda buffer open and don't use `org-agenda-exit` (keybinding: `Z Q` in [[Doom Emacs]]) to exit org-agenda and kill the buffers it opened, then all those buffers hang around.
After two weeks of not using [[org-mode]], I'd already forgotten how I invoked `org-capture`: `SPC` `X` And then whatever lowercase letter for the capture template needed.
Before expanding on it, I stole this tiddler from [[Jack Baty|https://rudimentarylathe.org/#Org-Journal]], like I do half the stuff in here. Org-Journal could turn out to be a real rabbit-hole for me. Day One is a great app, but it has started to feel so //heavy// in recent years. And every time I load up the Mac app, I just don't love the way it presents all the latest entries. But I could get very into a journal that looks like [[this|https://www.emacswiki.org/emacs/OrgJournal]]. from https://github.com/bastibe/org-journal > The built-in search is available through the following function: `org-journal-search` (`C-c C-s` in `org-journal-mode`). By default, it will ask for the time interval to search within (accepting the `org-read-date` format such as “-1y” or “-1m”) and the string to search for. Given a prefix argument (`C-u org-journal-search`), it will go through the whole journal. <<< * `C-c C-f` - go to the next journal file. * `C-c C-b` - go to the previous journal file. <<< Spacemacs keybindings: https://github.com/borgnix/spacemacs-journal Resources: * https://www.reddit.com/r/emacs/comments/8kz8dv/tip_how_i_use_orgjournal_to_improve_my/ * https://www.emacswiki.org/emacs/OrgJournal
I was going to set up [[Org-Journal]] in [[Doom Emacs]], but I'm going to have to pick this up later. I just saw this from [[BSAG - But She's a Girl]]: https://www.rousette.org.uk/archives/doom-emacs-tweaks-org-journal-and-org-super-agenda/ > The bindings built in to `org-journal` conflict with the `evil` mappings used in Doom Emacs. I therefore added some custom bindings to the `SPC` leader mapping and also to the `calendar-mode-map` to fix this. Shit! This is why I knew better than to get into this! Oh well.
Yes, I'm crazy. Have to figure this out because it's bugging me. Examples below. !! Scope * This is for "dumb" text timestamps in headlines, for me, not real Org-Mode timestamps that link to Agenda items. * This does not take into account how TextExpander shortcuts figure in for data entry, or how nice it would be if "630a" could expand to "6:30 AM". * Some people would probably break these tags out into individual .org files but I'm mashing them all together in Org-Journal. * All entries—even ones without text in the Notes section—will have a blank line at the bottom, which appears to be part of creating a new entry. That’s fine, because when all the entries on 1 day are expanded, they’re all separated by a blank line, making them easier to read. !! Ideas * Jack Baty doesn't use timestamps in Org-journal. [[link to Micro.blog thread here]] * Maybe cheat and see what Dr. Drang uses. * All I know is that I'm keeping the "`** `" prefix. None of these are going to be great if some have timestamps and some don't, but if we assume that some do (because I'm not going to pad the no-timestamp ones with spaces): ``` ** 0630 this that ** 0900 annual physical exam w/Dr :health: ** no timestamp here about something I did ** 1030 ok more things ** another no-timestamp entry here ** 1910 ate stuff... :dinner: ** 2215 Sixpoint Resin... :beer: ``` or ``` ** 630a this that ** 9a annual physical exam w/Dr :health: ** no timestamp here about something I did ** 1030a ok more things ** another no-timestamp entry here ** 710p ate stuff... :dinner: ** 1015p Sixpoint Resin... :beer: ``` or ``` ** 6:30 am this that ** 9:00 am annual physical exam w/Dr :health: ** no timestamp here about something I did ** 10:30 am ok more things ** another no-timestamp entry here ** 7:10 pm ate stuff... :dinner: ** 10:15 pm Sixpoint Resin... :beer: ``` or ``` ** 6:30 AM this that ** 9:00 AM annual physical exam w/Dr :health: ** no timestamp here about something I did ** 10:30 AM ok more things ** another no-timestamp entry here ** 7:10 PM ate stuff... :dinner: ** 10:15 PM Sixpoint Resin... :beer: ``` And then there's this possibility, but, just, no. It is the cleanest, but it makes the no-stamp items look subordinate to the stamped ones, and all that space between the `**` and the text doesn't feel right for each headline on its own: ``` ** 0630 this that ** 0900 annual physical exam w/Dr :health: ** no timestamp here about something I did ** 1030 ok more things ** another no-timestamp entry here ** 1910 ate stuff... :dinner: ** 2215 Sixpoint Resin... :beer: ```
https://orgmode.org
https://orgmode.org/manual/The-date_002ftime-prompt.html > The actions of the date/time prompt may seem complex, but I assure you they will grow on you, and you will start getting annoyed by pretty much any other way of entering a date/time out there. To help you understand what is going on, the current interpretation of your input is displayed live in the minibuffer. Well that is certainly true.
[[Org-mode features You May Not Know - Bastien Guerry|https://bzg.fr/en/some-emacs-org-mode-features-you-may-not-know/]] Here's a good one: `C-c C-^` to move to the root of the element
Most of the ones I use all the time are in [[2019-09-01 Sacha Chua: Outlining Your Notes with Org]]. Also (in [[Doom Emacs]]): |`SPC m h`|`org-toggle-heading`|convert headings to normal text, or text/items to headings|
https://github.com/jethrokuan/org-roam > Org-roam is a rudimentary [[Roam]] replica built around the all-powerful [[org-mode]].
via [[Jack|https://rudimentarylathe.org/#Monday%2C%20May%2004%2C%202020]] https://org-roam.discourse.group/ Riiiiiight when [[Roam]] is having day after day of people getting their data mangled (according to the Roam [[Slack]]), this great [[org-roam]] [[Discourse]] forum starts up. And yep, I agree that Alan's idea about [[custom Roam-style links|https://org-roam.discourse.group/t/custom-roam-style-link/39]] looks incredible, although I haven't read it slowly enough to fully get it. You know what I //don't// see in this forum? People nervously reloading the app, mysteriously losing bullets, and doing other voodoo to keep from corrupting their data. I know, I know, Roam will figure all this stability stuff out eventually. But dang. Posts like Alan's, with screen recordings of nimble Emacs installations, that's my weak spot!
https://www.reddit.com/r/orgmode/comments/dbsngi/finally_solving_the_lack_of_a_treeview_navigation/ https://github.com/alphapapa/org-sidebar > A helpful sidebar for Org mode Holy //moly//. This is kind of like what's in the [[Video: "Emacs for Writers" with Jay Dixit]].
Ohhhhh. Now I see why it's good to set [[org-mode]]'s `org-tags-column` to 0: It puts one space between the end of the headline and the start of the tags, instead of having them hang out on column 80. Makes it much easier to see what tags go with which headlines, and also the ellipses aren't forced to be way out on the edge of the screen. https://stackoverflow.com/questions/21340741/how-can-i-control-in-org-mode-the-distance-of-tags-from-the-text-they-apply-to > If this number is positive, it specifies the column. If it is negative, it means that the tags should be flushright to that column. For example, -80 works well for a normal 80 character screen. When 0, place tags directly after headline text, with only one space in between.
Via [[Jack Baty|https://rudimentarylathe.org/#organice%20for%20org-mode]]: https://github.com/200ok-ch/organice > An implementation of Org mode without the dependency of Emacs - built for mobile and desktop browsers
[[Orger: plaintext reflection of your digital self – beepb00p|https://beepb00p.xyz/orger.html]] > Mirror your personal data as [[org-mode]] for instant access and search
* how do you define a bunch of :tags: to have them ready to go? * make systemwide keyboard shortcut to add new journal entry to today from anywhere * How do you select a bunch of words all at once?
[[Orgro: A mobile Org Mode file viewer|https://orgro.org/]] Bought. It's nice that it's stripped down, but the in-file search is crude and it can't search across files at all. And you can't select text and copy it to the clipboard, which is a big downer. But I like that it's view-only, so it seems to me that it wouldn't corrupt your files. Overall, though, [[Editorial]] is still more practical even though it doesn't understand [[org-mode]] and thinks it's all just text.
[[Oscilloscopes For Audio 101 - Part 2 - Safety and Precautions - YouTube|https://www.youtube.com/watch?v=zhON9mAL2KA]] by [[Blueglow Electronics]] Incredibly helpful. Probably the most important notes I took: <<< Only ever work within a piece of equipment with the cover off with one hand. Keep the other hand away, not holding the chassis, completely away. Sit on it if you must! Working with both hands can complete a circuit path through your body from one hand to the other, right through your chest & heart. Same as using a defibrillator on a healthy person. [img[https://twelvety.com/philtiddlywiki_images/2021-01-19-oscilloscope-safety.png]] Getting shocked with one hand will hurt but likely won't kill you. Be careful of incidental contact with a component with the other side of your hand or little finger, not what you are focused on. Take your time and be diligent about what you are doing. <<<
https://otter.ai 2019-05-25 This is an unbelievable speech-to-text app/service. Even smarter than the [[Google Cloud Text-to-Speech]] voice typing built into Google Docs in Chrome. I've been using the iOS app to record snippets of podcasts that I want to transcribe to TiddlyWiki, like in the [[2019-05-20 Debbie Millman worries about wasting her life]] tiddler. I just play the [[Overcast]] snippet in Safari and hold the bottom of the phone up to the MacBook's speaker and let it rip. I can also just record my own voice reading [[bullet journal|2019-04-22 bullet journal experiment]] entries. When it's done processing the audio, I go to the otter.ai website and make whatever cleanup edits I need there. The privacy parts of it are not totally without concern, as mentioned in this thread, but the company at least seems like it wants to do the right thing: https://twitter.com/spacedoutsmiles/status/1131941546234925056 As long as I'm not putting sensitive stuff in it, I don't care. I'll delete things when I'm done and that'll suit me. You have to pay if you go over the 600-minutes-a-month limit, but I'm not going to get anywhere near that, I'm sure. I wouldn't mind giving them some money, though. I wish they had an option to pay for what you need.
This [[quote|https://rudimentarylathe.org/#Sunday%2C%20March%2022%2C%202020]] from [[Jack Baty]] has been rolling around in my head: > Working on ways to focus on the output rather than the systems getting me there. I could use a dose of that. And it meshes well with a mention he made about [[Curio]]: > Well shit, I just opened an old [[Curio|https://rudimentarylathe.org/#Curio]] document to look something up and was able to instantly grasp an overview of the entire project and spotted some helpful tangential files. This reinforces my suspicion that I work best with visual tools. This helps explain why I find actually //working// in text/markdown/org files to be harder and/or less effective. Like, do I think all these epidemiologists who are suddenly celebrities now are worried about [[Markdown]] vs. [[org-mode]]? Wouldn't they gravitate more towards something like [[Curio]] and PDF files and just get on with their work?
https://overcast.fm I've been using Overcast to listen to podcasts since it was first released. I just recently noticed the "Play Next" function, which queues up the selected episode to play after the one you're listening to. I wish I had been using it earlier, because it makes driving a car safer, since I don't need to pull over (which I would actually do) to find the next thing I want to listen to when the current episode ended. By doing this, it also encourages me to listen to better stuff out of all the downloaded bits, because the past me that's a notch smarter about future things than present me is more apt to pick something deeply good than the thing that looks the most flashy or sensational or seductive in the moment. I need to adopt a similar habit in Instapaper, where I just read the next thing in order and don't second guess it.
https://ownyourgram.com/ This service lets you automatically post to Micro.blog from Instagram. You enter your IG username on your Account page on Micro.blog, and it authenticates through IG.
[[dakrone/ox-tufte: Emacs' Org-mode export backend for Tufte HTML|https://github.com/dakrone/ox-tufte]] > This is an export backend for [[Org-mode|org-mode]] that exports buffers to HTML that is compatible with [[Tufte CSS]] out of the box (meaning no CSS modifications needed).
https://appmakes.io/paletro <<< !! Command Palette !!! in any applications on macOS With ''Paletro'', by pressing `⬆️ ⌘ P`, you have access to all of the functionality of current focused app, including keyboard shortcuts for the most common operations. <<< On [[Setapp]], of course! Already immediately handy in [[Drafts]], where I wanted to quickly toggle Link Mode on and off, but there was no keyboard shortcut for it.
[[RF-B11 Radio Panasonic, Matsushita – radiomuseum.org|https://www./r/panasonic_rf_b11.html]] from 1995
https://pandoc.org > If you need to convert files from one markup format into another, pandoc is your swiss-army knife.
From Jack: https://micro.blog/jack/9747278 > And if you're feeling brave, I've used the following one-liner using pandoc to convert a folder of .md files to Org mode files :). Not perfect but a good head start. ``` find . -name \*.md -type f -exec pandoc -f markdown -t org -o {}.org {} \; ``` Very handy! And how have I not installed [[pandoc]] until now?
http://www.panosalexiadis.com/ > Panos Alexiadis (1985) is a sound artist based in Athens, Greece mainly working with electronics and magnetic tape. His approach to sound lies between composition and improvisation, all merged in long form built structures of synthetic and acoustic textures, evolving a sense of wandering in an introverted semi – abstract sound environment. [img[https://twelvety.com/philtiddlywiki_images/2021-09-14-alexiadis-documenta.png]] Heard his incredible "Katabasis Pt. I" (excerpt) on the 2021-09-02 [[Strength Through Failure]]. The [[EMS Synthi 100]] in the photo belongs to The [[Contemporary Music Research Center (KSYME-CMRC)]] in Athens.
https://paperlike.com/ > Fall in love with drawing and writing on your iPad like on paper. and blog post: [[The Paperlike 2 with Nanodots: a Dream Come True for iPad & Apple Pencil Users|https://paperlike.com/blogs/paperlikers-insights/the-paperlike-2-with-nanodots-a-dream-come-true-for-ipad-apple-pencil-users]]
https://www.paprikaapp.com/ > Paprika is an app that helps you organize your recipes, make meal plans, and create grocery lists. Using Paprika's built-in browser, you can save recipes from anywhere on the web. I keep forgetting that it can //automatically create timers// based on the recipe instructions.
[[Paradigm shifts for the decentralized Web – Ruben Verborgh|https://ruben.verborgh.org/blog/2017/12/20/paradigm-shifts-for-the-decentralized-web/]] <<< In this blog post, I will discuss three paradigm shifts we need to prepare for if we want to build Web applications with a decentralized mindset: # ''End users become data controllers''. This is the most well-known decentralization aspect: we store our data in places of our choice, which improves privacy and control. # ''[[Apps become views]]''. As apps become decoupled from data, they start acting as interchangeable views rather than the single gateway to that data. # ''Interfaces become queries''. Data will be distributed across highly diverse interfaces, so sustainable apps need declarative contracts instead of custom data requests. <<< via [[Ton Zijlstra]] in [[Decentralise All The Things! – Interdependent Thoughts|https://www.zylstra.org/blog/2018/07/decentralise-all-the-things/]]
[img[http://twelvety.com/philtiddlywiki_images/2021-12-12-parasound-zpre3-preamp.jpg]] https://parasound.com/zpre3.php [[2021-12-12|2021-12-12 Journal]] Ordered from https://www.safeandsoundhq.com via Amazon.
Amazing! Based on [[Turndown|https://github.com/domchristie/turndown]]: https://euangoddard.github.io/clipboard2markdown/ <<< ! Instructions # Find the text to convert to Markdown (e.g., in another browser tab) # Copy it to the clipboard (Ctrl+C, or ⌘+C on Mac) # Paste it into this window (Ctrl+V, or ⌘+V on Mac) # The converted Markdown will appear! <<<
''patriarchate'' |ˈpeɪtrɪɑːkət| noun the office, see, or residence of an ecclesiastical patriarch: //the patriarchate of Constantinople | they used the prestige of the patriarchate to wield political influence.//
Now [[Patrick La Roque]] has me wanting to buy an [[HP Tango]] photo printer: [[The Shoebox Project — laROQUE|https://www.laroquephoto.com/blog/2021/3/23/shoebox-project]] > Why do it myself instead of using a printing service? That paper, for one. I’ve never found a single shop that offers paper I like for small prints. But also because, as I said earlier, for me, the joy comes from creating these, slowly, on my own time. It feels like craftwork and connects me to the printed images.
[[On Keeping A Daily Log – Rhoneisms|https://www.patrickrhone.net/on-keeping-a-daily-log/]] by [[Patrick Rhone]] > Many thoughts/moments/events end up in the log that were not planned or things that “just happened”. > > Because of this habit, I can recall the important details of any day in the past 15 years or so. I can even tell you how I slept the night before for the past five (when I began tracking that). There are too many times to count where having past information in such detail at hand has saved my bacon (//“I sent that check on…”, “I called on {date} and spoke to…”//) like a [[daybook]]
https://twitter.com/ftrain
I've linked to this piece about [[Paul Ford]] before, but today [[Jack|Jack Baty]] reminded me of it and new things about [[Emacs]] and [[org-mode]] jump out at me. https://usesthis.com/interviews/paul.ford/ > Emacs is hard to learn, and Org mode is harder, but taken together they offer a sustainable way for me to do things. I've used Emacs for decades and it's possible I will continue to use it until I die; it is a lifelong piece of software. Like Unix, it has been around as long as I have, and keeps evolving. ... > Note that I do not claim that all of this makes me more //productive//, merely that it makes things more //searchable//. I don't see computing as a way to be productive as much as I see it as a space to be thoughtful. And I really do like things to be nicely searchable and linkable.
When I have a few minutes to kill (ahem) on the phone, if I want to avoid getting sucked in by Twitter, I'll google stuff about [[org-mode]]. Lately I've been googling "[[Paul Ford]] org-mode", and today I found his http://tilde.club/~ford/ home page. I really like what and how he wrote the "October 12, 2014" entry, which is how he wrote a lot of them, in a giant outline of nested thoughts. It was a calm way to read his memories about his friend who had just passed away.
Saw her mentioned on the [[Broadcast]] Facebook fan page: from [[Inclusive Listening: 8 artists on the wide-reaching legacy of Pauline Oliveros|https://thevinylfactory.com/features/pauline-oliveros-legacy-deep-listening/]] – [[The Vinyl Factory]] > In 1965, pioneering experimental composer, performer and educator Pauline Oliveros released ‘Bye Bye Butterfly’. The piece opens out quietly at first: sharp, oscillating frequencies gradually arresting and compacting all surrounding noise to create a tunnel of solitary, vivid sound. Almost instantly, you are absorbed. Most importantly, you are fully listening. > > Recorded with a set-up of two oscillators, two line amplifiers, two tape recorders set to delay, and a record player with a copy of [[Puccini]]’s opera [[Madama Butterfly]], Oliveros manipulated and improvised around the composition to create a piece that now, five decades later, remains haunting, visionary and futuristic.
Taking [[Andrew Canion]]'s lead, I'm making a People page to remember (and share with anyone interested) who is who and why I like to follow what they're doing: * [[Jeremy Ruston|https://jermolene.com]]: inventor and main developer of [[TiddlyWiki|https://tiddlywiki.com]] * {{BSAG - But She's a Girl}} * [[Jack Baty]] * [[Andrew Canion]] * [[h0p3]] * [[Sphygmus]] * [[Jay Dixit]] * [[Amit Gawande]]: curious about TiddlyWiki * [[Brad Enslen]]: curious about TiddlyWiki * [[stefp]]: curious about TiddlyWiki * [[Fabio Roberti]] * [[Matthew Finlayson|https://micro.blog/Mattfinlayson]]: [[installed TiddlyWiki on 2019-01-29|https://micro.blog/Mattfinlayson/2074846]] * [[Beck Tench]] * [[Josh Sullivan]]
https://en.wikipedia.org/wiki/Perfect_is_the_enemy_of_good > ''Perfect is the enemy of good'', or more literally ''the best is the enemy of the good'', is an aphorism which is commonly attributed to Voltaire, who quoted an Italian proverb in his //Dictionnaire philosophique// in 1770: //"Il meglio è l'inimico del bene".//
https://software.charliemonroe.net/permute/ > Video, audio and image files come in many different kinds and shapes, but sometimes you need a specific format since your iPad or DVD player won't play that video. That is what Permute is for - easily convert your media files to various different formats. On [[Setapp]].
https://web.archive.org/web/20150208030139/petebridgwood.com/wp/2014/10/x-trans-sharpening/ <<< I have found that the key difference between Raw files from conventional sensors and Raw files from X-Trans is that they favour different DETAIL slider settings: part of the sharpening control set within the DETAIL panel of the DEVELOP module. Whereas conventional sensors usually favour a relatively low DETAIL slider setting and risk introduction of artefacts with very high detail settings, for X-Trans files, the reverse is true; they favour a high DETAIL slider setting and do not suffer anywhere near as much from introduction of artefacts. In fact, with X-Trans files, you’ll see more trouble from artefacts (albeit different ones) at lower detail settings. To anyone who has spent time processing conventional (Bayer array sensor) Raw files, this is completely counter-intuitive. The DETAIL slider affects how Lightroom processes and emphasises fine details. It does this by changing the bias of which sharpening algorithms are being used. X-Trans files can take a lot of capture sharpening and they like a specific mathematical method known as ‘deconvolution’ sharpening. For my landscape work I find that most images work best with the DETAIL slider set all the way over to the right at 100; my understanding is that when the DETAIL is set to 100, Lightroom uses ‘deconvolution’ algorithms in preference. <<< ''Hot damn.'' I don't know how this guy figured this out, but it works. It's a shame that this is only available on archive.org anymore, but at least it's there. Applying this technique to [[Fujifilm X100T]] RAF files in [[Adobe Lightroom Classic]], I can effectively match the detail and sharpness of JPGs rendered by the camera's RAW converter. If there's any wormy/watercolor effect left in LR, my old eye can't see it now. I like this setting of his the best: > X-Trans SHARP : Amount 25, Radius 1.0, Detail 100, Masking 10.
https://www.peterturnley.com/ My god: <iframe src="https://www.instagram.com/p/Ca6-cwQo8Xa/embed" width="400" height="480" frameborder="0" scrolling="no" allowtransparency="true"></iframe>
This looks good: [[Phil Lynott]]: [[Songs for While I'm Away (Trailer)|https://youtu.be/DiihFusQGNk]] <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//DiihFusQGNk' frameborder='0' allowfullscreen></iframe></div>
* 2019-04-19 Upgrading to Mojave from Sierra. Saying a silent prayer. ** Worked great! And Day One v3 is really nicer than the 2.x version! ** Gave Backblaze "Full Disk Access" in System Preferences. ** Followed these steps to let TextExpander work again: https://smilesoftware.com/blog/entry/textexpander-macos-10-14-mojave-and-accessibility Apple sure is hobbling the OS out of the box. * Used macOS System Preferences to override the `⌘T` keyboard shortcut for "Show Fonts" in [[Photos.app]] with one that does "Adjust Date and Time..." instead. This is so I can easily change the dates of scanned photos of [[bullet journal|2019-04-22 bullet journal experiment]] pages (which then get imported into Day One).
https://www.filmomat.eu/photoplug > The PhotoPlug is a small light sensitive sensor which plugs into the headphone-jack of your smartphone. Together with the Shutter-Speed App (available FREE on the iOS and Android AppStore) it transforms your smartphone into a optical shutter speed tester for analog cameras. I need this!
https://pika.page/ > Pika is a pretty good blogging platform by the people at Good Enough. It’s pretty and easy and pretty easy. You should try it!
http://pikapods.com > Instant Open Source App Hosting > Run the finest Open Source web apps from just $1/month
[img width=60% [http://twelvety.com/philtiddlywiki_images/2021-12-07-pioneer-sb-bs41-lr.jpg]] https://www.stereophile.com/content/pioneer-sp-bs41-lr-loudspeaker
https://bluemooncamera.com/ (under Shop > Darkroom Enlargers)
https://plainorg.com/ > Bring org to your iPhone
https://www.plex.tv/ > Plex brings together all the media that matters to you. Your personal collection will look beautiful alongside stellar streaming content. Enjoy Live TV & DVR, a growing catalog of great web shows, news, and podcasts. It's finally possible to enjoy all the media you love in a single app, on any device, no matter where you are.
Mentioned by Emily Hokett on her blog: https://www.emilyhokett.blog/june-pause-for-joy/ * https://plotterusa.com/leather-binders/ * https://plotterusa.com/the-joy-of-plotter-a-system-techo-to-start-the-year/ * https://plotterusa.com/what-is-plotter-analog-method/
It's rare that I miss an episode of these: * Hurry Slowly * Micro Monday * Nerds On Draft * Slate's Political Gabfest * Stay Tuned with Preet * Unwound
''pogrom'' |ˈpɒɡrəm, ˈpɒɡrɒm| noun an organized massacre of a particular ethnic group, in particular that of Jews in Russia or eastern Europe: //the Nazis began a ''pogrom against'' Jewish people in Germany.//
https://getpolarized.io <<< We make it easy to manage your reading. A powerful document manager for web pages, textbooks, PDFs, and anything you want to read. Supports tagging, annotation, highlighting and keeps track of your reading progress. <<< I am so curious about this, although I don't need yet //another// place to lose PDFs and other reading material. But this [[incremental reading|https://getpolarized.io/docs/incremental-reading.html]] idea seems so cool.
[[Kicks Condor]] posted [[Gardens and Streams|https://www.kickscondor.com/links/gardens-and-streams/]] with a link to an [[IndieWebCamp]] [[video conference|https://archive.org/details/gardens-and-streams-wikis-blogs-and-ui-popup-indie-web-camp-session-2020/GardensAndStreamsWikisBlogsAndUI-SpeakerView-PopupIndieWebCampSession-2020.mp4]] between [[Chris Aldrich]], [[h0p3]], [[Neil Mather]], [[Ian Jones]], [[Anne-Laure Le Cunff]] and others about [[wikis]] and [[IndieWeb]] stuff. I thought I was finally going to get to see what h0p3 looked like, but I should have known better! :) I haven't listened to the whole thing, but it seems interesting and I like what Chris Aldrich said about the "Publish" button making bloggers feel like they have to get blog posts to this polished, final state, and wikis remove that barrier. They used [[Etherpad]] to take collaborative notes. I wish we could use this at work. I know my [[TiddlyWiki]] would be more interesting if it were the only wiki I used, but there's too much non-public/diary stuff I want to put into [[Obsidian]] first, so the TW remains a second-class mirror.
https://www.postbox-inc.com Mentioned by [[Jack|https://rudimentarylathe.org/#Postbox]]. It's quite good, and lets you use the Gmail keyboard shortcuts. I didn't know until tonight that when you're in a thread, you can press `n` to go to the next message or `p` to go to the previous one, and `return` to expand the message. 2019-03-15 installed. 2019-04-15 I don't think I'm going to buy the license. It's a powerful email app, but an order of magnitude more powerful than what I need. And it's too easy to not find things that I know are there when I search for them (mostly due to user error). As ugly as Gmail on the web is, at least I know that I'm looking at canonical Gmail when I use it, and it's so much faster (of course) than any 3rd-party client. Also, I keep tripping over how to navigate threads in Postbox. With Gmail on the web, I never think twice about it.
The plastic press-fit reel pulleys are the most commonly failing parts in the [[Fostex R8]]. I've now gone through two of them. You can't get replacements, and even if you could, the design flaw in them means they will crack again eventually. Potential workarounds are: * Using a glob of J-B Weld on top of the pulley to hold it in place on the stainless steel shaft. * This guy's smart idea of using [[Du-Bro 3/16" plated brass Dura-Collars|https://www.dubro.com/products/nickel-plated-dura-collars?variant=27880685191]] to hug the cracked pulley. As he noted in a comment reply, "...there is a lot of back and forth torque action on these parts. I just can't see any kind of glue holding on to that small polished steel shaft under these conditions for the long term." Although I wonder if he'd just used a larger one if he could have avoided having to drill out a bigger hole. *# https://www.youtube.com/watch?v=jACI_SIcJSk *# https://www.youtube.com/watch?v=Mn1iatn8Mzo And on that 2nd video, this commenter's ''even better idea of just using a 1/4-20 hex nut'': > After watching it I came up with a 3rd fix. I figured if I could twist a standard nut onto the plastic post it would serve the same purpose. Luckily, it turns out that a 1/4-20 hex nut will thread itself just enough to squeeze the hairline crack perfectly to allow the pulley to install over the motor shaft. Obviously, the cool part is this approach avoids all those steps you presented using the brass collar. I didn't push my luck by trying to run it all the way down, just enough to seat it strongly. I may add some adhesive or epoxy later, if it fails, but so far it runs beautifully. I really like that plan because it spreads the force 360º around the pulley instead of having two single radial forces on it. I wonder if an alloy or carbon steel nut having a less slick surface would grab the plastic pulley shaft better. Also wonder if the nylon collar in a stainless steel locking nut would hold better or worse than that. Easy enough to test. ''Update:'' The 1/4-20 hex nut (non-locking) TOTALLY WORKED.
https://www.health.harvard.edu/a_to_z/presbyopia-a-to-z > Nothing can be done to prevent presbyopia. It is an inevitable part of aging. Great.
2021-10-15 Starting this to take notes and throw out questions as they pop into my head as I figure out how to process [[Fujifilm X100T]] images to a good-enough degree. This is getting to be a problem for my brain. !!! Found * How [[Kevin Mullins]] edits his [[color|https://www.f16.click/blog/tips/how-i-edit-my-colour-images-with-lightroom.html]] and [[black and white|https://www.f16.click/blog/tips/black-and-white-editing-with-lightroom.html]] Fujifilm images in Lightroom (not sure what version). He doesn't appear to be worried about X-Trans demosaicing. * [[Kevin Mullins JPEG settings]] - he still relies on the in-camera jpegs (of course, he's not shooting much X100-series stuff anymmore) * [[Kevin Mullins]]: [[Editing Fujifilm JPEGs|https://www.f16.click/blog/tips/editing-fujifilm-jpegs.html]] * ''The jackpot:'' [[Pete Bridgwood: Sharpening X-Trans Files in Adobe Lightroom]]. This is the key to avoiding the watercolor/wormy artifacts from X-Trans sensors when dealing with RAF/RAW files in [[Adobe Lightroom Classic]]. !!! Requirements * I will not create 97MB .DNG copies of 34MB Fujifilm .RAF files in [[Capture One 21 Express Fujifilm]], no matter how good it is as processing the initial files. !!! Experiments * Ok, if I overexpose when I shoot, there's not much latitude (or precision) to tone it down with the in-camera RAW converter. Lightroom handles that way better.
2019-05-17 Searched for "projects" in the [[Reddit r/bujo forum|https://www.reddit.com/r/bujo/]]: Checking these out: * https://www.reddit.com/r/bujo/comments/ausyg4/so_how_do_you_manage_projects_in_bujo_software_in/ ** https://www.reddit.com/r/bujo/comments/96dht8/trying_out_the_kanban_board_in_my_bujo_to_track/?st=JSL7IMF4&sh=3423f791 ** https://minimalplan.bigcartel.com/product/3-month-projo-pack-pack-3-mois ** https://www.instagram.com/minimal.plan/ ** http://minimal-plan.com/en/projo-the-project-journal/ * https://www.reddit.com/r/bujo/comments/basuaa/i_was_told_fo_post_this_here_as_well_im_an_it/ * https://www.reddit.com/r/bujo/comments/bjb3ap/what_are_some_good_logstrackers/
2020-05-11 I don't have anything but my own observations to go on, but when there are a lot of people working on a project, especially when you get to like an "enterprise" level, more than once I've seen slide deck after slide deck, and PDF and Visio and screenshot and Word doc and you-name-it, presented and shared by multiple different people, who are all listing out dates and milestones and phases of the same project but from different perspectives and domains, and I feel certain that they're spending a significant portion of their weeks just syncing up dates with each other. There are at least three problems here: * X number of people multiplied by Y hours/week copying and pasting a bunch of dates and adding no value as they plop a bunch of dates into documents * All those dates are static, dumb characters that don't update themselves * Every time that copy and paste happens, it's an opportunity for an error, and that error can propagate I don't know where to begin with this problem, but there's gotta be a way I can at least not add to the madness with my own documents.
<<< Almost everything about him is misunderstood, starting with his name. Ralph Vaughan Williams. //Ralph// is pronounced //Rafe// (“any other pronunciation used to drive him mad,” his wife Ursula cautioned), to rhyme with //safe// and //chafe//, words his detractors might apply to his music. //Vaughan// is not his middle name, so he is not referred to as //Williams//. The surname is //Vaughan Williams//, not hyphenated but fused just the same. Ralph Vaughan Williams. <<< Larry Rothe, //The Vaughan Williams Brand//, [[San Francisco Symphony|https://www.sfsymphony.org/Watch-Listen-Learn/Read-Program-Notes/Articles-Interviews/The-Vaughan-Williams-Brand.aspx]]
https://protomartyr.bandcamp.com
From: [[Where should I keep my personal files while keeping the pathname short? — askubuntu.com|https://askubuntu.com/questions/707688/where-should-i-keep-my-personal-files-while-keeping-the-pathname-short]] <<< What is the purpose of these directories? * lib: kernel modules and those shared library images (the C programming code library) needed to boot the system and run the commands in the root filesystem * etc: configuration files * var: files to which the system writes data during the course of its operation * tmp: temporary files * mnt: the temporary mount points for mounting storage devices <<<
https://www.qobuz.com/ It started so innocently. This morning during an idle five seconds, I thought, "Well, I should follow AudioQuest on Twitter because maybe they'll post pictures of the [[AudioQuest Dragonfly Red]] frequently enough that I'll give in and get one someday", and the FIRST thing I tapped on was their retweet of Engadget saying "[[Qobuz ditches MP3-quality streaming for a single hi-res plan|https://twitter.com/engadget/status/1193916784488992769]]". Oh shit. That lower-quality, lower-priced Qobuz offering was what always kept me hooked to [[Spotify]]. Why bother stepping up to the $20/month plan for streaming CD-quality lossless when that's almost two actual purchases of 44.1/16 album downloads? But now they've changed the CD-quality //plus// Hi-Res tier (Studio Premier) to $15/month for the first 100,000 people until 1/31/2020. Well, that's awfully hard to turn down, especially given the limited-time-offer factor (devious of them). I tried it this morning and it's wonderful, of course. The only "problem" with it is that the library is so overwhelming and the descriptions of multiple versions of the same album doesn't always make it clear whether something is a "40th anniversary remaster" (ugh) or an original master from whenever the album first came out. But that's a good problem to have. I do have to be aware of the lack of feeling of "investment" with this, just like I've noticed with Spotify. When I buy a download, I feel more responsible for getting the most out of it. With a streamed album, there's less pressure and no ownership. But the funniest and maybe most common way I could see using Qobuz is to listen to CDs I already own but haven't gotten around to ripping yet. Can't wait to get home and try it with [[Roon]] tonight. Also, the [[Sony NW-A45 hi-res audio player]] doesn't get to play in the Qobuz sandbox. [[Darko.audio]] is making me re-evaluate the need for a dedicated DAP, as in their [["DAP days are over" series|https://darko.audio/?s=dap+days]]. Which is making me look at the Dragonfly Red even harder (not that I need another toy). The Dragonfly can take full advantage of the Hi-Res audio on an iPhone that the onboard DAC can't. But do I really want to be the guy at work hogging the guest wireless network with Hi-Res streams?
As of 2020-08-01 these were my saved albums in Qobuz, sorted by Artist: """ Powerage AC/DC Highway To Hell AC/DC '74 Jailbreak AC/DC High Voltage AC/DC Let There Be Rock AC/DC Toys In The Attic Aerosmith Alvvays Alvvays Mercury American Music Club Tanz der Lemminge Amon Düül II All Mirrors Angel Olsen Land of No Junction Aoife Nessa Frances Verve Jazz Masters 9 Astrud Gilberto The Bela Session Bauhaus Dreamy Beat Happening Vespertine Björk Selmasongs: Music From The Motion Picture "Dancer In The Dark" Björk Homogenic Björk Debut Björk Telegram Björk Post Björk Damaged Black Flag Black Lips Black Lips Parallel Lines Blondie The Freewheelin' Bob Dylan Bob Dylan Dandelion Albums and BBC Collection Bridget St. John Willy And The Poor Boys Creedence Clearwater Revival Deja Vu Crosby, Stills, Nash & Young Hunky Dory (2015 Remaster) David Bowie Dream with Dean Dean Martin Circle of Light (Original Electronic Soundtrack Recording) Delia Derbyshire and Elsa Stansfield All Descendents Liveage! Descendents Go Dexter Gordon You're Living All Over Me Dinosaur Jr. Dinosaur Dinosaur Jr. Bug Dinosaur Jr. Delaware Drop Nineteens Skit I Allt Dungen 4 Dungen Tio Bitar Dungen Echo & the Bunnymen Echo And The Bunnymen Crocodiles Echo And The Bunnymen Heaven Up Here Echo And The Bunnymen Eddie Gale’s Ghetto Music Eddie Gale Strategies Against Architecture Einstürzende Neubauten Rumours Fleetwood Mac Hocus Pocus - U.S. Version Focus This is Our Music Galaxie 500 On Fire Galaxie 500 Today Galaxie 500 The Big Shot Chronicles Game Theory The Dream Weaver Gary Wright Foxtrot Genesis Love & Peace Girma Yifrashewa Slow Riot for New Zero Kanada Godspeed You! Black Emperor Crappin' You Negative Grifters One Sock Missing Grifters Surrender Your Poppy Field Guided By Voices Bee Thousand Guided By Voices Alien Lanes Guided By Voices Ariadne auf Naxos Gundula Janowitz Dreamboat Annie Heart The Magic City Helium The Dirt of Luck Helium Holst : The Planets Herbert von Karajan Joy as an Act of Resistance. Idles Grippe Jawbox Unfun (2010 Remastered Edition) Jawbreaker Bivouac (Remastered) Jawbreaker Orange Rhyming Dictionary Jets To Brazil Blue World John Coltrane Crescent John Coltrane Quartet Plastic Ono Band John Lennon Fishing With John - Original Music From The Series By John Lurie John Lurie Closer Joy Division Unknown Pleasures Joy Division Substance 1977 - 1980 Joy Division I Am Beautiful June Bitter Kaleidobolt The Universe Smiles Upon You Khruangbin Hasta El Cielo (Con Todo El Mundo In Dub) Khruangbin Texas Sun Khruangbin & Leon Bridges Led Zeppelin II Led Zeppelin Hamilton (Original Broadway Cast Recording) Lin-Manuel Miranda Winning Losers Lou Barlow What's Going On Marvin Gaye Mountains Mary Timony Live At Newport McCoy Tyner The Real McCoy McCoy Tyner KIWANUKA Michael Kiwanuka Vivaldi: Le quattro stagioni / Albinoni: Adagio / Corelli: Christmas Concerto Michel Schwalbé The Legendary Prestige Quintet Sessions Miles Davis Quintet The Politics of Time Minutemen Paranoid Time Minutemen Two of Me Momma Biohazard Momma Double Dare Momma Viva Hate (Remastered) Morrissey Ace of Spades Motörhead Motörhead Motörhead Isn't Anything My Bloody Valentine Tremolo My Bloody Valentine Loveless My Bloody Valentine Glider My Bloody Valentine Pink Moon Nick Drake Five Leaves Left Nick Drake Networker Omni There Is No One What Will Take Care of You Palace Brothers The Comforts Of Madness Pale Saints Debussy: Preludes for Piano, Books I & II Paul Jacobs Slanted & Enchanted Pavement Peter Gabriel 4: Security (Remastered) Peter Gabriel Peter Gabriel 3: Melt (Remastered) Peter Gabriel Peter Gabriel 2: Scratch (Remastered) Peter Gabriel Peter Gabriel 1: Car (Remastered) Peter Gabriel Exploded Drawing Polvo Shapes Polvo Allegory & Self Psychic TV Dead Letter Office R.E.M. Life's Rich Pageant R.E.M. Reckoning R.E.M. Murmur R.E.M. Rising Rainbow Elkmont Rainsticks Nowhere (Expanded) Ride Caress Of Steel Rush Moving Pictures Rush 2112 Rush A Farewell To Kings Rush Fly By Night Rush Hemispheres Rush Permanent Waves Rush Moving Pictures Rush You Were Here Sarah Harmer Are You Gone Sarah Harmer Scott 2 Scott Walker Scott 3 (Édition Studio Masters) Scott Walker free sentridoh, songs from loobiecore sentridoh/lou barlow Bridge Over Troubled Water Simon & Garfunkel Peepshow Siouxsie & The Banshees Kingdom Come Sir Lord Baltimore Soda Pop Rip Off Slant 6 Sleater-Kinney (Remastered) (Édition StudioMasters) Sleater-Kinney Jazz Samba Stan Getz Gaucho Steely Dan Pretzel Logic Steely Dan Can't Buy A Thrill Steely Dan Peng! Stereolab Switched On Stereolab Couldn't Stand The Weather Stevie Ray Vaughan Suzanne Vega Suzanne Vega Mezcal Head Swervedriver Raise Swervedriver Future Ruins Swervedriver Folklore (Explicit) Taylor Swift Little Windows Teddy Thompson Terry Riley: A Rainbow in Curved Air & Poppy Nogood and the Phantom Band Terry Riley Cosmic Thing The B-52's The Band The Band The Cars The Cars Boomerang The Creatures Time Out The Dave Brubeck Quartet Dragnet The Fall Room to Live The Fall This Nation's Saving Grace The Fall Perverted By Language The Fall Grotesque (After the Gramme) [Expanded Deluxe Edition] The Fall Beauty And The Beat The Go-Go's See You Tomorrow The Innocence Mission Psychocandy (Expanded Version) The Jesus And Mary Chain Lovey The Lemonheads The Day the Politicians Died The Magnetic Fields Tim The Replacements Let It Be The Replacements Get Yer Ya-Ya's Out! The Rolling Stones Tattoo You The Rolling Stones Beggars Banquet The Rolling Stones The Queen Is Dead The Smiths The Smiths The Smiths Hatful of Hollow The Smiths Louder Than Bombs The Smiths Blind The Sundays Juvenilia The Verlaines Seamonsters The Wedding Present Who's Next The Who 'Live And Dangerous' Thin Lizzy 'Live And Dangerous' Thin Lizzy Jailbreak (Deluxe Edition) Thin Lizzy Thin Lizzy Thin Lizzy This Kind of Punishment This Kind Of Punishment 20 Jazz Funk Greats (Remastered) Throbbing Gristle Damn The Torpedoes Tom Petty And The Heartbreakers Swordfishtrombones Tom Waits Rain Dogs Tom Waits Nighthawks At The Diner Tom Waits Soul Jazz Records Presents APALA: Apala Groups in Nigeria 1967-70 Various Artists Abridged Perversion Various Artists A Charlie Brown Christmas (Remastered & Expanded Edition) Vince Guaraldi Violent Femmes Violent Femmes The Ideal Copy Wire Chairs Missing Wire Pink Flag Wire 154 Wire See How We Are X """
https://quarto.org/ <<< An open-source scientific and technical publishing system * Author using Jupyter notebooks or with plain text markdown in your favorite editor. * Create dynamic content with Python, R, Julia, and Observable. * Publish reproducible, production quality articles, presentations, dashboards, websites, blogs, and books in HTML, PDF, MS Word, ePub, and more. * Share knowledge and insights organization-wide by publishing to Posit Connect, Confluence, or other publishing systems. * Write using Pandoc markdown, including equations, citations, crossrefs, figure panels, callouts, advanced layout, and more. <<<
DANG this is cool shortcut if you use [[Google Docs]] and stuff: [[Use shortcuts to create new files - Google Workspace Learning Center|https://support.google.com/a/users/answer/9308871?hl=en]] <<< ''Open a new Google file in your browser'' In your browser, enter one of these URLs: * ''Docs'' ** docs.new ** doc.new ** document.new * ''Sheets'' ** sheets.new ** sheet.new ** spreadsheet.new * ''Slides'' ** slides.new ** slide.new ** presentation.new * ''Forms'' ** forms.new ** form.new <<<
These are the things I type after ⌘-space (invoking [[Quicksilver]]) that I can never seem to remember: |!sequence |!result | |tkb |open [[Things Keyboard Shortcuts|https://support.culturedcode.com/customer/en/portal/articles/2785159-keyboard-shortcuts-for-mac]] |
https://apps.apple.com/us/app/quine-2/id1450128957 > "Quine 2" - enables the popular wiki tool "TiddlyWiki" for use on iOS - it allows you to work with your wiki files in an integrated way, both locally and in the cloud. Google Group: https://groups.google.com/g/quine-app It doesn't want to let me grant permissions to save back to Dropbox – seems to be an iOS limitation – so I'll relent and try iCloud Drive. I wouldn't even care so much about writing back to it from mobile, except that you can't even render linked images in a nearby/enclosed subfolder without that permission.
from the Google Group: [[Quotes and Minimum Information Units as Tiddlers|https://groups.google.com/d/msg/tiddlywiki/nJVYWLmxEmk/7JuwEf8oCQAJ]]
I think that what's so comforting about these is: (a) I'm old, and (b) I can look at that army of surface-mounted resistors and *know* that that's where the music comes out (or is reconstructed). * https://www.tek.com/blog/tutorial-digital-analog-conversion-r-2r-dac * https://en.wikipedia.org/wiki/Resistor_ladder
https://kb.roonlabs.com/RAAT <<< We like to think of RAAT as AirPlay for Audiophiles. <<< <<< RAAT is plumbing. It gets the audio from point A to point B without screwing it up, and without bringing limitations to the table that might compel the software/hardware on either side of it to screw things up. It's an enabling technology for "doing things right" everywhere else in the system. Otherwise, it shouldn't get in the way. <<< I do not need [[Roon]]. I do not need Roon. I do not need Roon (right now). ''2019-12-08 update:'' [[Yes, I do.|Roon]]
[[Rachel Demy]] from https://usesthis.com/interviews/rachel.demy/ <<< !! What would be your dream setup? Honestly, I couldn't want for anything else at the moment. I am not a huge gear nerd nor do I collect just to collect. I have the gear I have because as I learned more about photography and how I shoot, I found the tools that best work for me. My Leicas are powerful but simple and with beautiful glass. They feel like extensions of my own body. I don't need much more than that! The second people want to get into the super technical side of gear, I kind of glaze over. For me, if it's not useful, I don't use it. And if my photography evolves and suddenly I need to know everything possible about megapixels? I'll totally do it. But not a second before that moment. <<<
https://musicthing.co.uk/pages/radio.html And I see [[Chris Carter]] also owns one! https://twitter.com/chris_carter_/status/562889299621076993 Mine is the [[re-engineered one|https://reverb.com/item/13291131-music-thing-modular-radio-music-red]] from [[James's Gear Outlet|https://reverb.com/shop/jamess-gear-outlet-688]]. > This is the classic Radio Music module with several quality and reliability improvements over the original design. By redesigning the two separate boards into a single board, any problems with loose or misaligned connections are eliminated! The design also includes the additional 100k resistor recommended by the designer for better sounds quality. Although the module looks different, it is electrically identical to the traditional Radio Music. Fingers crossed it works as well as the stock one. It's crazy that this module with a redesigned and improved circuit board is this cheap. He seems like a nice dude!
https://www.youtube.com/user/koenighaunstetten Has tons of [[org-mode]] videos on YouTube.
[[Getting yourself organized with Org-mode – Udemy|https://www.udemy.com/share/103DqE/]] Yesterday I bought [[Rainer König]]'s [[org-mode]] course on Udemy. I love watching his YouTube videos, so if nothing else, I'm supporting him in some way.
My brother just texted me a link to this song, "Ganier Ridge" by Rainsticks, from Nashville. He said "Listen to this very loud or with headphones." Wow! How appropriate for this warm day: https://rainsticks.bandcamp.com/track/ganier-ridge-2
https://rarefilmm.com per [[Fabio Roberti]] on [[Strength Through Failure]] Offline at the moment.
http://www.rasplex.com > A Plex Client for the Raspberry Pi computer 2019-12-03 Well, controlling [[Volumio]] from the iPhone is sufficiently annoying and flaky that I don't want to use it anymore. I'm sold on [[Roon]] except that I don't have a spare Windows or Mac computer sitting around that I can leave Roon Core running on all the time, and I'd need about a $400-$500 machine (either an old Mac mini or a new Intel NUC) to run it decently, and I've already spent enough money on non-essential toys this season. RasPlex could be a decent solution in the meantime... See also: * http://www.scottbouch.com/remote-raspberry-pi-music-player-rasplex.html * https://forums.plex.tv/t/headless-remote-music-player-using-rasplex-controlled-by-plex-app-on-tablet-or-web-app/179887/11 * https://forums.plex.tv/t/rasplex-as-headless-audio-only-player/158738 * https://forums.plex.tv/t/rasplex-hiberry-great-headless-music-device-in-less-than-20-minteus/209865
Today I learned that when adding a new drive to [[Backblaze]] in [[macOS]] [[Mojave]], you may need to revoke and re-grant Full Disk Access to Backblaze for it to work. [[Posted on Micro.blog|https://twelvety.micro.blog/2020/09/20/when-adding-a.html]]. Also, [[Roam]] made it so easy to document what I was doing as I went.
The descriptions of [[ADHD]] in these two posts that I read this past weekend stopped me cold. I don't think I //have// ADHD and I shouldn't begin to self-diagnose, because there are people out there who have it bad and it messes with their lives. I don't usually forget to do things, I am extremely detail-oriented, I almost always pay bills on time, and I listen reasonably well. But I have elaborate, complicated checklists and reminders for the most mundane, routine shit, because otherwise I'll just stare at the computer and go, "what next?" And a house and basement and hard drive //full// of incomplete projects. I'm probably just lazy. Still, there are a lot of things that sound familiar in these. I suppose the productive next question would be, "Well, if I share any of these tendencies, how can I manage around it?" !! [[ADHD — Gekk|https://gekk.info/articles/adhd.html]] by [[@gravislizard]] (This article was the worse of the two.) > The problem with "systems" is that they are authorities. They have to be. If you decide //"I'll prioritize things with a stack of notecards"// ''then you are telling yourself the following:'' > > //"The notecards replace my own brain. Everything that I do must be on a notecard. If it isn't on a notecard, it can't be done. If I want it done, it has to be on a notecard."// > > The problem is that when you have a crisis (a day full of emergencies) that forces you to break from this system you will lose all respect for its authority. Your brain will learn that it //doesn't// have to respect the notecards, that they aren't in charge, and this sense of freedom is addictive and will persist. Most ADHD sufferers have left a trail of systems * notecards, whiteboards, lists, post-its, apps, alarms * that worked great for [a month, a week, three days] but are now dead to them, scorched earth we can't return to. > > I have no idea what to do about this. ... > ''I will actually end up standing at my desk, jerking in one direction or another as the impulses fight each other.'' > > I read the email I'm trying to respond to. I think about both the tasks I have to do. My head hurts and there's something else I was working on, so I go look at that. 15 minutes pass, and suddenly I remember that I need to go get the power supply. I start to take a step, and then my body slams to a halt as I remember I need to make the config. I turn back to my desk, and then the thought comes to mind that I need to get the PSU before it's too late. This can go on indefinitely. !! [[Why I Procrastinate|https://invisibleup.com/articles/27/]] by [[InvisibleUp]] (This was a little more relatable, but I still don't think I'm at this level.) > When I lose my train of thought, ''I'm really prone to letting my thoughts get off on the worst tangents, and it will take a while to get myself back on track.'' For instance, suppose a question in my homework asks me to find the efficiency of a solar panel. I'll start reading the textbook to figure out how to solve the problem. Then I come across a sentence like "Solar cell efficiency is rarely above 30% for most solar panels". Good to know as a ballpark for my results, right? > > Well. This makes me start wondering what the //really good// solar panels are like, so I open up the Wikipedia page on solar panel efficiency. This leads me to learning that in the 70's Jimmy Carter installed some (rather inefficient) solar panels on the roof of the White House. ''An hour later and I haven't started the homework problem'', but I could tell you a surprising amount about the 1973 oil crisis and it's effect on the American automobile industry. (It's why all the cars were really small back then!) ... > Taxes, emails, homework and tests and obligations and promises. I can (and have, multiple times, sometimes even skipping class to make time) set aside an entire day to do one important task. And unless I'm in the right headspace, it's like pulling teeth to get it done. I struggle to do my laundry on a regular basis. I have 3 unread emails relating to some code I wrote that have been sitting there since //January//, probably telling me problems I've been aware of since January //of last year//. (I eventually checked them sometime during the writing of this article.) In high school I could barely get myself to apply to jobs or colleges or scholarships. My grades are not as good as I think they could be if I could just //not procrastinate.// > > But what about the moments where I can't help //but// focus on something? Turns out it isn't healthy. I must stress: my brain latches onto these things //at the exclusion of everything else//. ... > [[Hyperfocus]] > > That state where I get //too// stuck on things thing is called //hyperfixation// or //hyperfocus//. Briefly, it's ''when you can't regulate your attention away from something, even if you really //need// to, and even if it's not enjoyable.'' Even if there's something more urgent or useful I could be doing, if I'm hyperfocused on something it will be hard to break out of that and even harder to do what I'm supposed to, because I'm so mentally fixated on the meaningless nonsense I got sucked into.
I'm reading too much of (and reloading too often) the [[Washington Post]] and [[New York Times]] websites on the [[iPhone]] throughout the day. Now that we pay for those and [[The Atlantic]], I'm using their apps on the [[iPad Pro]] and it's delightful and calming. Even better is to turn it horizontally and split the screen (which I had never tried before) with [[Drafts]] to collect notes and quotes and snippets. It also makes everything way easier to read because the lines aren't so long. The idea is to read any interesting articles on the iPad at night in one go instead of using it as a pacifier on the phone whenever I get bored or anxious.
https://github.com/fniessen/org-html-themes#readtheorg > ReadTheOrg is a clone of the official – and great! – [[Sphinx theme|https://github.com/snide/sphinx_rtd_theme]] used in the [[Read The Docs|http://docs.readthedocs.org/en/latest/]] site. It gives a beautiful and professional style to all your [[Org|org-mode]] docs. The super lazy way to do it (which I'm doing) is to add this directive to the preamble of the file you want to export: `#+SETUPFILE: https://fniessen.github.io/org-html-themes/org/theme-NAME.setup` Then export your file to HTML with `org-html-export-to-html`. --- https://github.com/fniessen/refcard-org-mode#section-numbering Add this directive to turn off section numbering: `#+OPTIONS: num:nil`
At last. After years of doing a search on eBay whenever I remembered to, I have found the first 8-track stereo I bonded with. The same model belonged to a (then) teenage friend of ours that my parents took on church youth group trips in the early- to mid-70s. We'd stay in a hotel for a weekend or a week, she would bring her entire stereo and a suitcase of tapes, and I would sit on the edge of the bed staring at this as it played [[Led Zeppelin]] //IV// or [[The Beatles]] //Sgt. Pepper//. I remember everything about this unit: the orange tuner dial, the gray power button, the dual mic inputs, the fader-style pots for adjusting the sound, and best of all, the meters. I even drew pictures of it. I wish there were better photos. [img[https://twelvety.com/philtiddlywiki_images/2020-05-14-realistic-modulaire-8-1.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2020-05-14-realistic-modulaire-8-2.jpg]] [img[https://twelvety.com/philtiddlywiki_images/2020-05-14-realistic-modulaire-8-3.jpg]] Source: [[eBay|https://www.ebay.com/itm/REALISTIC-MODULAIRE-8-TRACK-STEREO-RECORD-SYSTEM-CAT-NO-14-924-FROM-1970s-/392781065234?&autorefresh=true]]
https://www.reaper.fm * $60 discounted/personal license, and you can evaluate it for free indefinitely, although if I use it for more than just this project I will totally pay up. * $225 commercial license * This is the only non-expensive DAW I see mentioned in the same breath as Pro Tools, Ableton, Logic Pro, etc. 2019-06-30 * Couldn't get the Focusrite Scarlett to show up in the Reaper preferences under Audio > MIDI Devices until I hit the tiny "Rescan MIDI" button in macOS Audio Midi Setup app. * If you can't get MIDI notes to send from a Reaper track to an external MIDI device, click the Route button on the track and assign a MIDI Hardware Output. * There was bad latency between hitting a key on the KX76 or Mother-32 and hearing it through the headphones. Finally realized that the audio was being delayed by the [[Sonarworks True-Fi]] virtual audio device that I was listening through (to feed a special EQ to the [[Sony MDR-7506 headphones]]). Duh. Turned that off and sent audio directly to the Scarlett and the latency went away. * If you all of a sudden find you can't make a time selection in a song, you may have locked the timeline. Hit L to toggle locking on/off. (The status is reflected in the toolbar button.) [[2019-07-13 learning about takes in Reaper]]
! To learn * lentil loaf ! Learned * spicy blackbean burgers
Continuing with my [[Steve Albini]] obsession: From [[YouTube|https://www.youtube.com/watch?v=kmP9z-xTRz0]]. This is like a college course condensed down to 34 minutes. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/kmP9z-xTRz0' frameborder='0' allowfullscreen></iframe></div>
I like how Andrew Canion pastes in entire Micro.blog posts sometimes, like here: https://andrewcanion.com/wiki/doku.php?id=people:josh_sullivan I think I'll record each thread in the [[Favorite Micro.blog threads]] page as its own tiddler. Those will each have: ''title:'' `YYYY-MM-DD Thread: [very short description]` The date stamp in the title will be the date of the first post in the thread. And in the body: * [the ''URL'' of the first reply, or any reply, really] * So-and-so posted about [''topic/question''] * A ''short summary'' of where the thread went * ''Quotes'' from the thread if there are gems (and there will always be gems) And then the tiddler will be tagged with anything that matches one of the topics mentioned if there's enough to merit digging back into the thread later.
https://rectangleapp.com/ https://github.com/rxhanson/Rectangle > Move and resize windows on macOS with keyboard shortcuts and snap areas per [[Craig Mod]] Wow, it's good. Brings the best parts of keyboard-driven window management from Windows to the Mac.
from https://stackoverflow.com/a/12399668 <<< The gist is that a rewrite happens solely on the server, the client (browser) is blind to it. The browser sends a request and gets content, it is none the wiser to what happened on the server in order to serve the request. A redirect is a server ''response'' to a request, that tells the client (browser) to submit a new request. The browser asks for a url, this url is what's in the location bar, the server gets that request and ''responds with a redirect'', the browser gets the response and loads the URL in the server's response. The URL in the location bar is now the new URL and the browser sends a request for the new URL. <<<
[[2021-11-20 Journal]] – Goddammit. The freezer drain hole in the fridge that we got fixed on Monday is now frozen over again. If my setting it to one-notch-less-cold just now doesn't fix it, then whatever is wrong is going to be more expensive than Monday's repair visit. If we need to get a new one, it should be smaller than the 25-cu. ft. model we have now. That much space just gets us into trouble. We're only two people. [[The 7 Best Narrow Refrigerators – The Spruce|https://www.thespruce.com/best-narrow-refrigerators-4158689]] [[10 of the Best Small Refrigerators for $1,000 or Less – Kitchn|https://www.thekitchn.com/10-small-refrigerators-for-1-000-or-less-110535]]
http://www.rega.co.uk/rb220.html > The RB220 is the latest incarnation of one of our most popular tonearms. > > The latest design takes full advantage of our brand new arm tube and the current three point arm mounting system. Each RB220 is meticulously hand assembled, creating a precision crafted tonearm achieving extremely low friction levels and performance way beyond the expectations of a product at this price point. 2020-08-10 Ordered from [[Britaudio]]
A helpful thread from [[@The_Lookout_N|https://twitter.com/The_Lookout_N/status/1577012534837932032]] (2022-10-03), which I will quote in its entirety: <<< Some thoughts on possible Russian nuclear signaling, and how to isolate what matters from bluster, propaganda and really the bad journalism out there First: Listen to what the US and NATO says about Russian nuclear posture. As late as today, the US have said still no changes I consider testing of new systems such as Poseidon and SARMAT as routine, even if Russian propaganda says something else. These are long running programs, not yet in operational service, so there will be tests. Such tests does NOT involve live nuclear warheads. Examples of what should be treated as nuclear signaling: Increased SSBN patrols Mobile ICBM exercises Larger LRA exercises Strategic exercises (Grom) involving test firing of ICBMs and SLBMs in operational service. Russia did conduct Grom just prior to the invasion Further up the ladder: Removal of non-strategic nuclear warheads from storage, with the next step in this chain; delivering and uploading them (Iskander units, ships, subs, aircraft etc) Even if this is done, it doesn't have to mean nuclear use is imminent. Geography matters Western statements clearly indicate that the threat is taken seriously, and a lot of resources are involved in monitoring Russian nuclear posture. The situation is serious, but succumbing to fear isn't helpful. It's exactly what the Russians want to accomplish. Western media bears a large responsibility now. Click-bait, fear-mongering, retransmitting propaganda and sloppy work should be avoided The way to inform and prepare the public is through calm, open debate based on facts, featuring those who know what they are talking about <<<
Potentially useful from Jack Baty: https://rudimentarylathe.org/#Removing%20words%20from%20Tiddler%20links
This week's quest is to find a 2- or 3-camera system that will sense motion, alert an iPhone, and show us video of who was/is at the front door or back door. I don't know whether it's going to be Blink, Ring, Arlo, Eufy, or something else. I figure there must be a sweet spot between: * spending too much money on something that's going to be exposed to the elements all the time and is destined to fail eventually (or be made hideously obsolete) in a year or two * spending so little that what you get is essentially disposable and not worth the trouble of installing
OLED vs. QLED vs. LCD/LED vs. I don't even know what
Well this was annoying. I knew the TAB cycling in [[org-mode]] hadn't felt right in a long time, but I couldn't put my finger on it. Turns out that [[Doom Emacs]] changes TAB to toggle visibility on only the current subtree. https://github.com/hlissner/doom-emacs/tree/develop/modules/lang/org#hacks <<< TAB was changed to toggle only the visibility state of the current subtree, rather than cycle through it recursively. This can be reversed with: ``` (after! evil-org (remove-hook 'org-tab-first-hook #'+org-cycle-only-current-subtree-h)) ``` <<<
https://github.com/jessekelly881/Theme-Rethink https://jessekelly881-rethink.surge.sh > Rethink is a css theme targeted at org mode. Rethink was inspired by its cousin Imagine and HTML5 UP's theme Story It's kind of weird, but I don't know if I used it correctly when I exported. But could be handy later.
https://www.getrevue.co
https://rhodiapads.com/collections_boutique_webnotebooks_desk.php The paper is so good, the cover is a delight. My use of it ebbs and flows as I try and fail at weekly/monthly spreads.
[[Richard Feynman]] from: https://www.mentalfloss.com/article/22542/richard-feynman-i-can-live-doubt > You see, one thing is, I can live with doubt, and uncertainty, and not knowing. I think it's much more interesting to live not knowing than to have answers which might be wrong. I have approximate answers and possible beliefs and different degrees of certainty about different things. But I'm not absolutely sure of anything, and there are many things I don't know anything about, such as whether it means anything to ask why we're here, and what the question might mean. I might think about it a little bit; if I can't figure it out, then I go onto something else. But I don't have to know an answer. I don't feel frightened by not knowing things, by being lost in the mysterious universe without having any purpose, which is the way it really is, as far as I can tell -- possibly. It doesn't frighten me. via https://www.roambrain.com/the-memex-of-a-matriarch/ via https://www.copingmechanism.com/2020/memex-of-a-matriarch-violeta-kristof Sarah asks me once every month or two, "What are we doing with our lives? Is life meaningless?" And I always say, "I don't know" and "It probably is".
[[Fairport Convention]]
[[Why Richard Thompson is keeping the faith – The Guardian|https://www.theguardian.com/music/2010/apr/11/richard-thompson-faith-feature]] > He has never required mind-altering substances to access those emotions. "In '67, we were an innocent band, having half a lager before we went on stage," he recalls. "By 1970, we were a two crates of Newcastle Brown kind of band. But then I stopped drinking in 1974. I saw a fork in the road and I thought, 'I'm not going down that one.'" [[Richard Thompson]] [[Fairport Convention]]
https://www.richmondfolkfestival.org This note is to remind myself that the festival always looks great on paper, but when it comes down to circling downtown twice to look for parking, and trudging through massive crowds of people for overpriced beer in the harsh fall sun, it's not for me.
http://camera-wiki.org/wiki/Ricoh_500_G I have a black one of these and it's beautifully beaten up and nearly silent and easy to hide in my hand and I love it and why don't I shoot with it more often?
https://www.bhphotovideo.com/c/product/1002102-REG/ricoh_175770_gh_3_hood_adapter.html for the [[Ricoh GR (2013)]] > The Ricoh GH-3 Lens Hood and Adapter allows you to attach a lens hood and other accessories to the GR and GR II digital cameras. The included lens hood prevents glare and ghosting when shooting toward bright light sources. Additionally, the adapter allows for the attachment of filters with a thread size of 49mm and the GH-3 Wide-Angle Adapter. Combining the adaptor and a 49mm UV filter is rumored to keep dust out of the GR, but there's no guarantee.
The one from 2013, not the original GR Digital from 2005, no offense. http://www.ricoh-imaging.co.jp/english/products/gr/ https://en.wikipedia.org/wiki/Ricoh_GR_(large_sensor_compact_camera) https://125px.com/articles/photography/cameras/ricoh-gr/ Pretty much all because of seeing the camera in this shot by Tim Gray. I mean, it just LOOKS COOL, and I'm sure takes great photos: https://flic.kr/p/2fuXuxP <a data-flickr-embed="true" href="https://www.flickr.com/photos/tgray1/47585376381/in/dateposted/" title="al + ice"><img src="https://live.staticflickr.com/7856/47585376381_c6acb9ecf2_z.jpg" width="100%" alt="al + ice"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> Here's one taken with the actual GR. I mean, come ON: <a data-flickr-embed="true" href="https://www.flickr.com/photos/tgray1/43775213220/in/faves-41894160112@N01/" title="R0000769"><img src="https://live.staticflickr.com/1927/43775213220_d21b25950d_z.jpg" width="640" height="424" alt="R0000769"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> 2021-03-27: I [[asked Tim|https://micro.blog/tgray/11235389]] about his GR photos. He said: > I probably add grain to most of the shots. I think I have different settings for real high ISO shots but I can't recall - I have not been shooting the camera as much in the past few years. It's a great camera and I've been tempted by the newest version, but I spent way too much on other camera stuff recently. If you have questions about specific pictures I can pull them up and see what my ACR settings were...
Ah! I didn't know until now that you can change the contrast settings on the [[Ricoh GR (2013)]]'s high-contrast B/W mode. The default of "MAX" is not usually usable for me, but -2 looks pretty good.
has a 40mm equivalent lens
https://github.com/BurntSushi/ripgrep > ripgrep is a line-oriented search tool that recursively searches the current directory for a regex pattern. By default, ripgrep will respect gitignore rules and automatically skip hidden files/directories and binary files. ripgrep has first class support on Windows, macOS and Linux, with binary downloads available for every release. ripgrep is similar to other popular search tools like The Silver Searcher, ack and grep.
Tested/Matched Pair (2 Tubes) 7-Pin GE JAN 5654W Fully-Tested Vacuum Tubes http://www.amazon.com/dp/B01BFJDTW0
https://roadmap.sh/ > roadmap.sh is a community effort to create roadmaps, guides and other educational content to help guide developers in picking up a path and guide their learnings. Their roadmaps on [[Frontend|https://roadmap.sh/frontend]] and [[Computer Science|https://roadmap.sh/computer-science]] are wild and a bit overwhelming, but also tempting because I see lots of words I've heard but didn't know how they related.
https://roamresearch.com/ 2019-12-17 I've been watching [[Jack Baty]]'s [[thoughts on Roam|https://rudimentarylathe.org/#Roam]] closely and today he put the out-of-office on his wiki and is going all-in for a while at https://roamresearch.com/#/app/jackbaty. After I spent 10 minutes with it the other day, the only reason I haven't gone back is the same reason a spaceship steers clear of black holes: It's far too attractive and I would disappear into it if I got too close. I need to look more into who develops it and how stable it might be. The nice thing with [[TiddlyWiki]] is that the data in it should be accessible in a browser theoretically forever, no matter what happens to the TiddlyWiki platform. And if God forbid something happens to [[Jeremy Ruston]], it's 100% open and maintained by more people than just him. But Roam seems to allow for a whole different, easier way of entering information and harvesting what's in it. I realize that what I've seen of Roam looks a lot like what initially got me excited about [[The power of Federated Wiki search results]]. Holy crap this thread that Jack linked to in his Roam: https://twitter.com/vgr/status/1199391391803043840?s=20 Look away, look away!!! OMG/LOL (re: Roam): <blockquote class="twitter-tweet" data-theme="dark"><p lang="en" dir="ltr">i have a boner right now<br><br>this is THE best tool for thought out there. <br><br>seriously, encourage all of you to try it. <a href="https://t.co/yt1qObDtvD">https://t.co/yt1qObDtvD</a></p>— ryan (@context_ing) <a href="https://twitter.com/context_ing/status/1164038156343099393?ref_src=twsrc%5Etfw">August 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Somewhat like what [[Jack said|https://rudimentarylathe.wiki/#2021.03.21%20-%20Daily%20Notes]] the other day: > Thinking about files vs notes for text content. This is from wandering around J.D and out of Roam and in the middle somewhere with Emacs. ...I feel like I spent the last 6 months rewiring my brain to realize how //obviously// we should connect everything in [[Roam]] and just let the links and backlinks figure it all out. But now that I've been exposed to [[Johnny.Decimal]], I think that yes, Roam is great for outlining, noodling, documenting stuff as you learn, and collecting trivia, but it is terrible at sharing information with others. Have you ever tried to read the release notes or the help docs that Roam publishes in Roam format? Good luck finding what you need if you didn't write them. If you're going to share stuff with other people, you're gonna need to impose some structure and it's going to be slower for you, but it's going to be worth it for others and it'll be cleaner in the end. And future you will be grateful because it'll be easier to jump back into what you were thinking long after you've forgotten what you were originally thinking.
https://roam.garden/ > Create beautifully tended Digital Gardens from your RoamResearch graph. Publish your notes as a static site in a few simple steps
Oooooh: Found the [[Roam]] [[Hidden Features page|https://roamresearch.com/#/app/metaroam/page/4DI0kb9Nv]] * Go to link under cursor: `ctrl-o`
I was curious about whether anyone had asked if exporting embedded images/files from [[Roam]] had gotten any better, so I went looking for the Roam [[Discourse]], which I think used to be at https://forum.roamresearch.com . It appears to be gone and at some point ~~the~~ one official forum became https://www.reddit.com/r/RoamResearch/ (looks like their Slack channel may also be used for issues/support if you don't use Intercom). That's fine, but I also saw this [[Update to our Rules + A note on recent bans from Roam's CEO|https://www.reddit.com/r/RoamResearch/comments/q1v1qp/update_to_our_rules_a_note_on_recent_bans_from/]] (from [[Conor White-Sullivan]]) which feels generally gross and tone-deaf. And then there was a link to the [[reveddit.com archive of posts removed by the mods|https://www.reveddit.com/v/roamresearch/?localSort=num_comments]] (who are at least Conor and maybe some other Roam people, among others). I don't understand why a great many of those were removed. Roam seems like not a great place to put things anymore, but I haven't been doing that anyway, so there's that.
https://www.roambrain.com > A resource and information hub for [[Roam]] Research made by [[Francis Miller]]
[[Don’t stop now: A conversation with Robert Pollard of Guided by Voices — Metro.us|https://www.metro.us/dont-stop-now-a-conversation-with-robert-pollard-of-guided-by-voices/]] > If I sense a lack of enthusiasm for either playing live or making a record, I know I have a problem. I can tell if someone is half-assing it in both of those areas. You don’t disrespect the stage or the songs. That may sound a little tyrannical, but that’s the way it is. You’ve got to show a great sense of pride in what you’re doing, or go do something else. [[Robert Pollard]]
!! White Fragility: Why It’s So Hard for White People to Talk About Racism https://www.goodreads.com/book/show/43708708-white-fragility [[Robin DiAngelo]] [[racism]]
I recently watched a bunch of presentations about Robotic Process Automation (RPA). https://en.wikipedia.org/wiki/Robotic_process_automation > Robotic process automation (or RPA) is a form of business process automation technology based on metaphorical software robots (bots) or artificial intelligence (AI) workers. It's simultaneously exciting and depressing. Neat that you can make processes faster and more accurate by having a virtual user simulate mouse clicks and copy-and-paste, but "attended RPA" (where you sit there and watch a script simulate your movements on a computer) seems like such a bandaid. It would be faster and more accurate still to trade data through [[API]]'s, than to watch a script do screen scraping. But sometimes there just is no API and you have to make do. I suppose that the benefits of RPA (supposedly freeing up employees to work on higher-level stuff, because we would //never//, you know, fire people) are worth it, but I wonder where it ends? As quickly as applications get updated these days, aren't we just scripting against moving targets? I feel like we're already in [[Brazil]] by [[Terry Gilliam]].
Here's [[Deanna Durbin singing "Lover"|https://youtu.be/IrNf3BNiuj8]] by [[Rodgers & Hart]]. I recognized it while we watched [[The Lady Eve (1941)]] tonight and remembered having heard it in [[Rear Window (1954)]]. That descending chord progression just breaks my brain in the best way. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//IrNf3BNiuj8' frameborder='0' allowfullscreen></iframe></div>
2020-05-09 We've had one of these for a couple of years and today it started sending a mangled signal to the projector. Rebooted and it wouldn't get past the start-up animation screen, but at least the animation looked normal and the sound effects came through. I took out the no-name 1GB microSD card I had put in it a few months ago, and then it was able to boot. Put the card back in, no boot. Took the card back out, booted fine. Put the card in the MacBook to reformat it and toss it. Turns out [[Roku recommends at least a 2GB card|https://support.roku.com/article/208756158-how-do-i-increase-memory-with-a-micro-sd-card-]] anyway, so that one I had in there wasn't really helping. Ordered a 16GB SanDisk from Amazon.
https://www.roland.com/us/products/gaia_sh-01/ This is the keyboard in the photo of [[Sadie Dupuis's home studio]].
https://roonlabs.com > Roon looks at your music and finds photos, bios, reviews, lyrics, and concert dates, and makes connections between artists, composers, performers, conductors, and producers. > > What you get is a searchable, surfable magazine about your music. 2019-12-08 I am all in. I should have known from these old posts from [[BSAG|https://www.rousette.org.uk/archives/roon-music-player/]] and [[Jack|https://www.baty.net/2018/the-roon-music-player-is-awesome/]] that I would end up loving Roon. How they make enough money to keep going is beyond me. I am 100% in their target demographic: eager adopter of audio-focused minimal OSes for the [[Raspberry Pi]], two unused [[Squeezebox]] devices in the basement, tons of FLACs on a [[Plex]] server, and an unnatural need to know just how lossless my lossless signal chain is. Whatever — I'm just glad they're still at it and I'm more than willing to give them $10 a month now that I've tried the service. It's like what [[Logitech Media Server]]/[[SlimServer]] should have been but weren't ready to be yet. Tonight I dusted off the old [[AirPort Express]] that I used to use for [[AirPlay]] before discovering [[RoPieee]], and managed to resuscitate it for the kitchen [[Tivoli Model One]], which now syncs with the RPi in the living room. So easy. I forgot how nice it is to have audio synced between multiple rooms. [[Roon Radio|https://kb.roonlabs.com/FAQ:_What%27s_Radio_and_how_does_it_work%3F]] is wonderful. It's great to play pseudo-random things from your own collection instead of playing them from the limitless cloud. Every track unearthed is a chance to get to know your library a little bit better and get more value out of it. The [[Signal Path|https://kb.roonlabs.com/Signal_Path]] feature — be still my heart. Finally, complete visibility about all the steps the audio is taking from source file to DAC, and where things could go wrong. I even tried the upsampling feature in the DSP, but I don't know enough about our [[Schiit Modi 2 Uber]] DAC to know whether tricking it into playing 44.1/16 audio at 96/24 (or 192/24) is worth it, so I'll probably just stick with native resolution for everything for now. It's still wildly better than anything we've had before.
https://community.roonlabs.com When my lame brain wants attention-sugar in the form of news headlines or Twitter, I'm generally better off looking at the [[Roon]] community forum and reading whatever people are trying, discovering or complaining about.
2019-12-19 Oh my GOD the [[Intel NUC]] (NUC8i3BEH) is ~~a half-baked piece of hardware. It's~~ so cute and feels so well made, but getting it to work has been a trial, and I'm nowhere near done. I love an early-adopter tech challenge as much as the next dork, but this is too much. To be fair, I don't know how much of it is due to the [[Roon Optimized Core Kit]] build or the hardware. But here's where we are: !! 2019-12-18 * Connected it to a modern Logitech USB keyboard and got into the BIOS setup with the F2 key. Was able to do the things that [[Roon]] says to do in the setup instructions, like turning on "Legacy Boot" and identifying the SSD where the OS will live. * Flashed the BIOS to the latest "BE0075.bio" version from Intel. * Rebooted and installed the Roon Optimized Core Kit OS to the SSD. * Rebooted and the NUC announced that it couldn't get DHCP from the router (connected via wired Ethernet), so it was available at http://169.254.199.200, which I of course can't reach on the MacBook because it's on the same subnet as //literally every other networked device in our house that gets an automatic IP address just fine from the router//. I haven't had to think about DHCP in years. * Oh yeah, and when I turn on the NUC, it kills the internet for my MacBook and phone, which seems like an indication that something's wrong. * A dozen browser tabs later, I see lots of reports from other nerds out there with LAN issues and the NUC8. Like, a lot. Some people resort to getting a USB-to-Ethernet dongle and that seems to work more often than not. I can't do anything with the LAN driver because it's baked into the ROCK build. !! 2019-12-19 * More research. I've been staying up too late and I'm tired of spending all this time on it, so maybe throwing money at it will help. Ordered an Anker USB/Ethernet dongle. * Enabled network boot and turned off WLAN interface and tried the Anker Ethernet dongle. Still no DHCP IP address. Still breaks the internet for the rest of the house. * Disabled network boot, left Anker dongle connected, rebooted. Still no DHCP IP address, only a 169.254.x.x address. * Turned WLAN interface on, turned LAN interface off, rebooted. Still no DHCP IP address. Not even a 169.254.x.x address this time. Just no address at all. * Turned WLAN interface back off, turned LAN interface back on. Connected to the MacBook with a crossover patch cable (using Ethernet jack on NUC and with Anker dongle connected to MacBook). Roon ROCK main menu screen was instantly available in browser at http://169.254.199.200. * But I see the Netmask is 255.255.0.0 and it's greyed out. That seems bad. * I'm going to try the "Reinstall" button under Operating System to make sure it's on the latest version. * Reinstalled ok, rebooted ok. Still on the same version (RoonOS 1.0, build 175, stable), so that must have been the latest. At this point, the MacBook is supplying the NUC with internet. * Maybe if I temporarily set it to a static IP (192.168.1.254), I can get access to change the Netmask under the DHCP tab to 255.255.255.0. * Nope. That killed the tenuous connection I had to Roon on the NUC. Weirdly, the browser tab at http://169.254.199.200 says "Failed to load device state (status: 0). Please refresh." * I'll reboot from the USB drive and reinstall Roon. * Ok, done. Whew. I'm back in the Roon menu at http://169.254.199.200. * Tried changing static address to 192.168.1.254 again with Netmask of 255.255.255.0. Disconnected crossover cable between MacBook and NUC. Connected LAN port on NUC to Ethernet cable in wall (connected to router). NUC says it's at http://192.168.1.254, but I can't get to it on the MacBook. * Rebooted, turned on WLAN again, thinking that it would see the router over WiFi and connect at the static IP I set, but I never reserved it in the router, so that's probably why it's not working. The MAC address is on a sticker on the bottom of the NUC. * Reserved the 192.168.1.254 address for the NUC in the router's DHCP ("IP Address Distribution") screen. Rebooted NUC, still hoping at least the WLAN connection would work. * Nothing. No IP address at all. * Rebooted. In BIOS, turning WLAN back off, WLAN back on, but not connecting cable yet. Booting off of Roon OS USB stick to reinstall Roon. * Roon OS is available at 169.254.199.200 again. * Set Static IP to 169.254.199.200 at Netmask 255.255.0.0. * Rebooted NUC, hoping that the DHCP tab would be editable. It's not. DHCP is still greyed out. Shit. * Reinstalled Roon OS. * Rebooted while connected directly via a short patch cable connected to the back of the router. * ''Well this is embarrassing. Right away, the NUC found the IP address I had reserved for it in the DHCP screen in the router, which I admit is nice to have for a headless device.'' So, I'm the asshole here. I could reach the Roon menu from the MacBook, no problem. And now the DHCP tab shows Netmask set at 255.255.255.0, like I expected. Guess I need to throw out that long-ass network cable coming out of the wall. Still, it's not great that the built-in WLAN interface doesn't want to see our router, but I don't care that much since I'm never going to use wireless on it. !! 2019-12-20 * Installed the codecs: https://kb.roonlabs.com/Roon_OS_Missing_Codecs ** Downloaded `ffmpeg` from https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz and expanded it. ** Connected to the NUC's Samba share at `smb://ROCK` in the Finder ** Copied the `ffmpeg` file (and no other files) to the Codecs folder ** Rebooted the NUC through the web interface. All good. * Migrating the database from the MacBook Roon Core ** Ran a backup from Roon on the Mac to an external Seagate USB drive ** Shut down Roon on the Mac ** Connected Seagate USB drive to NUC ** Launched Roon on the Mac, went to pick a different Core, and it said Software Update Needed. Clicked "Download and Install" beside the NUC/Remote Core icon. ** The NUC rebooted and Roon on the Mac still said something about the NUC needing an update, so I restarted Roon on the Mac. Now the "Connect" button beside the NUC is clickable, but it still says "Update Required" beside the NUC icon. The version it says it's on is: Firmware 1.0 (build 183) stable/192.168.1.254, Version 1.6 (build 416) stable ** I'm clicking the Connect icon since that's all I can do. ** It says Remote Core (Roon Optimized Core Kit) - 1.6 (build 416) stable -- an update is ready to be downloaded. Hmm. I don't know if that's the number it showed before. ** Clicking Download and Install. ** Ah! Now it says "An update is awaiting relaunch", so I'm clicking "Relaunch". ** Now it wants me to log in to Roon. ''But'', per the instructions at https://kb.roonlabs.com/Migrating_To_ROCK I'm going to click on "Restore A Backup". ** Using Roon's file browser to locate the /RoonBackups folder on the Seagate. ** Clicking "Restore" in the Backup Manager. ** Pressing Relaunch to continue. ** Connected to the NUC Core ok! ** Went to the Roon web interface to shut down the NUC, unplugged the Seagate USB drive that had the database export on it. ** Turned power back on, got to web interface OK, relaunched the Roon app on MacBook to be sure I was using a fresh connection. * Pointing to the music again, following these instructions https://kb.roonlabs.com/FAQ:_How_do_I_move_my_collection_to_a_new_folder%2C_hard_drive_or_NAS%2C_Will_I_lose_my_edits%3F ** "If you're going to move all or part of your music library, please follow the strategy below to ensure Roon can accurately track your files to their new location." ** (During this, the Mac Roon popped up to say I had to unauthorize the Mac Core, so I did that.) ** Beside the two RPi Plex music folders I was pointing to before, clicked on "Disable" under the three dots for each of them. ** Clicked Edit on each of them and updated them to point to this network share: *** `smb://piplex.local/media_2018_plex/` *** ... and then the "lossless_music" and "lossy_music" folders in that share. *** (I had initially tried `smb://piplex/media_2018_plex/` but that didn't work, and found someone on the Roon forum that said to try `<HOSTNAME>.local` instead of just `<HOSTNAME>` and that worked right away. Whew. *** Enabled both folders. * And now I'm listening to music. I //love// Roon, but it seems like their customer base is a very slim intersection between nerdy people who understand the barest essentials of networking + also crave high-resolution audio. But maybe that's not so small of a clientele? * Updated iOS app to the latest version. !! 2021-11-27 Bought a [[Samsung 870 EVO 500GB 2.5 Inch SATA III Internal SSD]] to store all the music internally in the NUC. ''TODO'' * ''Don't need to do any of these below, I suppose.'' * Look on the forums for what to do about DHCP being greyed out. * Order a dongle with the Asix AX88179 chipset, like this [[Plugable|https://www.amazon.com/Plugable-Ethernet-Gigabit-10-100-1000-Compatible/dp/B00AQM8586]] one, which someone mentioned on the [[Roon forum|https://community.roonlabs.com/t/what-usb-ethernet-adapters-work-with-roon-os/42011/2]] * reseat RAM and SSD chips * check for other bios versions * Post a comment on Roon community forum * re-check for latest ROCK version * if all that fails, return the NUC * ~~Even if it were to "fix" it, there is no way i'm setting a static IP for this thing. I've gone this long without static IPs and I'm not about to start now.~~
https://help.roonlabs.com/portal/en/kb/articles/roon-optimized-core-kit
Lordy, there's always something when it comes to hosting your own [[lossless]] [[music]] files. My [[Roon]] [[FLAC]] library is sitting on an external [[HFS+]] USB drive connected to the [[Roon Intel NUC]]. That's been fine for a couple of months and I know I've previously been able to drag music into the storage folder that Roon makes available to the [[MacBook]] over the network. This morning I bought the [[Tracyanne & Danny]] [[self-titled album|https://tracyanneanddanny.bandcamp.com/album/tracyanne-danny]] from [[Bandcamp]] and couldn't drag it into that storage folder. Turns out Roon recommends external drives be formatted as [[exFAT]]. So for now I just powered down the NUC and connected the drive to the MacBook and copied the files that way. Here are the references: https://community.roonlabs.com/t/adding-music-files-to-core-storage-permission-issue/53552 > Problem solved! I reformatted my drive as ExFat and recooked my music to it. Now it works like a charm and I can easily drag new music files to the Roon library folder. It’s in the documentation, but would be good to make more clear to Mac Users that they need to reformat existing drives to this format for it to work well. Thanks. https://kb.roonlabs.com/ROCK:_Storage_Basics > ''We recommend USB drives connected to ROCK be formatted exFAT if you require compatibility, or EXT4 if you don't.''
https://www.ropieee.org > RoPieee: a RoonBridge ready-to-go image for Raspberry Pi What a gift. I just gave the developer some money. 2022-11-23 Gave Harry €30.
Quoted in: [['ONLY CONNECT' - SOME THOUGHTS ON DISCOVERY AND CREATIVITY|http://www.alanmacfarlane.com/TEXTS/METHOD3.pdf]] (PDF) by Alan Macfarlane Rudyard Kipling: > "My Daemon was with me in the //Jungle Books//, //Kim//, and both Puck books, and good care I took to walk delicately, lest he should withdraw. I know that he did not, because when those books were finished they said so themselves with, almost, the water-hammer click of a tap turned off.... //Note here.// When your Daemon is in charge, do not try to think consciously. Drift, wait, and obey." (Autobiography, 210)
http://www.runeaudio.com <<< RuneAudio is a free and open source software that turns embedded hardware into Hi-Fi music players. Take an inexpensive, silent and low-consumption mini-PC and make it perform as an high fidelity digital source. <<<
Two great people nerding out about [[Emacs]] and [[org-mode]]. https://www.youtube.com/watch?v=uUtFIbKEpJQ <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/uUtFIbKEpJQ' frameborder='0' allowfullscreen></iframe></div> [[Carsten Dominik]]
[[Sadie Dupuis]] from [[her interview|https://tapeop.com/interviews/142/sadie-dupuis/]] in [[Tape Op magazine]]: > I always fall backwards into learning how to get better at anything. I’m averse to reading instructions, so I do something the way that seems obvious to me – which is probably the worst way to do it – and then I have to learn how to fix it. Even the first Sad13 record [//Slugger//], I thought I was making demos and then got deeper and deeper into trying to make them sound better. [img[ https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fphil_nunnally%2FgXb4p4vU_S.jpg?alt=media&token=100d371e-c544-4b8d-8547-3cf9867f7adb]]
https://www.apple.com/safari/
https://www.samsung.com/us/computing/memory-storage/solid-state-drives/870-evo-sata-2-5-ssd-500gb-mz-77e500b-am/ http://www.amazon.com/dp/B08QBMD6P4
[[Sarah Chayes in Conversation with Chase Robinson: The Roots of Global Extremism - YouTube|https://www.youtube.com/watch?v=xwi-tHpH2F4]] About 70% of what [[Sarah Chayes]] talked about in this interview was well over my simple head, but it made me feel smarter just to hear her explain it. Lots of real-world experience and examples about [[corruption]] in Afghanistan and other places.
Listening to [[Sarah Harmer]]'s newest album, [[Are You Gone|https://sarahharmer.bandcamp.com/album/are-you-gone]] with Sarah. It's like an old friend has returned! [img[https://twelvety.com/philtiddlywiki_images/2020-02-23-sarah-harmer-are-you-gone.jpg]]
https://social.perma.cc/ > High-fidelity capture of [[Twitter]] threads as sealed PDFs. > > ''What is this?'' > > This site is an experiment by the Harvard Library Innovation Lab to let you download signed PDFs of Twitter URLs.
https://www.schiit.com/products/magni-1
* https://www.schiit.com/products/modi-1 * https://www.schiit.com/news/news/introducing-modi-multibit > Modi Multibit is built on Schiit’s proprietary multibit DAC architecture, featuring Schiit’s unique closed-form digital filter on an Analog Devices SHARC DSP processor. For D/A conversion, it uses a medical/military grade, true multibit converter specified down to 1/2LSB linearity, the Analog Devices AD5547CRUZ. ... > Multibit DACs differ from the vast majority of DACs in that they use true 16-20 bit D/A converters that can reproduce the exact level of every digital audio sample. Most DACs use inexpensive delta-sigma technology with a bit depth of only 1-5 bits to approximate the level of every digital audio sample, based on the values of the samples that precede and follow it. Every single review of this thing that I find says stuff about "rounder", "fuller", and "more liquid sounding" music coming out of it. Help.
https://www.schiit.com/products/sol-tonearm > This is exactly what it says it is--an additional tonearm for your Sol. Use it to set up an additional cartridge for easy swapping. It comes with everything you need: tonearm, weights, and wires. Just add the cartridge of your choice, set it up, and you're done! More photos included as part of the Sol turntable: https://www.schiit.com/products/sol A $199 unipivot tonearm. Unreal. It looks like I'd need to fashion my own bearing point, but that's the easiest part of this setup. Good lord.
https://scroll.com/about <<< How Scroll works Scroll distributes your membership to sites you read based on their share of your engagement. Those sites make more money than they would from showing you ads and deliver you a faster, better experience. Every month, we’ll tell you where your membership went and which sites you supported. <<< Seems like [[Setapp]] for reading news sites. If they get enough partners it could be a nice thing. Although I'm sure I'm not getting something about how this breaks the internet or whatever. But I have to admit that without Scroll, when I see links in Twitter to pages from Business Insider, The Verge, Slate, Vox and BuzzFeed News, a little part of my brain makes a quick calculation about how much I want to sit through the page loading process while all the bits of javascript re-orient all the cruft on the page and obscure the content. I don't see how this alternative is bad.
https://pilotmoon.com/scrollreverser/ On my work computer, I use classic non-natural "reversed" scrolling when I'm using a mouse scroll wheel. On my home MacBook, I use a trackpad most of the time and use Apple's "natural" scrolling direction, but that feels weird when using a mouse, so this app works great to bridge the gap in my brain. You can pick which devices get their scrolling reverse.
https://www.sdcard.org/downloads/formatter/ > The SD Memory Card Formatter formats SD Memory Card, SDHC Memory Card and SDXC Memory Card (respectively SD/SDHC/SDXC Cards) complying with the SD File System Specification created by the SD Association (SDA).
https://secondunionrosenwaldschool.org/museum > As a museum for the history of African American education in Goochland county, the restored school will be used to represent all Rosenwald schools in Goochland, as well as Central High School. The museum will commemorate the work of Booker T. Washington and Julius Rosenwald for their work in providing education in the segregated South. """ 2843 Hadensville Fife Road Goochland, VA 23063 """
https://apps.apple.com/us/app/secure-shellfish-ssh-sftp/id1336634154 > Secure ShellFish brings SSH to your iPhone and iPad and remote file transfers to the Files app, all in a convenient and easy to use package. By the same dude who wrote [[Working Copy]].
https://www.kodak.com/en/motion/blog-post/memoria > I started with experimental films shot on Super 8 and 16. Film reflects how I see the world and I even think that I see the world with this grain. I try to initiate all of my feature films with film in mind because of this natural quality that I look for. I also enjoy the workflow of film. It’s something that you don’t see right away, but you imagine and focus on what’s in front of the camera. I have trust in Sayombhu, who I have worked with from the beginning, that he will deliver what we have planned. ... > While Palme d'Or-winner //Uncle Boonmee Who Can Recall His Past Lives// was captured on Super16, //[[Memoria|Memoria (2021)]]// was shot on 35mm. “I needed more detail because we shot a lot of nature and 35mm handles that better than 16mm,” states [[Weerasethakul|Apichatpong Weerasethakul]]. “Working on film is like a ritual and is quieter because of the awareness of the preciousness of the footage.” Mukdeeprom is drawn towards the viewfinder on a film camera. “When you’re looking at a small monitor it has a signal so you have a filter between you and the real world. But when you look into an optical viewfinder you see it for real. You see the real lighting. I react better. The larger area of 35mm allowed me to have a better wide shot compared to Super16.” //Memoria// was shot entirely on KODAK VISION3 500T Color Negative Film 5219.
[[Self-tracking in Plain Text|https://blog.jethro.dev/posts/self_tracking_in_plain_text/]] – [[Jethro Kuan]] > I recently decided to start doing more self-tracking. In my [[Org-mode|org-mode]] workflow series, I gave a brief overview of how I did task management, but what I failed to mention then was that Org provides clocking capabilities, so I sort-of knew where I was spending my time. However, I wanted to track things that are unrelated to tasks. For instance, I wanted to track my mood at different times of the day, or what I ate. I also wanted to track numeric quantities: how much water did I drink? How far did I run? How long did I sleep?
<<< What man can you show me who places any value on his time, who reckons the worth of each day, who understands that he is dying daily? For we are mistaken when we look forward to death; the major portion of death has already passed. Whatever years be behind us are in death's hands. <<< Seneca, Letters from a Stoic: Letter 1 - On Saving Time [[Archive.org|https://archive.org/details/LettersFromAStoic-Letter1OnSavingTime]]
https://en-us.sennheiser.com/finalstop Recommended by Bob Clearmountain on the [[Gear Club Podcast #45|https://www.gear-club.net/episodes/2018/11/19/45-bob-clearmountain-live-episode-w7yr8]]. These things have microphones built into them so you can record binaurally. Lord.
[[Serial Reader app|https://itunes.apple.com/us/app/serial-reader/id1077180804?mt=8]] by Michael Schmitt Has 600+ public domain books that you can get delivered in manageable chunks once a day. I instantly paid the one-time $2.99 charge for the premium version.
2019-11-06 I keep starting small tiddlers and as I figure out what I'm trying to say, they become long enough to turn into blog posts. https://twelvety.micro.blog/2019/11/06/serverless.html
2019-05-04 Signed up! Borrowing from Jack Baty's [[blog post|https://www.baty.net/2018/setapp-or-not/]] about it, here are some lists: !! Apps I look forward to trying * Bartender * BusyCal * CleanMyMac X * Cloud Outliner * CloudMounter * Downie * Expressions * Flume * ForkLift * Gemini * iStat Menus * MathKey * NotePlan * Numi * PDFpen * Renamer * Squash * TextSoap (though I know I should just learn Unix commands to do the same things) * ToothFairy * TripMode * Ulysses * WiFi Explorer * Workspaces !! Apps I already use and need to update or pay for more often * BetterTouchTool * iThoughtsX * Marked * MindNode * TaskPaper
https://shifty.natethompson.io/en/ > A macOS menu bar app that gives you more control over Night Shift. > > Shifty was made to expand the capabilities of the built in Night Shift feature in macOS. You can disable Night Shift for specific apps, websites, and custom time periods. It also provides easy access to a slider to fine tune your color temperature. With Shifty, Night Shift becomes a power user feature! It's probably best if I don't have Night Shift on when I'm using [[Adobe Lightroom Classic]] or [[Adobe Photoshop]].
[[MLA-30 loop antenna]] * [[MLA-30 Loop Antenna review -- Gadget-talk|http://www.gadget-talk.com/2020/04/18/mla-30-loop-antenna/]] > One connection I wanted to make was from the antenna to my [[Tecsun]] portable short wave receiver. That required a set of adapters to change from SMA to PLA 259 connectors and then another short adapter that converter the larger 259 to a TRS plug style connector. * Good question from someone asking for help setting up an [[MLA-30 loop antenna]] with a portable [[shortwave radio]]: ** https://www.reddit.com/r/shortwave/comments/emg4ve/idiot_needs_help_setting_up_mla30_loop_antenna/ [[PK's Loop Antennas]] * http://www.amradioantennas.com/shortwave_antennas.htm * highly regarded * [[A preliminary review of the PK Loop C-LOOP-HDSW6-18 -- The SWLing Post|https://swling.com/blog/2016/11/a-preliminary-review-of-the-pk-loop-c-loop-hdsw6-18/]] > Loop antennas, in general, are fairly narrow-band and--unlike a [[Wellbrook]] or [[Pixel Loop]]--manual adjustments need to be made with the tuning knob to match the PK Loop as you scan across bands. [[Pixel Technologies Active Magnetic Loop Antennas RF-PRO-1B|https://www.dxengineering.com/parts/pxl-rf-pro-1b]] * Holy cow - expensive
Sadly, Shure stopped making these in 2018: https://service.shure.com/s/article/discontinuation-of-phono-products?language=en_US
Not that I //need// this, but I'm trying it in Firefox: https://simpl.fyi > A browser extension that brings the simplicity of Google Inbox to Gmail.
https://github.com/gildas-lormeau/SingleFile > SingleFile is a Web Extension (and a CLI tool) compatible with Chrome, Firefox (Desktop and Mobile), Microsoft Edge, Vivaldi, Brave, Waterfox, Yandex browser, and Opera. It helps you to save a complete web page into a single HTML file. This worked for me a lot better than [[Conifer]]. Very slick.
https://skim-app.sourceforge.io/ Trying this with //[[Mastering Emacs|2019-02-09 Bought "Mastering Emacs"]]//. ''Update 1:'' Huh. The help docs say: > The highlights are not saved in the PDF data itself, therefore other PDF viewers will probably not be able to show the highlights. ''Update 2:'' Well, Preview.app is worse, because it can make highlights and show them in a left pane, but the text in the highlights is lost when you close and re-open the PDF. And Preview.app and Skim don't seem to play well together when trading edits on the same file. At least Skim preserves its highlights between sessions, and you can export the highlights to a text file that includes page references for permanent storage. It could also be that the PDF that the book is in may be a format that causes both apps to hiccup, but Skim should do it for now. I also thought about trying to use the ePub or Kindle versions, but it's probably best to actually be at my laptop when I read the book so I can try stuff out immediately.
https://sleevenote.com > The music player for album lovers
https://github.com/brianpetro/obsidian-smart-connections > Chat with your notes in Obsidian! Plus, see what's most relevant in real-time! Interact and stay organized. Powered by OpenAI ChatGPT, GPT-4 & Embeddings. I want to use this, but I don't want to upload all or even some of my stuff to OpenAI to do it.
For quickly making todo items in [[Obsidian]], I created a [[TextExpander]] [[snippet]] to replace `ttd` with `- [ ] `
Created a [[TextExpander]] [[snippet]] to make front matter like this for new (non-[[Daily Notes]]) notes in [[Obsidian]]: ``` --- title: %| date: [[%Y-%m-%d]] tags: --- ``` And I didn't know until now that it formats that section (in the Edit view, at least) as monospaced! Hopefully they can make that section look less like a heading in Preview mode in future versions.
I should make a giant, depressing master list of all the tools we have and how often we use them. Especially the tools that require maintenance of their own, have a level of "consumable-ness" to them, or are software/services with monthly payments. Here's a start: These get used without even thinking about it: * iPhone * MacBook Pro * [[AirPods]] * [[Obsidian]] * [[BBEdit]] * [[Dropbox]] * [[Massdrop X Sennheiser HD6XX Headphones]] * Piece of shit [[Epson Home Cinema 2150]] projector * My car * [[Keychron K2]] * [[Wharfedale 10.1]] speakers * [[Yamaha AVC-50]] integrated amp * [[Kenwood KD-600]] turntable * [[U-Turn Audio Pluto]] preamp * [[Harman-Kardon PA 2200]] amp * [[Cambridge Audio Minx X201]] subwoofer * [[Cambridge Audio DacMagic XS]] and its attendant [[AirPlay]] (and sometimes [[Roon]]) [[Raspberry Pi]] endpoint * Honda lawn mower * [[Melitta Pour Over Coffee Cone Brewers]] These should be re-evaluated: * [[Fujitsu ScanSnap S300M]] scanner * [[Sony WM-F2078 Sports Walkman]] * Sony SACD player * Sony DVD player * That Hitachi VHS VCR we inherited from Grace * [[Elgato Video Capture]] USB dongle * [[IK Multimedia iRig Pro]] * [[Teenage Engineering PO-16 Factory]] * Tascam digital audio recorder * Every film camera in the house (that would be its own list) * All the online services (you know the ones) * The second car * The snare drum and its practice pad * [[Lightroom]] (what-the-fuck-ever version the Classic one is now) * That long overhead extendible lopper we use to cut tall tree branches * Hedge trimmer * Weed eater * Dremel (I neglect you) * Turntables (the other three) * [[Nakamichi DR-3]] (I'm sorry about your pinch roller and belts. Hang in there.) * [[Yamaha SU-10]] * [[Yamaha KX-76]] * The modular synthesizer * The five reel-to-reel recorders (none of which work properly, and my greatest source of shame) * Bolex Super8 projector * Apple Logic * Tinderbox * The juicer * The homemade pasta maker * All the other headphones * Spin-Clean MKII record cleaner * Makita impact driver * Makita jigsaw * [[Roon Intel NUC]] * [[Plex]] [[Raspberry Pi]] * iPad Pro * Squeezeboxes (both, yes) * [[Sony MDS-JB940 MiniDisc deck]] * Focusrite Scarlett 2i4 * [[Plustek OpticFilm 8200i]] film scanner * Panasonic GX1 Oh my god I think I may cry. What a squandering. The next time I have the urge to watch a "tiny house" video, I should just watch porn instead. It would be more honest and useful.
https://www.imdb.com/title/tt0081534/ This is a bad movie, but I’ve loved the plot, the actors, and the setting since I saw it on cable TV in the early 80s. One of my favorites.
[img[http://twelvety.com/philtiddlywiki_images/2021-12-08-sonic-impact-t-amp.jpg]]
[[Francis loves the Sony ICF-SW11 – The SWLing Post|https://swling.com/blog/2016/08/francis-loves-the-sony-icf-sw11/]] [[Rawad takes a peek inside the Sony ICF-SW11 – The SWLing Post|https://swling.com/blog/2018/03/rawad-takes-a-peek-inside-the-sony-icf-sw11/]] [[Stereo 12 Bands ICF-SW11 Radio Sony Corporation – radiomuseum.org|https://www.radiomuseum.org/r/sony_icf_sw11icfsw1.html]] * Made from 1999-2011
These are my nicest headphones, but they're more bright and revealing than flat. Good for monitoring and doing scalpel-level editing of audio, not good for listening to music without EQ correction.
https://www.sony.com/electronics/walkman/nw-a40-series We are cheated and deadened by the compressed audio we are subjected to during most of our time in the world. The NW-A45 got here today, the first new Walkman for me in about 17 years. This thing is gorgeous. Having the ability to play practically any lossless format is really nice. The UI is easy to figure out, and per a recommendation on Amazon, I ordered it with an IVSO screen protector, which does make it easier to swipe around on the screen, and I don't worry about scratching it with my meaty paws. I dumped 45 GB of FLAC/ALAC files on it (pretty much all my lossless tracks) and barely made a dent in the 256 GB SD card. I'm gonna need to rip more CDs before I can listen to anything new, but I have plenty to play with for now. Also, it is -tiny-. I think it's smaller than my last iPod touch and makes my iPhone 8 feel giant by comparison. We listened in the car through the stereo's aux in. Fleet Foxes at 96kHz/24-bit sounded great! Besides the car, I've been using Sony MDR-7506 headphones. I'm still playing with the EQ curve to try to undo the clinical sound they bring to everything, but I'm getting close. I don't know yet whether the amp in the NW-A45 has enough oomph for these headphones. I listen to music pretty quietly most of the time, but I could also easily see getting one of those add-on DAC/amps to pair with it, although those look kind of ridiculous. I'll probably get over that at some point. For now, there's so much detail that I had forgotten just envelops lossless audio, 44,100 times a second (or more when you get into hi-res stuff). ~~I can't bring myself to test Bluetooth headphones with it.~~ It seems wrong to have all this lossless beauty and waste it by compressing anything. I tested the AirPods with it and the experience and sound sucked. Turning Bluetooth back off and will stick with wired earphones. I do see the symptom various people reported where album art isn't shown for some CDs. I took a fresh pass at the FLAC tags and art with MusicBrainz Picard and xACT. A couple of the albums still didn't display cover art until I found fresh JPGs and associated them in Picard. I figured it out, but I don't know how normal people would deal with this. The included USB cable connects to a proprietary Sony WM-PORT, um, port. Not the best, but those cables aren't expensive if this one breaks or gets lost. The only real problem is that now I can hear a ton of problems with the way various CDs were mastered, and I never had enough resolution (or listened with headphones enough) to hear it before. It's unexpectedly nice to play music and never, ever worry that the thing I'm playing it on will buzz with a push notification, or that a phone call will interrupt everything and scare the hell out of me. Thumbs-up! --- 2019-03-24 Cleaned this up a little and [[posted|https://twelvety.micro.blog/2019/03/24/sony-nwa-highresolution.html]].
From the [[Innerfidelity review of the Sony NWZ-A17|https://www.innerfidelity.com/content/survey-digital-audio-players-part-1-sony-nwz-a17]], which has the same S-Master HX chip as the [[NW-A45|Sony NW-A45 hi-res audio player]]: > The A17 is based around a proprietary Sony platform which they term "S Master." Less advanced versions of this technology have appeared in various Sony gear over the past few years, such as the older X and Z series DAPs, some of their tablets, and even a few Vaio laptops. The A17 gets the latest and greatest "HX" version as originally appearing in the more expensive NW-ZX1. You can read more about it here, here, and here. The resulting system is similar to what NuForce did with their DDA-100 integrated amp—Sony has their own version of a PWM amplification stage with no intermediate digital to analog conversion step involved. As such there is no actual DAC chip from the likes of Wolfson or Cirrus Logic, and the headphones are driven directly from the S Master chip itself with no further amplification stage required. Absorbing the functions of a DAC right into the PWM of the digital amp is pretty slick.
https://walkman.land/sony/wm-150 [img[https://twelvety.com/philtiddlywiki_images/2022-04-09-sony-wm-150-squashed.jpg]]
* WM-DD22 * WM-DD30 ** https://walkman-archive.com/gadgets/walkman_sony_03_dd30_eng.htm * WM-DD33
The WM-EX511 is the "Tourist" model, also known as the WM-EX618 in the UK. https://walkmancentral.com/products/wm-ex618 [img[http://twelvety.com/philtiddlywiki_images/2022-04-17-wm-ex511.png]] 2022-04-15 Ordered from [[matsuday_16|https://www.ebay.com/usr/matsuday_16?_trksid=p2047675.m3561.l2559]] on eBay.
https://www.sony-asia.com/electronics/support/boomboxes-zs-series/zs-s2ip/specifications https://www.crutchfield.com/S-nnNHixB2grA/p_158ZSS2IP/Sony-ZS-S2iP-Black.html [img[http://twelvety.com/philtiddlywiki_images/2024-06-07-sony-boombox.jpg]]
http://www.dlib.indiana.edu/projects/sounddirections/papersPresent/sd_bp_07.pdf By Mike Casey, Indiana University and Bruce Gordon, Harvard University from: http://www.dlib.indiana.edu/projects/sounddirections/bestpractices2007/
https://github.com/TheBB/spaceline > This is the package that provides Spacemacs with its famous mode-line theme. It has been extracted as an independent package for general fun and profit. Jack has helpful notes here https://www.baty.net/2019/spaceline-for-emacs/ but I have apparently mucked up my `init.el` file and have the package/theme only about half working. But I haven't had time enough to dig into it the last couple of days to figure out what I should actually be seeing or where I went wrong. If [[org-mode]] sucks up all the notes and tasks in its orbit, [[Emacs]] configuration tweaks suck up all the free time. It's like a video game where I keep learning just enough to keep going and occasionally get to the next level by sheer persistence. And yet, it's still fun!
https://www.chrislockard.net/posts/spacemacs-org-mode-intro/ I'm not getting into this right now. Saving for later.
Sanus Systems SF-26B https://www.amazon.com/gp/product/B00069DRYG Bought 2008-02-18 (still great!)
From the [[Roam]] [[Slack workspace|https://roamresearch.slack.com/archives/CN5MK4D2M/p1578865630145800]]: * ''[[Jacob Spence|https://app.slack.com/team/UNBL434CU]]'' * SPEED TIP: Being on daily notes is waaaaaay slower than being on a specific date page. If you're dealing with frustrating lag, this might be the issue. [[@Vladyslav Sitalo|https://roamresearch.slack.com/team/UR937AKE3]] just pointed this out to me and I wanted to make it more visible (because it was really frustrating to me) https://roamresearch.slack.com/archives/CMZMS7FLJ/p1578859171090900?thread_ts=1578853206.088800&cid=CMZMS7FLJ
Yesterday I read about the Sperry FMS from 1982. For some reason, it became vitally important for me to read everything I could about it. That display is the thing that keeps me coming back. I strongly suspect it's a vector CRT, not a regular raster CRT. There is just no way raster display drivers were high enough resolution back then to render text with those curves that sharply. Look at the stroke lines through the zeroes, and how the opposite lines of the "H" are just every so slightly offset. I want to use [[org-mode]] on this thing so bad. It's gorgeous. My wife took one look at the photo and said, "Oh, that's very Phil." The photo is from [[this tweet|https://twitter.com/AeroSavvy/status/1283158364478771201]], which is what started it. The point of the thread was how funny it was that they have to emulate floppy drives on an emulated Windows 98 machine to be able to update the nav database in it. I took that to mean that the FMS and its old systems and code are still so eminently reliable decades later that its operators are willing to string together a patchwork of modern technologies to give it the data it wants. I love that. [img[https://twelvety.com/philtiddlywiki_images/2020-07-16-sperry-fms.jpg]] * Developed in the 1970s and first released in 1982. * Was used on the Airbus Industries A310 and on other popular Boeing planes. * Sperry was since bought by Honeywell * Manual is here: http://www.smartcockpit.com/aircraft-ressources/A310-Sperry_Flight_Management_System.html * Original sales brochure: https://gsplanestuff.com/products/sperry-fms-flight-management-system-original-sales-brochure-tri-fold-8-5-x-11 * Walkthrough video: https://www.youtube.com/watch?v=09aPLGX8P-I * And the treasure I was most proud of finding, a patent filed by Sperry in 1977 for "Digital stroke display with vector, circle and character generation capability": https://patents.google.com/patent/US4115863
Wiki is here: https://sphygm.us This is a friend of [[h0p3|https://philosopher.life/#Sphygmus]]. Things I like about this wiki: * Stylesheet. It's like a dark-themed text editor. * The [[wiki review logs|https://sphygm.us/#📝%20wiki%20review%20logs]] - very self-aware! * Sometimes s/he uses short date stubs like 181226, but sometimes longer ones like 2018.09.24
from https://sphygm.us/#190112%20%E2%80%93%20wiki%3A%20public-facing > There's //something// about writing publicly yet completely obscurely -- my words are out there, visible to those who find them -- but you must find them first! It is a treasure hunt, and I am buried so deeply in a cave that I assume no one reads these words. But that they have a //chance// to be read? That is a chance to be ''heard'', no matter how small. Which reminds me of [[Jack Baty: the possibility that someone will stumble across things I've written]]
https://github.com/deezer/spleeter This crazy library from [[Deezer]] can separate music mixes into its component voice, drums, bass, piano, and other instrumental parts. [[Andy Baio]] wrote about it here: https://waxy.org/2019/11/fast-and-free-music-separation-with-deezers-machine-learning-library/
[img[http://twelvety.com/philtiddlywiki_images/2021-12-08-squeezebox-2.jpg]]
After seeing more and more people talk about it, I finally tried https://standardnotes.org/. It is indeed very slick and minimal, and feels solid, and could finally be the cross-platform journaling app I've been looking for. But would it replace Day One? VS Code's [[vscode-journal]] extension? Would I use it as a daybook or a private journal? I am loath to move to yet another tool, but I feel the inevitable draw at the same time.
https://statamic.com/ > Build beautiful, easy to manage websites. They've changed the whole feel of their website A LOT since I last visited, and I don't think I care for it now. I should try one of the million other blog generators if I'm going to keep https://twelvety.com around.
I didn't mean to stalk [[Jack|Jack Baty]] again, but when I Googled "[[org-mode]] food log", this was the 2nd result: [[Logging Food With Org-mode - Jack Baty|https://archive.baty.net/2018/logging-food-with-org-mode/]] I went with the same setup except I changed the heading: ``` #+TITLE: Food log #+PROPERTY: Meal_ALL breakfast lunch dinner snack #+PROPERTY: Type_ALL "home cooked" "work cafeteria" "delivered" "dine out" "fast food" #+COLUMNS: %60ITEM %Meal %Type #+CATEGORY: food ``` Try THAT shit with [[Markdown]]! ''2021-07-16 Update:'' Oops. You can't separate the quoted "Type" values with commas. Took those out and also ordered them in terms of (aspirational) frequency.
[[Stefano Mastrogiacomo]]'s Team Alignment Map looks cool. https://www.strategyzer.com/books/team-alignment-map-stefano-mastrogiacomo via @ViktorTabori on [[Twitter|https://twitter.com/ViktorTabori/status/1269045925693054984]]
<<< Each thing I do I rush through so I can do something else. <<<[[Stephen Dobyns: Pursuit]]
(This poem was published in 1987 and Stephen King quoted the first couple of lines in //Insomnia//, published in 1994.) from https://writersalmanac.publicradio.org/index.php%3Fdate=2012%252F02%252F27.html ! Pursuit """ Each thing I do I rush through so I can do something else. In such a way do the days pass— a blend of stock car racing and the never ending building of a gothic cathedral. Through the windows of my speeding car, I see all that I love falling away: books unread, jokes untold, landscapes unvisited. And why? What treasure do I expect in my future? Rather it is the confusion of childhood loping behind me, the chaos in the mind, the failure chipping away at each success. Glancing over my shoulder I see its shape and so move forward, as someone in the woods at night might hear the sound of approaching feet and stop to listen; then, instead of silence he hears some creature trying to be silent. What else can he do but run? Rushing blindly down the path, stumbling, struck in the face by sticks; the other ever closer, yet not really hurrying or out of breath, teasing its kill. """ — Stephen Dobyns, //Cemetery Nights//
https://www.youtube.com/c/steveguttenbergaudiophiliac
https://www.nytimes.com/2003/11/30/magazine/the-guts-of-a-new-machine.html > "Most people make the mistake of thinking design is what it looks like," says Steve Jobs, Apple's C.E.O. "People think it's this veneer -- that the designers are handed this box and told, 'Make it look good!' That's not what we think design is. It's not just what it looks like and feels like. Design is how it works." I love that idea and annoy people at work with it all the time. But this may also be [[Steve Jobs]]: https://www.theatlantic.com/technology/archive/2011/10/in-praise-of-bad-steve/246242/ <<< Last year a former Apple employee related his favorite Steve Jobs story to me. I have no way of knowing if it is true, so take it for what it's worth. I think it nicely captures the man who changed the world four times over. When engineers working on the very first iPod completed the prototype, they presented their work to Steve Jobs for his approval. Jobs played with the device, scrutinized it, weighed it in his hands, and promptly rejected it. It was too big. The engineers explained that they had to reinvent inventing to create the iPod, and that it was simply impossible to make it any smaller. Jobs was quiet for a moment. Finally he stood, walked over to an aquarium, and dropped the iPod in the tank. After it touched bottom, bubbles floated to the top. "Those are air bubbles," he snapped. "That means there's space in there. Make it smaller." <<<
I could listen to him play and talk all day. [[Steve Jordan on Jamming with John Mayer, How Not to Play "Soul Man," and More Drum Wisdom – Reverb - YouTube|https://www.youtube.com/watch?v=ut7nkarQqnU]] <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/ut7nkarQqnU' frameborder='0' allowfullscreen></iframe></div>
[[Steve Schmidt]] with a small number of words that say so much regarding [[POTUS]] at the daily [[coronavirus]] "task force" briefings: from [[Trump floats another bogus coronavirus cure — and his administration scrambles to stop people from injecting disinfectants — The Washington Post|https://www.washingtonpost.com/politics/trump-floats-another-bogus-coronavirus-cure--and-his-administration-scrambles-to-stop-people-from-injecting-disinfectants/2020/04/24/77759238-8644-11ea-a3eb-e9fc93160703_story.html]] > “These briefings have become a daily symposium on unfitness,” Schmidt said. “He gets up there, he’s completely unprepared, he has no idea what he’s talking about and he says things that shock the conscience and make no sense.”
https://stevenberlinjohnson.com/tool-for-thought-b12c170fcc24 (also <a href="x-devonthink-item://E242CF94-5E94-4EEF-B345-A1BB2FA13CB5">archived in DevonThink</a>) Notes: * [[Steven Berlin Johnson's short chunks of text]] * [[Steven Berlin Johnson: checking others' note libraries]]
from Steven Berlin Johnson, [[Tool for Thought|https://stevenberlinjohnson.com/tool-for-thought-b12c170fcc24]]. (<a href="x-devonthink-item://E242CF94-5E94-4EEF-B345-A1BB2FA13CB5">local archive</a>) > The other thing that would be fascinating would be to open up these personal libraries to the external world. That would be a lovely combination of old-fashioned book-based wisdom, advanced semantic search technology, and the personality-driven filters that we've come to enjoy in the blogosphere. I can imagine someone sitting down to write an article about complexity theory and the web, and saying, "I bet Johnson's got some good material on this in his 'library.'" (You wouldn't be able to pull down the entire database, just query it, so there wouldn't be any potential for intellectual property abuse.) I can imagine saying to myself: "I have to write this essay on taxonomies, so I'd better sift through [[Weinberger's library|http://www.hyperorg.com/blogger]], and that chapter about power laws won't be complete without a visit to [[Shirky's database|http://www.shirky.com/]]." The only difference for me is that I love people being able to pull down the entire database of my stuff. It was all free where I got it anyway! (With the exception of notes on books/PDFs/ebooks that I buy, in which case it would seem wrong to have a zillion snippets of copyrighted text in here, all from a single book. Which is disappointing.)
> But files are a different matter. Think of all the documents you have on your machine that are longer than a thousand words: business plans, articles, ebooks, pdfs of product manuals, research notes, etc. When you’re making an exploratory search through that information, you’re not looking for the files that include the keywords you’ve identified; you’re looking for specific sections of text — sometimes just a paragraph — that relate to the general theme of the search query. If I do a Google Desktop search for “Richard Dawkins” I’ll get dozens of documents back, but then I have to go through and find all the sections inside those documents that are relevant to Dawkins, which saves me almost no time. > So the proper unit for this kind of exploratory, semantic search is not the file, but rather something else, something I don’t quite have a word for: a chunk or cluster of text, something close to those little quotes that I’ve assembled in DevonThink. If I have an eBook of Manual DeLanda’s on my hard drive, and I search for “urban ecosystem” I don’t want the software to tell me that an entire book is related to my query. I want the software to tell me that these five separate paragraphs from this book are relevant. Until the tools can break out those smaller units on their own, I’ll still be assembling my research library by hand in DevonThink. from Steven Berlin Johnson, [[Tool for Thought|https://stevenberlinjohnson.com/tool-for-thought-b12c170fcc24]]. (<a href="x-devonthink-item://E242CF94-5E94-4EEF-B345-A1BB2FA13CB5">local archive</a>)
From [[Stian Håklev]] on [[Twitter|https://mobile.twitter.com/houshuang/status/1218008231521345536]] > Neat script by @andy_matuschak to "read in a folder of Markdown files, note all the [[wiki-style links]] between them, add a special "backlinks" section which lists passages which reference a given file." Made it work for @RoamResearch backup https://www.youtube.com/watch?v=DJtCoV4lF-A #roamcult This is the script: https://github.com/houshuang/note-link-janitor
What a delightful newsletter: [[Story Club|https://georgesaunders.substack.com/]] with [[George Saunders]] (via my friend at the [[humdrum.life]] newsletter). I just read [[“Cat in the Rain,” by Ernest Hemingway, Part One|https://georgesaunders.substack.com/p/a-cat-in-the-rain-ernest-hemingway]] and signed up after that. [[This comment|https://georgesaunders.substack.com/p/a-cat-in-the-rain-ernest-hemingway/comment/4012974]] by Susanna Benningfield was great: > This method of study, taking a small chunk of primary text and then digging deeply into the meaning and implications held within it, and doing it together with a bunch of people commenting around it in the margins of the primary text, feels sort of Talmudic. There's a Hebrew word, Chevrutah, which translates as the connection between study partners, or friendship, or companionship, and some might say that holiness is found in that connection. > > If we accept that time is an illusion, and the current moment, the now, is infinite, then it becomes easier to be patient and go slowly with this method, and shift our focus to our connection with each other. We can also learn to be better readers and better writers, too. Things go in deeper that are lingered over longer. Thanks, George, for creating this delightful container for us.
https://wfmu.org/playlists/FR Hosted by [[Fabio Roberti]] on [[WFMU]].
I'm halfway through [[Fabio Roberti]]'s [[Strength Through Failure]] show on [[WFMU]] from 2020-03-19, where he did a tribute to [[Genesis Breyer P-Orridge]]. It is the most emotional I’ve ever heard Fabio get in the 15 or so years I’ve been listening to him. Just an astounding and moving show. https://www.wfmu.org/playlists/shows/92125
http://studioprojects.com/c1.html > The Studio Projects C1 is a large diaphragm, fixed-cardioid condenser microphone employing a 1.06” (27mm) capsule, high quality, low noise amplifier and balanced, transformerless output circuitry. It features switchable -10dB or -20dB pad and 6dB@75Hz or 150Hz high pass filter for added control in various recording applications and a clear, full response expected from a large capsule microphone design. Got mine in about 2003.
[[2019-01-27 multi-select to copy and paste from Tinderbox]]
Lots of these come from the Reddit [[r/bujo|https://www.reddit.com/r/bujo]] forum: * Don't create empty Collections until you have actual recorded things in the Daily Log to create collections of and migrate things into. ([[source|https://www.reddit.com/r/bujo/comments/ajgj5p/i_made_this_page_and_couldnt_think_of_anything_to/eevggg4?utm_source=share&utm_medium=web2x]]) * Even though I want to perfect and adopt the One Perfect Weekly Spread like I see so may of the people on the Reddit forum showing off, all the wisdom on the forum says to start minimal and stick with it for a while and only add complexity and customizations as I need them. I think that's a smart way to go.
* 2019-05-01 Remembering that giving other people a chance to speak is more important than proving I have something smart to add. * 2019-05-01 Keeping copies of thank-you notes I write to people. * 2019-05-01 Writing thank-you notes to people. (This list inspired by Catherine's [[Continuous Improvement|https://www.casualbedlam.com/#Continuous%20Improvement]] tiddler.)
https://www.hbo.com/succession
[[Summer Of Soul (…Or, When The Revolution Could Not Be Televised)|https://boxd.it/tbhu]] Directed by [[Questlove]] > During the same summer as [[Woodstock]], over 300,000 people attended the Harlem Cultural Festival, celebrating African American music and culture, and promoting Black pride and unity. The footage from the festival sat in a basement, unseen for over 50 years, keeping this incredible event in America’s history lost – until now.
Doug Z sent all us dudes a link to the studio version of this song today and it caused me to go deep on Sunflower Bean. Lordy. <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//QCuUXsntDlk' frameborder='0' allowfullscreen></iframe></div> <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed//1aFNpHKgEvE' frameborder='0' allowfullscreen></iframe></div>
[[Johnny.Decimal]] introductory post and extremely long thread on [[Hacker News|https://news.ycombinator.com/item?id=25398027]] !! Favorite parts: https://news.ycombinator.com/item?id=25415405 > The problems that are now universal ("Acme Corp Contract", "Acme Corp Contract - final version", "Acme Corp Contract - final with client revisions", "Acme Corp Contract - senior management approval", "Acme Corp Contract Brian", etc.) have indeed come about because computer-illiterate and filing-illiterate office workers thought the FAT file system (and then NTFS and/or Sharepoint) was a magic, zero-effort substitute for having a system both for keeping records and for training/indoctrinating new staff to keep records properly. https://news.ycombinator.com/item?id=25415088 > Something jen729w doesn't talk about, but possibly should: if you have two categories that have similar things in them, have the same IDs in both. For example, I'm a low level manager. I've got an area for admin paperwork. One category is Me, other categories are for each of my subordinates. Each of those has a ID for annual performance reports. So mine is 11.01. My subordinates are all 12.01/13.01/14.01. This may result in skipped IDs, as not all subordinates have all of the IDs in use. But this is still helpful, as I know that 01 is always for annual performance reports, 02 is always for training, etc. > > Another thing for Johnny: You may not need to get the IT team to make you a Sharepoint list for tracking your IDs. You may have your own little Sharepoint site if they use MS365. OneDrive for MS365 business runs on Sharepoint. So just make your own there. > > Admittedly, I don't, because I'm actually using OneNote for that, as well as storing the notes. So every Area is a section group, Category is a section, and every ID is a page. And if I need to make more notes in an ID, I can make a subpage. But normally it's group-section-page. This leads into: the default page is 00.00, which is the table of contents. If you want to go really crazy, you could just embed any files into the pages as well, but I currently think that's a kinda nasty way to do it. https://news.ycombinator.com/item?id=25413448 > //... “Destroy after {reasonable future date}” ...// > > A whole book on this is "Delete: The Virtue of Forgetting in the Digital Age" by Viktor Mayer-Schönberger (2011). > A longer piece with the author in The Guardian: https://www.theguardian.com/technology/2011/jun/30/remember-delete-forget-digital-age > And the book: https://www.jstor.org/stable/j.ctt7t09g
https://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html > SuperDuper is the wildly acclaimed program that makes recovery painless, because it makes creating a fully bootable backup painless. If Dave Nanian isn't going to consistently use that awful exclamation point in his SuperDuper ad copy, then neither am I.
A fitness app for the [[Oculus Quest]] https://www.getsupernatural.com > Supernatural is an immersive, virtual reality fitness experience that combines the best music, coaches, destinations and movements into an incredible home workout. A new workout is released every day. Recommended by [[Benjamin Wittes]] on [[Twitter|https://twitter.com/benjaminwittes/status/1273230327452962818]]: > Okay, I don’t normally talk about products on Twitter—and just to be clear, I have no relationship at all with @getsupernatural at all—but if you are a bored fitness person and want an incredible workout, I highly recommend giving this virtual reality workout program a try.
We binged Superstore a bunch this weekend and it's really grown on me. It's funny when you pay attention to it, but it's also great to have on as TV wallpaper because it can move so slowly. These two articles sum it up well: * https://www.vox.com/culture/2019/5/21/18627101/superstore-review-recap-watch-nbc-hulu * https://www.vox.com/2016/2/9/10944962/superstore-nbc-review-america-ferrera
https://syncthing.net > Syncthing is a ''continuous file synchronization'' program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.
Ahhhh, I may have known and then forgotten that the [[Highlight Plugin|https://tiddlywiki.com/plugins/tiddlywiki/highlight/]] in [[TiddlyWiki]] makes it easy to get syntax highlighting. Just put in a code block and specify the language right after the three backticks: ```javascript alert( 'Hello, world!' ); ``` Import it from here: https://tiddlywiki.com/plugins/tiddlywiki/highlight/#%24%3A%2Fplugins%2Ftiddlywiki%2Fhighlight
<div class="tc-table-of-contents"> <<toc-selective-expandable "TableOfContents" "sort{fuzzy}" >> </div>
https://tailscale.com > Zero config VPN. Installs on any device in minutes, manages firewall rules for you, and works from anywhere. Oh man this looks cool. [[Via|https://rudimentarylathe.wiki/#Tailscale]] [[Jack|Jack Baty]].
[img[https://twelvety.com/philtiddlywiki_images/2019-05-24-tank-and-the-bangas-green_balloon.jpg]] 2019-05-23 Downloaded hi-res version from [[Qobuz]] store. 2019-05-24 This record is expansive, raw, funny, touching, and gorgeous.
https://tapeop.com My favorite magazine ever. Still free.
[img[https://twelvety.com/philtiddlywiki_images/2021-03-18-tascam-tsr8.jpg]]
* 2019-08-27 Based on [[this old expired listing|https://rvrb.io/tsr-8-7kn]] on Reverb, [[Adrian Pro Audio|http://adrianproaudio.com/]] looks like a good place to send the [[Tascam TSR-8]] (eventually). I'm sure I will pay dearly but that's ok.
https://www.taskpaper.com/ > Plain text to-do lists for Mac Also available on [[Setapp]].
https://www.tc-helicon.com/product.html?modelCode=0726-AAZ > 3-Button Vocal Effects Stompbox with Looping
https://www.hifiengine.com/manual_library/teac/x-1000r.shtml Adding this [[reel-to-reel]] deck to my wishlist. And this guy [[Vintage Audio Addict]] is a great restoration resource. He makes tearing these down and building them back up seem do-able: https://youtu.be/hTCLoBXf7JU
[img width=30% [https://twelvety.com/philtiddlywiki_images/2019-06-09-po-16.jpg]] https://teenage.engineering/products/po 2019-06-09 I love the stuff Teenage Engineering makes. I got obsessed with their line of Pocket Operator synthesizers and sequences/drum machines during this past week at the beach. A friend there showed me his PO-33 sampler and I figured the only slightly cheaper PO-16 synth would be a good first step. It's really fun to play with, and sounds better and more precise overall than my Commodore 64's SID chip did back in 1985. Mine came from B&H with a silicone "pro" case included, but I took it off five minutes after putting it on. It makes the buttons too hard to press, and the LEDs almost impossible to see. I almost got caught by the quest for The Perfect Case, but I figured it'd be better to actually //use// this thing for a while and then see about a case. It works really nicely with the [[IK Multimedia iRig Pro]] and iPhone 6 (which is easier to use than the iPhone 8 because the 6 still has a headphone output, and the iRig Pro has no audio out).
http://tesis.tiddlyspot.com/ A gorgeous [[TiddlyWiki]] instance.
This is just a list of tiddlers matching the "apps" tag: <<list-links "[tag[apps]]">> This is the list of tiddlers matching the "Paste to Markdown" title: <<list-links "[title[Paste to Markdown]]">> This is the list of tiddlers with "20190108T0948" somewhere in them: <<list-links "[!is[system]search[20190108T0948]]">>
https://www.unmarked.com/textsoap/ > Automate Tedious Text Document Clean up On [[Setapp]]. It seems like half the time I think of a new app I need, it's already in there.
I love the "Values" section from [[John Jacobsen]]'s [[resume|http://johnj.com/static/jacobsen-resume.pdf]]: > Always learning new ways to increase simplicity and elegance in design and implementation, combined with operational, coding, and testing discipline to improve reliability and deliver repeatable value. Respectful, honest and clear communication with clients, customers and colleagues.
[[The Amp Hour Electronics Podcast|https://theamphour.com/]] > A weekly show about the trends in the electronic industry. More often it's just two dudes talking about electronics testing equipment and soldering and that's what I'm here for.
* It should be as tiny as possible, like a [[Ricoh GR (2013)]]. * 16MP APS-C sensor * Must have a viewfinder – either optical, electronic, or hybrid – with diopter correction * Fixed non-zoom lens, either 35mm or 40mm equivalent * Fixed LCD display. Don't want a swiveling one * Non-touch sensitive screen * Dedicated top dial for shutter speed * Dedicated aperture ring on the lens * No way for dust to get on the sensor * Black * Also, I want it to //do something// to my photos. Leave its mark. I don't want the images to be a perfect representation of reality. The GR line of cameras //does something//. Actually, the [[Fujifilm X100T]] is probably it except nothing else is as small as a GR.
Matt told me about [[The City]], which was the band [[Carole King]] was in very briefly between her time in the Brill Building and releasing //Tapestry//. They released [[Now That Everything's Been Said|https://www.discogs.com/The-City-Now-That-Everythings-Been-Said/master/301188]] in 1968 and it's just unreal. [img[https://twelvety.com/philtiddlywiki_images/2021-05-31-the-city.jpg]]
https://en.wikipedia.org/wiki/The_Conet_Project > The Conet Project: Recordings of Shortwave Numbers Stations is a four (later five) CD set of recordings of numbers stations and noise stations: shortwave (HF) radio stations of unknown origin believed to be operated by government agencies to communicate with deployed spies. This mirror of Irdial has the entire 5-disc set (cat. no. ''59ird tcp1''): http://irdial.hyperreal.org/
https://www.criterionchannel.com Signed up before the April 2018 launch to get the discount. !! Watched * 2019-08-04 The Decline of Western Civilization * 2019-08-03 Night Nurse * 2019-07-28 Easy Rider * some others that i need to add * The Wicker Man * 2019-05-03 [[Wanda|https://letterboxd.com/twelvety/film/wanda/]] (1970)
https://archive.org/details/diamondheadtapes > A collection of videotapes bought at auction from the collection of Diamondhead Records, a 3-store music chain in the Houston, TX area. This collection is all over the place: Mercyful Fate, Stone Temple Pilots, [[Kiss]], Dio, Black Sabbath, Rush, Soundgarden, Thin Lizzy, Judas Priest, etc.
https://thedigitalstory.com Mostly about digital photography. Hosted by [[Derrick Story]]. I had forgotten what a fun website that is, and how much I like hearing his voice on the podcast.
[[The Fallacy of the ‘I Turned Out Fine’ Argument — The New York Times|https://www.nytimes.com/2018/11/27/well/family/the-fallacy-of-the-i-turned-out-fine-argument.html]]
https://www.imdb.com/title/tt7569576/ We're two episodes in and it's riveting. Ridiculous, but good.
[[The future needs files – Scott Jenson|https://jenson.org/files/]] [[via|https://rudimentarylathe.wiki/#2021.09.01%20-%20Daily%20Notes]] [[Jack|Jack Baty]] > Yes, you can “Share” notes with other iOS users but that’s a very Procrustean Bed you’re making. You have to ask “at what cost”? Are you really willing to bet your creative productivity to a single app from a single company? Remember, this approach prevents your notes even from being used by other iOS apps as well! That line about a single app from a single company. Ouch.
Recent thoughts from others about [[Obsidian]], [[Roam]], [[org-roam]]. This does not bode well for me and Obsidian: [[Jack Baty]] on 6/11: https://www.copingmechanism.com/2020/so-i-went-with-roam-research-and-am-a-true-believer/ > Roam isn’t the choice I wanted to make. I wanted to use Org-roam. Still do. I also find Obsidian compelling. But, I had to stop losing sleep thinking about it, so I made the decision to go all-in with Roam. It’s the outliner, simplicity, and block-level references that clinched it. Many will say that I don’t “own my data” but I kind of do. I export the entire DB as JSON daily and could probably recreate the thing in Obsidian or something else in a few hours. I don’t feel locked in, but I’m sure some people disagree. Good for them, that’s what Org-roam and Obsidian are for. Kevin on 6/13: https://tiv.today/2020/06/roamvobsidian > The more I use Obsidian, the more I miss Roam. Getting thoughts down and organizing them after the fact is so much nicer with the Roam outliner. I hate myself right now. Kevin on 6/14: https://tiv.today/2020/06/backtoroammaybeeeeee > Well… I added a bunch of Daily Pages back to Roam from Obsidian… Driving myself a bit crazy at this point, but Roam just feels like it takes the best pieces of all of the other tools for text and puts them into a package that is both streamlined and frictionless.
[[Roon]] recommended the new [[See You Tomorrow|https://theinnocencemission.bandcamp.com/album/see-you-tomorrow]] album by [[The Innocence Mission]] on [[Qobuz]] and man, it's really good. I didn't even know they were still making records. [img[https://twelvety.com/philtiddlywiki_images/2020-02-20-the-innocence-mission-see-you-tomorrow.jpg]]
[[Barbara Stanwyck]] and [[Henry Fonda]]
This is the article that everyone refers to when they talk about [[loop-on-ground antenna]] designs: [[The Loop on Ground Antenna - the "LoG" -- kk5jy.net|http://www.kk5jy.net/LoG/]] by [[Matt Roberts]] > Remember, as with any receiving antenna, if you hear an increase in band noise when you connect the antenna, and a decrease when you disconnect it, the antenna has enough gain for that band, and a preamplifier is unnecessary. You might need to turn up the volume to get the sound level you want, but if you can run without a preamplifier, it will improve the SNR in your receiver. ... > Now that the antenna has been in the yard for a while, I have been able to test it on some real-world signals, as described in the sidebar at right. This is where the rubber meets the road, because my home is located in a less-than-friendly RF environment. Nonetheless, I am very pleased with the results of the 15' square loop-on-ground, and it has become my primary recieve antenna for most HF work. Since we are well into the low-band years of the sunspot cycle, this antenna appears to be well-sized for this kind of on-air work. In the end, a loop of wire in my yard has turned out to be one of the best pieces of gear I have ever used for HF, as well as one of the least expensive. That's a slam-dunk combination.
DVDs of seasons 1–3 at https://movies.disney.com/the-muppet-show and on Amazon
Seeing this screenshot lights a fire in me to get a personal knowledgebase going. He has things in chunks like Steven Berlin Johnson does with DEVONthink. from [[The Garden and the Stream: A Technopastoral — Mike Caulfield|https://hapgood.us/2015/10/17/the-garden-and-the-stream-a-technopastoral/]]: from Mike Caulfield's blog: [img[https://twelvety.com/philtiddlywiki_images/2019-01-07-federated-wiki.png]]
https://en.wikipedia.org/wiki/The_Stone_Roses
* 2019-11-05 Like clockwork, the fall time change puts me in a mind where I want to organize EVERYTHING, all at once (even more-so than usual). Reminds me of when I got my first couple of [[Palm OS]] devices and wanted to log, plan, and record all my stuff with them. It's probably partly to do with the weather getting colder (although not by much yet), the impending holidays and all their related obligations and logistics, and the beginning of a new year. Somewhere in my brain is a region that believes that if I could just. get. all. the. tasks. listed. and. slotted., then I could make sense of it all.
https://theweeklyreview.fm > A Podcast About Starting (or Restarting) The Chapter of Your Life in Which You Get Organized
What a terrible name for a tiddler. Anyway: https://culturedcode.com/things/ I //love// this app and it pains me to have realized after all this time that my brain will systematically ignore the tidy, hierarchical, slice-and-dice, perfectly normalized way it stores and presents tasks. The [[bullet journal|2019-04-22 bullet journal experiment]] has proven to be the only thing that actually gets me to do the things I write down, as well as to do a [[Weekly Review]] (even a sporadic one) and actually think about what I'm doing. So I end up using Things as a glorified replacement for the horrible, eternally broken [[Reminders]] app (which is relegated to being the sole recipient of Siri commands, which is does extremely well with). But I'll keep Things because of the lovely way it helps with recurring reminders.
I'm not that good at all of these, but I'm trying. * 2019-08-28 If you ever catch me writing an email that says, "Thoughts???", just take away my account. * 2019-05-16 There is just no reason for anyone to walk around with ear hair. Not with all the tools and time we have these days. * "Collaboration" software is no substitute for conversations and planning. * No one should be able to hear your music at work. That's why we have earbuds, AirPods, and headphones. * No one at work is ever hoping you'll drop by to chat. * Always leave at least three seconds of following distance in front of your car. * I'm stealing this from [[Marco Arment]] from some early episode of [[Accidental Tech Podcast]]: "A car in the lane beside mine is a problem to be solved." Meaning, you should never have a car in the lane right beside you for more than a couple of seconds. Either speed up or slow down to fix that. * Don't honk at people to "wave hello". * Try to be on time to meetings. At least try. * Don't print so much. Use "Print to PDF" more. * Turn off the lights when you leave a conference room (if they don't turn themselves off). * Zip up your pants while you're still facing the urinal. Please do not turn and awkwardly face people while putting yourself back together. * Instead of saying, "To your point...", say, "Like you said..." * When you're 40+ years old, two beers in one night is almost always plenty. * Don't leave your phone on the table when out with friends. Even face down. Leave it in your pocket. * When you're temporarily superficially depressed (because of lack of sleep, seasonal affective disorder, etc.), do six quick chores in a row to break out of it. (I stole this from somewhere years ago but I'll never remember where now.)
2019-08-10 What to do instead of [[getting sucked into the phone so much|2019-08-07 using the smartphone less mindlessly]]? * Use laptop more * Walk * Read printed books * Read [[The Economist]] * Sleep * Actually answer emails * Watch movies * Cook * Listen to LPs * [[Bullet journal|2019-04-22 bullet journal experiment]]
https://github.com/AlexanderWillner/things.sh > Simple read-only comand-line interface to your Things 3 database
I won't let myself use [[Roam]] on my work PC during the workday, and if I had it running on the home Mac beside me, I'd just end up using it when I shouldn't, and someday when we go back into the office, that won't be an option anyway, so here I am, thinking in the back of my mind about cool ways to arrange information in Roam, but not actually doing it all that much.
A podcast by [[Andy Sylvester]] https://thinkingabouttoolsforthought.com/ > Exploring tools and methods to help us think
I'm sorry, [[TiddlyWiki]]. It's not you, it's me. This feels like such a betrayal for a platform that was worked so well for so long. https://roamresearch.com/#/app/twelvety_public
[[Jack Baty]] wrote the most cogent definition I've seen about ''thoughts vs. records'' yesterday: https://copingmechanism.com/2020/thoughts-vs-records/ > Thoughts are meant to be used as raw materials for new thoughts. Records are for logging events. Thoughts are most useful right now, but will also be used in the future. Records are only useful in the future. Thoughts work better as easy, visual notes. Records can be kept in a simple, permanent, plain-text format. > > The difference here is that Thoughts //should of course// be as permanent as possible, but permanence is not their defining feature. Permanence is secondary to usefulness. I agree with all of it, and would like to add that for me at least, thoughts can //morph into// records if given enough time. And sometimes I'll have a thought, and then a record, and then another thought, all in one sentence in whatever system I'm currently using. So then what the hell do I do? And even though I feel like [[Roam]] is still the easiest and least bad and most fun of all the options, I //still// don't trust it for the long term! My god, I will never be free of this conundrum, apparently. I guess I should just shut up and stick with Roam because it's good enough for most things, but am I putting my music logs into it? No. Would I trust my health logs or my car service or home maintenance logs with it? Nope. They're all still in [[Markdown]] text files in [[Dropbox]]. And I can't even prove exactly why! Three beers in on a Friday night is probably the wrong time to be trying to figure this out. Also, [[Roam]] needs to get its shit together and figure out a way to make blockquotes look at //least// as good as [[Markdown]] can, because mine don't look like anything but a greater-than sign and undifferentiated text right now.
When I see this, I'm in 6th grade all over again. (Original screenshot from [[Ninerpedia.org|https://www.ninerpedia.org/wiki/TI-99/4A_system_usage]], uploaded by [[Michael Zapf|https://www.ninerpedia.org/wiki/User:Mizapf]].) [img[https://twelvety.com/philtiddlywiki_images/2019-01-13-ti994a-startup-screen.png]]
https://giffmex.org/gifts/tiddlyblink.html > TiddlyBlink is an adaptation of [[TiddlyWiki]] with the goal of helping you see connections between your ideas, and move quickly from one note to another. It was inspired by the bi-directional linking found in [[Roam]], but built with capabilities already available in TiddlyWiki. I'm anxious to try it, but I just need to figure out how to make it not interfere with the autocomplete plugin I already have laying around here. Also, what a nice thing to have `gifts` in the directory path.
2019-02-13 Stole this tiddler from http://tobibeer.github.io/tb5/#TiddlySpot ''Update:'' I could never get the initial upload to work in Chrome nor Safari. I ended up having to upload it through the TiddlyDesktop macOS app. But even after that, I can't get these browsers to upload back to TiddlySpot when saving. ----- The workflow to host any tw5 on TiddlySpot couldn't be much simpler: In fact, you can upload ''__any__'' tw5 to your TiddlySpot Site ID, simply by entering the correct Site ID and password into [[ControlPanel|$:/ControlPanel]]: ''Done!'' If you neither have a TiddlyWiki or TiddlySpot yet, here's a simple process to do to get both up and running (only works in Chrome or Safari, not Firefox or IE). # create [[new TiddlySpot|http://tiddlyspot.com]] #* flavour doesn't matter, just remember the ''Site ID'' #* keep that window open # [[download|http://tiddlywiki.com/#GettingStarted]] or simply [[open an empty TiddlyWiki|http://tiddlywiki.com/empty.html]] # set your basics in [[ControlPanel|$:/ControlPanel]] to your liking ...I most always do: #*''Info:'' Title, Subtitle, Username, animation = 0 #* ''Settings:'' autosave "off", "include target URL", "update history" # under [[ControlPanel / Saving|$:/ControlPanel]] enter TiddlySpot credentials #* simply enter TiddlySpot password and ''Wiki Name'' as TiddlySpot site ID # click save {{$:/core/ui/Buttons/save-wiki}} #* open or reload that TiddlySpot window # Enjoy! !!Related articles <<taggly>>
https://twcloud.github.io
https://tiddlywiki.com/#Community
via Jack. Praise the lord. https://talk.tiddlywiki.org/
https://tiddlywiki.com/#TiddlyWiki%20Hangouts
* http://tiddlymap.org * https://tiddlywiki.com/plugins/tiddlywiki/highlight/ * https://burningtreec.github.io/TW5-navigator/ * http://seealso.tiddlyspot.com * https://tiddlywiki.com/editions/text-slicer/ * https://github.com/mpenkov/tiddlywiki-splitter * http://tw5magick.tiddlyspot.com * per Jeremy Ruston on [[Google Groups|https://groups.google.com/d/msg/tiddlywiki/mDrqJJVfQbU/fGiFsYCUGQAJ]]: "Jed Carty's 'Bob' extension does provide full two way syncing between the file system and TiddlyWiki: https://github.com/OokTech/TW5-Bob"
from: https://tiddlywiki.com/#Future%20Proof > TiddlyWiki is designed with the long term needs of its users in mind. Because it is OpenSource and needs no infrastructure, we can be confident that all we'll need to access a TiddlyWiki file even in the far future is an ordinary HTML browser. If you're starting to use TiddlyWiki at the beginning of your career you can be confident that it will carry you through to retirement.
https://125px.com/ http://micro.blog/tgray
http://timeryapp.com This is a 3rd-party app that works with the [[Toggl]] time-tracking service. Grey and Myke raved about it on [[Cortex episode 86|https://www.relay.fm/cortex/86]]. 2019-06-17 I signed up for the $0.99/month plan for now. It seems really good so far. I'm not using it for work, since we already track our time in other systems. I'm using it for non-work time. It's already making me more aware of how I fritter away minutes. 2019-06-19 I'm not using it to track //everything// outside of work, but I am using it to track things I want to do more of //or// less of. It's not for stuff like eating dinner, lunch, breakfast, or social/family activities.
https://ibnishak.github.io/Timimi/ > Timimi is a browser extension that allows user to save standalone tiddlywiki files - both TW5 and TW-Classic. In addition, Timimi also provides ability to backup the tiddlywiki files to a path of user's choice.
https://www.eastgate.com/Tinderbox/ > Tinderbox helps you visualize, analyze, and share your ideas.
[[Jack|Jack Baty]], thank you so much for sharing how and why you use a [[daybook]] in [[org-mode]]. These [[two|https://rudimentarylathe.wiki/#2021.07.12%20-%20Daybook%20versus%20Journal]] [[tiddlers|https://rudimentarylathe.wiki/#Daybook]] were extremely helpful tonight. First, now I'm not scared of capture templates anymore! I don't know why I was – I just thought I was going to set off all kinds of bad things if I did them wrong. But they are amazing and so ultra fast! Second, holy moly datetrees are great. I really like that format and didn't realize capture templates made them so easy to build. Third, my mind is totally blown at the flexibility of the [[org-mode date/time prompt]]. I could mess with this all day!
<<list-links filter:"[tag[to read]]">>
https://tobibeer.github.io/tw5-plugins/#random > A filter to return one or more random titles
from: https://m.facebook.com/RobertPollardGBV/posts/10151622826497951 > Tommy Keene: "I don’t know if there will ever be another Keene Brothers record—I’m up for it but don’t know about how Bob feels, he tends to move on after doing a project. The process of doing that album was that I sent him rough sketches of songs with drum machines to full-on fleshed out studio versions of about 30 songs and then he whittled it down to the 12 he felt most comfortable with, as in I think the 12 that he could hear melody lines and lyrics to. One song which I thought was in the bottom-tier quality-wise was one he picked and it ended up becoming the best song on the album! The song is “Death of the Party”. He came up with a fantastic melody line over my chord changes and great lyrics! This is an example of true collaboration: all too often when you’re writing with other people who are more successful than you, they tend to hold back their good bits for their own career or record, you have to bring something to the party to make it work and he did!!" This is surprising. "Death of the Party" is one of the most gorgeous songs I've ever heard. Reminds me of CS&N's "Guinnevere" in places.
https://www.zylstra.org/blog/
[[100 Days in Obsidian Pt 6: Final Observations – Interdependent Thoughts|https://www.zylstra.org/blog/2020/11/100-days-in-obsidian-pt-6-final-observations/]] by [[Ton Zijlstra]] > I refuse to use any functionality that creates functionality lock-in, and makes me dependent on that particular feature while compromising the 3 key conditions mentioned above. Basically this covers any functionality that determines what my data looks like, and how it is created (naming conventions, automatic lay-outs etc). Functionality that doesn’t stick to being a viewer, but actively shapes the way data looks is a no go. Ton was a guest on [[Andy Sylvester]]'s [[podcast|https://thinkingabouttoolsforthought.com/episode-008-interview-with-ton-zijlstra/]] recently. This is making me think very differently about [[Roam]], which just by its formatting renders things hard to use elsewhere. Also the block references and transclusion in things like Roam, [[Logseq]], and [[Obsidian]]. All of these tools do that stuff differently. If there was an agreed-upon standard for how to mark these things up, that would be different, but adopting any of those features in any of the existing tools puts a person in the position of feeling like they're digging themselves into a hole. Isn't it better to use any notetaking tool in the dumbest way you can tolerate, so you can know that you can switch to something else in the future when its "viewer" capabilities seem compelling? In short, are the short-term gains from using whatever fancy, proprietary features in a tool worth the cost of spending time worrying about lock-in, and the lost time or lost search results when you can't query all of your notes at once? see also [[Paradigm shifts for the decentralized Web – Ruben Verborgh]]
https://www.toneboosters.com/tb_morphit_v1.html 2019-07-07 Trying this as a plug-in in [[Reaper]]. [[Sonarworks True-Fi]] at the OS level has a nice correction curve for the [[Sony MDR-7506 headphones]], but it introduces such latency that I can't play along to any previously recorded tracks. Maybe Morphit will be better?
There seems to be a huuuuuuge potential for overlap between topic journals and this wiki, so I don't know if/how I would ever start doing this, but man, what a great thing: Jack Baty: [[Using the Emacs Deft package for topic journals|https://www.baty.net/2019/using-the-emacs-deft-package-for-topic-journals/]] which links to... Derek Sivers: [[Benefits of a daily diary and topic journals|https://sivers.org/dj]]
[[DONE]] Moved the [[music to check out]] list to [[Obsidian]] and will keep logging found music that way with linked dates and band names (and not in [[Daily Notes]]). This way, I get to keep my [[topic journals]] for certain things. [[TODO]] Also do this for [[Couch to 5K log]], [[XYZ Company mortgage log]], [[dishwasher log]], [[clothes dryer log]], [[phil health log]], and whatever other things need to have exhaustive, visibly complete histories. Like [[visual workspaces]] and [[Edward Tufte]]’s [[small multiples]], these need to be easy to review and compare over time by looking at one file, and I need to know that all the entries for a respective topic are in there. A bonus is that each file will be readable on the iPhone. These details will not go in [[Daily Notes]], so each entry will be dated. They are different than notes in Daily Notes, which are usually about external things from external people, or just generally events that happened, where tags bring things together in unexpected, nice ways and it’s not a big deal if something isn’t tagged. Topic journals are like the best of dated entries in [[org-mode]]/[[org-journal]] but with the [[org-agenda]]-like display of data, which will show up in Daily Notes. [[meta]] Also, this reminds me of one other reason I’m holding off from [[Roam]] is that [[Obsidian]] files are easier and more reliable to add to and edit from the phone. And I prefer the `yyyy-mm-dd` format for [[Daily Notes]] names because that’s what I’ve been using for freaking EVER and I don’t want a bunch of fully spelled out dates in my files. He said obstinately.
I never learned it. Posted this on Micro.blog just now: > I'm 50 and have been typing "incorrectly" for 38 years, ever since I got a TI-99/4a computer. All this time I've been using nine of my 10 fingers. When I pay attention, I can get up to around 65 WPM. Is it worth learning to touch-type now?
[[Fabio Roberti]] played [[Trevor Wishart]]'s [[Machine|https://trevorwishart.bandcamp.com/album/machine]] on [[Strength Through Failure]] on 2021-06-10. > Although Machine was completed in 1971 it was not released until 1973, shortly after the release of Journey Into Space. Machine is therefore the first major composition by Trevor Wishart. It was composed at York University and was originally issued on vinyl as 3 sides of a highly adventurous 3LP box set called Electronic Music From York, released by the University’s own record label. > > In common with Journey Into Space (also on Paradigm Discs), Machine makes use of a large number of volunteer contributors, mostly from the student body at York. With this recording, however, there are no instruments used. > > Instead, the music of Machine is made up entirely from a combination of spoken text and carefully directed improvising choirs that take their lead from prerecorded factory sounds. These are extensively mixed and edited with yet more collected machine sounds and other sources of musique concrète, as well as occasional use of basic electronic sources. The scale of this work, and the degree of preparation involved in scoring it, seem to have more resonances with the world of theatre or film rather than tape composition. Much of Wishart's early work involved the use of musicians and artists being directed to perform in new ways, outside of their usual remit. A combination of late 60s openness, detailed scores that provide frameworks for improvisation and slavish editing have resulted in an incomparable sound work. > > With a continuous playing time of one hour, the wild and previously unexplored terrain covered by this pioneering work of British experimental music moves in turn through the full range of possible audio landscapes from the oceanic calm of the doldrums to earsplitting factory mayhem.
https://tropicalfstorm.bandcamp.com/
[[Tuck Andress]] of [[Tuck & Patti]] still has a [[Tuck's Corner|https://roamresearch.com/www.tuckandpatti.com/tucks-corner]] section of their website. His [[Pick and Fingerstyle Technique|https://static1.squarespace.com/static/5a5bd42e8fd4d2aea7b0b426/t/5eddf0091cb53938998f511c/1591603210434/Pick+and+Fingerstyle+technique+6-7-20+version.pdf]] essay/white paper is unreal. This is the bonkers comprehensive database/recordkeeping/logging thing I remembered reading 20 years ago: * [[Tuck & Patti: Tuck's Corner: Questions and Answers --- Archive.org|https://web.archive.org/web/20151026055502/http://www.tuckandpatti.com/questions_answers_tuck.html]] (This is on Archive.org because the Tuck & Patti website is currently being rebuilt.) Scroll down to where it says: > ''2/25/00 (posted 2/24/01) In your corner section, you mention devoting much of your travel time on the road maintaining your databases. A blurb on your computer preferences and practices would be very interesting.''
https://edwardtufte.github.io/tufte-css/ > Tufte CSS provides tools to style web articles using the ideas demonstrated by [[Edward Tufte]]’s books and handouts. Tufte’s style is known for its simplicity, extensive use of sidenotes, tight integration of graphics with text, and carefully chosen typography.
* 2021-09-26 Added the random tiddler button, but I don't see it in the toolbar yet. ''Oh, because I'm not on 5.1.23 yet.'' * 2019-09-26 Added the Permalink button to the toolbar for each tiddler (in Control Panel > Appearance > Toolbars > View Toolbar). Also changed the order so the Permalink is //before// the Edit button, since I always expect Edit to be next to the Close This Tiddler button. * 2019-09-11 Changed default tiddlers to `[!is[system]!sort[created]limit[5]]`, so that annoying [[Most Recent Journal]] isn't there anymore. * 2019-05-04 Changed delimiter in [[Backlinks footer]] from `{space}{comma}{space}` to `{space}{pipe}{pipe}{space}` * 2019-04-09 WHEW. Per [[Josh Sullivan]] on [[Micro.blog|https://micro.blog/joshsullivan/3063733]], to fix the recurring "can't-press-Return-in-a-textarea" bug, I had to disable the ''escapecss'' plugin. I did that and didn't see an improvement, and then disabled the ''BurningTreeC/navigator'' plugin (which relies on ''escapecss'') and that did the trick. Not a huge loss because I hadn't internalized the keyboard shortcuts the ''Navigator'' plugin provided anyway. I will miss being able to pick tags with the keyboard, though. At least the Return key works again. * 2019-03-18 Hid author field in all tiddlers with [[2019-03-18 css - hide author name]]. * 2019-03-18 Got wiki fully living in DigitalOcean droplet. * 2019-03-14 Added a space after the comma in the [[Backlinks footer]]. Ahhh. That was bugging me. * 2019-03-06 took my last name off the wiki title line. partially for a tiny bit more obscurity, partially for aesthetics, because my last name is so long and it looked horsey there. * 2019-03-03 tweaked the CSS in the loading message so that the each line's visibility property is turned on as soon as it starts being "typed" and the width has a chance to expand. * 2019-03-02 I was tired of seeing the same "[[Hello world]]" welcome page every time I loaded my wiki, so I borrowed Jack Baty's [[Most Recent Journal]] structure and added it here, so it shows up above Hello World. At least that way if strangers don't look at anything else, they might see something recent. * 2019-02-24 added a loading message using [[2019-02-24 TW: Adding a loading message]] from [[Jack Baty]] * 2019-02-24 changed ''Line height'' from 20px to 22px * 2019-02-24 changed ''Font size'' from 14px to 16px * 2019-02-24 changed ''Line height for tiddler body'' from 22px to 24px * 2019-02-24 changed ''Font size for tiddler body'' from 15px to 17px
* Add macro to list tiddlers here for tags like `draft`, `review`, `stub`, `trail`, and `to process`. This is a list of things I should remember to do every so often: # check for duplicate tags that differ only by letter case # create these missing tiddlers: {{TW: Missing}}
<<list-links filter:"[all[missing]sort[title]]">>
Making this up as I go along: * In general, keep names as short as possible so they can be read in the sidebar (on a laptop), and to encourage the habit of linking to them from other tiddlers as often as possible. * ''Apps:'' Should get their own short tiddlers, no date, and should say "app" in the name, like "[[Beorg app]]". * ''Journal entries:'' "MMMM-DD-YY Journal" is working fine for now. * ''Links:'' See "When to use a date prefix" below. Use the prefix "link:" after the date. * ''People:'' Just the person's name, like "[[Jay Dixit]]". * ''Services:'' For now, they can just be the name of the service, no date. I'm not sure if they should say "service" in the tiddler name, unless the name is so obscure that adding it would help make it clearer what it was about. "OwnYourGram service" seems too unwieldy. * 2019-02-06: Adopted "TW:" prefix for TiddlyWiki tiddlers, after Jack Baty adopted it from h0p3. !! When to use a date prefix: {{2019-02-01 When to use a date prefix}}
! TODO * Upgrade TiddlyWiki to latest version. See [[Jack Baty's 2019.08.09 - Wiki: Upgrade to 5.1.20|https://rudimentarylathe.org/#2019.08.09%20-%20Wiki%3A%20Upgrade%20to%205.1.20]] * Figure out how to run TW in a single-page browser/app on macOS. See [[2019-02-06 Journal]]. * Add "TW:" to TiddlyWiki meta/specific tiddlers. See [[Tiddler naming conventions]]. * [[Andrew Canion]]'s wiki has a nice theme refresh going on. I like how calm my current TW default theme is, but his sure looks fun. * I like [[Sphygmus]]'s "Content" search with highlighted matches better than the fuzzy search I installed. Need to pull it in. * make/find an AppleScript to share Safari URL and title in TiddlyWiki markup to the clipboard * see what I need to change default tiddlers to based on examples in Jack's [[Changelog|https://rudimentarylathe.org/#Changelog]] * play with ListWidget and list-links macro: https://tiddlywiki.com/static/Introduction%2520to%2520Lists.html * find an AutoBackup plugin, or at least make sure Backblaze is capturing changes to the individual tiddlers. * CodeMirror * learn how to make one TiddlyWiki show tiddlers from other instances * keep importing Commonplace Book entries from DevonThink * rename meta2 tag to meta * if I keep a copy of this publicly accessible, set up Hazel rules to copy the saved HTML file to Dropbox > Transmit (and to Twelvety.com) every time the file changes. * learn about TOC widget * how to make the fuzzy search result previews not render plain text? * get a domain and host this wiki on Linode * enable QuickLook to read .tid files * Learn about transclusion https://tiddlywiki.com/static/Transclusion%2520in%2520WikiText.html ! DONE * 2019-02-03: For the standalone HTML version of TW, made Hazel copy the file to a backup folder (`~/Documents/web data backups/tiddlywiki-html/`) every time a new version is saved and uploaded to Twelvety server. * 2019-01-13: convert all tiddlers to TW syntax, get rid of .md and .meta files * Q: is there a TiddlyWiki syntax plugin for BBEdit? ''A: Apparently not.'' * [[2019-01-12 installed TiddlyWiki on Node.js]] so I can store everything as text files
I tagged the [[Steven Berlin Johnson: "Tool for Thought" essay]] tiddler with the `-parent` tag to indicate that it's a "parent" tiddler of the notes it refers to. This has been my dream all along: To have upper-level notes that refer to (or transclude) a bunch of lower-level notes. Backlinks make going the other direction really easy. See [[2019-02-09 Journal]] for thoughts on how this works fine for public sources, but will probably work best for book notes in [[Tinderbox]] or a private TW instance.
I'm trying to make this thing like a [[Zettelkasten|https://youtu.be/mCFP5i_0ibE]]. It should be nimble and expansive, but not store deep/complete works of others. Full archives of web or print articles should be saved as PDFs, imported to DevonThink, and linked to notes in this wiki. These go here: * quotes * snippets of articles * questions * book notes (a few) * people * notes on speeches, seminars or conferences * half-baked future blog posts * log-type notes about changes I make to the MacBook * word definitions * reference material for Terminal commands, code snippets * random facts I don't want to forget * poems (I debated this, but most poems I like are relatively short and they just look better in TiddlyWiki than in DevonThink anyway)
https://sonephetr2.github.io/ > Adds a random tiddler button to TiddlyWiki's page toolbar. To install simply drag and drop $:/plugins/kiasu/RandomTiddlerButton to your TiddlyWiki. Enjoy :) Requires [[tobibeer random tiddler plugin]]
https://www.twenband.com/
Got this as a suggested highlight in the [[Readwise]] email this morning. From the //Superhuman by Habit// book by Tynan. (Note: He has a [[background in the "pickup" genre|https://tynan.com/about]], but do I ignore a wise quote just because he's probably gross?) > Remember that the power of a habit isn't actually in the individual execution, but in the consistency. It is far far worse to skip doing something than to just do a horrible job of it.
A Markdown editor: https://typora.io 2019-06-15 installed the beta.
I have a shit-ton of real life responsibilities to theoretically catch up on, but I lately don't care about //anything// but spec'ing out a [[Eurorack]] [[modular]] setup. I'm firmly in [[hotbrain]] territory. I'm using [[Roam]] to take some notes on modules and cases I like, but Roam is almost too capable and rich for this purpose. Plus, I want to be able to open a text file on my phone and add to it or edit it at any time. And on the Mac I want to be able to hit `Save` and know that the data is there with no wondering. So I started with a [[Markdown]] outline stored in [[Dropbox]] and edited in [[nvALT]]. But nvALT is poor at outlining. (Yes, I have [[Dynalist]] as an [[outliner]], but I don't want to do research in it that I expect to stay around for years.) So back to text files. What has worked unexpectedly well is [[Typora]]. For making a Markdown outline, it's really clean and does all the nice indenting and formatting, and almost looks Roam-like. Only glaring drawback is that you can't move a line up or down easily with the keyboard, but that never stopped me from using nvALT before, so I'm trying to not let it be a barrier. {{ModularGrid}}
https://uturnaudio.com/products/orbit-basic-turntable https://uturnaudio.com/products/orbit-plus-turntable
Matt told me that //Achtung Baby// was in fact one of U2's best records, which I wasn't ready to hear, but I gave it a real listen the other day and he's right. I hated "Zoo Station" when it came out, but now I love it. You can tell when Edge's guitar starts chiming in after the distorted drum intro that something is about to happen. I could still do without "One", but the rest of it is either good or great, and an ambitious change in direction for a band at that stage at that time.
https://ublockorigin.com/ Turned on these filters in the Annoyances section of the Filter Lists in the extension preferences in hopes that the dumb cookie popups will go away: * EasyList – Annoyances * AdGuard – Annoyances * uBlock filters – Annoyances
I [[posted this|https://twelvety.micro.blog/2020/02/03/that-nagging-feeling.html]] about the mess I've made with [[Momento]], [[Diarly]], [[Roam]], [[org-journal]], the [[bullet journal|2019-04-22 bullet journal experiment]], [[Field Notes]], and [[Day One]].
[[what a no-fly zone means]] [[2022-03-14 Masha Gessen on Vladimir Putin (Ezra Klein Show)]] [[2022-03-04 Andrew Exum on not bragging about helping Ukraine]] [[2022-02-28 Fiona Hill on Putin and Nukes]] [[2019-05-20 Volodymyr Zelenskyy on lawmakers not displaying his photo]]
Heard [[Kim Stanley Robinson]] mention it on [[The Ezra Klein Show, July 2022|Kim Stanley Robinson on The Ezra Klein Show, July 2022]].
[[Interview with Umberto Eco: 'We Like Lists Because We Don't Want to Die' - DER SPIEGEL|https://www.spiegel.de/international/zeitgeist/spiegel-interview-with-umberto-eco-we-like-lists-because-we-don-t-want-to-die-a-659577.html]] <<< ''SPIEGEL:'' Why do we waste so much time trying to complete things that can't be realistically completed? ''Eco:'' We have a limit, a very discouraging, humiliating limit: death. That's why we like all the things that we assume have no limits and, therefore, no end. It's a way of escaping thoughts about death. We like lists because we don't want to die. <<<
https://www.bzgapps.com/unite Ah! Now I see how useful this is for running [[Roam]] on, like [[Jack does|https://rudimentarylathe.org/#Unite%20app]].
https://updown.io I remembered a [[tiddler from Jack|https://rudimentarylathe.org/#Updown.io]] mentioning Updown.io as the uptime monitoring service he uses. Super cheap for my modest needs. I signed up! The welcome credits should last me nine months as the rate that I'm having them check this DigitalOcean droplet and my old blog at twelvety.com.
https://www.dschapman.com/notes/eaa58ce8-38bf-41bf-91e7-4c1481b48bbc > //This assumes that you have an existing installation of Doom Emacs// > > To upgrade Doom Emacs from Emacs 26 to Emacs 27, download the latest version of Emacs 27 [[here|https://emacsformacosx.com/]]. > > Install it. > > Then in your terminal run `doom sync`. Doom will rebuild all of your packages.
!! Maybe use more headings in [[Obsidian]] instead of trying to make thoughts into their own files I think I need to give up a bit on the idea of trying to make my [[Obsidian]] notes so "atomic". For example, in [[Roam]], if you write a thought introducing a quote, that thought (and the quote, if it's on another line) is independently addressable from anywhere. Obsidian can sort of kind of do that if you make ideas into headings, but I had this idea that each thought should be its own file, and those filenames would "bubble up" at some point, they way you stumble across connections in Roam. But making so many new files in Obsidian is a giant pain because you have to think too much about what you're going to name each file, you want to use filesystem-safe characters, you want to stay away from extraneous punctuation characters, and it causes all this friction, so you end up not making as many individual files. And even if you do make them religiously, you have to remember to tag people or companies or organizations within that thought. You may even go nuts like me and add [[front-matter]] to give it a date and some kind of structure. Because that was the "ideal" and it was hard, I almost never did it. And I have this sneaking suspicion (or hope) that eventually Roam will adopt or enable proper [[Markdown]] blockquotes with ">" characters before [[Obsidian]] figures out how to do "block-level" references, which I still believe to be a foolish and fragile thing to try to implement in plaintext files. I'd rather keep going in [[Obsidian]] and hope that someday I can dump all this into Roam, than jump into Roam (again) and have to stare at those awful workarounds for blockquotes for an indeterminate period of time and end up back in Obsidian in the end.
An answer to the question, "Is there any difference between a GUID and a UUID?" on [[Stack Overflow|https://stackoverflow.com/questions/246930/is-there-any-difference-between-a-guid-and-a-uuid]]: > The ''simple answer'' is: ''no difference'', they are the same thing. Treat them as a 16 byte (128 bits) value that is used as a unique value. In Microsoft-speak they are called GUIDs, but call them UUIDs when not using Microsoft-speak. It goes on to specify some technical differences, but I get it. Same idea.
[[VCV Rack 2 - Virtual Eurorack Studio|https://vcvrack.com/Rack]] Bonkers that this is free. I could get lost in it for days. [img[https://twelvety.com/philtiddlywiki_images/2022-03-05-vcv-rack.jpg]]
https://www.youtube.com/watch?v=FtieBc3KptU This demo from 2015 is so good. [[Jay Dixit]] is a writer and has only learned about Emacs and Lisp to be able to do what he wants to do more efficiently. In this video, he shared tons of great examples and played the app like a musician, hopping around between buffers and showing off capture templates. Emacs looks mega-fast if you know what you're doing. His non-techie background and determination to keep at it gives me hope that I can dig into this stuff and figure it out. He did caution, though, that he wouldn't recommend that most other writers use Emacs because "it would take so much time and it would take over their life". I could see that. Do I really want to open the door to this? Probably, yes.
This is an ongoing list of things that are so good that I need to hoard them before they disappear: * [[Ronnie James Dio interview on religion and the Devil|https://youtu.be/U8Ln5GW-3as]] 2004 | Raw & Uncut * [[Genesis - Watcher of the Skies Live Shepperton Studios 16mm HD|https://www.youtube.com/watch?v=z5NOV0-EH0c]] - 30/31 October 1973 * [[Genesis - Live 1972 Pop Shop Belgian TV|https://youtu.be/yo6f7gk-n3Y]] Remastered Full Concert -------- 2019-02-17 migrated from nvALT
> A week or so ago, I was reading about the Oregon shooting. I’m a pretty standard issue liberal and when I see things that support my liberal views I tend to notice them. > So when I see this line in an article I get all excited. This is from the CSJ: > 'The prevalence of gun ownership in a given state is “significantly associated with state incidence of mass killings with firearms, school shootings, and mass shootings,” according to a study published last July from numbers compiled of mass killings in the US between 2006 to December 2013.' > So the blood starts pumping. Dammit, I’m right. When will the world see it? > So a year ago I would have thrown the link to Twitter with a damning summary of the study, and everyone would have known I was a good liberal and retweeted it to prove that they were good liberals and if you listened closely you could hear our collective neurons harden. > But for the past year I’ve been experimenting with another form of social media called federated wiki. And it’s radically changed how I think about online communication and collaboration. from [[The Garden and the Stream: A Technopastoral — Mike Caulfield|https://hapgood.us/2015/10/17/the-garden-and-the-stream-a-technopastoral/]] And I was led to that by this: https://fedwiki.frankmcpherson.net/view/welcome-visitors/view/index/view/the-garden-and-the-stream 20190106T1525
https://www.vmfa.museum/ We've been members forever. No reason to stop now!
https://volumio.org > All your music in one place. With bit-perfect audio quality. Free and Open Source Forever. 2019-09-11 I only tried this to see if it would work on my old [[Raspberry Pi]] v1, and lo and behold it ran on the first try with no configration (wow). This is one of those things where you flash an SD card with a minimal, single-purpose OS that's tuned to deal with audio and not much else. (I wonder, though, about security and how to harden the device against the ravages of those outside our network.) It sounds wonderful, but I can't say for certain that it's "better" than using the iPhone running the [[Plex]] app and bouncing that via [[AirPlay]] to the Airport Express and then through Toslink to the [[Schiit Modi 2 Uber]]. Although having one Raspberry Pi running Volumio, hard-wired to the network, reading files off the (other) Raspberry Pi NAS, and turning those into a USB stream for the Schiit has got to be a better way to go. I got rid of most of the occasional stuttering by turning the buffer up as high as it would go. This old RPi v1 is really not up to the task, but it's doing admirably. Proof of concept: PROVEN. Now to buy a new RPi v3 or v4 that can handle FLAC without breaking a sweat... UI-wise, it sure ain't no [[Plex]] or [[Roon]]. But it sounds great and is fun to tinker with.
Microsoft Visual Studio Code https://code.visualstudio.com !! Learned: * 2019-03-11 Learned that Ctrl-P lets you quickly open files from a list. !! Settings tweaks: * 2019-03-08 ** Turned this on: Workbench › Editor: Highlight Modified Tabs, so it's obvious when something is saved or not, but that was too distracting, so I turned it back off. ** Removed `${dirty}` from the Window: Title, because it was making the title move over one character for 1 second every time there was an unsaved change. ** Set Files: Auto Save to afterDelay, because OneNote has spoiled me. ** Set Files: Auto Save Delay to 1001, because leaving it at the default of 1000 seems to do the actual saving, but doesn't visibly indicate a save action anywhere. I may turn this off later after I trust everything to work. * 2019-03-07 Turned off "Editor: Auto Indent" because it was screwing up the indentation of tasks when I moved them up and down in the [[vscode-todo-plus]] extension.
https://github.com/dakaraphi/vscode-extension-fold This is super handy for dealing with indented items and outlines. Shortcut for folding everything at (for example) level 3: `Ctrl-K, Ctrl-3`.
Markdown-based journaling/notes for Visual Studio Code. https://github.com/pajoma/vscode-journal !! Settings tweaks: * 2019-03-08 Added this key to Settings JSON to specify where vscode-journal files should go and how they should be named: ``` "journal.patterns": { "notes": { "path": "${base}/${year}/${month}/${day}", "file": "${input}.${ext}" }, "entries": { "path": "${base}/${year}/${month}", "file": "${year}-${month}-${day}.${ext}" } ```
https://github.com/yzhang-gh/vscode-markdown a.k.a. "Markdown All in One" I love how criminally easy it is to pick which extensions to download in the VS Code Marketplace. When you see something has 2,283,032 downloads, it's a pretty safe bet that it's a good one. This one is BONKERS because you can have a Markdown URL in the clipboard, select some words, hit ⌘-V (the regular paste shortcut) and boom the words are hyperlinked in Markdown.
https://github.com/shd101wyy/vscode-markdown-preview-enhanced ''2019-02-24 Update:'' I thought I didn't need this and turned it off for a few minutes, but it turns out that the built-in Markdown preview in VS Code has a dark background if your editing window theme has a dark background. I'm no animal, so I re-enabled the extension.
https://marketplace.visualstudio.com/items?itemName=tootone.org-mode
https://github.com/fabiospampinato/vscode-todo-plus (a.k.a. "Todo+") This is really good. Looks just like [[TaskPaper]], but is missing the filtering. !! Learned: * 2019-03-08: Learned that Ctrl-Shift-O lets you easily jump to project headings in a `.todo` file. * You can toggle an item between being a task/non-task by pressing Ctrl-Enter. * Changing colors of some tags/types requires restarting VS Code. !! Settings tweaks: * 2019-03-12 I added this to the Settings JSON so that I could change the `@done` tag color to be something other than yellow. I made the background color undefined, which seems to have allowed it to take on whatever background color is set for the current theme. The tag names, foreground and background colors are separated into three different arrays, which was confusing at first: ``` "todo.tags.names": [ "critical", "high", "low", "today", "done" ], "todo.colors.tags.foreground": [ "#000000", "#000000", "#000000", "#000000", "#b5cea8" ], "todo.colors.tags.background": [ "#e54545", "#e59f45", "#e5d145", "#ae81ff", "" ], ``` * 2019-03-07: Changed color for `@done` items from `#a6e22e` to `#888888`
https://en.wikipedia.org/wiki/VT100 > The VT100 was a video terminal, introduced in August 1978 by Digital Equipment Corporation (DEC). It was one of the first terminals to support ANSI escape codes for cursor control and other tasks, and added a number of extended codes for special features like controlling the status lights on the keyboard. This led to rapid uptake of the ANSI standard, which became the de facto standard for hardware video terminals and later terminal emulators.
EG sent me this video about Walter Murch and how he "[[worldized]]" film sound for "Apocalypse Now", "The Godfather", and "THX 1138". https://www.youtube.com/watch?v=gAN9pBY7jHA
https://en.wikipedia.org/wiki/Ward_Cunningham > Howard G. Cunningham is an American computer programmer who developed the first wiki and was a co-author of the Manifesto for Agile Software Development.
Outright copied from [[Josh Sullivan]]: <<< [[Wasabi|https://wasabi.com/]] is S3 compliant storage. It is incredibly cheap for $5 for 1TB or less, which I am definitely under. I am currently using it for hosting my blog and wiki images and any downloads I need to share. I also use it with [[Dropshare]]. I also have [[this wiki backing up to it|TW: Wiki Backup]]. <<<
I love the way this dude writes and makes things easy to understand. Lots of good projects in here. https://wtfamps.com <<< Enjoyment is an experience and accuracy is a measurement. They are not the same. Because enjoyment is subjective, and by nature we as humans strive for objective answers, we judge based on measurement because measurement is easily compared and certified. This is not at all to say that accuracy does not improve the listening experience, but accuracy is a measurement of a playback system’s expression, not the music’s idea. Accurate systems, and the pursuit of them, bring us rational pleasure. Your brain processes emotional and rational information in different ways and in different places. In enjoying music and your playback system, both the subjective experience and the objective accuracy play a role in determining your satisfaction. To completely ignore one at the expense of the other is to betray your very nature as a human audience. <<<
http://www.websdr.org/ > ''A WebSDR is a Software-Defined Radio receiver connected to the internet, allowing many listeners to listen and tune it simultaneously.'' SDR technology makes it possible that all listeners tune independently, and thus listen to //different// signals; this is in contrast to the many classical receivers that are already available via the internet.
!! Process * [[2020-02-09 weekly review - process]] * [[2019-06-23 weekly review - process]] !! History I'm going to leave this tiddler here and update it every time I do a weekly review on a Saturday or Sunday. Anyone who happens upon this list and sees that I'm overdue is welcome to [[email me|mailto:phil@twelvety.com]] to ask me why I'm slacking and what I've been doing instead. * 2019-12-01 Sunday: started + finished 🥇 * 2019-11-24 Sunday: started + finished 🥇 * 2019-11-17 Sunday: started + finished 🥇 * 2019-08-18 Sunday: started + finished 🥇 * 2019-08-06 Tuesday: Did a weekly review two days late, but at least I did it. * 2019-02-10 Sunday: Completed an actual Sunday weekly review for the first time in a while.
Not that all of these could be done every week on these days, but they are things to consider: !! Sunday * [[Weekly Review]] * boil eggs for the week * charge SleepPhones and AirPods * plan meals and eating out for the week * make salads for the work-week
https://diyaudiostore.com/products/whammy > Wayne Colburn, the genius at Pass Labs who for the last 25 years has designed essentially all the things that aren't speaker amplifiers, wanted to make a fun, high-performance, fantastic-sounding, Class-A, DIY headphone amp for this community. We call it: ''Wayne's Headphone Amp Must Make Yourself''
[[2022-02-27 Gen. Philip Breedlove on no-fly zones]]
I often think: what am I unknowingly doing wrong now, or not doing now at all, that I'll wish in a month or a year that I had been doing all along. Will I still be in [[org-mode]] in a year? Or will I go back to [[nvUltra]] and some bare bones [[Markdown]] logging system?
[[Jack|Jack Baty]] [[pointed to|https://daily.baty.net/2022-01-17/]] [[The computer built to last 50 years – ploum.net|https://ploum.net/the-computer-built-to-last-50-years/]] and [[How I Switched To Plan 9|http://helpful.cat-v.org/Blog/2019/12/03/0/]]. The latter has this question in it: > Seriously, what do you do with your computer? I went down the rabbit hole more and found [[How and Why I Stopped Buying New Laptops – LOW←TECH MAGAZINE|https://solar.lowtechmagazine.com/2020/12/how-and-why-i-stopped-buying-new-laptops.html]] and ended up in my sweet-spot / soft-spot of solar power, anti-consumption, anti-speed, anti-everything, minimalist contrarianism. I love it there. What //do// I do with my computer(s), anyway? Nothing that justifies the amount of money and time I spend outfitting and maintaining them, for sure. Same goes for most of the monthly- and yearly-billed services they connect to. In a good way, this feels like that time we spent a few nights in an eco-lodge in St. John and the only hot water came from a solar barrel, we used a composting toilet, and tried our best to avoid generating trash. We came out of it hyper-aware of how lavishly we spend our resources the rest of the year.
I'm glad I'm not the only one obsessed with [[Coronavirus]] [[COVID-19]]. From [[Jack Baty]]'s [[wiki|https://rudimentarylathe.org/#Monday%2C%20March%202%2C%202020]]: > I'm a little obsessed with the COVID-19 thing. I wouldn't say I've become a prepper....yet. What is it that makes [[COVID-19]] so compelling, to me, at least? * The newness of the virus itself, the lack of a vaccine, and no human immunity to it * The opportunity to discover and follow smart doctors and [[public policy]] people on [[Twitter]] and learn about [[crisis management]], case fatality rates ([[CFR]]), and the R0 [[basic reproduction number]]. * The potential for disruption to the [[stock market]] (which I am hate-following right now, egging on the downward spiral, even though we have a third of our [[401(k)]] in the [[S&P 500]]) because it irritates Trump so badly, and maybe, just maybe, this public health problem could unseat him in the election if it gets bad enough, but wow is that a selfish thought to have about a virus that has killed thousands of people * The gorgeous, constantly updated [[Johns Hopkins CSSE Coronavirus COVID-19 case map]] * The numbers of new cases, creeping upward by the hour * The hunker-down mentality that comes with anticipating anything we have to ride out and prep for * The trickle of news about the strategic failures of the Trump administration and CDC during all this * The degree to which the virus reveals how little Trump knows about science * The remarkable number of conferences, events, and venues that have canceled or closed already to prevent spread of the disease * The sliver of hope I have that we'll finally stop shaking hands with each other * It's one more steady stream of stuff to take and collect notes on, so, tailor-made for me
|<<tag [[compass]]>>|Things that I need to remember because they point me toward a better life/brain. A moral or emotional compass.| |<<tag [[draft]]>>|Started writing but haven't finished it yet. May be reworked substantially.| |<<tag [[manifesto]]>>|A belief or value. Something I stand for.| |<<tag [[Pinned]]>>|Currently important. If it were an LP, it's not ready to go back in the stacks yet.| |<<tag [[stub]]>>|A stub in the Wikipedia tradition. Useful as a placeholder, but not done. Needs expansion.| |<<tag [[to process]]>>|There's a lot in this tiddler that probably needs to be broken out or culled. Or I need to make more sense of it and figure out if it's useful.|
https://www.imdb.com/title/tt7908628/
I started putting stuff in the [[buffer notes]] text file on July 21, 2018. The ideal scenario is that things go in there from [[Drafts]] (after being copied from [[Twitter]], web pages, podcasts, photos, books, or somewhere else) and then go to live permanently in [[Roam]] or [[org-roam]] or [[TiddlyWiki]] or //somewhere//. The buffer notes file is now 8,103 lines long. It still has more entries in it than entries that have ever migrated out of it. It's one of the places that I sometimes remember to check when I can't find a note I know I've captured. And I realized the other day that it's unfortunately now probably the most expansive, near-complete, and shallow de facto "notetaking" repository I have. This sucks! It's not how I want to live!
[[When Charlie Watts Finally Made It to New York City - The New York Times|https://www.nytimes.com/2021/08/30/nyregion/charlie-watts-birdland-nyc.html]] > For that matter, Mr. Watts said he felt out of place in the whole rock ’n’ roll scene — “I live in TCM world, Turner Classic Movies,” he told a [[BBC radio show|https://www.bbc.co.uk/programmes/p009493z]], explaining that he’d inherited his father’s love for 1940s-style tailor-made suits, and regarded [[Fred Astaire]] as “the ultimate in what you should be if you’re a professional.” Could I possibly love him more? tiddler: [[Charlie Watts]]
from [[Henry Rollins on the Music of His Life – Pitchfork|https://pitchfork.com/features/5-10-15-20/henry-rollins-on-the-music-of-his-life/]] > At one point, one of the ([[Black Flag]]) band members said, “Look, if you want to be in this band you’ve got to be down with [[Black Sabbath]], the [[Stooges]], and the [[MC5]].”
Per this bug report on GitHub: [[org-roam-jump-to-index not working properly|https://github.com/org-roam/org-roam/issues/597]] > Setting the full path seems to work > > `(setq org-roam-index-file "~/source/Org/Roam/index.org")` ...even though you shouldn't have to set the full path. But it looks like this will be fixed soon.
I get asked every few years what equipment and processes I recommend to get into podcasting (even though I've never //done// a podcast). Here's where I'll collect stuff so I don't have to dig for it later: * https://danbenjamin.com/podcastmethod/ for equipment recommendations. * GarageBand for people with Macs, Audacity for PC users. * Don't record with your laptop's built-in mic. Just don't. * This article by Jason Snell still has really good tips in it, and everyone is still using Skype anyway: https://www.macworld.com/article/1162062/skype-garageband-podcast-tips.html * https://fireside.fm by Dan Benjamin for hosting, distributing, having a CMS, dealing with episode art, etc.
Again, via [[Jack|Jack Baty]] https://www.justuseemail.com/instant-messaging-is-no-longer-instant/ <<< * instant messaging should only be used for the simplest of messages that or of the greatest urgency. * group instant messaging is, largely, distracting and of little value (more on this later) and can best be dealt with in weekly ‘batches’, if it’s required at all. <<< Preach. It.
Jack wrote this: [[Where should I be writing things down? - Jack Baty's Weblog|https://www.baty.net/2020/why-even-write-things-down/]] > My grandfather once asked how much paint he should buy in order to paint his garage. My dad said, "Hang on.", went into his office and came out two minutes later with a piece of paper and said, "We used just over two gallons of Benjamin Moore white from Ace Hardware when we painted it last time in 1983." When I watch old movies that were made before computers (like when we were watching [[Holiday (1938)]] last night), I like to imagine how the characters kept notes, records, and logs of things. How many separate notebooks did it take for them to write things down and find them later? What was their routine? How much time did it take and how often did they have to update the pages? > I'm beginning to think I should stop writing so many things down and just stick to the things I may actually need later. And I should do this in simple tools which do little more than let me look up the specific things I want to know. If I could only decide what those tools are.
Here's a dumb question: Where should I start setting up my [[Johnny.Decimal]] area folders on my laptop? I know the answer is going to be "that's up to you!", but like, do I start with 10 area folders right in my home (aka `~/`) folder or maybe limit the scope of the devastation by creating a `~/JD/` or similar folder and just start with the nice, neat 10 areas in there? ''2021-03-29 Update:'' [[Andrew Canion]] answered in Discord: > I reckon do a /JD folder. That's what I've been doing.
https://openai.com/blog/whisper/ > We’ve trained and are open-sourcing a neural net called Whisper that approaches human level robustness and accuracy on English speech recognition.
https://github.com/ggerganov/whisper.cpp > Port of OpenAI's Whisper model in C/C++ I installed this on the [[14-inch MacBook Pro (2021)]] because people said they had trouble getting the regular [[Whisper]] to run on M1 Macs otherwise. It's crazy easy: # Downloaded the whole `whisper.cpp` repo to the `~/Downloads` folder and left it there because I was just testing and didn't want to junk up my system if I wanted to get rid of it. # Whisper (at least this one) can only operate on 16-bit 16 kHz .WAV files, so I set up a preset in [[Permute]] (available on [[Setapp]], of course) to do that in one click and convert the audio to mono. I love Permute. # In Terminal, went to the downloaded `whisper.cpp` folder. # `bash ./models/download-ggml-model.sh base.en` to install the base language model. # `make` # `./main -f /Users/phil/Downloads/david-sylvian-mono-16khz.wav` to run it on a recent [[David Sylvian]] interview I downloaded from the BBC and converted to WAV. # Watch in amazement as it blew through the file and turned the audio into very accurate text. # Then `bash ./models/download-ggml-model.sh medium.en` to get the medium-sized model. # `make medium.en` # Ran `./main -m models/ggml-medium.en.bin -f /Users/phil/Downloads/mary-party.wav` on a WAV of Sarah's grandma's memorial party from 2014, where a lot of family members shared stories and memories, and //holy crap// it's good at this. # `./main -pc -m models/ggml-medium.en.bin -f /Users/phil/Downloads/mary-party.wav` uses the `-pc` option to "print colors", which shows the confidence level Whisper has for every word. This makes me want to go through all my bootleg audio and transcribe it and share it.
https://wiimhome.com/Overview.html 2022-11-25 Bought two of these just now on Amazon, which are on sale today for $79 each. I was already hunting for a good, simple, lossless-capable wireless speaker for the kitchen, and then saw this [[John Darko]] video about its big brother, the WiiM Pro: https://www.youtube.com/watch?v=n3GPZNpxcNw He wanted to say the Mini was his favorite streamer of 2022, but it came out in 2021. Here's his original video about the Mini: https://www.youtube.com/watch?v=JTSzAJ88zmE It's not [[Roon]]-Ready, but it does [[AirPlay 2]], which means that two of these should be groupable for [[Apple Music]] or Roon or whatever can play through AirPlay.
(borrowed this idea from [[Sphygmus]]) * get rid of `link: ` in tiddler titles * set up $:/DefaultTiddlers like [[Josh Sullivan]] has on his wiki * figure out how to make rotated text work in table headers in TiddlyWiki, to make habits list vertical (with more days) instead of horizontal * write a note (back!) to [[Sphygmus|https://sphygm.us/#190301%20%E2%80%93%20To%20Phil%3A%20Hey%2C%20Hi%2C%20Hello!]] * respond to @kordumb's [[letter|https://humdrum.life/2019/02/28/twelvety]]. * start including Flickr images in Journal posts (see Jack and Andrew) * read the full [[h0p3]] tiddlers about [[Wiki Audit|https://philosopher.life/#Wiki%20Audit]] and [[Wiki Review|https://philosopher.life/#Wiki%20Review]] to see what I can learn. I've been trying to figure out the process behind these without reading the tiddlers written to actually explain them. * ~~respond to Josh's [[letter about wikis and blogs|https://joshisms.io/#2019-03-11%20-%20To%3A%20Phil]]~~. Done: [[2019-03-15 to: Josh]] * ~~respond to [[h0p3 letter|https://philosopher.life/#2019.01.26%20-%20Phil%20Nunnally%3A%20Quietly%20Watching]]!~~ Done: [[2019-03-05 To h0p3: hello back!]]
https://github.com/lostintangent/wikilens > WikiLens is a [[VS Code]] extension that adds a Roam/Obsidian-like editing experience on top of a GitHub repo and markdown files. This provides an excellent companion to github.dev, and allows you to manage your notes/knowledge base, directly from the browser and using your existing/customized editor setup (e.g. Vim bindings, color theme)
https://wildauthority.com > Wild Authority Critter and Pest Services offers humane and permanent solutions for wildlife control and animal removal to homeowners, property managers, and businesses. We achieve this by using the most advanced technology in detection, prevention, repairs, and clean up of wildlife damage and wild animal problems.
> Arriving home at dusk on the first night of the year, there is snow to be measured & shoveled. But first, I am being treated to an extended conversation with a few obliging local great horned owls. > //You still up? Me too.// from https://blog.schuth.xyz/2019/01/01/arriving-home-at.html
http://willyhermannservices.com/index.html In case the [[Nakamichi DR-3]] ever needs any work.
https://crooked.com/podcast-series/wind-of-change/ > It’s 1990. The Berlin Wall has just come down. The Soviet Union is on the verge of collapse. A heavy metal band from West Germany, the [[Scorpions]], releases a power ballad, “Wind of Change.” The song becomes the soundtrack to the peaceful revolution sweeping Europe — and one of the biggest rock singles ever. According to some fans, it’s the song that ended the Cold War. > > Decades later, New Yorker writer Patrick Radden Keefe hears a rumor from a source: the Scorpions didn’t actually write “Wind of Change.” The CIA did. That song has always sucked but boy what a great story.
from full Benjamin Wittes thread here: https://twitter.com/benjaminwittes/status/967608461717590016 > ...We must particularly honor and treasure the voices who speak up when it’s hard, who speak up where it’s hard and unpopular, and who speak up at cost to their social and professional worlds. > We must remember that it really is okay to disagree about the political and agree about the pre-political—that large set of democratic commitments that exist as an antecedent matter to the ability to disagree about the political questions we’re accustomed to fighting over. > We must remember that some of the bravest sacrifices—you know, the ones in which people give their lives—take place for those pre-political commitments in the face of great political disagreement. Think of all the soldiers who have died protecting one another without asking... > ...what their comrades thought of marginal tax rates, of reproductive rights, or of climate change.
https://www.wolframcloud.com
https://workflowy.com/ Super-slick outlining app available on web, Android and iOS.
https://workingcopyapp.com > the powerful Git client for iOS that clones, edits, commits, pushes & more. Also understands [[org-mode]].
https://iconfactory.com/worldwideweb/ > a web server for developers The easiest way I know of to run a local web server on an iPhone and load local HTML files in Mobile Safari.
> Its goal was to gather a collection of the wisest statements, usually of the ancients, for future meditation. And here the key thing was to _write the words in your own hand_ -- by this means, by laboriously and carefully copying out the insights of people smarter than you, you could absorb and internalize their wisdom. Call it osmosis-by-handwriting. from Alan Jacobs for The Atlantic, [['Commonplace Books': The Tumblrs of an Earlier Era|https://www.theatlantic.com/technology/archive/2012/01/commonplace-books-the-tumblrs-of-an-earlier-era/251811/]] 20190109T1101
[[WWV (radio station) - Wikipedia|https://en.m.wikipedia.org/wiki/WWV_%28radio_station%29]] > Since 1945, WWV has disseminated "official U.S. time", as provided by government entities such as NIST and the United States Naval Observatory (USNO), to ensure that uniform time is maintained throughout the United States and around the world. WWV provides a public service by making time information readily available at all hours and at no monetary charge beyond the cost of the receiving equipment. > > The time signals generated by WWV allow time-keeping devices such as radio-controlled clocks to automatically maintain accurate time without the need for manual adjustment.
http://xact.scottcbrown.org 2019-03-25 My tried-and-true CD ripper, but it sometimes has trouble with various tracks on certain CDs.
https://tmkk.undo.jp/xld/index_e.html 2019-03-25 Trying this because it seems to offer some more paranoid/thorough disc-reading options than [[xACT]].
This is the integrated amp we have. * RMS power: 45 WPC into 8 ohms * IHF/Dynamic power: 73 WPC into 8 ohms
[[Sounds like jazz but isn't|http://oldschool.scripting.com/KenSmith/2021/11/18/154518.html?title=soundsLikeJazzButIsnt]] from [[Ken Smith]] > The //Yes, and// logic has faith in exploration and in the other players on the stage, or the stage of life. [[Colbert|Stephen Colbert]] says he was so influenced by the creativity of //Yes, and// that he found it become a way of life outside the theater. He was, I think, astounded by not just the creative possibilities but also their ethical foundation, the decency of it all. ... > Americans grow in their distrust of each other because public people like Tucker Carlson and many politicians NEVER model //Yes, and// for us in action. People who don't know how to improvise in open conversation with others are, down deep, bullies, because they don't believe there is any obligation to listen to another person. Even leaders whose politics we might like often don't do //Yes, and//. It should never be a surprise to find out that so-and-so, famous leader on our favorite part of the political spectrum is, behind the scenes, a bully or a predator. Especially if you never see them playing //Yes, and// in public. I should keep all this in mind next time I find myself in a difficult conversation with family, strangers, whomever.
This is what I put on the [[Keychron K2]]. Thumbs up. https://www.amazon.com/gp/product/B07GT1CKMC/
from https://tiddlywiki.com/plugins/tiddlywiki/markdown/ ! Creating WikiLinks Create wiki links with the usual Markdown link syntax targeting # and the target tiddler title: `[link text](#TiddlerTitle)`
I guess in parallel with [[Roam benevolent chaos vs. Johnny.Decimal deliberate order]], I learned an important lesson at work this week: ''You have to document your project work and planning and problem-solving as you go'', and you have to do it in a way that means you're basically always close to ready to share it when you're asked about status, and about "what's left to do". It's not enough to be a mad scientist working in isolation with a bunch of thrashed-about notes that only you understand (and random notes being digital is not sufficient). You have to regularly get what's in your head out to where others can make sense of the dependencies and order of everything. And for the love of god keep a [[decision log]]. If you do all that, you can get help validating decisions, and crucially, you can say "this is what's left to do before we're done".
from the beloved [[Poltergeist (1982)]]: <style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><div class='embed-container'><iframe src='https://www.youtube.com/embed/Lh_W6FLaMvA' frameborder='0' allowfullscreen></iframe></div>
Heard this on [[Weekend Edition Sunday]] on [[NPR]] this morning. I love the bit of scripture this dude quoted, and I'm not a person who usually loves any bit of scripture. To me it means that you can still continue to create, encourage, help, and/or just take care of things even when the world grinds to a halt. https://www.npr.org/2020/04/05/826840998/hindered-by-a-pandemic-religious-leaders-prepare-for-holidays > Here's more of what the three faith leaders had to say about how they're helping their congregations cope during the coronavirus outbreak, speaking in an interview with //Weekend Edition//: > ... > ''On a story or a line in scripture the leaders are holding on to that's helping them get through this difficult time'' > ''[[Jesse Rincones]]'': 2 Corinthians 9:8 says that God is able to bless you abundantly so that in all things at all times, having all that you need, you will abound in every good work. I think it's easy for us in these moments, when there is a shortage of everything ... to think that our lack might keep us from continuing to fulfill our faith. But that promise allows us that no matter what the circumstance, we can continue to abound in every good work.
from [[Island Time, Barista and Journaling — Nerds on Draft|http://www.nerdsondraft.com/podcast/2018/2/1/island-time-barista-and-journaling]] Gabe and Jeff were talking about journaling. Gabe said he was reading too much (depressing) news in 2017, and said to himself, "If you keep doing nothing but reading the news all the time, you're never going to be happy." tagx: #journaling #media #news #mindfulness
https://support.google.com/youtube/answer/7631406?hl=en Especially: |j|Seek backward 10 seconds| |k|Pause/Play| |l|Seek forward 10 seconds| |Numbers 1 to 9 (not on the numeric pad)|Seek to 10%-90% of the video| |f|Activate full screen. If full screen mode is enabled, activate F again or press escape to exit full-screen mode.|
[img[https://www.dropbox.com/s/4jqky2t8xietheh/zebra_g402.jpg?dl=1]] For the [[Bellroy Field Notes Notebook Cover Mini]], I actually like this better than a [[Pilot G2]]. 2019-05-05 Note to self: G2 refills may at first feel like they fit in the barrel, but they don't; they're too long. And if you try to insert one, the black plug at the top of the G2 refill will get stuck in the G-402, which will keep the OEM refill from going back in, and you'll have to use tweezers to extract it.
https://www.zotero.org/ > Your personal research assistant > Zotero is a free, easy-to-use tool to help you collect, organize, cite, and share research. Via [[Jack|https://rudimentarylathe.org/#Tuesday%2C%20May%2012%2C%202020]] > Also has the benefit of integrating with Org mode long term. Huh... If I used this, I wonder how this would compare to and overlap with [[DEVONthink]], [[Polar]], etc. See also: * [[A research workflow with Zotero and Org mode|http://www.mkbehr.com/posts/a-research-workflow-with-zotero-and-org-mode/]] * [[Scientific Writing with Zotero and Org Mode|https://irreal.org/blog/?p=5771]]
[[Коммерсантъ FM|https://www.kommersant.ru/fm]] This is the Moscow news/radio station I've been listening to to get my ears used to hearing [[Russian]]. Part of the Kommersant newspaper. It's great because there are so many different voices, but I don't understand much of anything except when they say "Привет" or "Россия".