Wordpress's truly magical approach. You can host it yourself, or use a hosted service.
You have the choice, whether you exercise it or not. Freedom and autonomy, or convenience at the sacrifice of features and control.
Just knowing you have the choice makes things better, and it seems to have worked out for them, financially and in terms of their vision.
<<<
People often praise the food we serve at Pok Pok and my other restaurants as “authentic.” I’m flattered, but that word and its cousin in compliment, “traditional,” are banished from my restaurants. The words imply an absolute cuisine, that there is a one true Thai food out there, somewhere.
<<< Chef Andy Ricker
http://www.foodrepublic.com/2013/11/06/andy-ricker-on-the-absurdity-of-authenticity/
<<<
But as the word spreads beyond its original childhood boundaries, it also loses much of its power. Increasingly, “feeling bullied” is used broadly by the powerful and the powerless alike to describe feeling insulted (by a peer), feeling unfairly criticized (by a professional critic), feeling diminished (by commenters) or merely feeling exposed to potential profit losses, ego injuries or points of view that run counter to your own.
<<< Heather Havrilesky
http://www.nytimes.com/2016/05/01/magazine/when-the-powerful-cry-bully.html
<<<
An “I feel like” preface implies that my feelings aren’t set in stone; they’re not necessarily rational or well thought-out. I strive to have faith that my opinions are worthy, but I don’t want to be the kind of person who is so convinced she has something important to say that she asserts every statement as fact, not feeling.
<<< Brian Mayer, [['I Feel Like': This Has to Stop|http://brianmayer.com/2015/07/i-feel-like-this-has-to-stop/]]
<<<
The jeans didn’t pinch, but they made their presence felt…. As a result, I lived in the knowledge that I had jeans on, whereas normally we live forgetting that we’re wearing undershorts or trousers. I lived for my jeans, and as a result I assumed the exterior behavior of one who wears jeans. In any case, I assumed a demeanor… I discussed it at length, especially with consultants of the opposite sex, from whom I learned what, for that matter, I had already suspected: that ''for women experiences of this kind are familiar because all their garments are conceived to impose a demeanor—high heels, girdles, brassieres, pantyhose, tight sweaters.''
I thought then about how much, in the history of civilization, dress as armor has influenced behavior and, in consequence, exterior morality. The Victorian bourgeois was stiff and formal because of stiff collars; the nineteenth-century gentleman was constrained by his tight redingotes, boots, and top hats that didn’t allow brusque movements of the head. If Vienna had been on the equator and its bourgeoisie had gone around in Bermuda shorts, would Freud have described the same neurotic symptoms, the same Oedipal triangles? And would he have described them in the same way if he, the doctor, had been a Scot, in a kilt (under which, as everyone knows, the rule is to wear nothing)?
But the problem of my jeans led me to other observations. Not only did the garment impose a demeanor on me; by focusing my attention on demeanor, it obliged me to live towards the exterior world…I thought about the relationship between me and my pants, and the relationship between my pants and me and the society we lived in. I had achieved heteroconsciousness, that is to say, an epidermic self-awareness.
I realized then that thinkers, over the centuries, have fought to free themselves of armor. Warriors lived an exterior life, all enclosed in cuirasses and tunics; but monks had invented a habit that, while fulfilling, on its own, the requirements of demeanor (majestic, flowing, all of a piece, so that it fell in statuesque folds), it left the body (inside, underneath) completely free and unaware of itself. Monks were rich in interior life and very dirty, because the body, protected by a habit that, ennobling it, released it, was free to think, and to forget about itself… And when even the intellectual must dress in lay armor (wigs, waistcoats, knee breeches) we see that when he retires to think, he swaggers in rich dressing-gowns, or in Balzac’s loose, drolatique blouses. Thought abhors tights.
But if armor obliges its wearer to live the exterior life, then the age-old female spell is due also to the fact that society has imposed armors on women, forcing them to neglect the exercise of thought. Woman has been enslaved by fashion not only because, in obliging her to be attractive, to maintain an ethereal demeanor, to be pretty and stimulating, it made her a sex object; she has been enslaved chiefly because the clothing counseled for her forced her psychologically to live for the exterior. And this makes us realize how intellectually gifted and heroic a girl had to be before she could become, in those clothes, Madame de Sevigne, Victoria Colonna, Madame Curie, or Rosa Luxemburg.
….A final reflection—''in imposing an exterior demeanor, clothes are semiotic devices, machines for communicating.'' This was known, but there had been no attempt to illustrate the parallel with the syntactic structures of language, which, in the opinion of many people, influence our view of the world. ''The syntactic structures of fashions also influence our view of the world, and in a far more physical way than the consecutio tempomm or the existence of the subjunctive.''
<<< Lumbar Thought, Umberto Eco (emphasis added)
[[Link to the full essay|http://fields.eca.ac.uk/digitalspaces1/wp-content/uploads/2009/04/lumbarthought.pdf]]
<<<
Then he added, as men will who are of infinite imagination and crammed with desires, 'My wants are few.'
<<< Hilaire Belloc, The Four Men: A Farrago
<<<
This is exactly what I'm so often looking for in my career! Autonomy. Responsibility. To be respected, to be treated like an adult.
It's no surprise as I look back that the times I've grown the most are the times I'm the most humble. The times I've felt constrained are the times I've clung to my pride. The further I go in my career, the more difficult it becomes. I know a lot of things now I didn't know before - but the world is infinite, and so must be my humility.
<<< [[This is Professionalism|http://arches.io/2014/03/this-is-professionalism/]]
I've got to reproduce this whole article, because it's so good and I'd be sad if it ever came down. One of the best things on work I've ever read.
<<<
''This Is Professionalism'' by Chris Doyle
//05 Mar 2014//
Very early in my career, I was setting up some pressure sensors. The sensors had tiny wires coming off them, which someone had soldered to shielded co-axial cable running back to the data acquisition board/laptop.
My task was to fasten the sensors to a frame, which I completed quickly and thoroughly. My boss checked in, complimented my framed sensors, and mentioned that the way the tiny wires connected to the co-ax was too flimsy for our application. He worried they would break.
"Oh that wasn't me, those were already like that when I started," I explained.
My boss replied "I didn't say you did it, I said to fix it."
That exchange has stuck with me for the last 10 years because in one brief moment he exposed to me the fundamental nature of professionalism.
''Autonomy''
I immediately realized I wasn't hired to do specific fully-defined tasks, but rather to further the goals of the team and company. It's up to me to learn voraciously and think critically about the problem, the solution, the constraints. It's up to me to become fully aware of all my contexts - business pressure, schedule, financial considerations, deployment strategy, etc etc. Then it's up to me to do whatever I can within my sphere of influence to help the team succeed.
''Responsibility''
I was in essence arguing "that's not my job." But responsibility follows autonomy. If I'm able to do something to help the team, then I am expected to do it. Instead I put the burden on my boss to babysit me. Failing to identify the risk was my own error. Ignorance of a problem is no excuse. Autonomy means actively searching for barriers to the team's success.
And to be honest I knew those wires needed fixing before he came in, yet I didn't fix them or even mention it; an even more egregious abdication of my responsibility.
''Humility''
The correction stung a little; I was proud of what I accomplished. I chose to assume that because I hadn't made the mistake it wasn't mine to address, so I considered it a job well done. My pride made me defensive and stifled my autonomy.
Humility completes the cycle. I could have held fast to my opinion, clung to my limited definition of success. But instead I took my lumps. I accepted the guidance. I accepted the challenge of fixing the wires. I accepted my place on the team.
Most importantly, I accepted that I possessed autonomy and responsibility all along. In my pride I had rejected it to make myself feel good. By letting go of my pride I once again accepted my expanded autonomy. I allowed myself to think more broadly, to consider new possibilities. More autonomy led to more responsibility, which in turn led me to realize just how much I still don't understand about the world and my industry.
And so the cycle continues.
''Don't Worry''
Autonomy, responsibility, and humility can be uncomfortable. They can be tiring and complicated. But a mistake isn't the only opportunity to work on them. Sometimes it's about raising your hand when you see a hidden risk that could cause trouble later. Sometimes it's about keeping an open mind when others are speaking. Sometimes it's just about admitting you don't know everything and making an honest effort to learn something new.
''This Is Professionalism''
This is exactly what I'm so often looking for in my career! Autonomy. Responsibility. To be respected, to be treated like an adult.
It's no surprise as I look back that the times I've grown the most are the times I'm the most humble. The times I've felt constrained are the times I've clung to my pride. The further I go in my career, the more difficult it becomes. I know a lot of things now I didn't know before - but the world is infinite, and so must be my humility.
<<<
[img[http://i.imgur.com/dcq3Rn9.jpg]]
<<<
"I don't think of it as art -- I just make things I like bigger, assuming that if I like them some other people might too. Some do. Some don't, and that's ok too."
<<< Sister Corita Kent
Outside of Flannery O'Connor's [[large and startling figures]], one of my favorite art manifestos.
<<<
""""I don't think so," he said, ruminatively. "We have too much work piled up here in the planetarium."
"'The work can wait,'" I said, quoting our business motto."""
<<< Robert Benchley
''Can you give some examples of a military consumerist mentality in the church?''
<<<
That ideological system causes us to be very afraid, to regard other people as competitors, or as threats, or as rivals. It causes us to think of the world in very frightened and privatistic forms.
The gospel very much wants us to think in terms of a neighborhood, in terms of being in solidarity with other people, in sharing our resources, and of living out beyond ourselves. The gospel contradicts the dominant values of our system, which encourages self-protection and self-sufficiency at the loss of the common good. The church is in some ways a reflection of those dominant values.
<<< Walter Brueggemann, [[8 Questions|http://www.faithstreet.com/onfaith/2015/01/09/walter-brueggemann-church-gospel-bible/35739]]
{
"tiddlers": {
"$:/Acknowledgements": {
"title": "$:/Acknowledgements",
"type": "text/vnd.tiddlywiki",
"text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
},
"$:/core/copyright.txt": {
"title": "$:/core/copyright.txt",
"type": "text/plain",
"text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright © Jeremy Ruston 2004-2007\nCopyright © UnaMesa Association 2007-2014\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of the UnaMesa Association nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n"
},
"$:/core/icon": {
"title": "$:/core/icon",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z M85.1274062,95.4080042 C81.5494069,95.3047989 79.9756384,95.3136745 78.1534289,92.2560668 L76.733228,92.2975844 C75.0801573,92.2226776 75.7690718,92.256631 74.6662332,92.2006037 C72.822332,92.1273894 73.1177105,90.3396383 72.7933215,89.3950941 C72.2744094,86.1888106 73.4800004,82.9659571 73.4419681,79.7590415 C73.428503,78.6206623 71.8498363,74.5912119 71.2858469,73.150598 C69.5178104,73.490271 67.7401827,73.5550323 65.9465048,73.6462337 C61.8120677,73.6358996 57.7056703,73.1192806 53.628962,72.4632293 C52.8345141,75.8119659 50.473106,80.4990751 52.4249964,83.9024219 C54.794228,87.4227874 56.45684,88.3980868 59.0339286,88.6103485 C61.6109895,88.8224384 62.1929077,91.7913467 61.5694236,92.8517379 C61.0175661,93.5845847 60.0476425,93.7176093 59.2235739,93.8951553 L57.5752147,93.9742093 C56.2780933,93.9296822 55.1187057,93.5723203 53.9629071,93.0211763 C52.0327307,91.9217335 50.0392154,89.6360411 48.5580719,87.9950695 C48.9028934,88.6503604 49.1085703,89.9296134 48.7958122,90.5249222 C47.9200982,91.7907825 44.1326257,91.7830485 42.3980986,90.996433 C40.4277043,90.1030197 35.6664658,83.8299171 34.9303347,79.1316435 C36.8887135,75.3525836 39.7416856,72.0607931 41.1850909,67.9459622 C38.038852,65.8974525 36.3537697,62.5626501 36.5725198,58.7851619 L36.6514762,58.3478913 C33.5557196,58.9392548 35.1611076,58.7192345 31.8308843,58.9762949 C21.2252017,58.9431831 11.8983553,51.6054609 17.1501626,40.2013394 C17.4916881,39.5260388 17.8165752,38.9120742 18.3955298,39.205288 C18.8602051,39.440565 18.793457,40.3843583 18.5597268,41.4309776 C15.5577203,55.057365 30.2297484,55.161659 39.2489049,52.6401668 C40.1440491,52.3898612 41.9243599,50.7040626 43.1576153,50.1452033 C45.1734825,49.231769 47.3615008,48.8611654 49.5329344,48.5941256 C54.9337165,47.9661653 61.4247946,50.8693254 64.7228943,50.9641212 C68.0210328,51.0589131 72.7127563,50.1582941 75.5928121,50.3479196 C77.6825379,50.4454833 79.734518,50.8303777 81.7507717,51.3786556 C83.0558682,44.8897102 83.1481363,40.1071855 86.2420439,39 C88.0578592,39.2926449 89.4570618,41.8175853 90.4927503,43.1666676 C92.6062592,43.0809984 94.6134653,43.6270518 96.6091885,44.233091 C100.222332,43.7098824 103.254293,41.6394732 106.445091,40.0288813 C103.211767,42.7223157 102.77315,47.1042714 103.142605,51.1564486 C103.280001,53.2591496 102.697713,55.5420684 101.977868,57.6949551 C100.630795,61.2025356 98.0292951,64.8997754 95.009908,64.7101481 C93.868464,64.673306 93.2053722,64.0138 92.3570101,63.3096933 C92.1924386,64.7358711 91.5456263,66.0084523 90.9221089,67.2697748 C89.4822206,70.066388 85.7194927,71.2987762 82.2354164,74.2849828 C78.7515768,77.2712347 83.3502408,87.9363951 84.4652464,89.8796277 C85.5800708,91.8230453 88.6922789,92.5339992 87.484639,94.28798 C87.1151913,94.8672415 86.5502884,95.0744181 85.9465544,95.2991347 L85.1274062,95.4080042 Z M45.0303574,86.5575217 L45.5828655,86.699414 C46.277142,86.4290005 47.6727292,86.8469317 48.4130246,87.0512628 C47.0498362,85.7357167 44.9960929,83.8038623 43.5164417,82.5859671 C43.0307739,81.1115156 43.2380006,79.6278431 43.3424927,78.122648 L43.3634516,77.9981264 C42.7802099,79.2030731 42.040056,80.3743566 41.6422405,81.6426885 C41.176708,83.3537773 43.7112632,85.1999538 44.6940603,86.2580263 L45.0303574,86.5575217 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/advanced-search-button": {
"title": "$:/core/images/advanced-search-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-advanced-search-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M74.5651535,87.9848361 C66.9581537,93.0488876 57.8237115,96 48,96 C21.490332,96 0,74.509668 0,48 C0,21.490332 21.490332,0 48,0 C74.509668,0 96,21.490332 96,48 C96,57.8541369 93.0305793,67.0147285 87.9377231,74.6357895 L122.284919,108.982985 C125.978897,112.676963 125.973757,118.65366 122.284271,122.343146 C118.593975,126.033442 112.613238,126.032921 108.92411,122.343793 L74.5651535,87.9848361 Z M48,80 C65.673112,80 80,65.673112 80,48 C80,30.326888 65.673112,16 48,16 C30.326888,16 16,30.326888 16,48 C16,65.673112 30.326888,80 48,80 Z\"></path>\n <circle cx=\"48\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"28\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"68\" cy=\"48\" r=\"8\"></circle>\n </g>\n</svg>"
},
"$:/core/images/blank": {
"title": "$:/core/images/blank",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-blank tc-image-button\" viewBox=\"63 152 64 64\" width=\"22pt\" height=\"22pt\"></svg>\n"
},
"$:/core/images/cancel-button": {
"title": "$:/core/images/cancel-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n\t<g fill-rule=\"evenodd\">\n\t <path d=\"M64,76.3137085 L47.0294734,93.2842351 C43.9038742,96.4098343 38.8399231,96.4084656 35.7157288,93.2842712 C32.5978915,90.166434 32.5915506,85.0947409 35.7157649,81.9705266 L52.6862915,65 L35.7157649,48.0294734 C32.5901657,44.9038742 32.5915344,39.8399231 35.7157288,36.7157288 C38.833566,33.5978915 43.9052591,33.5915506 47.0294734,36.7157649 L64,53.6862915 L80.9705266,36.7157649 C84.0961258,33.5901657 89.1600769,33.5915344 92.2842712,36.7157288 C95.4021085,39.833566 95.4084494,44.9052591 92.2842351,48.0294734 L75.3137085,65 L92.2842351,81.9705266 C95.4098343,85.0961258 95.4084656,90.1600769 92.2842712,93.2842712 C89.166434,96.4021085 84.0947409,96.4084494 80.9705266,93.2842351 L64,76.3137085 Z M64,129 C99.346224,129 128,100.346224 128,65 C128,29.653776 99.346224,1 64,1 C28.653776,1 1.13686838e-13,29.653776 1.13686838e-13,65 C1.13686838e-13,100.346224 28.653776,129 64,129 Z M64,113 C90.509668,113 112,91.509668 112,65 C112,38.490332 90.509668,17 64,17 C37.490332,17 16,38.490332 16,65 C16,91.509668 37.490332,113 64,113 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-down": {
"title": "$:/core/images/chevron-down",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-down tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 40.500000) rotate(-270.000000) translate(-64.000000, -40.500000) translate(-22.500000, -26.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>"
},
"$:/core/images/chevron-left": {
"title": "$:/core/images/chevron-left",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-left tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\" version=\"1.1\">\n <g fill-rule=\"evenodd\" transform=\"translate(92.500000, 64.000000) rotate(-180.000000) translate(-92.500000, -64.000000) translate(6.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-right": {
"title": "$:/core/images/chevron-right",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-right tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\" transform=\"translate(-48.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-up": {
"title": "$:/core/images/chevron-up",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-up tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 89.500000) rotate(-90.000000) translate(-64.000000, -89.500000) translate(-22.500000, 22.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>"
},
"$:/core/images/clone-button": {
"title": "$:/core/images/clone-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-clone-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M32.2650915,96 L32.2650915,120.002359 C32.2650915,124.419334 35.8432884,128 40.2627323,128 L120.002359,128 C124.419334,128 128,124.421803 128,120.002359 L128,40.2627323 C128,35.8457573 124.421803,32.2650915 120.002359,32.2650915 L96,32.2650915 L96,48 L108.858899,48 C110.519357,48 111.853018,49.3405131 111.853018,50.9941198 L111.853018,108.858899 C111.853018,110.519357 110.512505,111.853018 108.858899,111.853018 L50.9941198,111.853018 C49.333661,111.853018 48,110.512505 48,108.858899 L48,96 L32.2650915,96 Z\"></path>\n <path d=\"M40,56 L32.0070969,56 C27.5881712,56 24,52.418278 24,48 C24,43.5907123 27.5848994,40 32.0070969,40 L40,40 L40,32.0070969 C40,27.5881712 43.581722,24 48,24 C52.4092877,24 56,27.5848994 56,32.0070969 L56,40 L63.9929031,40 C68.4118288,40 72,43.581722 72,48 C72,52.4092877 68.4151006,56 63.9929031,56 L56,56 L56,63.9929031 C56,68.4118288 52.418278,72 48,72 C43.5907123,72 40,68.4151006 40,63.9929031 L40,56 Z M7.9992458,0 C3.58138434,0 0,3.5881049 0,7.9992458 L0,88.0007542 C0,92.4186157 3.5881049,96 7.9992458,96 L88.0007542,96 C92.4186157,96 96,92.4118951 96,88.0007542 L96,7.9992458 C96,3.58138434 92.4118951,0 88.0007542,0 L7.9992458,0 Z M19.0010118,16 C17.3435988,16 16,17.336731 16,19.0010118 L16,76.9989882 C16,78.6564012 17.336731,80 19.0010118,80 L76.9989882,80 C78.6564012,80 80,78.663269 80,76.9989882 L80,19.0010118 C80,17.3435988 78.663269,16 76.9989882,16 L19.0010118,16 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/close-all-button": {
"title": "$:/core/images/close-all-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-close-all-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\" transform=\"translate(-23.000000, -23.000000)\">\n <path d=\"M43,131 L22.9976794,131 C18.5827987,131 15,127.418278 15,123 C15,118.590712 18.5806831,115 22.9976794,115 L43,115 L43,94.9976794 C43,90.5827987 46.581722,87 51,87 C55.4092877,87 59,90.5806831 59,94.9976794 L59,115 L79.0023206,115 C83.4172013,115 87,118.581722 87,123 C87,127.409288 83.4193169,131 79.0023206,131 L59,131 L59,151.002321 C59,155.417201 55.418278,159 51,159 C46.5907123,159 43,155.419317 43,151.002321 L43,131 Z\" transform=\"translate(51.000000, 123.000000) rotate(-45.000000) translate(-51.000000, -123.000000) \"></path>\n <path d=\"M43,59 L22.9976794,59 C18.5827987,59 15,55.418278 15,51 C15,46.5907123 18.5806831,43 22.9976794,43 L43,43 L43,22.9976794 C43,18.5827987 46.581722,15 51,15 C55.4092877,15 59,18.5806831 59,22.9976794 L59,43 L79.0023206,43 C83.4172013,43 87,46.581722 87,51 C87,55.4092877 83.4193169,59 79.0023206,59 L59,59 L59,79.0023206 C59,83.4172013 55.418278,87 51,87 C46.5907123,87 43,83.4193169 43,79.0023206 L43,59 Z\" transform=\"translate(51.000000, 51.000000) rotate(-45.000000) translate(-51.000000, -51.000000) \"></path>\n <path d=\"M115,59 L94.9976794,59 C90.5827987,59 87,55.418278 87,51 C87,46.5907123 90.5806831,43 94.9976794,43 L115,43 L115,22.9976794 C115,18.5827987 118.581722,15 123,15 C127.409288,15 131,18.5806831 131,22.9976794 L131,43 L151.002321,43 C155.417201,43 159,46.581722 159,51 C159,55.4092877 155.419317,59 151.002321,59 L131,59 L131,79.0023206 C131,83.4172013 127.418278,87 123,87 C118.590712,87 115,83.4193169 115,79.0023206 L115,59 Z\" transform=\"translate(123.000000, 51.000000) rotate(-45.000000) translate(-123.000000, -51.000000) \"></path>\n <path d=\"M115,131 L94.9976794,131 C90.5827987,131 87,127.418278 87,123 C87,118.590712 90.5806831,115 94.9976794,115 L115,115 L115,94.9976794 C115,90.5827987 118.581722,87 123,87 C127.409288,87 131,90.5806831 131,94.9976794 L131,115 L151.002321,115 C155.417201,115 159,118.581722 159,123 C159,127.409288 155.419317,131 151.002321,131 L131,131 L131,151.002321 C131,155.417201 127.418278,159 123,159 C118.590712,159 115,155.419317 115,151.002321 L115,131 Z\" transform=\"translate(123.000000, 123.000000) rotate(-45.000000) translate(-123.000000, -123.000000) \"></path>\n </g>\n</svg>"
},
"$:/core/images/close-button": {
"title": "$:/core/images/close-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M65.0864256,75.4091629 L14.9727349,125.522854 C11.8515951,128.643993 6.78104858,128.64922 3.65685425,125.525026 C0.539017023,122.407189 0.5336324,117.334539 3.65902635,114.209145 L53.7727171,64.0954544 L3.65902635,13.9817637 C0.537886594,10.8606239 0.532659916,5.79007744 3.65685425,2.6658831 C6.77469148,-0.451954124 11.8473409,-0.457338747 14.9727349,2.66805521 L65.0864256,52.7817459 L115.200116,2.66805521 C118.321256,-0.453084553 123.391803,-0.458311231 126.515997,2.6658831 C129.633834,5.78372033 129.639219,10.8563698 126.513825,13.9817637 L76.4001341,64.0954544 L126.513825,114.209145 C129.634965,117.330285 129.640191,122.400831 126.515997,125.525026 C123.39816,128.642863 118.32551,128.648248 115.200116,125.522854 L65.0864256,75.4091629 L65.0864256,75.4091629 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/close-others-button": {
"title": "$:/core/images/close-others-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-close-others-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 127\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z M64,96 C81.673112,96 96,81.673112 96,64 C96,46.326888 81.673112,32 64,32 C46.326888,32 32,46.326888 32,64 C32,81.673112 46.326888,96 64,96 Z M64,80 C72.836556,80 80,72.836556 80,64 C80,55.163444 72.836556,48 64,48 C55.163444,48 48,55.163444 48,64 C48,72.836556 55.163444,80 64,80 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/delete-button": {
"title": "$:/core/images/delete-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\" transform=\"translate(12.000000, 0.000000)\">\n <rect x=\"0\" y=\"11\" width=\"105\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"28\" y=\"0\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"112\" width=\"88\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"56\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"32\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n </g>\n</svg>\n"
},
"$:/core/images/done-button": {
"title": "$:/core/images/done-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M3.52445141,76.8322939 C2.07397484,75.3828178 1.17514421,73.3795385 1.17514421,71.1666288 L1.17514421,23.1836596 C1.17514421,18.7531992 4.75686621,15.1751442 9.17514421,15.1751442 C13.5844319,15.1751442 17.1751442,18.7606787 17.1751442,23.1836596 L17.1751442,63.1751442 L119.173716,63.1751442 C123.590457,63.1751442 127.175144,66.7568662 127.175144,71.1751442 C127.175144,75.5844319 123.592783,79.1751442 119.173716,79.1751442 L9.17657227,79.1751442 C6.96796403,79.1751442 4.9674142,78.279521 3.51911285,76.8315312 Z\" id=\"Rectangle-285\" transform=\"translate(64.175144, 47.175144) rotate(-45.000000) translate(-64.175144, -47.175144) \"></path>\n </g>\n</svg>\n"
},
"$:/core/images/down-arrow": {
"title": "$:/core/images/down-arrow",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <path d=\"M109.35638,81.3533152 C107.923899,82.7869182 105.94502,83.6751442 103.759224,83.6751442 L24.5910645,83.6751442 C20.225873,83.6751442 16.6751442,80.1307318 16.6751442,75.7584775 C16.6751442,71.3951199 20.2192225,67.8418109 24.5910645,67.8418109 L95.8418109,67.8418109 L95.8418109,-3.40893546 C95.8418109,-7.77412698 99.3862233,-11.3248558 103.758478,-11.3248558 C108.121835,-11.3248558 111.675144,-7.78077754 111.675144,-3.40893546 L111.675144,75.7592239 C111.675144,77.9416955 110.789142,79.9205745 109.356651,81.3538862 Z\" transform=\"translate(64.175144, 36.175144) rotate(45.000000) translate(-64.175144, -36.175144) \"></path>\n</svg>\n"
},
"$:/core/images/download-button": {
"title": "$:/core/images/download-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-download-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 128\"><g fill-rule=\"evenodd\"><path class=\"tc-image-download-button-ring\" d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"/><path d=\"M34.3496823,66.4308767 L61.2415823,93.634668 C63.0411536,95.4551107 65.9588502,95.4551107 67.7584215,93.634668 L94.6503215,66.4308767 C96.4498928,64.610434 96.4498928,61.6588981 94.6503215,59.8384554 C93.7861334,58.9642445 92.6140473,58.4731195 91.3919019,58.4731195 L82.9324098,58.4731195 C80.3874318,58.4731195 78.3243078,56.3860674 78.3243078,53.8115729 L78.3243078,38.6615466 C78.3243078,36.0870521 76.2611837,34 73.7162058,34 L55.283798,34 C52.7388201,34 50.675696,36.0870521 50.675696,38.6615466 L50.675696,38.6615466 L50.675696,53.8115729 C50.675696,56.3860674 48.612572,58.4731195 46.0675941,58.4731195 L37.608102,58.4731195 C35.063124,58.4731195 33,60.5601716 33,63.134666 C33,64.3709859 33.4854943,65.5566658 34.3496823,66.4308767 L34.3496823,66.4308767 Z\"/></g></svg>"
},
"$:/core/images/edit-button": {
"title": "$:/core/images/edit-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M116.870058,45.3431458 L108.870058,45.3431458 L108.870058,45.3431458 L108.870058,61.3431458 L116.870058,61.3431458 L116.870058,45.3431458 Z M124.870058,45.3431458 L127.649881,45.3431458 C132.066101,45.3431458 135.656854,48.9248678 135.656854,53.3431458 C135.656854,57.7524334 132.07201,61.3431458 127.649881,61.3431458 L124.870058,61.3431458 L124.870058,45.3431458 Z M100.870058,45.3431458 L15.6638275,45.3431458 C15.5064377,45.3431458 15.3501085,45.3476943 15.1949638,45.3566664 L15.1949638,45.3566664 C15.0628002,45.3477039 14.928279,45.3431458 14.7913977,45.3431458 C6.68160973,45.3431458 -8.34314575,53.3431458 -8.34314575,53.3431458 C-8.34314575,53.3431458 6.85614548,61.3431458 14.7913977,61.3431458 C14.9266533,61.3431458 15.0596543,61.3384973 15.190398,61.3293588 C15.3470529,61.3385075 15.5049057,61.3431458 15.6638275,61.3431458 L100.870058,61.3431458 L100.870058,45.3431458 L100.870058,45.3431458 Z\" transform=\"translate(63.656854, 53.343146) rotate(-45.000000) translate(-63.656854, -53.343146) \"></path>\n <path d=\"M35.1714596,124.189544 C41.9594858,123.613403 49.068777,121.917633 58.85987,118.842282 C60.6854386,118.268877 62.4306907,117.705515 65.1957709,116.802278 C81.1962861,111.575575 87.0734839,109.994907 93.9414474,109.655721 C102.29855,109.242993 107.795169,111.785371 111.520478,118.355045 C112.610163,120.276732 115.051363,120.951203 116.97305,119.861518 C118.894737,118.771832 119.569207,116.330633 118.479522,114.408946 C113.146151,105.003414 104.734907,101.112919 93.5468356,101.66546 C85.6716631,102.054388 79.4899908,103.716944 62.7116783,109.197722 C59.9734132,110.092199 58.2519873,110.64787 56.4625698,111.20992 C37.002649,117.322218 25.6914684,118.282267 16.8654804,112.957098 C14.9739614,111.815848 12.5154166,112.424061 11.3741667,114.31558 C10.2329168,116.207099 10.84113,118.665644 12.7326489,119.806894 C19.0655164,123.627836 26.4866335,124.926678 35.1714596,124.189544 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/export-button": {
"title": "$:/core/images/export-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-export-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00348646,127.999999 C8.00464867,128 8.00581094,128 8.00697327,128 L119.993027,128 C122.205254,128 124.207939,127.101378 125.657096,125.651198 L125.656838,125.65759 C127.104563,124.210109 128,122.21009 128,119.999949 L128,56.0000511 C128,51.5817449 124.409288,48 120,48 C115.581722,48 112,51.5797863 112,56.0000511 L112,112 L16,112 L16,56.0000511 C16,51.5817449 12.4092877,48 8,48 C3.581722,48 7.10542736e-15,51.5797863 7.10542736e-15,56.0000511 L7.10542736e-15,119.999949 C7.10542736e-15,124.418255 3.59071231,128 8,128 C8.00116233,128 8.0023246,128 8.00348681,127.999999 Z M56.6235633,27.3113724 L47.6580188,36.2769169 C44.5333664,39.4015692 39.4634864,39.4061295 36.339292,36.2819351 C33.2214548,33.1640979 33.2173444,28.0901742 36.3443103,24.9632084 L58.9616908,2.34582788 C60.5248533,0.782665335 62.5748436,0.000361191261 64.624516,2.38225238e-14 L64.6193616,0.00151809229 C66.6695374,0.000796251595 68.7211167,0.781508799 70.2854358,2.34582788 L92.9028163,24.9632084 C96.0274686,28.0878607 96.0320289,33.1577408 92.9078345,36.2819351 C89.7899973,39.3997724 84.7160736,39.4038827 81.5891078,36.2769169 L72.6235633,27.3113724 L72.6235633,88.5669606 C72.6235633,92.9781015 69.0418413,96.5662064 64.6235633,96.5662064 C60.2142756,96.5662064 56.6235633,92.984822 56.6235633,88.5669606 L56.6235633,27.3113724 L56.6235633,27.3113724 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/full-screen-button": {
"title": "$:/core/images/full-screen-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-full-screen-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g>\n <g>\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 104.000000) rotate(-180.000000) translate(-104.000000, -104.000000) translate(80.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(24.000000, 104.000000) rotate(-90.000000) translate(-24.000000, -104.000000) translate(0.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 24.000000) rotate(90.000000) translate(-104.000000, -24.000000) translate(80.000000, 0.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n </g>\n</svg>"
},
"$:/core/images/globe": {
"title": "$:/core/images/globe",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-globe tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M72.8111354,37.1275855 C72.8111354,37.9789875 72.8111354,38.8303894 72.8111354,39.6817913 C72.8111354,41.8784743 73.7885604,46.5631866 72.8111354,48.5143758 C71.3445471,51.4420595 68.1617327,52.0543531 66.4170946,54.3812641 C65.2352215,55.9575873 61.7987417,64.9821523 62.7262858,67.3005778 C66.6959269,77.2228204 74.26087,70.4881886 80.6887657,76.594328 C81.5527211,77.415037 83.5758191,78.8666631 83.985137,79.8899578 C87.2742852,88.1128283 76.4086873,94.8989524 87.7419325,106.189751 C88.9872885,107.430443 91.555495,102.372895 91.8205061,101.575869 C92.6726866,99.0129203 98.5458765,96.1267309 100.908882,94.5234439 C102.928056,93.1534443 105.782168,91.8557166 107.236936,89.7775886 C109.507391,86.5342557 108.717505,82.2640435 110.334606,79.0328716 C112.473794,74.7585014 114.163418,69.3979002 116.332726,65.0674086 C120.230862,57.2857361 121.054075,67.1596684 121.400359,67.5059523 C121.757734,67.8633269 122.411167,67.5059523 122.916571,67.5059523 C123.011132,67.5059523 124.364019,67.6048489 124.432783,67.5059523 C125.0832,66.5705216 123.390209,49.5852316 123.114531,48.2089091 C121.710578,41.1996597 116.17083,32.4278331 111.249523,27.7092761 C104.975994,21.6942076 104.160516,11.5121686 92.9912146,12.7547535 C92.7872931,12.7774397 87.906794,22.9027026 85.2136766,26.2672064 C81.486311,30.9237934 82.7434931,22.1144904 78.6876623,22.1144904 C78.6065806,22.1144904 77.5045497,22.0107615 77.4353971,22.1144904 C76.8488637,22.9942905 75.9952305,26.0101404 75.1288269,26.5311533 C74.8635477,26.6906793 73.4071369,26.2924966 73.2826811,26.5311533 C71.0401728,30.8313939 81.5394677,28.7427264 79.075427,34.482926 C76.7225098,39.9642538 72.747373,32.4860199 72.747373,43.0434079\"></path>\n <path d=\"M44.4668556,7.01044608 C54.151517,13.1403033 45.1489715,19.2084878 47.1611905,23.2253896 C48.8157833,26.5283781 51.4021933,28.6198851 48.8753629,33.038878 C46.8123257,36.6467763 42.0052989,37.0050492 39.251679,39.7621111 C36.2115749,42.8060154 33.7884281,48.7028116 32.4624592,52.6732691 C30.8452419,57.5158356 47.0088721,59.5388126 44.5246867,63.6811917 C43.1386839,65.9923513 37.7785192,65.1466282 36.0880227,63.8791519 C34.9234453,63.0059918 32.4946425,63.3331166 31.6713597,62.0997342 C29.0575851,58.1839669 29.4107339,54.0758543 28.0457962,49.9707786 C27.1076833,47.1493864 21.732611,47.8501656 20.2022714,49.3776393 C19.6790362,49.8998948 19.8723378,51.1703278 19.8723378,51.8829111 C19.8723378,57.1682405 26.9914913,55.1986414 26.9914913,58.3421973 C26.9914913,72.9792302 30.9191897,64.8771867 38.1313873,69.6793121 C48.1678018,76.3618966 45.9763926,76.981595 53.0777543,84.0829567 C56.7511941,87.7563965 60.8192437,87.7689005 62.503478,93.3767069 C64.1046972,98.7081071 53.1759798,98.7157031 50.786754,100.825053 C49.663965,101.816317 47.9736094,104.970571 46.5680513,105.439676 C44.7757187,106.037867 43.334221,105.93607 41.6242359,107.219093 C39.1967302,109.040481 37.7241465,112.151588 37.6034934,112.030935 C35.4555278,109.88297 34.0848666,96.5511248 33.7147244,93.7726273 C33.1258872,89.3524817 28.1241923,88.2337027 26.7275443,84.7420826 C25.1572737,80.8164061 28.2518481,75.223612 25.599097,70.9819941 C19.0797019,60.557804 13.7775712,56.4811506 10.2493953,44.6896152 C9.3074899,41.5416683 13.5912267,38.1609942 15.1264825,35.8570308 C17.0029359,33.0410312 17.7876232,30.0028946 19.8723378,27.2224065 C22.146793,24.1888519 40.8551166,9.46076832 43.8574051,8.63490613 L44.4668556,7.01044608 Z\"></path>\n <path d=\"M64,126 C98.2416545,126 126,98.2416545 126,64 C126,29.7583455 98.2416545,2 64,2 C29.7583455,2 2,29.7583455 2,64 C2,98.2416545 29.7583455,126 64,126 Z M64,120 C94.927946,120 120,94.927946 120,64 C120,33.072054 94.927946,8 64,8 C33.072054,8 8,33.072054 8,64 C8,94.927946 33.072054,120 64,120 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/home-button": {
"title": "$:/core/images/home-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M112.9847,119.501583 C112.99485,119.336814 113,119.170705 113,119.003406 L113,67.56802 C116.137461,70.5156358 121.076014,70.4518569 124.133985,67.3938855 C127.25818,64.2696912 127.260618,59.2068102 124.131541,56.0777326 L70.3963143,2.34250601 C68.8331348,0.779326498 66.7828947,-0.000743167069 64.7337457,1.61675364e-05 C62.691312,-0.00409949529 60.6426632,0.777559815 59.077717,2.34250601 L33,28.420223 L33,28.420223 L33,8.00697327 C33,3.58484404 29.4092877,0 25,0 C20.581722,0 17,3.59075293 17,8.00697327 L17,44.420223 L5.3424904,56.0777326 C2.21694607,59.2032769 2.22220878,64.2760483 5.34004601,67.3938855 C8.46424034,70.5180798 13.5271213,70.5205187 16.6561989,67.3914411 L17,67.04764 L17,119.993027 C17,119.994189 17.0000002,119.995351 17.0000007,119.996514 C17.0000002,119.997675 17,119.998838 17,120 C17,124.418278 20.5881049,128 24.9992458,128 L105.000754,128 C109.418616,128 113,124.409288 113,120 C113,119.832611 112.99485,119.666422 112.9847,119.501583 Z M97,112 L97,51.5736087 L97,51.5736087 L64.7370156,19.3106244 L33,51.04764 L33,112 L97,112 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/import-button": {
"title": "$:/core/images/import-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-import-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M105.449437,94.2138951 C105.449437,94.2138951 110.049457,94.1897106 110.049457,99.4026111 C110.049457,104.615512 105.163246,104.615511 105.163246,104.615511 L45.0075072,105.157833 C45.0075072,105.157833 0.367531803,106.289842 0.367532368,66.6449212 C0.367532934,27.0000003 45.0428249,27.0000003 45.0428249,27.0000003 L105.532495,27.0000003 C105.532495,27.0000003 138.996741,25.6734987 138.996741,55.1771866 C138.996741,84.6808745 105.727102,82.8457535 105.727102,82.8457535 L56.1735087,82.8457535 C56.1735087,82.8457535 22.6899229,85.1500223 22.6899229,66.0913753 C22.6899229,47.0327282 56.1735087,49.3383013 56.1735087,49.3383013 L105.727102,49.3383013 C105.727102,49.3383013 111.245209,49.3383024 111.245209,54.8231115 C111.245209,60.3079206 105.727102,60.5074524 105.727102,60.5074524 L56.1735087,60.5074524 C56.1735087,60.5074524 37.48913,60.5074528 37.48913,66.6449195 C37.48913,72.7823862 56.1735087,71.6766023 56.1735087,71.6766023 L105.727102,71.6766029 C105.727102,71.6766029 127.835546,73.1411469 127.835546,55.1771866 C127.835546,35.5304025 105.727102,38.3035317 105.727102,38.3035317 L45.0428249,38.3035317 C45.0428249,38.3035317 11.5287276,38.3035313 11.5287276,66.6449208 C11.5287276,94.9863103 45.0428244,93.9579678 45.0428244,93.9579678 L105.449437,94.2138951 Z\" transform=\"translate(69.367532, 66.000000) rotate(-45.000000) translate(-69.367532, -66.000000) \"></path>\n </g>\n</svg>"
},
"$:/core/images/info-button": {
"title": "$:/core/images/info-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <g transform=\"translate(0.049406, 0.000000)\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"></path>\n <circle cx=\"64\" cy=\"32\" r=\"8\"></circle>\n <rect x=\"56\" y=\"48\" width=\"16\" height=\"56\" rx=\"8\"></rect>\n </g>\n </g>\n </g>\n</svg>\n"
},
"$:/core/images/locked-padlock": {
"title": "$:/core/images/locked-padlock",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-locked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M96.4723753,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L32.0000269,64 C32.0028554,48.2766389 32.3030338,16.2688026 64.1594984,16.2688041 C95.9543927,16.2688056 96.4648869,48.325931 96.4723753,64 Z M80.5749059,64 L48.4413579,64 C48.4426205,47.71306 48.5829272,31.9999996 64.1595001,31.9999996 C79.8437473,31.9999996 81.1369461,48.1359182 80.5749059,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/menu-button": {
"title": "$:/core/images/menu-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <rect x=\"0\" y=\"16\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"56\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"96\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n</svg>\n"
},
"$:/core/images/new-button": {
"title": "$:/core/images/new-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M56,72 L8.00697327,72 C3.59075293,72 0,68.418278 0,64 C0,59.5907123 3.58484404,56 8.00697327,56 L56,56 L56,8.00697327 C56,3.59075293 59.581722,0 64,0 C68.4092877,0 72,3.58484404 72,8.00697327 L72,56 L119.993027,56 C124.409247,56 128,59.581722 128,64 C128,68.4092877 124.415156,72 119.993027,72 L72,72 L72,119.993027 C72,124.409247 68.418278,128 64,128 C59.5907123,128 56,124.415156 56,119.993027 L56,72 L56,72 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/new-here-button": {
"title": "$:/core/images/new-here-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-here-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n \t<g transform=\"translate(52.233611, 64.389922) rotate(75.000000) translate(-52.233611, -64.389922) translate(-7.734417, 3.702450)\">\n\t <path d=\"M18.9270186,45.959338 L18.9080585,49.6521741 C18.8884833,53.4648378 21.0574548,58.7482162 23.7526408,61.4434022 L78.5671839,116.257945 C81.2617332,118.952495 85.6348701,118.950391 88.3334363,116.251825 L115.863237,88.7220241 C118.555265,86.0299959 118.564544,81.6509578 115.869358,78.9557717 L61.0548144,24.1412286 C58.3602652,21.4466794 53.0787224,19.2788426 49.2595808,19.3006519 L25.9781737,19.4336012 C22.1633003,19.4553862 19.0471195,22.5673232 19.0275223,26.3842526 L18.9871663,34.2443819 C19.0818862,34.255617 19.1779758,34.2665345 19.2754441,34.2771502 C22.6891275,34.6489512 27.0485594,34.2348566 31.513244,33.2285542 C31.7789418,32.8671684 32.075337,32.5211298 32.4024112,32.1940556 C34.8567584,29.7397084 38.3789778,29.0128681 41.4406288,30.0213822 C41.5958829,29.9543375 41.7503946,29.8866669 41.9041198,29.8183808 L42.1110981,30.2733467 C43.1114373,30.6972371 44.0473796,31.3160521 44.8614145,32.1300869 C48.2842088,35.5528813 48.2555691,41.130967 44.7974459,44.5890903 C41.4339531,47.952583 36.0649346,48.0717177 32.6241879,44.9262969 C27.8170558,45.8919233 23.0726921,46.2881596 18.9270186,45.959338 Z\"></path>\n\t <path d=\"M45.4903462,38.8768094 C36.7300141,42.6833154 26.099618,44.7997354 18.1909048,43.9383587 C7.2512621,42.7468685 1.50150083,35.8404432 4.66865776,24.7010202 C7.51507386,14.6896965 15.4908218,6.92103848 24.3842626,4.38423012 C34.1310219,1.60401701 42.4070208,6.15882777 42.4070209,16.3101169 L34.5379395,16.310117 C34.5379394,11.9285862 31.728784,10.3825286 26.5666962,11.8549876 C20.2597508,13.6540114 14.3453742,19.4148216 12.2444303,26.8041943 C10.4963869,32.9523565 12.6250796,35.5092726 19.0530263,36.2093718 C25.5557042,36.9176104 35.0513021,34.9907189 42.7038419,31.5913902 L42.7421786,31.6756595 C44.3874154,31.5384763 47.8846101,37.3706354 45.9274416,38.6772897 L45.9302799,38.6835285 C45.9166992,38.6895612 45.9031139,38.6955897 45.8895238,38.7016142 C45.8389288,38.7327898 45.7849056,38.7611034 45.7273406,38.7863919 C45.6506459,38.8200841 45.571574,38.8501593 45.4903462,38.8768094 Z\"></path>\n </g>\n <rect x=\"96\" y=\"80\" width=\"16\" height=\"48\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"96\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n </g>\n </g>\n</svg>\n"
},
"$:/core/images/new-journal-button": {
"title": "$:/core/images/new-journal-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-journal-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M102.545455,112.818182 L102.545455,124.636364 L102.545455,124.636364 L102.545455,124.636364 C102.545455,125.941761 103.630828,127 104.969697,127 L111.030303,127 C112.369172,127 113.454545,125.941761 113.454545,124.636364 L113.454545,112.818182 L125.575758,112.818182 C126.914626,112.818182 128,111.759982 128,110.454545 L128,104.545455 C128,103.240018 126.914626,102.181818 125.575758,102.181818 L113.454545,102.181818 L113.454545,90.3636364 C113.454545,89.0582 112.369172,88 111.030303,88 L104.969697,88 L104.969697,88 C103.630828,88 102.545455,89.0582 102.545455,90.3636364 L102.545455,102.181818 L90.4242424,102.181818 L90.4242424,102.181818 C89.0853705,102.181818 88,103.240018 88,104.545455 L88,110.454545 L88,110.454545 L88,110.454545 C88,111.759982 89.0853705,112.818182 90.4242424,112.818182 L102.545455,112.818182 Z\"></path>\n <g transform=\"translate(59.816987, 64.316987) rotate(30.000000) translate(-59.816987, -64.316987) translate(20.316987, 12.816987)\">\n <g transform=\"translate(0.000000, 0.000000)\">\n <path d=\"M9.99631148,0 C4.4755011,0 -2.27373675e-13,4.48070044 -2.27373675e-13,9.99759461 L-2.27373675e-13,91.6128884 C-2.27373675e-13,97.1344074 4.46966773,101.610483 9.99631148,101.610483 L68.9318917,101.610483 C74.4527021,101.610483 78.9282032,97.1297826 78.9282032,91.6128884 L78.9282032,9.99759461 C78.9282032,4.47607557 74.4585355,0 68.9318917,0 L9.99631148,0 Z M20.8885263,26 C24.2022348,26 26.8885263,23.3137085 26.8885263,20 C26.8885263,16.6862915 24.2022348,14 20.8885263,14 C17.5748178,14 14.8885263,16.6862915 14.8885263,20 C14.8885263,23.3137085 17.5748178,26 20.8885263,26 Z M57.3033321,25.6783342 C60.6170406,25.6783342 63.3033321,22.9920427 63.3033321,19.6783342 C63.3033321,16.3646258 60.6170406,13.6783342 57.3033321,13.6783342 C53.9896236,13.6783342 51.3033321,16.3646258 51.3033321,19.6783342 C51.3033321,22.9920427 53.9896236,25.6783342 57.3033321,25.6783342 Z\"></path>\n <text font-family=\"Helvetica\" font-size=\"47.1724138\" font-weight=\"bold\" fill=\"#FFFFFF\">\n <tspan x=\"42\" y=\"77.4847912\" text-anchor=\"middle\"><<now \"DD\">></tspan>\n </text>\n </g>\n </g>\n </g>\n</svg>\n"
},
"$:/core/images/options-button": {
"title": "$:/core/images/options-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-options-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M110.48779,76.0002544 C109.354214,80.4045063 107.611262,84.5641217 105.354171,88.3838625 L105.354171,88.3838625 L112.07833,95.1080219 C115.20107,98.2307613 115.210098,103.299824 112.089164,106.420759 L106.420504,112.089418 C103.301049,115.208874 98.2346851,115.205502 95.1077675,112.078585 L88.3836082,105.354425 C84.5638673,107.611516 80.4042519,109.354468 76,110.488045 L76,110.488045 L76,119.993281 C76,124.409501 72.4220153,128.000254 68.0083475,128.000254 L59.9916525,128.000254 C55.5800761,128.000254 52,124.41541 52,119.993281 L52,110.488045 C47.5957481,109.354468 43.4361327,107.611516 39.6163918,105.354425 L32.8922325,112.078585 C29.7694931,115.201324 24.7004301,115.210353 21.5794957,112.089418 L15.9108363,106.420759 C12.7913807,103.301303 12.7947522,98.2349395 15.9216697,95.1080219 L22.6458291,88.3838625 C20.3887383,84.5641217 18.6457859,80.4045063 17.5122098,76.0002544 L8.00697327,76.0002544 C3.59075293,76.0002544 2.19088375e-16,72.4222697 4.89347582e-16,68.0086019 L9.80228577e-16,59.9919069 C1.25035972e-15,55.5803305 3.58484404,52.0002544 8.00697327,52.0002544 L17.5122098,52.0002544 C18.6457859,47.5960025 20.3887383,43.4363871 22.6458291,39.6166462 L15.9216697,32.8924868 C12.7989304,29.7697475 12.7899019,24.7006845 15.9108363,21.5797501 L21.5794957,15.9110907 C24.6989513,12.7916351 29.7653149,12.7950065 32.8922325,15.9219241 L39.6163918,22.6460835 C43.4361327,20.3889927 47.5957481,18.6460403 52,17.5124642 L52,8.00722764 C52,3.5910073 55.5779847,0.000254375069 59.9916525,0.000254375069 L68.0083475,0.000254375069 C72.4199239,0.000254375069 76,3.58509841 76,8.00722764 L76,17.5124642 C80.4042519,18.6460403 84.5638673,20.3889927 88.3836082,22.6460835 L95.1077675,15.9219241 C98.2305069,12.7991848 103.29957,12.7901562 106.420504,15.9110907 L112.089164,21.5797501 C115.208619,24.6992057 115.205248,29.7655693 112.07833,32.8924868 L105.354171,39.6166462 L105.354171,39.6166462 C107.611262,43.4363871 109.354214,47.5960025 110.48779,52.0002544 L119.993027,52.0002544 C124.409247,52.0002544 128,55.5782391 128,59.9919069 L128,68.0086019 C128,72.4201783 124.415156,76.0002544 119.993027,76.0002544 L110.48779,76.0002544 L110.48779,76.0002544 Z M64,96.0002544 C81.673112,96.0002544 96,81.6733664 96,64.0002544 C96,46.3271424 81.673112,32.0002544 64,32.0002544 C46.326888,32.0002544 32,46.3271424 32,64.0002544 C32,81.6733664 46.326888,96.0002544 64,96.0002544 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/permalink-button": {
"title": "$:/core/images/permalink-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-permalink-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M80.4834582,48 L73.0956761,80 L73.0956761,80 L47.5165418,80 L54.9043239,48 L80.4834582,48 Z M84.1773493,32 L89.8007299,7.64246248 C90.7941633,3.33942958 95.0918297,0.64641956 99.3968675,1.64031585 C103.693145,2.63218977 106.385414,6.93288901 105.390651,11.2416793 L100.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L96.9043239,48 L89.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L85.8226507,96 L80.1992701,120.357538 C79.2058367,124.66057 74.9081703,127.35358 70.6031325,126.359684 C66.3068546,125.36781 63.6145865,121.067111 64.6093491,116.758321 L69.401785,96 L43.8226507,96 L38.1992701,120.357538 C37.2058367,124.66057 32.9081703,127.35358 28.6031325,126.359684 C24.3068546,125.36781 21.6145865,121.067111 22.6093491,116.758321 L27.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L31.0956761,80 L38.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L42.1773493,32 L47.8007299,7.64246248 C48.7941633,3.33942958 53.0918297,0.64641956 57.3968675,1.64031585 C61.6931454,2.63218977 64.3854135,6.93288901 63.3906509,11.2416793 L58.598215,32 L84.1773493,32 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/permaview-button": {
"title": "$:/core/images/permaview-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-permaview-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M81.4834582,48 L79.6365127,56 L79.6365127,56 L74.0573784,56 L75.9043239,48 L81.4834582,48 Z M85.1773493,32 L90.8007299,7.64246248 C91.7941633,3.33942958 96.0918297,0.64641956 100.396867,1.64031585 C104.693145,2.63218977 107.385414,6.93288901 106.390651,11.2416793 L101.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L97.9043239,48 L96.0573784,56 L104.000754,56 C108.411895,56 112,59.581722 112,64 C112,68.4092877 108.418616,72 104.000754,72 L92.3634873,72 L90.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L86.8226507,96 L81.1992701,120.357538 C80.2058367,124.66057 75.9081703,127.35358 71.6031325,126.359684 C67.3068546,125.36781 64.6145865,121.067111 65.6093491,116.758321 L70.401785,96 L64.8226507,96 L59.1992701,120.357538 C58.2058367,124.66057 53.9081703,127.35358 49.6031325,126.359684 C45.3068546,125.36781 42.6145865,121.067111 43.6093491,116.758321 L48.401785,96 L42.8226507,96 L37.1992701,120.357538 C36.2058367,124.66057 31.9081703,127.35358 27.6031325,126.359684 C23.3068546,125.36781 20.6145865,121.067111 21.6093491,116.758321 L26.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L30.0956761,80 L31.9426216,72 L23.9992458,72 C19.5881049,72 16,68.418278 16,64 C16,59.5907123 19.5813843,56 23.9992458,56 L35.6365127,56 L37.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L41.1773493,32 L46.8007299,7.64246248 C47.7941633,3.33942958 52.0918297,0.64641956 56.3968675,1.64031585 C60.6931454,2.63218977 63.3854135,6.93288901 62.3906509,11.2416793 L57.598215,32 L63.1773493,32 L68.8007299,7.64246248 C69.7941633,3.33942958 74.0918297,0.64641956 78.3968675,1.64031585 C82.6931454,2.63218977 85.3854135,6.93288901 84.3906509,11.2416793 L79.598215,32 L85.1773493,32 Z M53.9043239,48 L52.0573784,56 L57.6365127,56 L59.4834582,48 L53.9043239,48 Z M75.9426216,72 L74.0956761,80 L74.0956761,80 L68.5165418,80 L70.3634873,72 L75.9426216,72 L75.9426216,72 Z M48.3634873,72 L46.5165418,80 L52.0956761,80 L53.9426216,72 L48.3634873,72 L48.3634873,72 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-language": {
"title": "$:/core/images/plugin-generic-language",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M61.2072232,68.1369825 C56.8829239,70.9319564 54.2082892,74.793177 54.2082892,79.0581634 C54.2082892,86.9638335 63.3980995,93.4821994 75.2498076,94.3940006 C77.412197,98.2964184 83.8475284,101.178858 91.5684735,101.403106 C86.4420125,100.27851 82.4506393,97.6624107 80.9477167,94.3948272 C92.8046245,93.4861461 102,86.9662269 102,79.0581634 C102,70.5281905 91.3014611,63.6132813 78.1041446,63.6132813 C71.5054863,63.6132813 65.5315225,65.3420086 61.2072232,68.1369825 Z M74.001066,53.9793443 C69.6767667,56.7743182 63.7028029,58.5030456 57.1041446,58.5030456 C54.4851745,58.5030456 51.9646095,58.2307276 49.6065315,57.7275105 C46.2945155,59.9778212 41.2235699,61.4171743 35.5395922,61.4171743 C35.4545771,61.4171743 35.3696991,61.4168523 35.2849622,61.4162104 C39.404008,60.5235193 42.7961717,58.6691298 44.7630507,56.286533 C37.8379411,53.5817651 33.2082892,48.669413 33.2082892,43.0581634 C33.2082892,34.5281905 43.9068281,27.6132812 57.1041446,27.6132812 C70.3014611,27.6132812 81,34.5281905 81,43.0581634 C81,47.3231498 78.3253653,51.1843704 74.001066,53.9793443 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-plugin": {
"title": "$:/core/images/plugin-generic-plugin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M40.3972881,76.4456988 L40.3972881,95.3404069 L54.5170166,95.3404069 L54.5170166,95.3404069 C54.5165526,95.3385183 54.516089,95.3366295 54.515626,95.3347404 C54.6093153,95.3385061 54.7034848,95.3404069 54.7980982,95.3404069 C58.6157051,95.3404069 61.710487,92.245625 61.710487,88.4280181 C61.710487,86.6197822 61.01617,84.9737128 59.8795929,83.7418666 L59.8795929,83.7418666 C59.8949905,83.7341665 59.9104102,83.7265043 59.925852,83.7188798 C58.8840576,82.5086663 58.2542926,80.9336277 58.2542926,79.2114996 C58.2542926,75.3938927 61.3490745,72.2991108 65.1666814,72.2991108 C68.9842884,72.2991108 72.0790703,75.3938927 72.0790703,79.2114996 C72.0790703,81.1954221 71.2432806,82.9841354 69.9045961,84.2447446 L69.9045961,84.2447446 C69.9333407,84.2629251 69.9619885,84.281245 69.9905383,84.2997032 L69.9905383,84.2997032 C69.1314315,85.4516923 68.6228758,86.8804654 68.6228758,88.4280181 C68.6228758,91.8584969 71.1218232,94.7053153 74.3986526,95.2474079 C74.3913315,95.2784624 74.3838688,95.3094624 74.3762652,95.3404069 L95.6963988,95.3404069 L95.6963988,75.5678578 L95.6963988,75.5678578 C95.6466539,75.5808558 95.5967614,75.5934886 95.5467242,75.6057531 C95.5504899,75.5120637 95.5523907,75.4178943 95.5523907,75.3232809 C95.5523907,71.505674 92.4576088,68.4108921 88.6400019,68.4108921 C86.831766,68.4108921 85.1856966,69.105209 83.9538504,70.2417862 L83.9538504,70.2417862 C83.9461503,70.2263886 83.938488,70.2109688 83.9308636,70.1955271 C82.7206501,71.2373215 81.1456115,71.8670865 79.4234834,71.8670865 C75.6058765,71.8670865 72.5110946,68.7723046 72.5110946,64.9546976 C72.5110946,61.1370907 75.6058765,58.0423088 79.4234834,58.0423088 C81.4074059,58.0423088 83.1961192,58.8780985 84.4567284,60.2167829 L84.4567284,60.2167829 C84.4749089,60.1880383 84.4932288,60.1593906 84.511687,60.1308407 L84.511687,60.1308407 C85.6636761,60.9899475 87.0924492,61.4985032 88.6400019,61.4985032 C92.0704807,61.4985032 94.9172991,58.9995558 95.4593917,55.7227265 C95.538755,55.7414363 95.6177614,55.761071 95.6963988,55.7816184 L95.6963988,40.0412962 L74.3762652,40.0412962 L74.3762652,40.0412962 C74.3838688,40.0103516 74.3913315,39.9793517 74.3986526,39.9482971 L74.3986526,39.9482971 C71.1218232,39.4062046 68.6228758,36.5593862 68.6228758,33.1289073 C68.6228758,31.5813547 69.1314315,30.1525815 69.9905383,29.0005925 C69.9619885,28.9821342 69.9333407,28.9638143 69.9045961,28.9456339 C71.2432806,27.6850247 72.0790703,25.8963113 72.0790703,23.9123888 C72.0790703,20.0947819 68.9842884,17 65.1666814,17 C61.3490745,17 58.2542926,20.0947819 58.2542926,23.9123888 C58.2542926,25.6345169 58.8840576,27.2095556 59.925852,28.419769 L59.925852,28.419769 C59.9104102,28.4273935 59.8949905,28.4350558 59.8795929,28.4427558 C61.01617,29.674602 61.710487,31.3206715 61.710487,33.1289073 C61.710487,36.9465143 58.6157051,40.0412962 54.7980982,40.0412962 C54.7034848,40.0412962 54.6093153,40.0393953 54.515626,40.0356296 L54.515626,40.0356296 C54.516089,40.0375187 54.5165526,40.0394075 54.5170166,40.0412962 L40.3972881,40.0412962 L40.3972881,52.887664 L40.3972881,52.887664 C40.4916889,53.3430132 40.5412962,53.8147625 40.5412962,54.2980982 C40.5412962,58.1157051 37.4465143,61.210487 33.6289073,61.210487 C32.0813547,61.210487 30.6525815,60.7019313 29.5005925,59.8428245 C29.4821342,59.8713744 29.4638143,59.9000221 29.4456339,59.9287667 C28.1850247,58.5900823 26.3963113,57.7542926 24.4123888,57.7542926 C20.5947819,57.7542926 17.5,60.8490745 17.5,64.6666814 C17.5,68.4842884 20.5947819,71.5790703 24.4123888,71.5790703 C26.134517,71.5790703 27.7095556,70.9493053 28.919769,69.9075109 L28.919769,69.9075109 C28.9273935,69.9229526 28.9350558,69.9383724 28.9427558,69.95377 C30.174602,68.8171928 31.8206715,68.1228758 33.6289073,68.1228758 C37.4465143,68.1228758 40.5412962,71.2176578 40.5412962,75.0352647 C40.5412962,75.5186004 40.4916889,75.9903496 40.3972881,76.4456988 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-theme": {
"title": "$:/core/images/plugin-generic-theme",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M27.6619958,98.5383065 C27.5690581,98.5388896 27.4761291,98.539182 27.383212,98.539182 C41.5122315,92.2342259 36.7359182,71.4340774 52.2062903,71.4340772 C52.3396942,72.0325374 52.4778143,72.6764878 52.6543744,73.3309353 C41.7206358,71.5725612 42.70852,93.6013809 27.6619958,98.5383065 Z M27.962646,98.5354078 C44.3675979,98.3221342 60.9448114,89.104528 60.944811,79.6231217 C57.0326028,79.6231217 55.0057081,78.1546059 53.8483468,76.2715831 C46.8437297,73.3160546 41.0335584,95.5643154 27.9626323,98.5354081 Z M60.4476718,66.8723739 C57.4632888,63.6421817 54.9582687,60.7541572 53.4305549,58.7453802 C47.3662923,50.7715364 44.307483,54.9700909 40.8462757,58.7453801 C37.3850684,62.5206692 41.7580858,65.5796149 38.4732643,68.2464352 C35.1884428,70.9132556 35.391237,71.8376623 29.8473278,66.9588778 C24.3034186,62.0800933 23.919977,60.7368279 26.4649349,57.9530299 C29.0098928,55.1692318 31.1369568,59.5524845 36.3357237,54.6053302 C41.5344905,49.6581758 37.1673192,45.2736183 37.1673192,45.2736183 C37.1673192,45.2736183 47.9916921,23.1463023 62.4556497,24.7805686 C76.9196074,26.4148348 56.9839048,22.6644011 52.0250205,40.0179431 C49.9018746,47.4478606 52.4201529,45.6971267 56.4460414,48.8353078 C57.8695188,49.9449088 63.120208,53.6842856 69.3136884,58.3372485 C77.8095419,50.1273311 87.3705002,40.8200581 90.1462007,38.0443577 C94.9225135,33.268045 99.6988262,38.0443577 94.9225134,42.8206705 C92.2168565,45.5263274 83.0052228,54.3768782 74.6585455,62.4104777 C84.7196352,70.2010353 95.1107413,79.0341049 95.1107416,82.5307694 C95.1107421,88.9149413 92.3944614,92.7263341 86.6764506,90.6368273 C83.0906414,89.3264812 73.3126471,80.2536547 65.0234105,71.7029822 C62.8994697,73.7599251 61.2357389,75.3821997 60.3189624,76.2989761 C57.6045976,78.4574835 53.6647127,73.2589589 55.5426497,71.5226634 C56.5140946,70.6244887 58.249291,68.9770292 60.4476718,66.8723739 L60.4476718,66.8723739 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/refresh-button": {
"title": "$:/core/images/refresh-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-refresh-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M106.369002,39.4325143 C116.529932,60.3119371 112.939592,86.1974934 95.5979797,103.539105 C73.7286194,125.408466 38.2713806,125.408466 16.4020203,103.539105 C-5.46734008,81.6697449 -5.46734008,46.2125061 16.4020203,24.3431458 C19.5262146,21.2189514 24.5915344,21.2189514 27.7157288,24.3431458 C30.8399231,27.4673401 30.8399231,32.5326599 27.7157288,35.6568542 C12.0947571,51.2778259 12.0947571,76.6044251 27.7157288,92.2253967 C43.3367004,107.846368 68.6632996,107.846368 84.2842712,92.2253967 C97.71993,78.7897379 99.5995262,58.1740623 89.9230597,42.729491 L83.4844861,54.9932839 C81.4307001,58.9052072 76.5945372,60.4115251 72.682614,58.3577391 C68.7706907,56.3039532 67.2643728,51.4677903 69.3181587,47.555867 L84.4354914,18.7613158 C86.4966389,14.8353707 91.3577499,13.3347805 95.273202,15.415792 L124.145886,30.7612457 C128.047354,32.8348248 129.52915,37.6785572 127.455571,41.5800249 C125.381992,45.4814927 120.53826,46.9632892 116.636792,44.8897102 L106.369002,39.4325143 Z M98.1470904,27.0648707 C97.9798954,26.8741582 97.811187,26.6843098 97.6409651,26.4953413 L98.6018187,26.1987327 L98.1470904,27.0648707 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/right-arrow": {
"title": "$:/core/images/right-arrow",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-right-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <path d=\"M80.3563798,109.353315 C78.9238993,110.786918 76.9450203,111.675144 74.7592239,111.675144 L-4.40893546,111.675144 C-8.77412698,111.675144 -12.3248558,108.130732 -12.3248558,103.758478 C-12.3248558,99.3951199 -8.78077754,95.8418109 -4.40893546,95.8418109 L66.8418109,95.8418109 L66.8418109,24.5910645 C66.8418109,20.225873 70.3862233,16.6751442 74.7584775,16.6751442 C79.1218352,16.6751442 82.6751442,20.2192225 82.6751442,24.5910645 L82.6751442,103.759224 C82.6751442,105.941695 81.7891419,107.920575 80.3566508,109.353886 Z\" transform=\"translate(35.175144, 64.175144) rotate(-45.000000) translate(-35.175144, -64.175144) \"></path>\n</svg>"
},
"$:/core/images/save-button": {
"title": "$:/core/images/save-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/star-filled": {
"title": "$:/core/images/star-filled",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-star-filled tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"nonzero\">\n <path d=\"M61.8361286,96.8228569 L99.1627704,124.110219 C101.883827,126.099427 105.541968,123.420868 104.505636,120.198072 L90.2895569,75.9887263 L89.0292911,79.8977279 L126.314504,52.5528988 C129.032541,50.5595011 127.635256,46.2255025 124.273711,46.2229134 L78.1610486,46.1873965 L81.4604673,48.6032923 L67.1773543,4.41589688 C66.1361365,1.19470104 61.6144265,1.19470104 60.5732087,4.41589688 L46.2900957,48.6032923 L49.5895144,46.1873965 L3.47685231,46.2229134 C0.115307373,46.2255025 -1.28197785,50.5595011 1.43605908,52.5528988 L38.7212719,79.8977279 L37.4610061,75.9887263 L23.2449266,120.198072 C22.2085954,123.420868 25.8667356,126.099427 28.5877926,124.110219 L65.9144344,96.8228569 L61.8361286,96.8228569 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-classic": {
"title": "$:/core/images/storyview-classic",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-classic tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-pop": {
"title": "$:/core/images/storyview-pop",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-pop tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M16.0098166,56 C11.586117,56 8,59.5776607 8,63.9924054 L8,80.0075946 C8,84.4216782 11.5838751,88 16.0098166,88 L111.990183,88 C116.413883,88 120,84.4223393 120,80.0075946 L120,63.9924054 C120,59.5783218 116.416125,56 111.990183,56 L16.0098166,56 L16.0098166,56 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-zoomin": {
"title": "$:/core/images/storyview-zoomin",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-zoomin tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.578055 16,24.0085154 L16,71.9914846 C16,76.4144655 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.421945 112,71.9914846 L112,24.0085154 C112,19.5855345 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/tag-button": {
"title": "$:/core/images/tag-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-tag-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M18.1643182,47.6600756 L18.1677196,51.7651887 C18.1708869,55.5878829 20.3581578,60.8623899 23.0531352,63.5573673 L84.9021823,125.406414 C87.5996731,128.103905 91.971139,128.096834 94.6717387,125.396234 L125.766905,94.3010679 C128.473612,91.5943612 128.472063,87.2264889 125.777085,84.5315115 L63.9280381,22.6824644 C61.2305472,19.9849735 55.9517395,17.801995 52.1318769,17.8010313 L25.0560441,17.7942007 C21.2311475,17.7932358 18.1421354,20.8872832 18.1452985,24.7049463 L18.1535504,34.6641936 C18.2481119,34.6754562 18.3439134,34.6864294 18.4409623,34.6971263 C22.1702157,35.1081705 26.9295004,34.6530132 31.806204,33.5444844 C32.1342781,33.0700515 32.5094815,32.6184036 32.9318197,32.1960654 C35.6385117,29.4893734 39.5490441,28.718649 42.94592,29.8824694 C43.0432142,29.8394357 43.1402334,29.7961748 43.2369683,29.7526887 L43.3646982,30.0368244 C44.566601,30.5115916 45.6933052,31.2351533 46.6655958,32.2074439 C50.4612154,36.0030635 50.4663097,42.1518845 46.6769742,45.94122 C43.0594074,49.5587868 37.2914155,49.7181264 33.4734256,46.422636 C28.1082519,47.5454734 22.7987486,48.0186448 18.1643182,47.6600756 Z\"></path>\n <path d=\"M47.6333528,39.5324628 L47.6562932,39.5834939 C37.9670934,43.9391617 26.0718874,46.3819521 17.260095,45.4107025 C5.27267473,44.0894301 -1.02778744,36.4307276 2.44271359,24.0779512 C5.56175386,12.9761516 14.3014034,4.36129832 24.0466405,1.54817001 C34.7269254,-1.53487574 43.7955833,3.51606438 43.7955834,14.7730751 L35.1728168,14.7730752 C35.1728167,9.91428944 32.0946059,8.19982862 26.4381034,9.83267419 C19.5270911,11.8276553 13.046247,18.2159574 10.7440788,26.4102121 C8.82861123,33.2280582 11.161186,36.0634845 18.2047888,36.8398415 C25.3302805,37.6252244 35.7353482,35.4884477 44.1208333,31.7188498 L44.1475077,31.7781871 C44.159701,31.7725635 44.1718402,31.7671479 44.1839238,31.7619434 C45.9448098,31.0035157 50.4503245,38.3109156 47.7081571,39.5012767 C47.6834429,39.512005 47.6585061,39.5223987 47.6333528,39.5324628 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/theme-button": {
"title": "$:/core/images/theme-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-theme-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 129\">\n <g fill-rule=\"evenodd\">\n <g transform=\"translate(6.762422, 19.968999)\">\n <path d=\"M0.824945506,108.186742 C0.664785639,108.187747 0.504640965,108.188251 0.344516735,108.188251 C24.6927592,97.3230528 16.4618388,61.4785938 43.121606,61.4785936 C43.3514982,62.5099075 43.5895175,63.6196137 43.8937798,64.7474092 C25.0518979,61.7172401 26.754298,99.6790423 0.824939051,108.186742 Z M1.34304326,108.181747 C29.613352,107.814217 58.1805158,91.9297101 58.1805151,75.5906019 C51.4386888,75.5906018 47.9457839,73.0599394 45.9513275,69.8149659 C33.880418,64.7217657 23.8678719,103.061726 1.34301955,108.181748 Z\"></path>\n <path d=\"M48.871084,61.6312522 C45.6348746,64.6233738 52.4243955,73.581882 57.1020034,69.8621716 C65.3329228,61.631253 108.502656,20.4006304 116.733576,12.169711 C124.964495,3.9387916 116.733576,-4.29212771 108.502656,3.9387916 C100.271737,12.1697108 57.4180113,53.7289683 48.871084,61.6312522 Z\"></path>\n </g>\n <path d=\"M62.2824054,71.6211067 C57.93733,66.8541323 54.3123948,62.6301561 51.9937779,59.5814279 C41.5433616,45.8402704 36.2721798,53.0755512 30.307554,59.5814276 C24.3429282,66.0873041 31.8788571,71.3587209 26.2181932,75.9543964 C20.5575294,80.5500719 20.9070004,82.1430826 11.3532982,73.7355757 C1.79959591,65.3280689 1.13881905,63.0132479 5.52449152,58.2159872 C9.91016399,53.4187265 13.5756887,60.9722938 22.5346144,52.4469667 C31.4935401,43.9216395 23.9676854,36.3658236 23.9676854,36.3658236 C23.9676854,36.3658236 42.6210998,-1.76571499 67.5465342,1.05058165 C92.4719685,3.8668783 58.1171911,-2.5961653 49.5716499,27.3088291 C45.9128772,40.1126497 50.2525733,37.0956468 57.1903023,42.5036084 C59.4792141,44.2878157 67.5103988,50.0176866 77.2457031,57.2905766 C71.4143155,62.9019825 66.2337717,67.8661661 62.2824054,71.6211067 Z M73.4870997,83.4678852 C87.4278174,97.7290403 103.323635,112.360587 109.285731,114.539289 C119.139459,118.140092 123.820369,111.571999 123.820368,100.570289 C123.820367,94.7414103 107.064445,80.3074425 90.2759123,67.2185217 C83.6390655,73.6178 77.7700759,79.2918373 73.4870997,83.4678852 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/unlocked-padlock": {
"title": "$:/core/images/unlocked-padlock",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-unlocked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M48.6266053,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L30.136303,64 C19.6806213,51.3490406 2.77158986,28.2115132 25.8366966,8.85759246 C50.4723026,-11.8141335 71.6711028,13.2108337 81.613302,25.0594855 C91.5555012,36.9081373 78.9368488,47.4964439 69.1559674,34.9513593 C59.375086,22.4062748 47.9893192,10.8049522 35.9485154,20.9083862 C23.9077117,31.0118202 34.192312,43.2685325 44.7624679,55.8655518 C47.229397,58.805523 48.403443,61.5979188 48.6266053,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/video": {
"title": "$:/core/images/video",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-video tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,12 C29.0909091,12 8.72727273,14.9166667 5.81818182,17.8333333 C2.90909091,20.75 1.93784382e-15,41.1666667 0,64.5 C1.93784382e-15,87.8333333 2.90909091,108.25 5.81818182,111.166667 C8.72727273,114.083333 29.0909091,117 64,117 C98.9090909,117 119.272727,114.083333 122.181818,111.166667 C125.090909,108.25 128,87.8333333 128,64.5 C128,41.1666667 125.090909,20.75 122.181818,17.8333333 C119.272727,14.9166667 98.9090909,12 64,12 Z M54.9161194,44.6182253 C51.102648,42.0759111 48.0112186,43.7391738 48.0112186,48.3159447 L48.0112186,79.6840553 C48.0112186,84.2685636 51.109784,85.9193316 54.9161194,83.3817747 L77.0838806,68.6032672 C80.897352,66.0609529 80.890216,61.9342897 77.0838806,59.3967328 L54.9161194,44.6182253 Z\"></path>\n </g>\n</svg>"
},
"$:/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": "Cancel editing this tiddler"
},
"$:/language/Buttons/Clone/Caption": {
"title": "$:/language/Buttons/Clone/Caption",
"text": "clone"
},
"$:/language/Buttons/Clone/Hint": {
"title": "$:/language/Buttons/Clone/Hint",
"text": "Clone this tiddler"
},
"$:/language/Buttons/Close/Caption": {
"title": "$:/language/Buttons/Close/Caption",
"text": "close"
},
"$:/language/Buttons/Close/Hint": {
"title": "$:/language/Buttons/Close/Hint",
"text": "Close this tiddler"
},
"$:/language/Buttons/CloseAll/Caption": {
"title": "$:/language/Buttons/CloseAll/Caption",
"text": "close all"
},
"$:/language/Buttons/CloseAll/Hint": {
"title": "$:/language/Buttons/CloseAll/Hint",
"text": "Close all tiddlers"
},
"$:/language/Buttons/CloseOthers/Caption": {
"title": "$:/language/Buttons/CloseOthers/Caption",
"text": "close others"
},
"$:/language/Buttons/CloseOthers/Hint": {
"title": "$:/language/Buttons/CloseOthers/Hint",
"text": "Close other tiddlers"
},
"$:/language/Buttons/ControlPanel/Caption": {
"title": "$:/language/Buttons/ControlPanel/Caption",
"text": "control panel"
},
"$:/language/Buttons/ControlPanel/Hint": {
"title": "$:/language/Buttons/ControlPanel/Hint",
"text": "Open control panel"
},
"$:/language/Buttons/Delete/Caption": {
"title": "$:/language/Buttons/Delete/Caption",
"text": "delete"
},
"$:/language/Buttons/Delete/Hint": {
"title": "$:/language/Buttons/Delete/Hint",
"text": "Delete this tiddler"
},
"$:/language/Buttons/Edit/Caption": {
"title": "$:/language/Buttons/Edit/Caption",
"text": "edit"
},
"$:/language/Buttons/Edit/Hint": {
"title": "$:/language/Buttons/Edit/Hint",
"text": "Edit this tiddler"
},
"$:/language/Buttons/Encryption/Caption": {
"title": "$:/language/Buttons/Encryption/Caption",
"text": "encryption"
},
"$:/language/Buttons/Encryption/Hint": {
"title": "$:/language/Buttons/Encryption/Hint",
"text": "Set or clear a password for saving this wiki"
},
"$:/language/Buttons/Encryption/ClearPassword/Caption": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
"text": "clear password"
},
"$:/language/Buttons/Encryption/ClearPassword/Hint": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
"text": "Clear the password and save this wiki without encryption"
},
"$:/language/Buttons/Encryption/SetPassword/Caption": {
"title": "$:/language/Buttons/Encryption/SetPassword/Caption",
"text": "set password"
},
"$:/language/Buttons/Encryption/SetPassword/Hint": {
"title": "$:/language/Buttons/Encryption/SetPassword/Hint",
"text": "Set a password for saving this wiki with encryption"
},
"$:/language/Buttons/ExportPage/Caption": {
"title": "$:/language/Buttons/ExportPage/Caption",
"text": "export all"
},
"$:/language/Buttons/ExportPage/Hint": {
"title": "$:/language/Buttons/ExportPage/Hint",
"text": "Export all tiddlers"
},
"$:/language/Buttons/ExportTiddler/Caption": {
"title": "$:/language/Buttons/ExportTiddler/Caption",
"text": "export tiddler"
},
"$:/language/Buttons/ExportTiddler/Hint": {
"title": "$:/language/Buttons/ExportTiddler/Hint",
"text": "Export tiddler"
},
"$:/language/Buttons/ExportTiddlers/Caption": {
"title": "$:/language/Buttons/ExportTiddlers/Caption",
"text": "export tiddlers"
},
"$:/language/Buttons/ExportTiddlers/Hint": {
"title": "$:/language/Buttons/ExportTiddlers/Hint",
"text": "Export tiddlers"
},
"$:/language/Buttons/FullScreen/Caption": {
"title": "$:/language/Buttons/FullScreen/Caption",
"text": "full-screen"
},
"$:/language/Buttons/FullScreen/Hint": {
"title": "$:/language/Buttons/FullScreen/Hint",
"text": "Enter or leave full-screen mode"
},
"$:/language/Buttons/Import/Caption": {
"title": "$:/language/Buttons/Import/Caption",
"text": "import"
},
"$:/language/Buttons/Import/Hint": {
"title": "$:/language/Buttons/Import/Hint",
"text": "Import files"
},
"$:/language/Buttons/Info/Caption": {
"title": "$:/language/Buttons/Info/Caption",
"text": "info"
},
"$:/language/Buttons/Info/Hint": {
"title": "$:/language/Buttons/Info/Hint",
"text": "Show information for this tiddler"
},
"$:/language/Buttons/Home/Caption": {
"title": "$:/language/Buttons/Home/Caption",
"text": "home"
},
"$:/language/Buttons/Home/Hint": {
"title": "$:/language/Buttons/Home/Hint",
"text": "Open the default tiddlers"
},
"$:/language/Buttons/Language/Caption": {
"title": "$:/language/Buttons/Language/Caption",
"text": "language"
},
"$:/language/Buttons/Language/Hint": {
"title": "$:/language/Buttons/Language/Hint",
"text": "Choose the user interface language"
},
"$:/language/Buttons/More/Caption": {
"title": "$:/language/Buttons/More/Caption",
"text": "more"
},
"$:/language/Buttons/More/Hint": {
"title": "$:/language/Buttons/More/Hint",
"text": "More actions"
},
"$:/language/Buttons/NewHere/Caption": {
"title": "$:/language/Buttons/NewHere/Caption",
"text": "new here"
},
"$:/language/Buttons/NewHere/Hint": {
"title": "$:/language/Buttons/NewHere/Hint",
"text": "Create a new tiddler tagged with this one"
},
"$:/language/Buttons/NewJournal/Caption": {
"title": "$:/language/Buttons/NewJournal/Caption",
"text": "new journal"
},
"$:/language/Buttons/NewJournal/Hint": {
"title": "$:/language/Buttons/NewJournal/Hint",
"text": "Create a new journal tiddler"
},
"$:/language/Buttons/NewJournalHere/Caption": {
"title": "$:/language/Buttons/NewJournalHere/Caption",
"text": "new journal here"
},
"$:/language/Buttons/NewJournalHere/Hint": {
"title": "$:/language/Buttons/NewJournalHere/Hint",
"text": "Create a new journal tiddler tagged with this one"
},
"$:/language/Buttons/NewTiddler/Caption": {
"title": "$:/language/Buttons/NewTiddler/Caption",
"text": "new tiddler"
},
"$:/language/Buttons/NewTiddler/Hint": {
"title": "$:/language/Buttons/NewTiddler/Hint",
"text": "Create a new tiddler"
},
"$:/language/Buttons/Permalink/Caption": {
"title": "$:/language/Buttons/Permalink/Caption",
"text": "permalink"
},
"$:/language/Buttons/Permalink/Hint": {
"title": "$:/language/Buttons/Permalink/Hint",
"text": "Set browser address bar to a direct link to this tiddler"
},
"$:/language/Buttons/Permaview/Caption": {
"title": "$:/language/Buttons/Permaview/Caption",
"text": "permaview"
},
"$:/language/Buttons/Permaview/Hint": {
"title": "$:/language/Buttons/Permaview/Hint",
"text": "Set browser address bar to a direct link to all the tiddlers in this story"
},
"$:/language/Buttons/Refresh/Caption": {
"title": "$:/language/Buttons/Refresh/Caption",
"text": "refresh"
},
"$:/language/Buttons/Refresh/Hint": {
"title": "$:/language/Buttons/Refresh/Hint",
"text": "Perform a full refresh of the wiki"
},
"$:/language/Buttons/Save/Caption": {
"title": "$:/language/Buttons/Save/Caption",
"text": "save"
},
"$:/language/Buttons/Save/Hint": {
"title": "$:/language/Buttons/Save/Hint",
"text": "Save this tiddler"
},
"$:/language/Buttons/SaveWiki/Caption": {
"title": "$:/language/Buttons/SaveWiki/Caption",
"text": "save changes"
},
"$:/language/Buttons/SaveWiki/Hint": {
"title": "$:/language/Buttons/SaveWiki/Hint",
"text": "Save changes"
},
"$:/language/Buttons/StoryView/Caption": {
"title": "$:/language/Buttons/StoryView/Caption",
"text": "storyview"
},
"$:/language/Buttons/StoryView/Hint": {
"title": "$:/language/Buttons/StoryView/Hint",
"text": "Choose the story visualisation"
},
"$:/language/Buttons/HideSideBar/Caption": {
"title": "$:/language/Buttons/HideSideBar/Caption",
"text": "hide sidebar"
},
"$:/language/Buttons/HideSideBar/Hint": {
"title": "$:/language/Buttons/HideSideBar/Hint",
"text": "Hide sidebar"
},
"$:/language/Buttons/ShowSideBar/Caption": {
"title": "$:/language/Buttons/ShowSideBar/Caption",
"text": "show sidebar"
},
"$:/language/Buttons/ShowSideBar/Hint": {
"title": "$:/language/Buttons/ShowSideBar/Hint",
"text": "Show sidebar"
},
"$:/language/Buttons/TagManager/Caption": {
"title": "$:/language/Buttons/TagManager/Caption",
"text": "tag manager"
},
"$:/language/Buttons/TagManager/Hint": {
"title": "$:/language/Buttons/TagManager/Hint",
"text": "Open tag manager"
},
"$:/language/Buttons/Theme/Caption": {
"title": "$:/language/Buttons/Theme/Caption",
"text": "theme"
},
"$:/language/Buttons/Theme/Hint": {
"title": "$:/language/Buttons/Theme/Hint",
"text": "Choose the display theme"
},
"$:/language/ControlPanel/Advanced/Caption": {
"title": "$:/language/ControlPanel/Advanced/Caption",
"text": "Advanced"
},
"$:/language/ControlPanel/Advanced/Hint": {
"title": "$:/language/ControlPanel/Advanced/Hint",
"text": "Internal information about this TiddlyWiki"
},
"$:/language/ControlPanel/Appearance/Caption": {
"title": "$:/language/ControlPanel/Appearance/Caption",
"text": "Appearance"
},
"$:/language/ControlPanel/Appearance/Hint": {
"title": "$:/language/ControlPanel/Appearance/Hint",
"text": "Ways to customise the appearance of your TiddlyWiki."
},
"$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
"title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
"text": "Animation duration:"
},
"$:/language/ControlPanel/Basics/Caption": {
"title": "$:/language/ControlPanel/Basics/Caption",
"text": "Basics"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
"text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
"text": "Default tiddlers:"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
"text": "Choose which tiddlers are displayed at startup:"
},
"$:/language/ControlPanel/Basics/Language/Prompt": {
"title": "$:/language/ControlPanel/Basics/Language/Prompt",
"text": "Hello! Current language:"
},
"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
"text": "Title of new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
"text": "Tags for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
"text": "Number of overridden shadow tiddlers:"
},
"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
"text": "Number of shadow tiddlers:"
},
"$:/language/ControlPanel/Basics/Subtitle/Prompt": {
"title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
"text": "Subtitle:"
},
"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
"text": "Number of system tiddlers:"
},
"$:/language/ControlPanel/Basics/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tags/Prompt",
"text": "Number of tags:"
},
"$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
"text": "Number of tiddlers:"
},
"$:/language/ControlPanel/Basics/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/Title/Prompt",
"text": "Title of this ~TiddlyWiki:"
},
"$:/language/ControlPanel/Basics/Username/Prompt": {
"title": "$:/language/ControlPanel/Basics/Username/Prompt",
"text": "Username for signing edits:"
},
"$:/language/ControlPanel/Basics/Version/Prompt": {
"title": "$:/language/ControlPanel/Basics/Version/Prompt",
"text": "~TiddlyWiki version:"
},
"$:/language/ControlPanel/EditorTypes/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Caption",
"text": "Editor Types"
},
"$:/language/ControlPanel/EditorTypes/Editor/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
"text": "Editor"
},
"$:/language/ControlPanel/EditorTypes/Hint": {
"title": "$:/language/ControlPanel/EditorTypes/Hint",
"text": "These tiddlers determine which editor is used to edit specific tiddler types."
},
"$:/language/ControlPanel/EditorTypes/Type/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
"text": "Type"
},
"$:/language/ControlPanel/Info/Caption": {
"title": "$:/language/ControlPanel/Info/Caption",
"text": "Info"
},
"$:/language/ControlPanel/Info/Hint": {
"title": "$:/language/ControlPanel/Info/Hint",
"text": "Information about this TiddlyWiki"
},
"$:/language/ControlPanel/LoadedModules/Caption": {
"title": "$:/language/ControlPanel/LoadedModules/Caption",
"text": "Loaded Modules"
},
"$:/language/ControlPanel/LoadedModules/Hint": {
"title": "$:/language/ControlPanel/LoadedModules/Hint",
"text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
},
"$:/language/ControlPanel/Palette/Caption": {
"title": "$:/language/ControlPanel/Palette/Caption",
"text": "Palette"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
"text": "clone"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
"text": "It is recommended that you clone this shadow palette before editing it"
},
"$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
"text": "This shadow palette has been modified"
},
"$:/language/ControlPanel/Palette/Editor/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt",
"text": "Editing"
},
"$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
"text": "reset"
},
"$:/language/ControlPanel/Palette/HideEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
"text": "hide editor"
},
"$:/language/ControlPanel/Palette/Prompt": {
"title": "$:/language/ControlPanel/Palette/Prompt",
"text": "Current palette:"
},
"$:/language/ControlPanel/Palette/ShowEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
"text": "show editor"
},
"$:/language/ControlPanel/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Disable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Disable/Caption",
"text": "disable"
},
"$:/language/ControlPanel/Plugins/Disable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Disable/Hint",
"text": "Disable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Disabled/Status": {
"title": "$:/language/ControlPanel/Plugins/Disabled/Status",
"text": "(disabled)"
},
"$:/language/ControlPanel/Plugins/Empty/Hint": {
"title": "$:/language/ControlPanel/Plugins/Empty/Hint",
"text": "None"
},
"$:/language/ControlPanel/Plugins/Enable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Enable/Caption",
"text": "enable"
},
"$:/language/ControlPanel/Plugins/Enable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Enable/Hint",
"text": "Enable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Language/Prompt": {
"title": "$:/language/ControlPanel/Plugins/Language/Prompt",
"text": "Languages"
},
"$:/language/ControlPanel/Plugins/Plugin/Prompt": {
"title": "$:/language/ControlPanel/Plugins/Plugin/Prompt",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Theme/Prompt": {
"title": "$:/language/ControlPanel/Plugins/Theme/Prompt",
"text": "Themes"
},
"$:/language/ControlPanel/Saving/Caption": {
"title": "$:/language/ControlPanel/Saving/Caption",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/Heading": {
"title": "$:/language/ControlPanel/Saving/Heading",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
"text": "Advanced Settings"
},
"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
"text": "Backup Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
"text": "Backups"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Description": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
"text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
"text": "Upload Filename"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
"text": "~TiddlySpot"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
"text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address//"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Password": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
"text": "Password"
},
"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
"text": "Server URL"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
"text": "Upload Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
"text": "Wiki Name"
},
"$:/language/ControlPanel/Settings/AutoSave/Caption": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
"text": "Autosave"
},
"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
"text": "Do not save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
"text": "Save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
"text": "Automatically save changes during editing"
},
"$:/language/ControlPanel/Settings/Caption": {
"title": "$:/language/ControlPanel/Settings/Caption",
"text": "Settings"
},
"$:/language/ControlPanel/Settings/Hint": {
"title": "$:/language/ControlPanel/Settings/Hint",
"text": "These settings let you customise the behaviour of TiddlyWiki."
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
"text": "Navigation Address Bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
"text": "Behaviour of the browser address bar when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
"text": "Do not update the address bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
"text": "Include the target tiddler"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
"text": "Include the target tiddler and the current story sequence"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
"text": "Navigation History"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
"text": "Update browser history when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
"text": "Do not update history"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
"text": "Update history"
},
"$:/language/ControlPanel/Settings/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/StoryView/Caption": {
"title": "$:/language/ControlPanel/StoryView/Caption",
"text": "Story View"
},
"$:/language/ControlPanel/StoryView/Prompt": {
"title": "$:/language/ControlPanel/StoryView/Prompt",
"text": "Current view:"
},
"$:/language/ControlPanel/Theme/Caption": {
"title": "$:/language/ControlPanel/Theme/Caption",
"text": "Theme"
},
"$:/language/ControlPanel/Theme/Prompt": {
"title": "$:/language/ControlPanel/Theme/Prompt",
"text": "Current theme:"
},
"$:/language/ControlPanel/TiddlerFields/Caption": {
"title": "$:/language/ControlPanel/TiddlerFields/Caption",
"text": "Tiddler Fields"
},
"$:/language/ControlPanel/TiddlerFields/Hint": {
"title": "$:/language/ControlPanel/TiddlerFields/Hint",
"text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
},
"$:/language/ControlPanel/Toolbars/Caption": {
"title": "$:/language/ControlPanel/Toolbars/Caption",
"text": "Toolbars"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
"text": "Edit Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in edit mode"
},
"$:/language/ControlPanel/Toolbars/Hint": {
"title": "$:/language/ControlPanel/Toolbars/Hint",
"text": "Select which toolbar buttons are displayed"
},
"$:/language/ControlPanel/Toolbars/PageControls/Caption": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
"text": "Page Toolbar"
},
"$:/language/ControlPanel/Toolbars/PageControls/Hint": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
"text": "Choose which buttons are displayed on the main page toolbar "
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
"text": "View Toolbar"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in view mode"
},
"$:/language/ControlPanel/Tools/Download/Full/Caption": {
"title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
"text": "Download full wiki"
},
"$:/language/Date/DaySuffix/1": {
"title": "$:/language/Date/DaySuffix/1",
"text": "st"
},
"$:/language/Date/DaySuffix/2": {
"title": "$:/language/Date/DaySuffix/2",
"text": "nd"
},
"$:/language/Date/DaySuffix/3": {
"title": "$:/language/Date/DaySuffix/3",
"text": "rd"
},
"$:/language/Date/DaySuffix/4": {
"title": "$:/language/Date/DaySuffix/4",
"text": "th"
},
"$:/language/Date/DaySuffix/5": {
"title": "$:/language/Date/DaySuffix/5",
"text": "th"
},
"$:/language/Date/DaySuffix/6": {
"title": "$:/language/Date/DaySuffix/6",
"text": "th"
},
"$:/language/Date/DaySuffix/7": {
"title": "$:/language/Date/DaySuffix/7",
"text": "th"
},
"$:/language/Date/DaySuffix/8": {
"title": "$:/language/Date/DaySuffix/8",
"text": "th"
},
"$:/language/Date/DaySuffix/9": {
"title": "$:/language/Date/DaySuffix/9",
"text": "th"
},
"$:/language/Date/DaySuffix/10": {
"title": "$:/language/Date/DaySuffix/10",
"text": "th"
},
"$:/language/Date/DaySuffix/11": {
"title": "$:/language/Date/DaySuffix/11",
"text": "th"
},
"$:/language/Date/DaySuffix/12": {
"title": "$:/language/Date/DaySuffix/12",
"text": "th"
},
"$:/language/Date/DaySuffix/13": {
"title": "$:/language/Date/DaySuffix/13",
"text": "th"
},
"$:/language/Date/DaySuffix/14": {
"title": "$:/language/Date/DaySuffix/14",
"text": "th"
},
"$:/language/Date/DaySuffix/15": {
"title": "$:/language/Date/DaySuffix/15",
"text": "th"
},
"$:/language/Date/DaySuffix/16": {
"title": "$:/language/Date/DaySuffix/16",
"text": "th"
},
"$:/language/Date/DaySuffix/17": {
"title": "$:/language/Date/DaySuffix/17",
"text": "th"
},
"$:/language/Date/DaySuffix/18": {
"title": "$:/language/Date/DaySuffix/18",
"text": "th"
},
"$:/language/Date/DaySuffix/19": {
"title": "$:/language/Date/DaySuffix/19",
"text": "th"
},
"$:/language/Date/DaySuffix/20": {
"title": "$:/language/Date/DaySuffix/20",
"text": "th"
},
"$:/language/Date/DaySuffix/21": {
"title": "$:/language/Date/DaySuffix/21",
"text": "st"
},
"$:/language/Date/DaySuffix/22": {
"title": "$:/language/Date/DaySuffix/22",
"text": "nd"
},
"$:/language/Date/DaySuffix/23": {
"title": "$:/language/Date/DaySuffix/23",
"text": "rd"
},
"$:/language/Date/DaySuffix/24": {
"title": "$:/language/Date/DaySuffix/24",
"text": "th"
},
"$:/language/Date/DaySuffix/25": {
"title": "$:/language/Date/DaySuffix/25",
"text": "th"
},
"$:/language/Date/DaySuffix/26": {
"title": "$:/language/Date/DaySuffix/26",
"text": "th"
},
"$:/language/Date/DaySuffix/27": {
"title": "$:/language/Date/DaySuffix/27",
"text": "th"
},
"$:/language/Date/DaySuffix/28": {
"title": "$:/language/Date/DaySuffix/28",
"text": "th"
},
"$:/language/Date/DaySuffix/29": {
"title": "$:/language/Date/DaySuffix/29",
"text": "th"
},
"$:/language/Date/DaySuffix/30": {
"title": "$:/language/Date/DaySuffix/30",
"text": "th"
},
"$:/language/Date/DaySuffix/31": {
"title": "$:/language/Date/DaySuffix/31",
"text": "st"
},
"$:/language/Date/Long/Day/0": {
"title": "$:/language/Date/Long/Day/0",
"text": "Sunday"
},
"$:/language/Date/Long/Day/1": {
"title": "$:/language/Date/Long/Day/1",
"text": "Monday"
},
"$:/language/Date/Long/Day/2": {
"title": "$:/language/Date/Long/Day/2",
"text": "Tuesday"
},
"$:/language/Date/Long/Day/3": {
"title": "$:/language/Date/Long/Day/3",
"text": "Wednesday"
},
"$:/language/Date/Long/Day/4": {
"title": "$:/language/Date/Long/Day/4",
"text": "Thursday"
},
"$:/language/Date/Long/Day/5": {
"title": "$:/language/Date/Long/Day/5",
"text": "Friday"
},
"$:/language/Date/Long/Day/6": {
"title": "$:/language/Date/Long/Day/6",
"text": "Saturday"
},
"$:/language/Date/Long/Month/1": {
"title": "$:/language/Date/Long/Month/1",
"text": "January"
},
"$:/language/Date/Long/Month/2": {
"title": "$:/language/Date/Long/Month/2",
"text": "February"
},
"$:/language/Date/Long/Month/3": {
"title": "$:/language/Date/Long/Month/3",
"text": "March"
},
"$:/language/Date/Long/Month/4": {
"title": "$:/language/Date/Long/Month/4",
"text": "April"
},
"$:/language/Date/Long/Month/5": {
"title": "$:/language/Date/Long/Month/5",
"text": "May"
},
"$:/language/Date/Long/Month/6": {
"title": "$:/language/Date/Long/Month/6",
"text": "June"
},
"$:/language/Date/Long/Month/7": {
"title": "$:/language/Date/Long/Month/7",
"text": "July"
},
"$:/language/Date/Long/Month/8": {
"title": "$:/language/Date/Long/Month/8",
"text": "August"
},
"$:/language/Date/Long/Month/9": {
"title": "$:/language/Date/Long/Month/9",
"text": "September"
},
"$:/language/Date/Long/Month/10": {
"title": "$:/language/Date/Long/Month/10",
"text": "October"
},
"$:/language/Date/Long/Month/11": {
"title": "$:/language/Date/Long/Month/11",
"text": "November"
},
"$:/language/Date/Long/Month/12": {
"title": "$:/language/Date/Long/Month/12",
"text": "December"
},
"$:/language/Date/Period/am": {
"title": "$:/language/Date/Period/am",
"text": "am"
},
"$:/language/Date/Period/pm": {
"title": "$:/language/Date/Period/pm",
"text": "pm"
},
"$:/language/Date/Short/Day/0": {
"title": "$:/language/Date/Short/Day/0",
"text": "Sun"
},
"$:/language/Date/Short/Day/1": {
"title": "$:/language/Date/Short/Day/1",
"text": "Mon"
},
"$:/language/Date/Short/Day/2": {
"title": "$:/language/Date/Short/Day/2",
"text": "Tue"
},
"$:/language/Date/Short/Day/3": {
"title": "$:/language/Date/Short/Day/3",
"text": "Wed"
},
"$:/language/Date/Short/Day/4": {
"title": "$:/language/Date/Short/Day/4",
"text": "Thu"
},
"$:/language/Date/Short/Day/5": {
"title": "$:/language/Date/Short/Day/5",
"text": "Fri"
},
"$:/language/Date/Short/Day/6": {
"title": "$:/language/Date/Short/Day/6",
"text": "Sat"
},
"$:/language/Date/Short/Month/1": {
"title": "$:/language/Date/Short/Month/1",
"text": "Jan"
},
"$:/language/Date/Short/Month/2": {
"title": "$:/language/Date/Short/Month/2",
"text": "Feb"
},
"$:/language/Date/Short/Month/3": {
"title": "$:/language/Date/Short/Month/3",
"text": "Mar"
},
"$:/language/Date/Short/Month/4": {
"title": "$:/language/Date/Short/Month/4",
"text": "Apr"
},
"$:/language/Date/Short/Month/5": {
"title": "$:/language/Date/Short/Month/5",
"text": "May"
},
"$:/language/Date/Short/Month/6": {
"title": "$:/language/Date/Short/Month/6",
"text": "Jun"
},
"$:/language/Date/Short/Month/7": {
"title": "$:/language/Date/Short/Month/7",
"text": "Jul"
},
"$:/language/Date/Short/Month/8": {
"title": "$:/language/Date/Short/Month/8",
"text": "Aug"
},
"$:/language/Date/Short/Month/9": {
"title": "$:/language/Date/Short/Month/9",
"text": "Sep"
},
"$:/language/Date/Short/Month/10": {
"title": "$:/language/Date/Short/Month/10",
"text": "Oct"
},
"$:/language/Date/Short/Month/11": {
"title": "$:/language/Date/Short/Month/11",
"text": "Nov"
},
"$:/language/Date/Short/Month/12": {
"title": "$:/language/Date/Short/Month/12",
"text": "Dec"
},
"$:/language/RelativeDate/Future/Days": {
"title": "$:/language/RelativeDate/Future/Days",
"text": "<<period>> days from now"
},
"$:/language/RelativeDate/Future/Hours": {
"title": "$:/language/RelativeDate/Future/Hours",
"text": "<<period>> hours from now"
},
"$:/language/RelativeDate/Future/Minutes": {
"title": "$:/language/RelativeDate/Future/Minutes",
"text": "<<period>> minutes from now"
},
"$:/language/RelativeDate/Future/Months": {
"title": "$:/language/RelativeDate/Future/Months",
"text": "<<period>> months from now"
},
"$:/language/RelativeDate/Future/Second": {
"title": "$:/language/RelativeDate/Future/Second",
"text": "1 second from now"
},
"$:/language/RelativeDate/Future/Seconds": {
"title": "$:/language/RelativeDate/Future/Seconds",
"text": "<<period>> seconds from now"
},
"$:/language/RelativeDate/Future/Years": {
"title": "$:/language/RelativeDate/Future/Years",
"text": "<<period>> years from now"
},
"$:/language/RelativeDate/Past/Days": {
"title": "$:/language/RelativeDate/Past/Days",
"text": "<<period>> days ago"
},
"$:/language/RelativeDate/Past/Hours": {
"title": "$:/language/RelativeDate/Past/Hours",
"text": "<<period>> hours ago"
},
"$:/language/RelativeDate/Past/Minutes": {
"title": "$:/language/RelativeDate/Past/Minutes",
"text": "<<period>> minutes ago"
},
"$:/language/RelativeDate/Past/Months": {
"title": "$:/language/RelativeDate/Past/Months",
"text": "<<period>> months ago"
},
"$:/language/RelativeDate/Past/Second": {
"title": "$:/language/RelativeDate/Past/Second",
"text": "1 second ago"
},
"$:/language/RelativeDate/Past/Seconds": {
"title": "$:/language/RelativeDate/Past/Seconds",
"text": "<<period>> seconds ago"
},
"$:/language/RelativeDate/Past/Years": {
"title": "$:/language/RelativeDate/Past/Years",
"text": "<<period>> years ago"
},
"$:/language/Docs/ModuleTypes/animation": {
"title": "$:/language/Docs/ModuleTypes/animation",
"text": "Animations that may be used with the RevealWidget."
},
"$:/language/Docs/ModuleTypes/command": {
"title": "$:/language/Docs/ModuleTypes/command",
"text": "Commands that can be executed under Node.js."
},
"$:/language/Docs/ModuleTypes/config": {
"title": "$:/language/Docs/ModuleTypes/config",
"text": "Data to be inserted into `$tw.config`."
},
"$:/language/Docs/ModuleTypes/filteroperator": {
"title": "$:/language/Docs/ModuleTypes/filteroperator",
"text": "Individual filter operator methods."
},
"$:/language/Docs/ModuleTypes/global": {
"title": "$:/language/Docs/ModuleTypes/global",
"text": "Global data to be inserted into `$tw`."
},
"$:/language/Docs/ModuleTypes/isfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/isfilteroperator",
"text": "Operands for the ''is'' filter operator."
},
"$:/language/Docs/ModuleTypes/macro": {
"title": "$:/language/Docs/ModuleTypes/macro",
"text": "JavaScript macro definitions."
},
"$:/language/Docs/ModuleTypes/parser": {
"title": "$:/language/Docs/ModuleTypes/parser",
"text": "Parsers for different content types."
},
"$:/language/Docs/ModuleTypes/saver": {
"title": "$:/language/Docs/ModuleTypes/saver",
"text": "Savers handle different methods for saving files from the browser."
},
"$:/language/Docs/ModuleTypes/startup": {
"title": "$:/language/Docs/ModuleTypes/startup",
"text": "Startup functions."
},
"$:/language/Docs/ModuleTypes/storyview": {
"title": "$:/language/Docs/ModuleTypes/storyview",
"text": "Story views customise the animation and behaviour of list widgets."
},
"$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
"title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
"text": "Converts different content types into tiddlers."
},
"$:/language/Docs/ModuleTypes/tiddlerfield": {
"title": "$:/language/Docs/ModuleTypes/tiddlerfield",
"text": "Defines the behaviour of an individual tiddler field."
},
"$:/language/Docs/ModuleTypes/tiddlermethod": {
"title": "$:/language/Docs/ModuleTypes/tiddlermethod",
"text": "Adds methods to the `$tw.Tiddler` prototype."
},
"$:/language/Docs/ModuleTypes/upgrader": {
"title": "$:/language/Docs/ModuleTypes/upgrader",
"text": "Applies upgrade processing to tiddlers during an upgrade/import."
},
"$:/language/Docs/ModuleTypes/utils": {
"title": "$:/language/Docs/ModuleTypes/utils",
"text": "Adds methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/utils-node": {
"title": "$:/language/Docs/ModuleTypes/utils-node",
"text": "Adds Node.js-specific methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/widget": {
"title": "$:/language/Docs/ModuleTypes/widget",
"text": "Widgets encapsulate DOM rendering and refreshing."
},
"$:/language/Docs/ModuleTypes/wikimethod": {
"title": "$:/language/Docs/ModuleTypes/wikimethod",
"text": "Adds methods to `$tw.Wiki`."
},
"$:/language/Docs/ModuleTypes/wikirule": {
"title": "$:/language/Docs/ModuleTypes/wikirule",
"text": "Individual parser rules for the main WikiText parser."
},
"$:/language/Docs/PaletteColours/alert-background": {
"title": "$:/language/Docs/PaletteColours/alert-background",
"text": "Alert background"
},
"$:/language/Docs/PaletteColours/alert-border": {
"title": "$:/language/Docs/PaletteColours/alert-border",
"text": "Alert border"
},
"$:/language/Docs/PaletteColours/alert-highlight": {
"title": "$:/language/Docs/PaletteColours/alert-highlight",
"text": "Alert highlight"
},
"$:/language/Docs/PaletteColours/alert-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
"text": "Alert muted foreground"
},
"$:/language/Docs/PaletteColours/background": {
"title": "$:/language/Docs/PaletteColours/background",
"text": "General background"
},
"$:/language/Docs/PaletteColours/blockquote-bar": {
"title": "$:/language/Docs/PaletteColours/blockquote-bar",
"text": "Blockquote bar"
},
"$:/language/Docs/PaletteColours/dirty-indicator": {
"title": "$:/language/Docs/PaletteColours/dirty-indicator",
"text": "Unsaved changes indicator"
},
"$:/language/Docs/PaletteColours/code-background": {
"title": "$:/language/Docs/PaletteColours/code-background",
"text": "Code background"
},
"$:/language/Docs/PaletteColours/code-border": {
"title": "$:/language/Docs/PaletteColours/code-border",
"text": "Code border"
},
"$:/language/Docs/PaletteColours/code-foreground": {
"title": "$:/language/Docs/PaletteColours/code-foreground",
"text": "Code foreground"
},
"$:/language/Docs/PaletteColours/download-background": {
"title": "$:/language/Docs/PaletteColours/download-background",
"text": "Download button background"
},
"$:/language/Docs/PaletteColours/download-foreground": {
"title": "$:/language/Docs/PaletteColours/download-foreground",
"text": "Download button foreground"
},
"$:/language/Docs/PaletteColours/dragger-background": {
"title": "$:/language/Docs/PaletteColours/dragger-background",
"text": "Dragger background"
},
"$:/language/Docs/PaletteColours/dragger-foreground": {
"title": "$:/language/Docs/PaletteColours/dragger-foreground",
"text": "Dragger foreground"
},
"$:/language/Docs/PaletteColours/dropdown-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-background",
"text": "Dropdown background"
},
"$:/language/Docs/PaletteColours/dropdown-border": {
"title": "$:/language/Docs/PaletteColours/dropdown-border",
"text": "Dropdown border"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
"text": "Dropdown tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
"text": "Dropdown tab background"
},
"$:/language/Docs/PaletteColours/dropzone-background": {
"title": "$:/language/Docs/PaletteColours/dropzone-background",
"text": "Dropzone background"
},
"$:/language/Docs/PaletteColours/external-link-background-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-background-hover",
"text": "External link background hover"
},
"$:/language/Docs/PaletteColours/external-link-background-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-background-visited",
"text": "External link background visited"
},
"$:/language/Docs/PaletteColours/external-link-background": {
"title": "$:/language/Docs/PaletteColours/external-link-background",
"text": "External link background"
},
"$:/language/Docs/PaletteColours/external-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
"text": "External link foreground hover"
},
"$:/language/Docs/PaletteColours/external-link-foreground-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
"text": "External link foreground visited"
},
"$:/language/Docs/PaletteColours/external-link-foreground": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground",
"text": "External link foreground"
},
"$:/language/Docs/PaletteColours/foreground": {
"title": "$:/language/Docs/PaletteColours/foreground",
"text": "General foreground"
},
"$:/language/Docs/PaletteColours/message-background": {
"title": "$:/language/Docs/PaletteColours/message-background",
"text": "Message box background"
},
"$:/language/Docs/PaletteColours/message-border": {
"title": "$:/language/Docs/PaletteColours/message-border",
"text": "Message box border"
},
"$:/language/Docs/PaletteColours/message-foreground": {
"title": "$:/language/Docs/PaletteColours/message-foreground",
"text": "Message box foreground"
},
"$:/language/Docs/PaletteColours/modal-backdrop": {
"title": "$:/language/Docs/PaletteColours/modal-backdrop",
"text": "Modal backdrop"
},
"$:/language/Docs/PaletteColours/modal-background": {
"title": "$:/language/Docs/PaletteColours/modal-background",
"text": "Modal background"
},
"$:/language/Docs/PaletteColours/modal-border": {
"title": "$:/language/Docs/PaletteColours/modal-border",
"text": "Modal border"
},
"$:/language/Docs/PaletteColours/modal-footer-background": {
"title": "$:/language/Docs/PaletteColours/modal-footer-background",
"text": "Modal footer background"
},
"$:/language/Docs/PaletteColours/modal-footer-border": {
"title": "$:/language/Docs/PaletteColours/modal-footer-border",
"text": "Modal footer border"
},
"$:/language/Docs/PaletteColours/modal-header-border": {
"title": "$:/language/Docs/PaletteColours/modal-header-border",
"text": "Modal header border"
},
"$:/language/Docs/PaletteColours/muted-foreground": {
"title": "$:/language/Docs/PaletteColours/muted-foreground",
"text": "General muted foreground"
},
"$:/language/Docs/PaletteColours/notification-background": {
"title": "$:/language/Docs/PaletteColours/notification-background",
"text": "Notification background"
},
"$:/language/Docs/PaletteColours/notification-border": {
"title": "$:/language/Docs/PaletteColours/notification-border",
"text": "Notification border"
},
"$:/language/Docs/PaletteColours/page-background": {
"title": "$:/language/Docs/PaletteColours/page-background",
"text": "Page background"
},
"$:/language/Docs/PaletteColours/pre-background": {
"title": "$:/language/Docs/PaletteColours/pre-background",
"text": "Preformatted code background"
},
"$:/language/Docs/PaletteColours/pre-border": {
"title": "$:/language/Docs/PaletteColours/pre-border",
"text": "Preformatted code border"
},
"$:/language/Docs/PaletteColours/primary": {
"title": "$:/language/Docs/PaletteColours/primary",
"text": "General primary"
},
"$:/language/Docs/PaletteColours/sidebar-button-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
"text": "Sidebar button foreground"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
"text": "Sidebar controls foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
"text": "Sidebar controls foreground"
},
"$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
"text": "Sidebar foreground shadow"
},
"$:/language/Docs/PaletteColours/sidebar-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground",
"text": "Sidebar foreground"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
"text": "Sidebar muted foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
"text": "Sidebar muted foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
"text": "Sidebar tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
"text": "Sidebar tab background"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
"text": "Sidebar tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
"text": "Sidebar tab border"
},
"$:/language/Docs/PaletteColours/sidebar-tab-divider": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
"text": "Sidebar tab divider"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
"text": "Sidebar tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
"text": "Sidebar tab foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
"text": "Sidebar tiddler link foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
"text": "Sidebar tiddler link foreground"
},
"$:/language/Docs/PaletteColours/static-alert-foreground": {
"title": "$:/language/Docs/PaletteColours/static-alert-foreground",
"text": "Static alert foreground"
},
"$:/language/Docs/PaletteColours/tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/tab-background-selected",
"text": "Tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-background": {
"title": "$:/language/Docs/PaletteColours/tab-background",
"text": "Tab background"
},
"$:/language/Docs/PaletteColours/tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/tab-border-selected",
"text": "Tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-border": {
"title": "$:/language/Docs/PaletteColours/tab-border",
"text": "Tab border"
},
"$:/language/Docs/PaletteColours/tab-divider": {
"title": "$:/language/Docs/PaletteColours/tab-divider",
"text": "Tab divider"
},
"$:/language/Docs/PaletteColours/tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
"text": "Tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-foreground": {
"title": "$:/language/Docs/PaletteColours/tab-foreground",
"text": "Tab foreground"
},
"$:/language/Docs/PaletteColours/table-border": {
"title": "$:/language/Docs/PaletteColours/table-border",
"text": "Table border"
},
"$:/language/Docs/PaletteColours/table-footer-background": {
"title": "$:/language/Docs/PaletteColours/table-footer-background",
"text": "Table footer background"
},
"$:/language/Docs/PaletteColours/table-header-background": {
"title": "$:/language/Docs/PaletteColours/table-header-background",
"text": "Table header background"
},
"$:/language/Docs/PaletteColours/tag-background": {
"title": "$:/language/Docs/PaletteColours/tag-background",
"text": "Tag background"
},
"$:/language/Docs/PaletteColours/tag-foreground": {
"title": "$:/language/Docs/PaletteColours/tag-foreground",
"text": "Tag foreground"
},
"$:/language/Docs/PaletteColours/tiddler-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-background",
"text": "Tiddler background"
},
"$:/language/Docs/PaletteColours/tiddler-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-border",
"text": "Tiddler border"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
"text": "Tiddler controls foreground hover"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
"text": "Tiddler controls foreground for selected controls"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
"text": "Tiddler controls foreground"
},
"$:/language/Docs/PaletteColours/tiddler-editor-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
"text": "Tiddler editor background"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
"text": "Tiddler editor border image"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
"text": "Tiddler editor border"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
"text": "Tiddler editor background for even fields"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
"text": "Tiddler editor background for odd fields"
},
"$:/language/Docs/PaletteColours/tiddler-info-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-background",
"text": "Tiddler info panel background"
},
"$:/language/Docs/PaletteColours/tiddler-info-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-border",
"text": "Tiddler info panel border"
},
"$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
"text": "Tiddler info panel tab background"
},
"$:/language/Docs/PaletteColours/tiddler-link-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-background",
"text": "Tiddler link background"
},
"$:/language/Docs/PaletteColours/tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
"text": "Tiddler link foreground"
},
"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
"text": "Tiddler subtitle foreground"
},
"$:/language/Docs/PaletteColours/tiddler-title-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
"text": "Tiddler title foreground"
},
"$:/language/Docs/PaletteColours/toolbar-new-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-new-button",
"text": "Toolbar 'new tiddler' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-options-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-options-button",
"text": "Toolbar 'options' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-save-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-save-button",
"text": "Toolbar 'save' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-info-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-info-button",
"text": "Toolbar 'info' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-edit-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
"text": "Toolbar 'edit' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-close-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-close-button",
"text": "Toolbar 'close' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-delete-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
"text": "Toolbar 'delete' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-cancel-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
"text": "Toolbar 'cancel' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-done-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-done-button",
"text": "Toolbar 'done' button foreground"
},
"$:/language/Docs/PaletteColours/untagged-background": {
"title": "$:/language/Docs/PaletteColours/untagged-background",
"text": "Untagged pill background"
},
"$:/language/Docs/PaletteColours/very-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/very-muted-foreground",
"text": "Very muted foreground"
},
"$:/language/EditTemplate/Body/External/Hint": {
"title": "$:/language/EditTemplate/Body/External/Hint",
"text": "This is an external tiddler stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
},
"$:/language/EditTemplate/Body/Hint": {
"title": "$:/language/EditTemplate/Body/Hint",
"text": "Use [[wiki text|http://tiddlywiki.com/static/WikiText.html]] to add formatting, images, and dynamic features"
},
"$:/language/EditTemplate/Body/Placeholder": {
"title": "$:/language/EditTemplate/Body/Placeholder",
"text": "Type the text for this tiddler"
},
"$:/language/EditTemplate/Body/Preview/Button/Hide": {
"title": "$:/language/EditTemplate/Body/Preview/Button/Hide",
"text": "hide preview"
},
"$:/language/EditTemplate/Body/Preview/Button/Show": {
"title": "$:/language/EditTemplate/Body/Preview/Button/Show",
"text": "show preview"
},
"$:/language/EditTemplate/Field/Remove/Caption": {
"title": "$:/language/EditTemplate/Field/Remove/Caption",
"text": "remove field"
},
"$:/language/EditTemplate/Field/Remove/Hint": {
"title": "$:/language/EditTemplate/Field/Remove/Hint",
"text": "Remove field"
},
"$:/language/EditTemplate/Fields/Add/Button": {
"title": "$:/language/EditTemplate/Fields/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
"text": "field name"
},
"$:/language/EditTemplate/Fields/Add/Prompt": {
"title": "$:/language/EditTemplate/Fields/Add/Prompt",
"text": "Add a new field:"
},
"$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
"text": "field value"
},
"$:/language/EditTemplate/Shadow/Warning": {
"title": "$:/language/EditTemplate/Shadow/Warning",
"text": "This is a shadow tiddler. Any changes will override the default version"
},
"$:/language/EditTemplate/Shadow/OverriddenWarning": {
"title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
"text": "This is a modified shadow tiddler. You can revert to the default version by deleting this tiddler"
},
"$:/language/EditTemplate/Tags/Add/Button": {
"title": "$:/language/EditTemplate/Tags/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Tags/Add/Placeholder": {
"title": "$:/language/EditTemplate/Tags/Add/Placeholder",
"text": "tag name"
},
"$:/language/EditTemplate/Tags/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
"text": "tag list"
},
"$:/language/EditTemplate/Tags/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
"text": "Show tag list"
},
"$:/language/EditTemplate/Type/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Type/Dropdown/Caption",
"text": "content type list"
},
"$:/language/EditTemplate/Type/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Type/Dropdown/Hint",
"text": "Show content type list"
},
"$:/language/EditTemplate/Type/Delete/Caption": {
"title": "$:/language/EditTemplate/Type/Delete/Caption",
"text": "delete content type"
},
"$:/language/EditTemplate/Type/Delete/Hint": {
"title": "$:/language/EditTemplate/Type/Delete/Hint",
"text": "Delete content type"
},
"$:/language/EditTemplate/Type/Placeholder": {
"title": "$:/language/EditTemplate/Type/Placeholder",
"text": "content type"
},
"$:/language/EditTemplate/Type/Prompt": {
"title": "$:/language/EditTemplate/Type/Prompt",
"text": "Type:"
},
"$:/language/Exporters/StaticRiver": {
"title": "$:/language/Exporters/StaticRiver",
"text": "River of tiddlers as static HTML file"
},
"$:/language/Exporters/JsonFile": {
"title": "$:/language/Exporters/JsonFile",
"text": "JSON tiddlers file"
},
"$:/language/Exporters/CsvFile": {
"title": "$:/language/Exporters/CsvFile",
"text": "CSV tiddlers file"
},
"$:/language/Exporters/TidFile": {
"title": "$:/language/Exporters/TidFile",
"text": "Single tiddler \".tid\" file"
},
"$:/language/Docs/Fields/_canonical_uri": {
"title": "$:/language/Docs/Fields/_canonical_uri",
"text": "The full URI of an external image tiddler"
},
"$:/language/Docs/Fields/bag": {
"title": "$:/language/Docs/Fields/bag",
"text": "The name of the bag from which a tiddler came"
},
"$:/language/Docs/Fields/caption": {
"title": "$:/language/Docs/Fields/caption",
"text": "The text to be displayed on a tab or button"
},
"$:/language/Docs/Fields/color": {
"title": "$:/language/Docs/Fields/color",
"text": "The CSS color value associated with a tiddler"
},
"$:/language/Docs/Fields/component": {
"title": "$:/language/Docs/Fields/component",
"text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
},
"$:/language/Docs/Fields/current-tiddler": {
"title": "$:/language/Docs/Fields/current-tiddler",
"text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
},
"$:/language/Docs/Fields/created": {
"title": "$:/language/Docs/Fields/created",
"text": "The date a tiddler was created"
},
"$:/language/Docs/Fields/creator": {
"title": "$:/language/Docs/Fields/creator",
"text": "The name of the person who created a tiddler"
},
"$:/language/Docs/Fields/dependents": {
"title": "$:/language/Docs/Fields/dependents",
"text": "For a plugin, lists the dependent plugin titles"
},
"$:/language/Docs/Fields/description": {
"title": "$:/language/Docs/Fields/description",
"text": "The descriptive text for a plugin, or a modal dialogue"
},
"$:/language/Docs/Fields/draft.of": {
"title": "$:/language/Docs/Fields/draft.of",
"text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
},
"$:/language/Docs/Fields/draft.title": {
"title": "$:/language/Docs/Fields/draft.title",
"text": "For draft tiddlers, contains the proposed new title of the tiddler"
},
"$:/language/Docs/Fields/footer": {
"title": "$:/language/Docs/Fields/footer",
"text": "The footer text for a wizard"
},
"$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against": {
"title": "$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against",
"text": "A temporary storage field used in [[$:/core/templates/static.content]]"
},
"$:/language/Docs/Fields/icon": {
"title": "$:/language/Docs/Fields/icon",
"text": "The title of the tiddler containing the icon associated with a tiddler"
},
"$:/language/Docs/Fields/library": {
"title": "$:/language/Docs/Fields/library",
"text": "If set to \"yes\" indicates that a tiddler should be saved as a JavaScript library"
},
"$:/language/Docs/Fields/list": {
"title": "$:/language/Docs/Fields/list",
"text": "An ordered list of tiddler titles associated with a tiddler"
},
"$:/language/Docs/Fields/list-before": {
"title": "$:/language/Docs/Fields/list-before",
"text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
},
"$:/language/Docs/Fields/list-after": {
"title": "$:/language/Docs/Fields/list-after",
"text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles"
},
"$:/language/Docs/Fields/modified": {
"title": "$:/language/Docs/Fields/modified",
"text": "The date and time at which a tiddler was last modified"
},
"$:/language/Docs/Fields/modifier": {
"title": "$:/language/Docs/Fields/modifier",
"text": "The tiddler title associated with the person who last modified a tiddler"
},
"$:/language/Docs/Fields/name": {
"title": "$:/language/Docs/Fields/name",
"text": "The human readable name associated with a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-priority": {
"title": "$:/language/Docs/Fields/plugin-priority",
"text": "A numerical value indicating the priority of a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-type": {
"title": "$:/language/Docs/Fields/plugin-type",
"text": "The type of plugin in a plugin tiddler"
},
"$:/language/Docs/Fields/revision": {
"title": "$:/language/Docs/Fields/revision",
"text": "The revision of the tiddler held at the server"
},
"$:/language/Docs/Fields/released": {
"title": "$:/language/Docs/Fields/released",
"text": "Date of a TiddlyWiki release"
},
"$:/language/Docs/Fields/source": {
"title": "$:/language/Docs/Fields/source",
"text": "The source URL associated with a tiddler"
},
"$:/language/Docs/Fields/subtitle": {
"title": "$:/language/Docs/Fields/subtitle",
"text": "The subtitle text for a wizard"
},
"$:/language/Docs/Fields/tags": {
"title": "$:/language/Docs/Fields/tags",
"text": "A list of tags associated with a tiddler"
},
"$:/language/Docs/Fields/text": {
"title": "$:/language/Docs/Fields/text",
"text": "The body text of a tiddler"
},
"$:/language/Docs/Fields/title": {
"title": "$:/language/Docs/Fields/title",
"text": "The unique name of a tiddler"
},
"$:/language/Docs/Fields/type": {
"title": "$:/language/Docs/Fields/type",
"text": "The content type of a tiddler"
},
"$:/language/Docs/Fields/version": {
"title": "$:/language/Docs/Fields/version",
"text": "Version information for a plugin"
},
"$:/language/Filters/AllTiddlers": {
"title": "$:/language/Filters/AllTiddlers",
"text": "All tiddlers except system tiddlers"
},
"$:/language/Filters/RecentSystemTiddlers": {
"title": "$:/language/Filters/RecentSystemTiddlers",
"text": "Recently modified tiddlers, including system tiddlers"
},
"$:/language/Filters/RecentTiddlers": {
"title": "$:/language/Filters/RecentTiddlers",
"text": "Recently modified tiddlers"
},
"$:/language/Filters/AllTags": {
"title": "$:/language/Filters/AllTags",
"text": "All tags except system tags"
},
"$:/language/Filters/Missing": {
"title": "$:/language/Filters/Missing",
"text": "Missing tiddlers"
},
"$:/language/Filters/Drafts": {
"title": "$:/language/Filters/Drafts",
"text": "Draft tiddlers"
},
"$:/language/Filters/Orphans": {
"title": "$:/language/Filters/Orphans",
"text": "Orphan tiddlers"
},
"$:/language/Filters/SystemTiddlers": {
"title": "$:/language/Filters/SystemTiddlers",
"text": "System tiddlers"
},
"$:/language/Filters/ShadowTiddlers": {
"title": "$:/language/Filters/ShadowTiddlers",
"text": "Shadow tiddlers"
},
"$:/language/Filters/OverriddenShadowTiddlers": {
"title": "$:/language/Filters/OverriddenShadowTiddlers",
"text": "Overridden shadow tiddlers"
},
"$:/language/Filters/SystemTags": {
"title": "$:/language/Filters/SystemTags",
"text": "System tags"
},
"GettingStarted": {
"title": "GettingStarted",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is important to make sure that you can reliably save changes. See http://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit-text tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
},
"$:/language/Help/build": {
"title": "$:/language/Help/build",
"description": "Automatically run configured commands",
"text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
},
"$:/language/Help/clearpassword": {
"title": "$:/language/Help/clearpassword",
"description": "Clear a password for subsequent crypto operations",
"text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
},
"$:/language/Help/default": {
"title": "$:/language/Help/default",
"text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
},
"$:/language/Help/editions": {
"title": "$:/language/Help/editions",
"description": "Lists the available editions of TiddlyWiki",
"text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
},
"$:/language/Help/help": {
"title": "$:/language/Help/help",
"description": "Display help for TiddlyWiki commands",
"text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
},
"$:/language/Help/init": {
"title": "$:/language/Help/init",
"description": "Initialise a new wiki folder",
"text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
},
"$:/language/Help/load": {
"title": "$:/language/Help/load",
"description": "Load tiddlers from a file",
"text": "Load tiddlers from 2.x.x TiddlyWiki files (`.html`), `.tiddler`, `.tid`, `.json` or other files \n\n```\n--load <filepath>\n```\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
},
"$:/language/Help/makelibrary": {
"title": "$:/language/Help/makelibrary",
"description": "Construct library plugin required by upgrade process",
"text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
},
"$:/language/Help/notfound": {
"title": "$:/language/Help/notfound",
"text": "No such help item"
},
"$:/language/Help/output": {
"title": "$:/language/Help/output",
"description": "Set the base output directory for subsequent commands",
"text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
},
"$:/language/Help/password": {
"title": "$:/language/Help/password",
"description": "Set a password for subsequent crypto operations",
"text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n"
},
"$:/language/Help/rendertiddler": {
"title": "$:/language/Help/rendertiddler",
"description": "Render an individual tiddler as a specified ContentType",
"text": "Render an individual tiddler as a specified ContentType, defaults to `text/html` and save it to the specified filename:\n\n```\n--rendertiddler <title> <filename> [<type>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/rendertiddlers": {
"title": "$:/language/Help/rendertiddlers",
"description": "Render tiddlers matching a filter to a specified ContentType",
"text": "Render a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers <filter> <template> <pathname> [<type>] [<extension>]\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. The target directory is recursively created if it is missing.\n"
},
"$:/language/Help/savetiddler": {
"title": "$:/language/Help/savetiddler",
"description": "Saves a raw tiddler to a file",
"text": "Saves an individual tiddler in its raw text or binary format to the specified filename. \n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/savetiddlers": {
"title": "$:/language/Help/savetiddlers",
"description": "Saves a group of raw tiddlers to a directory",
"text": "Saves a group of tiddlers in their raw text or binary format to the specified directory. \n\n```\n--savetiddlers <filter> <pathname>\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the pathname are automatically created.\n"
},
"$:/language/Help/server": {
"title": "$:/language/Help/server",
"description": "Provides an HTTP server interface to TiddlyWiki",
"text": "The server built in to TiddlyWiki5 is very simple. Although compatible with TiddlyWeb it doesn't support many of the features needed for robust Internet-facing usage.\n\nAt the root, it serves a rendering of a specified tiddler. Away from the root, it serves individual tiddlers encoded in JSON, and supports the basic HTTP operations for `GET`, `PUT` and `DELETE`.\n\n```\n--server <port> <roottiddler> <rendertype> <servetype> <username> <password> <host> <pathprefix>\n```\n\nThe parameters are:\n\n* ''port'' - port number to serve from (defaults to \"8080\")\n* ''roottiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\") \n* ''rendertype'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''servetype'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''pathprefix'' - optional prefix for paths\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation isn't suitable for general use.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password:\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port.\n"
},
"$:/language/Help/setfield": {
"title": "$:/language/Help/setfield",
"description": "Prepares external tiddlers for use",
"text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''type'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n\n"
},
"$:/language/Help/unpackplugin": {
"title": "$:/language/Help/unpackplugin",
"description": "Unpack the payload tiddlers from a plugin",
"text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
},
"$:/language/Help/verbose": {
"title": "$:/language/Help/verbose",
"description": "Triggers verbose output mode",
"text": "Triggers verbose output, useful for debugging \n\n```\n--verbose\n```\n"
},
"$:/language/Help/version": {
"title": "$:/language/Help/version",
"description": "Displays the version number of TiddlyWiki",
"text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
},
"$:/language/Import/Listing/Cancel/Caption": {
"title": "$:/language/Import/Listing/Cancel/Caption",
"text": "Cancel"
},
"$:/language/Import/Listing/Hint": {
"title": "$:/language/Import/Listing/Hint",
"text": "These tiddlers are ready to import:"
},
"$:/language/Import/Listing/Import/Caption": {
"title": "$:/language/Import/Listing/Import/Caption",
"text": "Import"
},
"$:/language/Import/Listing/Select/Caption": {
"title": "$:/language/Import/Listing/Select/Caption",
"text": "Select"
},
"$:/language/Import/Listing/Status/Caption": {
"title": "$:/language/Import/Listing/Status/Caption",
"text": "Status"
},
"$:/language/Import/Listing/Title/Caption": {
"title": "$:/language/Import/Listing/Title/Caption",
"text": "Title"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
"text": "Blocked incompatible or obsolete plugin "
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
"text": "Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)"
},
"$:/language/Import/Upgrader/Plugins/Upgraded": {
"title": "$:/language/Import/Upgrader/Plugins/Upgraded",
"text": "Upgraded plugin from <<incoming>> to <<upgraded>>"
},
"$:/language/Import/Upgrader/State/Suppressed": {
"title": "$:/language/Import/Upgrader/State/Suppressed",
"text": "Blocked temporary state tiddler"
},
"$:/language/Import/Upgrader/System/Suppressed": {
"title": "$:/language/Import/Upgrader/System/Suppressed",
"text": "Blocked system tiddler"
},
"$:/language/Import/Upgrader/ThemeTweaks/Created": {
"title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
"text": "Migrated theme tweak from <$text text=<<from>>/>"
},
"$:/language/BinaryWarning/Prompt": {
"title": "$:/language/BinaryWarning/Prompt",
"text": "This tiddler contains binary data"
},
"$:/language/ClassicWarning/Hint": {
"title": "$:/language/ClassicWarning/Hint",
"text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See http://tiddlywiki.com/static/Upgrading.html for more details. "
},
"$:/language/ClassicWarning/Upgrade/Caption": {
"title": "$:/language/ClassicWarning/Upgrade/Caption",
"text": "upgrade"
},
"$:/language/CloseAll/Button": {
"title": "$:/language/CloseAll/Button",
"text": "close all"
},
"$:/language/ConfirmCancelTiddler": {
"title": "$:/language/ConfirmCancelTiddler",
"text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmDeleteTiddler": {
"title": "$:/language/ConfirmDeleteTiddler",
"text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmOverwriteTiddler": {
"title": "$:/language/ConfirmOverwriteTiddler",
"text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmEditShadowTiddler": {
"title": "$:/language/ConfirmEditShadowTiddler",
"text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
},
"$:/language/DefaultNewTiddlerTitle": {
"title": "$:/language/DefaultNewTiddlerTitle",
"text": "New Tiddler"
},
"$:/language/DropMessage": {
"title": "$:/language/DropMessage",
"text": "Drop here (or click escape to 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/InvalidFieldName": {
"title": "$:/language/InvalidFieldName",
"text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
},
"$:/language/MissingTiddler/Hint": {
"title": "$:/language/MissingTiddler/Hint",
"text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" - click {{$:/core/images/edit-button}} to create"
},
"$:/language/RecentChanges/DateFormat": {
"title": "$:/language/RecentChanges/DateFormat",
"text": "DDth MMM YYYY"
},
"$:/language/SystemTiddler/Tooltip": {
"title": "$:/language/SystemTiddler/Tooltip",
"text": "This is a system tiddler"
},
"$:/language/TagManager/Colour/Heading": {
"title": "$:/language/TagManager/Colour/Heading",
"text": "Colour"
},
"$:/language/TagManager/Icon/Heading": {
"title": "$:/language/TagManager/Icon/Heading",
"text": "Icon"
},
"$:/language/TagManager/Info/Heading": {
"title": "$:/language/TagManager/Info/Heading",
"text": "Info"
},
"$:/language/TagManager/Tag/Heading": {
"title": "$:/language/TagManager/Tag/Heading",
"text": "Tag"
},
"$:/language/UnsavedChangesWarning": {
"title": "$:/language/UnsavedChangesWarning",
"text": "You have unsaved changes in TiddlyWiki"
},
"$:/language/Modals/Download": {
"title": "$:/language/Modals/Download",
"type": "text/vnd.tiddlywiki",
"subtitle": "Download changes",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "http://tiddlywiki.com/static/DownloadingChanges.html",
"text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
},
"$:/language/Modals/SaveInstructions": {
"title": "$:/language/Modals/SaveInstructions",
"type": "text/vnd.tiddlywiki",
"subtitle": "Save your work",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "http://tiddlywiki.com/static/SavingChanges.html",
"text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
},
"$:/config/NewJournal/Title": {
"title": "$:/config/NewJournal/Title",
"text": "DDth MMM YYYY"
},
"$:/config/NewJournal/Tags": {
"title": "$:/config/NewJournal/Tags",
"text": "Journal"
},
"$:/language/Notifications/Save/Done": {
"title": "$:/language/Notifications/Save/Done",
"text": "Saved wiki"
},
"$:/language/Notifications/Save/Starting": {
"title": "$:/language/Notifications/Save/Starting",
"text": "Starting to save wiki"
},
"$:/language/Search/DefaultResults/Caption": {
"title": "$:/language/Search/DefaultResults/Caption",
"text": "List"
},
"$:/language/Search/Filter/Caption": {
"title": "$:/language/Search/Filter/Caption",
"text": "Filter"
},
"$:/language/Search/Filter/Hint": {
"title": "$:/language/Search/Filter/Hint",
"text": "Search via a [[filter expression|http://tiddlywiki.com/static/Filters.html]]"
},
"$:/language/Search/Filter/Matches": {
"title": "$:/language/Search/Filter/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches": {
"title": "$:/language/Search/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Shadows/Caption": {
"title": "$:/language/Search/Shadows/Caption",
"text": "Shadows"
},
"$:/language/Search/Shadows/Hint": {
"title": "$:/language/Search/Shadows/Hint",
"text": "Search for shadow tiddlers"
},
"$:/language/Search/Shadows/Matches": {
"title": "$:/language/Search/Shadows/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Standard/Caption": {
"title": "$:/language/Search/Standard/Caption",
"text": "Standard"
},
"$:/language/Search/Standard/Hint": {
"title": "$:/language/Search/Standard/Hint",
"text": "Search for standard tiddlers"
},
"$:/language/Search/Standard/Matches": {
"title": "$:/language/Search/Standard/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/System/Caption": {
"title": "$:/language/Search/System/Caption",
"text": "System"
},
"$:/language/Search/System/Hint": {
"title": "$:/language/Search/System/Hint",
"text": "Search for system tiddlers"
},
"$:/language/Search/System/Matches": {
"title": "$:/language/Search/System/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/SideBar/All/Caption": {
"title": "$:/language/SideBar/All/Caption",
"text": "All"
},
"$:/language/SideBar/Contents/Caption": {
"title": "$:/language/SideBar/Contents/Caption",
"text": "Contents"
},
"$:/language/SideBar/Drafts/Caption": {
"title": "$:/language/SideBar/Drafts/Caption",
"text": "Drafts"
},
"$:/language/SideBar/Missing/Caption": {
"title": "$:/language/SideBar/Missing/Caption",
"text": "Missing"
},
"$:/language/SideBar/More/Caption": {
"title": "$:/language/SideBar/More/Caption",
"text": "More"
},
"$:/language/SideBar/Open/Caption": {
"title": "$:/language/SideBar/Open/Caption",
"text": "Open"
},
"$:/language/SideBar/Orphans/Caption": {
"title": "$:/language/SideBar/Orphans/Caption",
"text": "Orphans"
},
"$:/language/SideBar/Recent/Caption": {
"title": "$:/language/SideBar/Recent/Caption",
"text": "Recent"
},
"$:/language/SideBar/Shadows/Caption": {
"title": "$:/language/SideBar/Shadows/Caption",
"text": "Shadows"
},
"$:/language/SideBar/System/Caption": {
"title": "$:/language/SideBar/System/Caption",
"text": "System"
},
"$:/language/SideBar/Tags/Caption": {
"title": "$:/language/SideBar/Tags/Caption",
"text": "Tags"
},
"$:/language/SideBar/Tags/Untagged/Caption": {
"title": "$:/language/SideBar/Tags/Untagged/Caption",
"text": "untagged"
},
"$:/language/SideBar/Tools/Caption": {
"title": "$:/language/SideBar/Tools/Caption",
"text": "Tools"
},
"$:/language/SideBar/Types/Caption": {
"title": "$:/language/SideBar/Types/Caption",
"text": "Types"
},
"$:/SiteSubtitle": {
"title": "$:/SiteSubtitle",
"text": "a non-linear personal web notebook"
},
"$:/SiteTitle": {
"title": "$:/SiteTitle",
"text": "My ~TiddlyWiki"
},
"$:/language/TiddlerInfo/Advanced/Caption": {
"title": "$:/language/TiddlerInfo/Advanced/Caption",
"text": "Advanced"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
"text": "none"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
"text": "Plugin Details"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
"text": "This plugin contains the following shadow tiddlers:"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
"text": "Shadow Status"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
"text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
"text": "It is overridden by an ordinary tiddler"
},
"$:/language/TiddlerInfo/Fields/Caption": {
"title": "$:/language/TiddlerInfo/Fields/Caption",
"text": "Fields"
},
"$:/language/TiddlerInfo/List/Caption": {
"title": "$:/language/TiddlerInfo/List/Caption",
"text": "List"
},
"$:/language/TiddlerInfo/List/Empty": {
"title": "$:/language/TiddlerInfo/List/Empty",
"text": "This tiddler does not have a list"
},
"$:/language/TiddlerInfo/Listed/Caption": {
"title": "$:/language/TiddlerInfo/Listed/Caption",
"text": "Listed"
},
"$:/language/TiddlerInfo/Listed/Empty": {
"title": "$:/language/TiddlerInfo/Listed/Empty",
"text": "This tiddler is not listed by any others"
},
"$:/language/TiddlerInfo/References/Caption": {
"title": "$:/language/TiddlerInfo/References/Caption",
"text": "References"
},
"$:/language/TiddlerInfo/References/Empty": {
"title": "$:/language/TiddlerInfo/References/Empty",
"text": "No tiddlers link to this one"
},
"$:/language/TiddlerInfo/Tagging/Caption": {
"title": "$:/language/TiddlerInfo/Tagging/Caption",
"text": "Tagging"
},
"$:/language/TiddlerInfo/Tagging/Empty": {
"title": "$:/language/TiddlerInfo/Tagging/Empty",
"text": "No tiddlers are tagged with this one"
},
"$:/language/TiddlerInfo/Tools/Caption": {
"title": "$:/language/TiddlerInfo/Tools/Caption",
"text": "Tools"
},
"$:/language/Docs/Types/application/javascript": {
"title": "$:/language/Docs/Types/application/javascript",
"description": "JavaScript code",
"name": "application/javascript",
"group": "Developer"
},
"$:/language/Docs/Types/application/json": {
"title": "$:/language/Docs/Types/application/json",
"description": "JSON data",
"name": "application/json",
"group": "Developer"
},
"$:/language/Docs/Types/application/x-tiddler-dictionary": {
"title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
"description": "Data dictionary",
"name": "application/x-tiddler-dictionary",
"group": "Developer"
},
"$:/language/Docs/Types/image/gif": {
"title": "$:/language/Docs/Types/image/gif",
"description": "GIF image",
"name": "image/gif",
"group": "Image"
},
"$:/language/Docs/Types/image/jpeg": {
"title": "$:/language/Docs/Types/image/jpeg",
"description": "JPEG image",
"name": "image/jpeg",
"group": "Image"
},
"$:/language/Docs/Types/image/png": {
"title": "$:/language/Docs/Types/image/png",
"description": "PNG image",
"name": "image/png",
"group": "Image"
},
"$:/language/Docs/Types/image/svg+xml": {
"title": "$:/language/Docs/Types/image/svg+xml",
"description": "Structured Vector Graphics image",
"name": "image/svg+xml",
"group": "Image"
},
"$:/language/Docs/Types/image/x-icon": {
"title": "$:/language/Docs/Types/image/x-icon",
"description": "ICO format icon file",
"name": "image/x-icon",
"group": "Image"
},
"$:/language/Docs/Types/text/css": {
"title": "$:/language/Docs/Types/text/css",
"description": "Static stylesheet",
"name": "text/css",
"group": "Developer"
},
"$:/language/Docs/Types/text/html": {
"title": "$:/language/Docs/Types/text/html",
"description": "HTML markup",
"name": "text/html",
"group": "Text"
},
"$:/language/Docs/Types/text/plain": {
"title": "$:/language/Docs/Types/text/plain",
"description": "Plain text",
"name": "text/plain",
"group": "Text"
},
"$:/language/Docs/Types/text/vnd.tiddlywiki": {
"title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
"description": "TiddlyWiki 5",
"name": "text/vnd.tiddlywiki",
"group": "Text"
},
"$:/language/Docs/Types/text/x-tiddlywiki": {
"title": "$:/language/Docs/Types/text/x-tiddlywiki",
"description": "TiddlyWiki Classic",
"name": "text/x-tiddlywiki",
"group": "Text"
},
"$:/languages/en-GB/icon": {
"title": "$:/languages/en-GB/icon",
"type": "image/svg+xml",
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
},
"$:/languages/en-GB": {
"title": "$:/languages/en-GB",
"name": "en-GB",
"description": "English (British)",
"author": "JeremyRuston",
"core-version": ">=5.0.0\"",
"text": "Stub pseudo-plugin for the default language"
},
"$:/core/modules/commander.js": {
"text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
"title": "$:/core/modules/commander.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/commands/build.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/build.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/clearpassword.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/clearpassword.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/editions.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tself = this;\n\t// Enumerate the edition paths\n\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar),\n\t\teditions = {};\n\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\tvar editionPath = editionPaths[editionIndex];\n\t\t// Enumerate the folders\n\t\tvar entries = fs.readdirSync(editionPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar entry = entries[entryIndex];\n\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\tif(!editions[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\tvar info;\n\t\t\t\ttry {\n\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t} catch(ex) {\n\t\t\t\t}\n\t\t\t\tif(info) {\n\t\t\t\t\teditions[entry] = info.description || \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\t$tw.utils.each(editions,function(description,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/editions.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/help.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/help.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/init.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/init.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/load.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar ext = path.extname(self.params[0]);\n\tfs.readFile(this.params[0],$tw.utils.getTypeEncoding(ext),function(err,data) {\n\t\tif (err) {\n\t\t\tself.callback(err);\n\t\t} else {\n\t\t\tvar fields = {title: self.params[0]},\n\t\t\t\ttype = path.extname(self.params[0]);\n\t\t\tvar tiddlers = self.commander.wiki.deserializeTiddlers(type,data,fields);\n\t\t\tif(!tiddlers) {\n\t\t\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t\t\t} else {\n\t\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddlers[t]));\n\t\t\t\t}\n\t\t\t\tself.callback(null);\t\n\t\t\t}\n\t\t}\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/load.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/makelibrary.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = fs.readdirSync(folder);\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = fs.readdirSync(folder);\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.pluginsPath));\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.themesPath));\n\tcollectPlugins(path.resolve($tw.boot.corePath,$tw.config.languagesPath));\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers},null,$tw.config.preferences.jsonSpaces)\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/makelibrary.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/output.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/output.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/password.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/password.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\";\n\t$tw.utils.createFileDirectories(filename);\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/rendertiddler.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[2]),\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.deleteDirectory(pathname);\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent;\n\t\tfs.writeFileSync(path.resolve(pathname,encodeURIComponent(title) + extension),text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/rendertiddlers.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title),\n\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t$tw.utils.createFileDirectories(filename);\n\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/savetiddler.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.deleteDirectory(pathname);\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/savetiddlers.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/server.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif(!$tw.browser) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\thttp = require(\"http\");\n}\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\n/*\nA simple HTTP server with regexp-based routes\n*/\nfunction SimpleServer(options) {\n\tthis.routes = options.routes || [];\n\tthis.wiki = options.wiki;\n\tthis.variables = options.variables || {};\n}\n\nSimpleServer.prototype.set = function(obj) {\n\tvar self = this;\n\t$tw.utils.each(obj,function(value,name) {\n\t\tself.variables[name] = value;\n\t});\n};\n\nSimpleServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nSimpleServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nSimpleServer.prototype.findMatchingRoute = function(request,state) {\n\tvar pathprefix = this.get(\"pathprefix\") || \"\";\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(pathprefix) {\n\t\t\tif(pathname.substr(0,pathprefix.length) === pathprefix) {\n\t\t\t\tpathname = pathname.substr(pathprefix.length);\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nSimpleServer.prototype.checkCredentials = function(request,incomingUsername,incomingPassword) {\n\tvar header = request.headers.authorization || \"\",\n\t\ttoken = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tusername = parts[0],\n\t\tpassword = parts[1];\n\tif(incomingUsername === username && incomingPassword === password) {\n\t\treturn \"ALLOWED\";\n\t} else {\n\t\treturn \"DENIED\";\n\t}\n};\n\nSimpleServer.prototype.listen = function(port,host) {\n\tvar self = this;\n\thttp.createServer(function(request,response) {\n\t\t// Compose the state object\n\t\tvar state = {};\n\t\tstate.wiki = self.wiki;\n\t\tstate.server = self;\n\t\tstate.urlInfo = url.parse(request.url);\n\t\t// Find the route that matches this path\n\t\tvar route = self.findMatchingRoute(request,state);\n\t\t// Check for the username and password if we've got one\n\t\tvar username = self.get(\"username\"),\n\t\t\tpassword = self.get(\"password\");\n\t\tif(username && password) {\n\t\t\t// Check they match\n\t\t\tif(self.checkCredentials(request,username,password) !== \"ALLOWED\") {\n\t\t\t\tvar servername = state.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\";\n\t\t\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + servername + '\"'\n\t\t\t\t});\n\t\t\t\tresponse.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// Return a 404 if we didn't find a route\n\t\tif(!route) {\n\t\t\tresponse.writeHead(404);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t\t// Set the encoding for the incoming request\n\t\t// TODO: Presumably this would need tweaking if we supported PUTting binary tiddlers\n\t\trequest.setEncoding(\"utf8\");\n\t\t// Dispatch the appropriate method\n\t\tswitch(request.method) {\n\t\t\tcase \"GET\": // Intentional fall-through\n\t\t\tcase \"DELETE\":\n\t\t\t\troute.handler(request,response,state);\n\t\t\t\tbreak;\n\t\t\tcase \"PUT\":\n\t\t\t\tvar data = \"\";\n\t\t\t\trequest.on(\"data\",function(chunk) {\n\t\t\t\t\tdata += chunk.toString();\n\t\t\t\t});\n\t\t\t\trequest.on(\"end\",function() {\n\t\t\t\t\tstate.data = data;\n\t\t\t\t\troute.handler(request,response,state);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t}).listen(port,host);\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n\t// Set up server\n\tthis.server = new SimpleServer({\n\t\twiki: this.commander.wiki\n\t});\n\t// Add route handlers\n\tthis.server.addRoute({\n\t\tmethod: \"PUT\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]),\n\t\t\t\tfields = JSON.parse(state.data);\n\t\t\t// Pull up any subfields in the `fields` object\n\t\t\tif(fields.fields) {\n\t\t\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\t\t\tfields[name] = field;\n\t\t\t\t});\n\t\t\t\tdelete fields.fields;\n\t\t\t}\n\t\t\t// Remove any revision field\n\t\t\tif(fields.revision) {\n\t\t\t\tdelete fields.revision;\n\t\t\t}\n\t\t\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title}));\n\t\t\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\t\t\tresponse.writeHead(204, \"OK\",{\n\t\t\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t});\n\t\t\tresponse.end();\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"DELETE\",\n\t\tpath: /^\\/bags\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]);\n\t\t\tstate.wiki.deleteTiddler(title);\n\t\t\tresponse.writeHead(204, \"OK\", {\n\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t});\n\t\t\tresponse.end();\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": state.server.get(\"serveType\")});\n\t\t\tvar text = state.wiki.renderTiddler(state.server.get(\"renderType\"),state.server.get(\"rootTiddler\"));\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/status$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\tvar text = JSON.stringify({\n\t\t\t\tusername: state.server.get(\"username\"),\n\t\t\t\tspace: {\n\t\t\t\t\trecipe: \"default\"\n\t\t\t\t},\n\t\t\t\ttiddlywiki_version: $tw.version\n\t\t\t});\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/favicon.ico$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\t\t\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\t\t\tresponse.end(buffer,\"base64\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers.json$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\tvar tiddlers = [];\n\t\t\tstate.wiki.forEachTiddler({sortField: \"title\"},function(title,tiddler) {\n\t\t\t\tvar tiddlerFields = {};\n\t\t\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\t\t\tif(name !== \"text\") {\n\t\t\t\t\t\ttiddlerFields[name] = tiddler.getFieldString(name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\ttiddlers.push(tiddlerFields);\n\t\t\t});\n\t\t\tvar text = JSON.stringify(tiddlers);\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]),\n\t\t\t\ttiddler = state.wiki.getTiddler(title),\n\t\t\t\ttiddlerFields = {},\n\t\t\t\tknownFields = [\n\t\t\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t\t\t];\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\t\t\ttiddlerFields[name] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t\t\t} else {\n\t\t\t\tresponse.writeHead(404);\n\t\t\t\tresponse.end();\n\t\t\t}\n\t\t}\n\t});\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\tvar port = this.params[0] || \"8080\",\n\t\trootTiddler = this.params[1] || \"$:/core/save/all\",\n\t\trenderType = this.params[2] || \"text/plain\",\n\t\tserveType = this.params[3] || \"text/html\",\n\t\tusername = this.params[4],\n\t\tpassword = this.params[5],\n\t\thost = this.params[6] || \"127.0.0.1\",\n\t\tpathprefix = this.params[7];\n\tthis.server.set({\n\t\trootTiddler: rootTiddler,\n\t\trenderType: renderType,\n\t\tserveType: serveType,\n\t\tusername: username,\n\t\tpassword: password,\n\t\tpathprefix: pathprefix\n\t});\n\tthis.server.listen(port,host);\n\tconsole.log(\"Serving on \" + host + \":\" + port);\n\tconsole.log(\"(press ctrl-C to exit)\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/server.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/setfield.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/setfield.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/unpackplugin.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerData(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/unpackplugin.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/verbose.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/verbose.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/version.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/version.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/config.js": {
"text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
"title": "$:/core/modules/config.js",
"type": "application/javascript",
"module-type": "config"
},
"$:/core/modules/deserializers.js": {
"text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming = JSON.parse(text),\n\t\tresults = [];\n\tif($tw.utils.isArray(incoming)) {\n\t\tfor(var t=0; t<incoming.length; t++) {\n\t\t\tvar incomingFields = incoming[t],\n\t\t\t\tfields = {};\n\t\t\tfor(var f in incomingFields) {\n\t\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t\t}\n\t\t\t}\n\t\t\tresults.push(fields);\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
"title": "$:/core/modules/deserializers.js",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/core/modules/filters/addprefix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/addprefix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/addsuffix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/addsuffix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/after.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/after.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/all/current.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/current.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/missing.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/missing.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/orphans.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/orphans.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/shadows.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/shadows.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/tiddlers.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/all.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/backlinks.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/backlinks.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/before.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/before.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/commands.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/commands.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/each.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = {};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value;\n\t\t\tif((operator.operand === \"\") || (operator.operand === \"title\")) {\n\t\t\t\tvalue = title;\n\t\t\t} else {\n\t\t\t\tvalue = tiddler.getFieldString(operator.operand);\n\t\t\t}\n\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\tvalues[value] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/each.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/eachday.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [];\n\t// 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[operator.operand]) {\n\t\t\tvar value = toDate(tiddler.fields[operator.operand]);\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/eachday.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/field.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/field.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/fields.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/fields.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/get.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/get.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/has.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand) || tiddler.fields[operator.operand] === \"\"))) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && tiddler.fields[operator.operand] !== \"\") {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/has.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/indexes.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerData(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/indexes.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/is/current.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/current.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/image.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/image.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/missing.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/missing.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/orphan.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/orphan.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/shadow.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/shadow.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/system.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/system.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tag.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/tag.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/tiddler.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tvar isFilterOperator = isFilterOperators[operator.operand];\n\tif(isFilterOperator) {\n\t\treturn isFilterOperator(source,operator.prefix,options);\n\t} else {\n\t\treturn [\"Filter Error: Unknown operand for the 'is' filter operator\"];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/is.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/limit.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/limit.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/links.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/links.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/list.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/list.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listed.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/listed.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listops.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
"title": "$:/core/modules/filters/listops.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/modules.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/modules.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/moduletypes.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/moduletypes.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/next.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/next.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/plugintiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerData(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/plugintiddlers.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/prefix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/prefix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/previous.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/previous.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/regexp.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\tregexp = new RegExp(regexpString,flags);\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/regexp.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removeprefix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/removeprefix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removesuffix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/removesuffix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sameday.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tvar isSameDay = function(dateField) {\n\t\t\treturn (new Date(dateField)).setHours(0,0,0,0) === targetDate;\n\t\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tif(isSameDay(tiddler.fields[fieldName])) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/sameday.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/search.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffix) {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: operator.suffix\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/search.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/shadowsource.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/shadowsource.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sort.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/sort.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/splitbefore.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/splitbefore.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/storyviews.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/storyviews.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/suffix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/suffix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tag.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && !tiddler.hasTag(operator.operand)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.hasTag(operator.operand)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/tag.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tagging.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/tagging.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tags.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\t$tw.utils.pushTop(results,tiddler.fields.tags);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/tags.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/title.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/title.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/untagged.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/untagged.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters.js": {
"text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation within a filter string\n\tresults: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar operator, operand, bracketPos, curlyBracketPos;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tvar nextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\toperator.indirect = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\toperator.variable = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n// DEPRECATION WARNING\nconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t}\n\t\tif(!operator.regexp) {\n\t\t\toperator.operand = filterString.substring(p,nextBracketPos);\n\t\t}\n\t\tp = nextBracketPos + 1;\n\t\t\t\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-)?)(?:(\\[)|(\"(?:[^\"])*\")|('(?:[^'])*')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow \"Syntax error in filter expression\";\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operand: match[3] || match[4] || match[5]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [\"Filter error: \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operand = operator.operand,\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\tif(operator.indirect) {\n\t\t\t\t\toperand = self.getTextReference(operator.operand,\"\",currTiddlerTitle);\n\t\t\t\t}\n\t\t\t\tif(operator.variable) {\n\t\t\t\t\toperand = widget.getVariable(operator.operand,{defaultValue: \"\"});\n\t\t\t\t}\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operand,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\t\t\t\t\tsource = self.makeTiddlerIterator(results);\n\t\t\t\t\t\tresults.splice(0,results.length);\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter\",function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = [];\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results;\n\t});\n};\n\n})();\n",
"title": "$:/core/modules/filters.js",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/info/platform.js": {
"text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function() {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\treturn infoTiddlerFields;\n};\n\n})();\n",
"title": "$:/core/modules/info/platform.js",
"type": "application/javascript",
"module-type": "info"
},
"$:/core/modules/language.js": {
"text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a single translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\nexports.Language = Language;\n\n})();\n",
"title": "$:/core/modules/language.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/macros/changecount.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
"title": "$:/core/modules/macros/changecount.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/contrastcolour.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB),\n\t\tbrightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
"title": "$:/core/modules/macros/contrastcolour.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/csvtiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
"title": "$:/core/modules/macros/csvtiddlers.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/dumpvariables.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/dumpvariables.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to dump all active variable values\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"dumpvariables\";\n\nexports.params = [\n];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\tvar output = [\"|!Variable |!Value |\"],\n\t\tvariables = [], variable;\n\tfor(variable in this.variables) {\n\t\tvariables.push(variable);\n\t}\n\tvariables.sort();\n\tfor(var index=0; index<variables.length; index++) {\n\t\tvar variable = variables[index];\n\t\toutput.push(\"|\" + variable + \" |<input size=50 value=<<\" + variable + \">>/> |\")\n\t}\n\treturn output.join(\"\\n\");\n};\n\n})();\n",
"title": "$:/core/modules/macros/dumpvariables.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter) {\n\tvar tiddlers = this.wiki.filterTiddlers(filter),\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
"title": "$:/core/modules/macros/jsontiddlers.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/makedatauri.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert the content of a tiddler to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tparts.push(\"data:\");\n\tparts.push(type);\n\tparts.push(isBase64 ? \";base64\" : \"\");\n\tparts.push(\",\");\n\tparts.push(isBase64 ? text : encodeURIComponent(text));\n\treturn parts.join(\"\");\n};\n\n})();\n",
"title": "$:/core/modules/macros/makedatauri.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/now.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
"title": "$:/core/modules/macros/now.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/qualify.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
"title": "$:/core/modules/macros/qualify.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/version.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
"title": "$:/core/modules/macros/version.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/parsers/audioparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/audioparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/csvparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/csvparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/htmlparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/htmlparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/imageparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t\tif(type === \"application/pdf\" || type === \".pdf\") {\n\t\t\telement.tag = \"embed\";\n\t\t}\n\t} else if(text) {\n\t\tif(type === \"application/pdf\" || type === \".pdf\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t\t\telement.tag = \"embed\";\n\t\t} else if(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"application/pdf\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/imageparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/utils/parseutils.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar node = {\n\t\ttype: \"whitespace\",\n\t\tstart: pos\n\t};\n\tvar re = /(\\s)+/g;\n\tre.lastIndex = pos;\n\tvar match = re.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t}\n\treturn null;\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar whitespace = $tw.utils.parseWhiteSpace(source,pos);\n\tif(whitespace) {\n\t\treturn whitespace.end;\n\t}\n\treturn pos;\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for an indirect value\n\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\tif(indirectValue) {\n\t\t\t\tpos = indirectValue.end;\n\t\t\t\tnode.type = \"indirect\";\n\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for a unquoted value\n\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\tif(unquotedValue) {\n\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"title": "$:/core/modules/utils/parseutils.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/parsers/textparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/textparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/dash.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/entity.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/extlink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: http://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|'\"\\\\^~]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/heading.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/html.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/html.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/image.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[http://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [http://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [http://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|http://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/image.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/list.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"p\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/list.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /(\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"macrodef\",\n\t\tname: this.match[1],\n\t\tparams: params,\n\t\ttext: text\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[http://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|http://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nvar 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.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(isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/rules.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/table.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/table.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/wikiparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\tthis.tree.push.apply(this.tree,this.parseInlineRun());\n\t} else {\n\t\tthis.tree.push.apply(this.tree,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar tree = [];\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t}\n\treturn tree;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,nextMatch.matchIndex)});\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\ttree.push({type: \"text\", text: this.source.substr(this.pos)});\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,terminatorMatch.index)});\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,inlineRuleMatch.matchIndex)});\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\ttree.push({type: \"text\", text: this.source.substr(this.pos)});\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar keepFilter;\n\tif(type === \"only\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) !== -1;\n\t\t};\n\t} else if(type === \"except\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) === -1;\n\t\t};\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif(!keepFilter(ruleArray[t].rule.name)) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/pluginswitcher.js": {
"text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
"title": "$:/core/modules/pluginswitcher.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/saver-handler.js": {
"text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tthis.numChanges = 0;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(callback) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\tcallback(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\twindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\",\n\t\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert(\"Error while saving:\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\") {\n\t\treturn false;\n\t}\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
"title": "$:/core/modules/saver-handler.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/savers/andtidwiki.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t// Strip the file://\n\tif(pathname.indexOf(\"file://\") === 0) {\n\t\tpathname = pathname.substr(7);\n\t}\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Save the file\n\twindow.twi.saveFile(pathname,text);\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/andtidwiki.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/download.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\tfilename = document.location.pathname.substr(p+1);\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tlink.setAttribute(\"target\",\"_blank\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/download.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/fsosaver.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/fsosaver.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/manualdownload.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/manualdownload.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/msdownload.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/msdownload.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyfox.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/tiddlyfox.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyie.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/tiddlyie.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/twedit.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback(\"Error saving to TWEdit: \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
"title": "$:/core/modules/savers/twedit.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/upload.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; ;charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback(\"Error:\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/upload.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/startup/commands.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
"title": "$:/core/modules/startup/commands.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/favicon.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",\"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text);\n\t}\n}\n\n})();\n",
"title": "$:/core/modules/startup/favicon.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/info.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Collect up the info tiddlers\n\tvar infoTiddlerFields = {};\n\t// Give each info module a chance to fill in as many info tiddlers as they want\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tvar tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);\n\t\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\t\tif(fields) {\n\t\t\t\t\tinfoTiddlerFields[fields.title] = fields;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Bake the info tiddlers into a plugin\n\tvar fields = {\n\t\ttitle: \"$:/temp/info-plugin\",\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"info\",\n\t\ttext: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)\n\t};\n\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\t$tw.wiki.readPluginInfo();\n\t$tw.wiki.registerPluginTiddlers(\"info\");\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
"title": "$:/core/modules/startup/info.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/load-modules.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
"title": "$:/core/modules/startup/load-modules.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/password.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: \"Set password\",\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
"title": "$:/core/modules/startup/password.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/render.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/PageTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n\t})();\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.pageWidgetNode.refresh(deferredChanges,$tw.pageContainer,null);\n\t\tdeferredChanges = Object.create(null);\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only drafts have changed\n\t\tvar onlyDraftsHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !tiddler.hasField(\"draft.of\")) {\n\t\t\t\tonlyDraftsHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyDraftsHaveChanged) {\n\t\t\ttimerId = setTimeout(refresh,DRAFT_TIDDLER_TIMEOUT);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n};\n\n})();\n",
"title": "$:/core/modules/startup/render.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/rootwidget.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param);\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tif(document[fullscreen._fullscreenElement]) {\n\t\t\t\tdocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tdocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/startup/rootwidget.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup.js": {
"text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION = false;\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t}\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance(PERFORMANCE_INSTRUMENTATION);\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-US\"\n\t\t]\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget = new widget.widget({\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},{\n\t\t\twiki: $tw.wiki,\n\t\t\tdocument: document\n\t\t});\n\t}\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t} \n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({wiki: $tw.wiki, dirtyTracking: !$tw.syncadaptor});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/startup.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/story.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers();\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: \"permalink\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: \"permaview\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle\n\t\t\t});\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t//invoke any hooks that might change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// If a target tiddler was specified add it to the history stack\n\tif(target && target !== \"\") {\n\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t}\n\t\t$tw.wiki.addToHistory(target);\n\t} else if(storyList.length > 0) {\n\t\t$tw.wiki.addToHistory(storyList[0]);\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\tif(options.updateAddressBar !== \"no\") {\n\t\t// Get the story and the history stack\n\t\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\t\ttargetTiddler = \"\";\n\t\tif(options.targetTiddler) {\n\t\t\ttargetTiddler = options.targetTiddler;\n\t\t} else {\n\t\t\t// The target tiddler is the one at the top of the stack\n\t\t\tif(historyList.length > 0) {\n\t\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t\t}\n\t\t\t// Blank the target tiddler if it isn't present in the story\n\t\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\t\ttargetTiddler = \"\";\n\t\t\t}\n\t\t}\n\t\t// Assemble the location hash\n\t\tif(options.updateAddressBar === \"permalink\") {\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t} else {\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t}\n\t\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\t\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\t\tif(options.updateHistory === \"yes\") {\n\t\t\t\t// Assign the location hash so that history is updated\n\t\t\t\twindow.location.hash = $tw.locationHash;\n\t\t\t} else {\n\t\t\t\t// We use replace so that browser history isn't affected\n\t\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t\t}\n\t\t}\n\t}\n}\n\n})();\n",
"title": "$:/core/modules/startup/story.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/storyviews/classic.js": {
"text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Get the current height of the tiddler\n\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"}\n\t\t]);\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Get the current height of the tiddler\n\tvar currWidth = targetElement.offsetWidth,\n\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t// Remove the dom nodes of the widget at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"translateX(0px)\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
"title": "$:/core/modules/storyviews/classic.js",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/pop.js": {
"text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
"title": "$:/core/modules/storyviews/pop.js",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/zoomin.js": {
"text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerData(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif(targetTiddler !== 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// 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})();",
"title": "$:/core/modules/storyviews/zoomin.js",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/syncer.js": {
"text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store. If a syncadaptor is used then individual tiddlers are synchronised through it. If there is no syncadaptor then the entire wiki is saved via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.syncadaptor = options.syncadaptor;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\"));\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\t// Tasks are {type: \"load\"/\"save\"/\"delete\", title:, queueTime:, lastModificationTime:}\n\tthis.taskQueue = {}; // Hashmap of tasks yet to be performed\n\tthis.taskInProgress = {}; // Hash of tasks in progress\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.syncToServer(changes);\n\t});\n\t// Browser event handlers\n\tif($tw.browser) {\n\t\t// Set up our beforeunload handler\n\t\twindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function() {\n\t\t\tself.handleLoginEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\tself.handleLazyLoadEvent(title);\n\t});\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nConstants\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.filterFn.call(this.wiki);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tself.tiddlerInfo[title] = {\n\t\t\trevision: tiddler.fields.revision,\n\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t};\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\treturn (this.numTasksInQueue() > 0) || (this.numTasksInProgress() > 0);\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(this.wiki.getTiddler(tiddlerFields.title),tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: tiddlerFields.revision,\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Set the various status tiddlers\n\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\tif(isLoggedIn) {\n\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t} else {\n\t\t\t\tself.wiki.deleteTiddler(self.titleUserName);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tif(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tvar self = this;\n\t\tif(this.pollTimerId) {\n\t\t\tclearTimeout(this.pollTimerId);\n\t\t\tthis.pollTimerId = null;\n\t\t}\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\t// Trigger the next sync\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(\"Error retrieving skinny tiddler list:\",err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null;\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Do a full load if we've already got a fat version of the tiddler\n\t\t\t\t\tif(tiddler && tiddler.fields.text !== undefined) {\n\t\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\t\tself.enqueueSyncTask({\n\t\t\t\t\t\t\ttype: \"load\",\n\t\t\t\t\t\t\ttitle: tiddlerFields.title\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Load the skinny version of the tiddler\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nSynchronise a set of changes to the server\n*/\nSyncer.prototype.syncToServer = function(changes) {\n\tvar self = this,\n\t\tnow = Date.now(),\n\t\tfilteredChanges = this.filterFn.call(this.wiki,function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t$tw.utils.each(changes,function(change,title,object) {\n\t\t// Process the change if it is a deletion of a tiddler we're already syncing, or is on the filtered change list\n\t\tif((change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) || filteredChanges.indexOf(title) !== -1) {\n\t\t\t// Queue a task to sync this tiddler\n\t\t\tself.enqueueSyncTask({\n\t\t\t\ttype: change.deleted ? \"delete\" : \"save\",\n\t\t\t\ttitle: title\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Queue up a sync task to load this tiddler\n\tthis.enqueueSyncTask({\n\t\ttype: \"load\",\n\t\ttitle: title\n\t});\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!isLoggedIn) {\n\t\t\t$tw.passwordPrompt.createPrompt({\n\t\t\t\tserviceName: \"Login to TiddlySpace\",\n\t\t\t\tcallback: function(data) {\n\t\t\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\t\t\tself.syncFromServer();\n\t\t\t\t\t});\n\t\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(null,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nQueue up a sync task. If there is already a pending task for the tiddler, just update the last modification time\n*/\nSyncer.prototype.enqueueSyncTask = function(task) {\n\tvar self = this,\n\t\tnow = Date.now();\n\t// Set the timestamps on this task\n\ttask.queueTime = now;\n\ttask.lastModificationTime = now;\n\t// Fill in some tiddlerInfo if the tiddler is one we haven't seen before\n\tif(!$tw.utils.hop(this.tiddlerInfo,task.title)) {\n\t\tthis.tiddlerInfo[task.title] = {\n\t\t\trevision: null,\n\t\t\tadaptorInfo: {},\n\t\t\tchangeCount: -1\n\t\t};\n\t}\n\t// Bail if this is a save and the tiddler is already at the changeCount that the server has\n\tif(task.type === \"save\" && this.wiki.getChangeCount(task.title) <= this.tiddlerInfo[task.title].changeCount) {\n\t\treturn;\n\t}\n\t// Check if this tiddler is already in the queue\n\tif($tw.utils.hop(this.taskQueue,task.title)) {\n\t\t// this.logger.log(\"Re-queueing up sync task with type:\",task.type,\"title:\",task.title);\n\t\tvar existingTask = this.taskQueue[task.title];\n\t\t// If so, just update the last modification time\n\t\texistingTask.lastModificationTime = task.lastModificationTime;\n\t\t// If the new task is a save then we upgrade the existing task to a save. Thus a pending load is turned into a save if the tiddler changes locally in the meantime. But a pending save is not modified to become a load\n\t\tif(task.type === \"save\" || task.type === \"delete\") {\n\t\t\texistingTask.type = task.type;\n\t\t}\n\t} else {\n\t\t// this.logger.log(\"Queuing up sync task with type:\",task.type,\"title:\",task.title);\n\t\t// If it is not in the queue, insert it\n\t\tthis.taskQueue[task.title] = task;\n\t\tthis.updateDirtyStatus();\n\t}\n\t// Process the queue\n\t$tw.utils.nextTick(function() {self.processTaskQueue.call(self);});\n};\n\n/*\nReturn the number of tasks in progress\n*/\nSyncer.prototype.numTasksInProgress = function() {\n\treturn $tw.utils.count(this.taskInProgress);\n};\n\n/*\nReturn the number of tasks in the queue\n*/\nSyncer.prototype.numTasksInQueue = function() {\n\treturn $tw.utils.count(this.taskQueue);\n};\n\n/*\nTrigger a timeout if one isn't already outstanding\n*/\nSyncer.prototype.triggerTimeout = function() {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},self.taskTimerInterval);\n\t}\n};\n\n/*\nProcess the task queue, performing the next task if appropriate\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if we're not already performing a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif(this.numTasksInProgress() === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(task) {\n\t\t\t// Remove the task from the queue and add it to the in progress list\n\t\t\tdelete this.taskQueue[task.title];\n\t\t\tthis.taskInProgress[task.title] = task;\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// Dispatch the task\n\t\t\tthis.dispatchTask(task,function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\tself.logger.alert(\"Sync error while processing '\" + task.title + \"':\\n\" + err);\n\t\t\t\t}\n\t\t\t\t// Mark that this task is no longer in progress\n\t\t\t\tdelete self.taskInProgress[task.title];\n\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t// Process the next task\n\t\t\t\tself.processTaskQueue.call(self);\n\t\t\t});\n\t\t} else {\n\t\t\t// Make sure we've set a time if there wasn't a task to perform, but we've still got tasks in the queue\n\t\t\tif(this.numTasksInQueue() > 0) {\n\t\t\t\tthis.triggerTimeout();\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nChoose the next applicable task\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar self = this,\n\t\tcandidateTask = null,\n\t\tnow = Date.now();\n\t// Select the best candidate task\n\t$tw.utils.each(this.taskQueue,function(task,title) {\n\t\t// Exclude the task if there's one of the same name in progress\n\t\tif($tw.utils.hop(self.taskInProgress,title)) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is a save and the tiddler has been modified recently, but not hit the fallback time\n\t\tif(task.type === \"save\" && (now - task.lastModificationTime) < self.throttleInterval &&\n\t\t\t(now - task.queueTime) < self.fallbackInterval) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is newer than the current best candidate\n\t\tif(candidateTask && candidateTask.queueTime < task.queueTime) {\n\t\t\treturn;\n\t\t}\n\t\t// Now this is our best candidate\n\t\tcandidateTask = task;\n\t});\n\treturn candidateTask;\n};\n\n/*\nDispatch a task and invoke the callback\n*/\nSyncer.prototype.dispatchTask = function(task,callback) {\n\tvar self = this;\n\tif(task.type === \"save\") {\n\t\tvar changeCount = this.wiki.getChangeCount(task.title),\n\t\t\ttiddler = this.wiki.getTiddler(task.title);\n\t\tthis.logger.log(\"Dispatching 'save' task:\",task.title);\n\t\tif(tiddler) {\n\t\t\tthis.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\t// Adjust the info stored about this tiddler\n\t\t\t\tself.tiddlerInfo[task.title] = {\n\t\t\t\t\tchangeCount: changeCount,\n\t\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\t\trevision: revision\n\t\t\t\t};\n\t\t\t\t// Invoke the callback\n\t\t\t\tcallback(null);\n\t\t\t},{\n\t\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t\t});\n\t\t} else {\n\t\t\tthis.logger.log(\" Not Dispatching 'save' task:\",task.title,\"tiddler does not exist\");\n\t\t\treturn callback(null);\n\t\t}\n\t} else if(task.type === \"load\") {\n\t\t// Load the tiddler\n\t\tthis.logger.log(\"Dispatching 'load' task:\",task.title);\n\t\tthis.syncadaptor.loadTiddler(task.title,function(err,tiddlerFields) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Store the tiddler\n\t\t\tif(tiddlerFields) {\n\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t});\n\t} else if(task.type === \"delete\") {\n\t\t// Delete the tiddler\n\t\tthis.logger.log(\"Dispatching 'delete' task:\",task.title);\n\t\tthis.syncadaptor.deleteTiddler(task.title,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tdelete self.tiddlerInfo[task.title];\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t});\n\t}\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
"title": "$:/core/modules/syncer.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/tiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = [];\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields.push(field + \": \" + this.getFieldString(field));\n\t\t\t}\n\t\t}\n\t}\n\treturn fields.join(\"\\n\");\n};\n\n/*\nCompare two tiddlers for equality\ntiddler: the tiddler to compare\nexcludeFields: array of field names to exclude from the comparison\n*/\nexports.isEqual = function(tiddler,excludeFields) {\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\treturn false;\n\t}\n\texcludeFields = excludeFields || [];\n\tvar self = this,\n\t\tdifferences = []; // Fields that have differences\n\t// Add to the differences array\n\tfunction addDifference(fieldName) {\n\t\t// Check for this field being excluded\n\t\tif(excludeFields.indexOf(fieldName) === -1) {\n\t\t\t// Save the field as a difference\n\t\t\t$tw.utils.pushTop(differences,fieldName);\n\t\t}\n\t}\n\t// Returns true if the two values of this field are equal\n\tfunction isFieldValueEqual(fieldName) {\n\t\tvar valueA = self.fields[fieldName],\n\t\t\tvalueB = tiddler.fields[fieldName];\n\t\t// Check for identical string values\n\t\tif(typeof(valueA) === \"string\" && typeof(valueB) === \"string\" && valueA === valueB) {\n\t\t\treturn true;\n\t\t}\n\t\t// Check for identical array values\n\t\tif($tw.utils.isArray(valueA) && $tw.utils.isArray(valueB) && $tw.utils.isArrayEqual(valueA,valueB)) {\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise the fields must be different\n\t\treturn false;\n\t}\n\t// Compare our fields\n\tfor(var fieldName in this.fields) {\n\t\tif(!isFieldValueEqual(fieldName)) {\n\t\t\taddDifference(fieldName);\n\t\t}\n\t}\n\t// There's a difference for every field in the other tiddler that we don't have\n\tfor(fieldName in tiddler.fields) {\n\t\tif(!(fieldName in this.fields)) {\n\t\t\taddDifference(fieldName);\n\t\t}\n\t}\n\t// Return whether there were any differences\n\treturn differences.length === 0;\n};\n\n})();\n",
"title": "$:/core/modules/tiddler.js",
"type": "application/javascript",
"module-type": "tiddlermethod"
},
"$:/core/modules/upgraders/plugins.js": {
"text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"] && incomingTiddler.version) {\n\t\t\t// Upgrade the incoming plugin if we've got a newer version in the upgrade library\n\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\tif($tw.utils.checkVersions(libraryTiddler.version,incomingTiddler.version)) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = $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}\n\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/upgraders/plugins.js",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/system.js": {
"text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/upgraders/system.js",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/themetweaks.js": {
"text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerData(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/upgraders/themetweaks.js",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/utils/crypto.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/utils/crypto.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/animations/slide.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/animations/slide.js",
"type": "application/javascript",
"module-type": "animation"
},
"$:/core/modules/utils/dom/animator.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
"title": "$:/core/modules/utils/dom/animator.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/browser.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif(document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/browser.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/csscolorparser.js": {
"text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
"title": "$:/core/modules/utils/dom/csscolorparser.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.className && el.className.toString().split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = el.className.split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t}\n\tel.className = c.join(\" \");\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = el.className.split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function() {\n\tif(\"scrollX\" in window) {\n\t\treturn {x: window.scrollX, y: window.scrollY};\n\t} else {\n\t\treturn {x: document.documentElement.scrollLeft, y: document.documentElement.scrollTop};\n\t}\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\ttry {\n\t\tif(window.localStorage) {\n\t\t\tlocalStorage.setItem(\"tw5-password-\" + name,password);\n\t\t}\n\t} catch(e) {\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\ttry {\n\t\treturn window.localStorage ? localStorage.getItem(\"tw5-password-\" + name) : \"\";\n\t} catch(e) {\n\t\treturn \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n\n})();\n",
"title": "$:/core/modules/utils/dom.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/http.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data)\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tdata = results.join(\"&\");\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this.responseText,this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback(\"XMLHttpRequest error code: \" + this.status);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,options.url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !$tw.utils.hop(headers,\"Content-type\")) {\n\t\trequest.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\trequest.send(data);\n\treturn request;\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/http.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/keyboard.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"enter\": 13,\n\t\"escape\": 27\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nexports.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(\"+\"),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase();\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(namedKeys[s]) {\n\t\t\tinfo.keyCode = namedKeys[s];\n\t\t}\n\t}\n\treturn info;\n};\n\nexports.checkKeyDescriptor = function(event,keyInfo) {\n\tvar metaKeyStatus = !!keyInfo.metaKey; // Using a temporary variable to keep JSHint happy\n\treturn event.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === metaKeyStatus;\t\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/keyboard.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/modal.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Create the wrapper divs\n\tvar wrapper = document.createElement(\"div\"),\n\t\tmodalBackdrop = document.createElement(\"div\"),\n\t\tmodalWrapper = document.createElement(\"div\"),\n\t\tmodalHeader = document.createElement(\"div\"),\n\t\theaderTitle = document.createElement(\"h3\"),\n\t\tmodalBody = document.createElement(\"div\"),\n\t\tmodalLink = document.createElement(\"a\"),\n\t\tmodalFooter = document.createElement(\"div\"),\n\t\tmodalFooterHelp = document.createElement(\"span\"),\n\t\tmodalFooterButtons = document.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t});\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\tbodyWidgetNode.render(modalBody,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t});\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(document.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler && tiddler.fields && tiddler.fields.help) {\n\t\tvar link = document.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.appendChild(document.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: \"Close\"\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t});\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + window.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\twindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tdocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tdocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tif($tw.pageContainer) {\n\t\t$tw.utils.toggleClass($tw.pageContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
"title": "$:/core/modules/utils/dom/modal.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/notifier.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar notification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration();\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// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{parentWidget: $tw.rootWidget, document: document});\n\twidgetNode.render(notification,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t});\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// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
"title": "$:/core/modules/utils/dom/notifier.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/popup.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === options.title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\t// Store the popup details\n\tthis.popups.push({\n\t\ttitle: options.title,\n\t\twiki: options.wiki,\n\t\tdomNode: options.domNode\n\t});\n\t// Set the state tiddler\n\toptions.wiki.setTextReference(options.title,\n\t\t\t\"(\" + options.domNode.offsetLeft + \",\" + options.domNode.offsetTop + \",\" + \n\t\t\t\toptions.domNode.offsetWidth + \",\" + options.domNode.offsetHeight + \")\");\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
"title": "$:/core/modules/utils/dom/popup.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/scroller.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\treturn this.scrollIntoView(event.target);\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\t// Now get ready to scroll the body\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = $tw.utils.getScrollPosition();\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar clientBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\ttop: clientBounds.top + scrollPosition.y,\n\t\t\twidth: clientBounds.width,\n\t\t\theight: clientBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is above/left of the current view, then scroll to it's top/left\n\t\t\tif(targetPos <= currentPos) {\n\t\t\t\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,window.innerWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,window.innerHeight);\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\twindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
"title": "$:/core/modules/utils/dom/scroller.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/fakedom.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text;\n};\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis.style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value;\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"='\",$tw.utils.htmlEncode(v),\"'\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this.style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this.style) {\n\t\t\t\tstyle.push(s + \":\" + this.style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style='\",style.join(\"\"),\"'\")\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tthrow \"Cannot get textContent on a raw TW_Element\";\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tthrow \"Cannot get formattedTextContent on a raw TW_Element\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
"title": "$:/core/modules/utils/fakedom.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/filesystem.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = $tw.utils.removeTrailingSeparator(srcPath);\n\tdstPath = $tw.utils.removeTrailingSeparator(dstPath);\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = new Buffer(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n})();\n",
"title": "$:/core/modules/utils/filesystem.js",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/logger.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName) {\n\tthis.componentName = componentName || \"\";\n}\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tif(console !== undefined && console.log !== undefined) {\n\t\treturn Function.apply.call(console.log, console, [this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)));\n\t}\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\t// Prepare the text of the alert\n\tvar text = Array.prototype.join.call(arguments,\" \");\n\t// Check if there is an existing alert with the same text and the same component\n\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\talertFields,\n\t\texistingCount,\n\t\tself = this;\n\t$tw.utils.each(existingAlerts,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t}\n\t});\n\tif(alertFields) {\n\t\texistingCount = alertFields.count || 1;\n\t} else {\n\t\talertFields = {\n\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\ttext: text,\n\t\t\ttags: [ALERT_TAG],\n\t\t\tcomponent: this.componentName\n\t\t};\n\t\texistingCount = 0;\n\t}\n\talertFields.modified = new Date();\n\tif(++existingCount > 1) {\n\t\talertFields.count = existingCount;\n\t} else {\n\t\talertFields.count = undefined;\n\t}\n\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t// Log it too\n\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n};\n\nexports.Logger = Logger;\n\n})();\n",
"title": "$:/core/modules/utils/logger.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/parsetree.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n})();\n",
"title": "$:/core/modules/utils/parsetree.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/performance.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap of current values of measurements\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n}\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tself.measures = {};\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime) + \"ms\");\n\t\t\tfor(var m in self.measures) {\n\t\t\t\tself.logger.log(\"+\" + m + \": \" + self.measures[m] + \"ms\");\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments),\n\t\t\t\tvalue = self.measures[name] || 0;\n\t\t\tself.measures[name] = value + $tw.utils.timer(startTime);\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
"title": "$:/core/modules/utils/performance.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/pluginmaker.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\nError: \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
"title": "$:/core/modules/utils/pluginmaker.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/utils.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\tconsole.log($tw.node ? \"\\x1b[1;33m\" + text + \"\\x1b[0m\" : text);\n}\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\tvar s = 0;\n\t$tw.utils.each(object,function() {s++;});\n\treturn s;\n};\n\n/*\nCheck if an array is equal by value and by reference.\n*/\nexports.isArrayEqual = function(array1,array2) {\n\tif(array1 === array2) {\n\t\treturn true;\n\t}\n\tarray1 = array1 || [];\n\tarray2 = array2 || [];\n\tif(array1.length !== array2.length) {\n\t\treturn false;\n\t}\n\treturn array1.every(function(value,index) {\n\t\treturn value === array2[index];\n\t});\n};\n\n/*\nPush entries onto an array, removing them first if they already exist in the array\n\tarray: array to modify (assumed to be free of duplicates)\n\tvalue: a single value to push or an array of values to push\n*/\nexports.pushTop = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\t// Remove any array entries that are duplicated in the new values\n\t\tif(value.length !== 0) {\n\t\t\tif(array.length !== 0) {\n\t\t\t\tif(value.length < array.length) {\n\t\t\t\t\tfor(t=0; t<value.length; t++) {\n\t\t\t\t\t\tp = array.indexOf(value[t]);\n\t\t\t\t\t\tif(p !== -1) {\n\t\t\t\t\t\t\tarray.splice(p,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor(t=array.length-1; t>=0; t--) {\n\t\t\t\t\t\tp = value.indexOf(array[t]);\n\t\t\t\t\t\tif(p !== -1) {\n\t\t\t\t\t\t\tarray.splice(t,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Push the values on top of the main array\n\t\t\tarray.push.apply(array,value);\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t\tarray.push(value);\n\t}\n\treturn array;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.getYearForWeekNo(date);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn date.getFullYear();\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call();\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1) + 3600000) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\" and \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar e = s.substr(1,s.length-2); // Strip the & and the ;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\treturn String.fromCharCode(parseInt(e.substr(2),16));\t\n\t\t} else {\n\t\t\treturn String.fromCharCode(parseInt(e.substr(1),10));\n\t\t}\n\t} else {\n\t\tvar c = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn String.fromCharCode(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape escape all non-ASCII characters.\n\t*/\n\treturn s\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/[\\x80-\\uFFFF]/g, exports.escape); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof window !== \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10);\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\tif($tw.browser) {\n\t\t// TODO\n\t\tthrow \"$tw.utils.base64Decode() doesn't work in the browser\";\n\t} else {\n\t\treturn (new Buffer(string64,\"base64\")).toString();\n\t}\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\t\t\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n})();",
"title": "$:/core/modules/utils/utils.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/widgets/action-deletefield.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {};\n\tif(this.actionField) {\n\t\tremoveFields[this.actionField] = undefined;\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t}\n\t\t});\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,removeFields));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-deletefield.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletetiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-deletetiddler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-navigate.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-navigate.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-sendmessage.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n};\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(changedAttributes[\"$message\"] || changedAttributes[\"$param\"]) {\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// Dispatch the message\n\tthis.dispatchEvent({type: this.actionMessage, param: param, paramObject: paramObject, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-sendmessage.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-setfield.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this;\n\tif(typeof this.actionValue === \"string\") {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue);\t\t\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-setfield.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/browse.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\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: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,function(tiddlerFieldsArray) {\n\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/browse.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/button.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"button\");\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = this.popup && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif(this.set && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n}\n\nButtonWidget.prototype.isSelected = function() {\n\tvar tiddler = this.wiki.getTiddler(this.set);\n\treturn tiddler ? tiddler.fields.text === this.setTo : this.defaultSetValue === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1)\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\t$tw.popup.triggerPopup({\n\t\tdomNode: this.domNodes[0],\n\t\ttitle: this.popup,\n\t\twiki: this.wiki\n\t});\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || changedAttributes.selectedClass || changedAttributes.style || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup])) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/button.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/checkbox.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value = tiddler.fields[this.checkboxField] || this.checkboxDefault || \"\";\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false;\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tiddler.hasTag(this.checkboxTag) !== checked)) {\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(checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tvar value = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\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.field || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/checkbox.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/codeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/codeblock.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/count.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = undefined;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/count.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/dropzone.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = \"tc-dropzone\";\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"}\n\t]);\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nDropZoneWidget.prototype.enterDrag = function() {\n\t// We count enter/leave events\n\tthis.dragEnterCount = (this.dragEnterCount || 0) + 1;\n\t// If we're entering for the first time we need to apply highlighting\n\tif(this.dragEnterCount === 1) {\n\t\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.leaveDrag = function() {\n\t// Reduce the enter count\n\tthis.dragEnterCount = (this.dragEnterCount || 0) - 1;\n\t// Remove highlighting if we're leaving externally\n\tif(this.dragEnterCount <= 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag();\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag();\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tthis.leaveDrag();\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Reset the enter count\n\tthis.dragEnterCount = 0;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = this.wiki.readFiles(dataTransfer.files,function(tiddlerFieldsArray) {\n\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t});\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\tthis.importData(dataTransfer);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.importData = function(dataTransfer) {\n\t// Try each provided data type in turn\n\tfor(var t=0; t<this.importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || this.importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = this.importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.convertToFields(data);\n\t\t\t\tif(!tiddlerFields.title) {\n\t\t\t\t\ttiddlerFields.title = this.wiki.generateNewTitle(\"Untitled\");\n\t\t\t\t}\n\t\t\t\tthis.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nDropZoneWidget.prototype.importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, convertToFields: function(data) {\n\t\treturn JSON.parse(data);\n\t}},\n\t{type: \"URL\", IECompatible: true, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURI(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURI(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/plain\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"Text\", IECompatible: true, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}}\n];\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/dropzone.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-binary.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Construct the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"transclude\",\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t}\n\t}]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-binary.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-bitmap.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 300,\n\tDEFAULT_IMAGE_HEIGHT = 185;\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our element\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\tthis.widthDomNode = $tw.utils.domMaker(\"input\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor-width\",\n\t\teventListeners: [{\n\t\t\tname: \"change\", handlerObject: this, handlerMethod: \"handleWidthChangeEvent\"\n\t\t}]\n\t});\n\tthis.heightDomNode = $tw.utils.domMaker(\"input\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor-height\",\n\t\teventListeners: [{\n\t\t\tname: \"change\", handlerObject: this, handlerMethod: \"handleHeightChangeEvent\"\n\t\t}]\n\t});\n\t// Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tparent.insertBefore(this.widthDomNode,nextSibling);\n\tparent.insertBefore(this.heightDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode,this.widthDomNode,this.heightDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n};\n\n/*\nNote that the bitmap editor intentionally doesn't try to refresh itself because it would be confusing to have the image changing spontaneously while editting it\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.updateSize();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.updateSize();\n\t};\n\t// Get the current bitmap into an image object\n\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Update the input boxes with the actual size of the canvas\n*/\nEditBitmapWidget.prototype.updateSize = function() {\n\tthis.widthDomNode.value = this.currCanvas.width;\n\tthis.heightDomNode.value = this.currCanvas.height;\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleWidthChangeEvent = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(this.widthDomNode.value,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newWidth !== this.currCanvas.width) {\n\t\tthis.changeCanvasSize(newWidth,this.currCanvas.height);\n\t}\n\t// Update the input controls\n\tthis.updateSize();\n};\n\nEditBitmapWidget.prototype.handleHeightChangeEvent = function(event) {\n\t// Get the new width\n\tvar newHeight = parseInt(this.heightDomNode.value,10);\n\t// Update if necessary\n\tif(newHeight > 0 && newHeight !== this.currCanvas.height) {\n\t\tthis.changeCanvasSize(this.currCanvas.width,newHeight);\n\t}\n\t// Update the input controls\n\tthis.updateSize();\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseInt(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"),10);\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\tif(tiddler) {\n\t\t// data URIs look like \"data:<type>;base64,<text>\"\n\t\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type,1.0),\n\t\t\tposColon = dataURL.indexOf(\":\"),\n\t\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\t\tposComma = dataURL.indexOf(\",\"),\n\t\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\t\ttext = dataURL.substring(posComma+1);\n\t\tvar update = {type: type, text: text};\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,update));\n\t}\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-bitmap.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-text.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditTextWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditTextWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our element\n\tvar editInfo = this.getEditInfo();\n\tvar domNode = this.document.createElement(this.editTag);\n\tif(this.editType) {\n\t\tdomNode.setAttribute(\"type\",this.editType);\n\t}\n\tif(editInfo.value === \"\" && this.editPlaceholder) {\n\t\tdomNode.setAttribute(\"placeholder\",this.editPlaceholder);\n\t}\n\tif(this.editSize) {\n\t\tdomNode.setAttribute(\"size\",this.editSize);\n\t}\n\t// Assign classes\n\tif(this.editClass) {\n\t\tdomNode.className = this.editClass;\n\t}\n\t// Set the text\n\tif(this.editTag === \"textarea\") {\n\t\tdomNode.appendChild(this.document.createTextNode(editInfo.value));\n\t} else {\n\t\tdomNode.value = editInfo.value;\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n\t// Fix height\n\tthis.fixHeight();\n\t// Focus field\n\tif(this.editFocus === \"true\") {\n\t\tdomNode.focus();\n\t\tdomNode.select();\n\t}\n};\n\n/*\nGet the tiddler being edited and current value\n*/\nEditTextWidget.prototype.getEditInfo = function() {\n\t// Get the edit value\n\tvar self = this,\n\t\tvalue,\n\t\tupdate;\n\tif(this.editIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\tupdate = function(value) {\n\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// Get the current tiddler and the field name\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t} else {\n\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\tswitch(this.editField) {\n\t\t\t\tcase \"text\":\n\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"title\":\n\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\tvalue = this.editDefault;\n\t\t\t}\n\t\t}\n\t\tupdate = function(value) {\n\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\tupdateFields = {\n\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t};\n\t\t\tupdateFields[self.editField] = value;\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t};\n\t}\n\treturn {value: value, update: update};\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditTextWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editDefault = this.getAttribute(\"default\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editSize = this.getAttribute(\"size\");\n\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",\"yes\") === \"yes\";\n\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\tthis.editFocus = this.getAttribute(\"focus\");\n\t// Get the editor element tag and type\n\tvar tag,type;\n\tif(this.editField === \"text\") {\n\t\ttag = \"textarea\";\n\t} else {\n\t\ttag = \"input\";\n\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\ttag = fieldModule.editTag;\n\t\t}\n\t\tif(fieldModule && fieldModule.editType) {\n\t\t\ttype = fieldModule.editType;\n\t\t}\n\t\ttype = type || \"text\";\n\t}\n\t// Get the rest of our parameters\n\tthis.editTag = this.getAttribute(\"tag\",tag);\n\tthis.editType = this.getAttribute(\"type\",type);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Completely rerender if any of our attributes have changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.editTitle]) {\n\t\tthis.updateEditor(this.getEditInfo().value);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n/*\nUpdate the editor with new text. This method is separate from updateEditorDomNode()\nso that subclasses can override updateEditor() and still use updateEditorDomNode()\n*/\nEditTextWidget.prototype.updateEditor = function(text) {\n\tthis.updateEditorDomNode(text);\n};\n\n/*\nUpdate the editor dom node with new text\n*/\nEditTextWidget.prototype.updateEditorDomNode = function(text) {\n\t// Replace the edit value if the tiddler we're editing has changed\n\tvar domNode = this.domNodes[0];\n\tif(!domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.document.activeElement !== domNode) {\n\t\t\tdomNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nFix the height of textareas to fit their content\n*/\nEditTextWidget.prototype.fixHeight = function() {\n\tvar self = this,\n\t\tdomNode = this.domNodes[0];\n\tif(this.editAutoHeight && domNode && !domNode.isTiddlyWikiFakeDom && this.editTag === \"textarea\") {\n\t\t// Resize the textarea to fit its content, preserving scroll position\n\t\tvar scrollPosition = $tw.utils.getScrollPosition(),\n\t\t\tscrollTop = scrollPosition.y;\n\t\t// Measure the specified minimum height\n\t\tdomNode.style.height = self.editMinHeight;\n\t\tvar minHeight = domNode.offsetHeight;\n\t\t// Set its height to auto so that it snaps to the correct height\n\t\tdomNode.style.height = \"auto\";\n\t\t// Calculate the revised height\n\t\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,minHeight);\n\t\t// Only try to change the height if it has changed\n\t\tif(newHeight !== domNode.offsetHeight) {\n\t\t\tdomNode.style.height = newHeight + \"px\";\n\t\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t\t$tw.utils.forceLayout(domNode);\n\t\t\t// Check that the scroll position is still visible before trying to scroll back to it\n\t\t\tscrollTop = Math.min(scrollTop,self.document.body.scrollHeight - window.innerHeight);\n\t\t\twindow.scrollTo(scrollPosition.x,scrollTop);\n\t\t}\n\t}\n};\n\n/*\nHandle a dom \"input\" event\n*/\nEditTextWidget.prototype.handleInputEvent = function(event) {\n\tthis.saveChanges(this.domNodes[0].value);\n\tthis.fixHeight();\n\treturn true;\n};\n\nEditTextWidget.prototype.handleFocusEvent = function(event) {\n\tif(this.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.editFocusPopup,\n\t\t\twiki: this.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\nEditTextWidget.prototype.saveChanges = function(text) {\n\tvar editInfo = this.getEditInfo();\n\tif(text !== editInfo.value) {\n\t\teditInfo.update(text);\n\t}\n};\n\nexports[\"edit-text\"] = EditTextWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-text.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder}\n\t\t}\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/element.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Neuter blacklisted elements\n\tvar tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"safe-\" + tag;\n\t}\n\tvar domNode = this.document.createElementNS(this.namespace,tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nElementWidget.prototype.execute = function() {\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.parseTreeNode.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\t// Update our attributes\n\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/element.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/encrypt.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/encrypt.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/entity.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar textNode = this.document.createTextNode($tw.utils.entityDecode(this.parseTreeNode.entity));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/entity.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fieldmangler.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tvar modification = this.wiki.getModificationFields();\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tvar modification = this.wiki.getModificationFields();\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/fieldmangler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fields.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\t// Get the exclusion list\n\tvar exclude;\n\tif(this.exclude) {\n\t\texclude = this.exclude.split(\" \");\n\t} else {\n\t\texclude = [\"text\"]; \n\t}\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tfor(var fieldName in tiddler.fields) {\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tfields.push(fieldName);\n\t\t\t}\n\t\t}\n\t\tfields.sort();\n\t\tfor(var f=0; f<fields.length; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tvar row = this.template,\n\t\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\t\tif(reMatch) {\n\t\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trow = row.replace(\"$name$\",fieldName);\n\t\t\t\trow = row.replace(\"$value$\",value);\n\t\t\t\trow = row.replace(\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\t\ttext.push(row);\n\t\t\t}\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude || changedAttributes.stripTitlePrefix || changedTiddlers[this.tiddlerTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/fields.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/image.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.imageSource;\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/image.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/importvariables.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar self = this;\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\tvar widgetStackStart,widgetStackEnd;\n\tfunction addWidgetNode(widgetNode) {\n\t\tif(widgetNode) {\n\t\t\tif(!widgetStackStart && !widgetStackEnd) {\n\t\t\t\twidgetStackStart = widgetNode;\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t} else {\n\t\t\t\twidgetStackEnd.children = [widgetNode];\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t}\n\t\t}\n\t}\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = self.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\taddWidgetNode({\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params\n\t\t\t\t});\n\t\t\t\tparseTreeNode = parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\t// Add our own children to the end of the pile\n\tvar parseTreeNodes;\n\tif(widgetStackStart && widgetStackEnd) {\n\t\tparseTreeNodes = [widgetStackStart];\n\t\twidgetStackEnd.children = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/importvariables.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/keyboard.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.utils.checkKeyDescriptor(event,self.keyInfo)) {\n\t\t\tself.dispatchMessage(event);\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.key = this.getAttribute(\"key\");\n\tthis.keyInfo = $tw.utils.parseKeyDescriptor(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/keyboard.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/link.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true;\n\t// Render the link if required\n\tif(useWikiLinks) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Create our element\n\tvar domNode = this.document.createElement(\"a\");\n\t// Assign classes\n\tvar classes = [];\n\tif(this.linkClasses) {\n\t\tclasses.push(this.linkClasses);\n\t}\n\tclasses.push(\"tc-tiddlylink\");\n\tif(this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t}\n\tif(this.isMissing && !this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t} else {\n\t\tif(!this.isMissing) {\n\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t}\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Set an href\n\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\",\n\t\twikiLinkText = wikiLinkTemplate.replace(\"$uri_encoded$\",encodeURIComponent(this.to));\n\twikiLinkText = wikiLinkText.replace(\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\tdomNode.setAttribute(\"href\",wikiLinkText);\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\t{name: \"dragstart\", handlerObject: this, handlerMethod: \"handleDragStartEvent\"},\n\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\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 it's way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1)\n\t});\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nLinkWidget.prototype.handleDragStartEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\tif(this.to) {\n\t\t\t// Set the dragging class on the element being dragged\n\t\t\t$tw.utils.addClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t\t// Create the drag image elements\n\t\t\tthis.dragImage = this.document.createElement(\"div\");\n\t\t\tthis.dragImage.className = \"tc-tiddler-dragger\";\n\t\t\tvar inner = this.document.createElement(\"div\");\n\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\tinner.appendChild(this.document.createTextNode(this.to));\n\t\t\tthis.dragImage.appendChild(inner);\n\t\t\tthis.document.body.appendChild(this.dragImage);\n\t\t\t// Astoundingly, we need to cover the dragger up: http://www.kryogenix.org/code/browser/custom-drag-image.html\n\t\t\tvar cover = this.document.createElement(\"div\");\n\t\t\tcover.className = \"tc-tiddler-dragger-cover\";\n\t\t\tcover.style.left = (inner.offsetLeft - 16) + \"px\";\n\t\t\tcover.style.top = (inner.offsetTop - 16) + \"px\";\n\t\t\tcover.style.width = (inner.offsetWidth + 32) + \"px\";\n\t\t\tcover.style.height = (inner.offsetHeight + 32) + \"px\";\n\t\t\tthis.dragImage.appendChild(cover);\n\t\t\t// Set the data transfer properties\n\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t// First the image\n\t\t\tdataTransfer.effectAllowed = \"copy\";\n\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\tdataTransfer.setDragImage(this.dragImage.firstChild,-16,-16);\n\t\t\t}\n\t\t\t// Then the data\n\t\t\tdataTransfer.clearData();\n\t\t\tvar jsonData = this.wiki.getTiddlerAsJson(this.to),\n\t\t\t\ttextData = this.wiki.getTiddlerText(this.to,\"\"),\n\t\t\t\ttitle = (new RegExp(\"^\" + $tw.config.textPrimitives.wikiLink + \"$\",\"mg\")).exec(this.to) ? this.to : \"[[\" + this.to + \"]]\";\n\t\t\t// IE doesn't like these content types\n\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\tdataTransfer.setData(\"text/plain\",title);\n\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURI(jsonData));\n\t\t\t}\n\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURI(jsonData));\n\t\t\tdataTransfer.setData(\"Text\",title);\n\t\t\tevent.stopPropagation();\n\t\t} else {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\nLinkWidget.prototype.handleDragEndEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\t// Remove the dragging class on the element being dragged\n\t\t$tw.utils.removeClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t// Delete the drag image element\n\t\tif(this.dragImage) {\n\t\t\tthis.dragImage.parentNode.removeChild(this.dragImage);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Get the target tiddler title\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\t// Get the link title and aria label\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\t// Get the link classes\n\tthis.linkClasses = this.getAttribute(\"class\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/link.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/linkcatcher.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(this.catchTo) {\n\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.catchMessage && this.parentWidget) {\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: this.catchMessage,\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\tif(this.catchSet) {\n\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/linkcatcher.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/list.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// 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\treturn true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tvar hasChanged = 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\treturn hasChanged;\n\t}\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/list.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/macrocall.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar text = this.getVariable(this.parseTreeNode.name || this.getAttribute(\"$name\"),{params: params}),\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\tvar parser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\tparseTreeNodes = parser ? parser.tree : [];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/macrocall.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/navigator.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList}\n\t));\n};\n\nNavigatorWidget.prototype.findTitleInStory = function(storyList,title,defaultIndex) {\n\tvar p = storyList.indexOf(title);\n\treturn p === -1 ? defaultIndex : p;\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tvar p = storyList.indexOf(title);\n\twhile(p !== -1) {\n\t\tstoryList.splice(p,1);\n\t\tp = storyList.indexOf(title);\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tvar pos = storyList.indexOf(oldTitle);\n\tif(pos !== -1) {\n\t\tstoryList[pos] = newTitle;\n\t\tdo {\n\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\tif(pos !== -1) {\n\t\t\t\tstoryList.splice(pos,1);\n\t\t\t}\n\t\t} while(pos !== -1);\n\t} else {\n\t\tstoryList.splice(0,0,newTitle);\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tvar storyList = this.getStoryList();\n\tif(storyList) {\n\t\t// See if the tiddler is already there\n\t\tvar slot = this.findTitleInStory(storyList,title,-1);\n\t\t// If not we need to add it\n\t\tif(slot === -1) {\n\t\t\t// First we try to find the position of the story element we navigated from\n\t\t\tslot = this.findTitleInStory(storyList,fromTitle,-1) + 1;\n\t\t\t// Add the tiddler\n\t\t\tstoryList.splice(slot,0,title);\n\t\t\t// Save the story\n\t\t\tthis.saveStoryList(storyList);\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.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\tif(!event.navigateSuppressNavigation) {\n\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title),\n\t\tdraftTitle = draftTiddler.fields.title,\n\t\tstoryList = this.getStoryList();\n\tthis.removeTitleFromStory(storyList,draftTitle);\n\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler.fields[\"draft.of\"],\n\t\tconfirmationTitle;\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Delete this tiddler\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle;\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\";\n\t\tc++;\n\t} while(this.wiki.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Save the draft tiddler as the real tiddler\n\t\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields()));\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler.fields[\"draft.of\"],\n\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\tstoryList = this.getStoryList();\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true;\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(originalTiddler) {\n\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t} else {\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t}\n\t\t\tthis.saveStoryList(storyList);\n\t\t\t// Trigger an autosave\n\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\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\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags)\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\texistingTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\t\t\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\tvar self = this;\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\t\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\t\t\n\t}\n\treturn false;\n};\n\n// \nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerData(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push(\"The following tiddlers were imported:\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(tiddlerFields));\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: IMPORT_TITLE,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([IMPORT_TITLE]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/navigator.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/password.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/password.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/radio.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nRadio widget\n\nWill set a field to the selected value:\n\n```\n\t<$radio field=\"myfield\" value=\"check 1\">one</$radio>\n\t<$radio field=\"myfield\" value=\"check 2\">two</$radio>\n\t<$radio field=\"myfield\" value=\"check 3\">three</$radio>\n```\n\n|Parameter |Description |h\n|tiddler |Name of the tiddler in which the field should be set. Defaults to current tiddler |\n|field |The name of the field to be set |\n|value |The value to set |\n|class |Optional class name(s) |\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.radioClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(this.getValue() == this.radioValue) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.radioTitle);\n\treturn tiddler && tiddler.getFieldString(this.radioField);\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tif(this.radioClass !== \"\") {\n\t\tthis.radioClass += \" \";\n\t}\n\tthis.radioClass += \"tc-radio\";\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.value || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.radioTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/radio.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/raw.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/raw.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/reveal.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar domNode = this.document.createElement(this.parseTreeNode.isBlock ? \"div\" : \"span\");\n\tvar classes = this[\"class\"].split(\" \") || [];\n\tclasses.push(\"tc-reveal\");\n\tdomNode.className = classes.join(\" \");\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tdomNode.style.left = (this.popup.left - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTitle = this.state;\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state = this.stateTitle ? this.wiki.getTextReference(this.stateTitle,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.readMatchState(state);\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.readMatchState(state);\n\t\t\tthis.isOpen = !this.isOpen;\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.readMatchState = function(state) {\n\tthis.isOpen = state === this.text;\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes[\"default\"] || changedAttributes.animate) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false,\n\t\t\tcurrentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\trefreshed = true;\n\t\t\t}\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n }});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/reveal.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/scrollable.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tthis.scrollIntoView(event.target);\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/scrollable.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/select.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\tvar value = this.getSelectDomNode().value;\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tvar domNode = this.getSelectDomNode();\n\tif(domNode.value !== value) {\n\t\tdomNode.value = value;\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tif(changedTiddlers[this.selectTitle]) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/select.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/set.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tvar value = this.setValue;\n\tif(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(!this.setValue) {\n\t\t\tvalue = $tw.utils.stringifyList(results);\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t}\n\tthis.setVariable(this.setName,value,this.parseTreeNode.params);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.value || changedAttributes.emptyValue) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/set.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/text.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/text.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/tiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/tiddler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/transclude.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: \"Recursive transclusion error in transclude widget\"}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/transclude.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/view.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified();\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function() {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{parentWidget: this});\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/view.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/widget.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tif(arguments.length > 0) {\n\t\tthis.initialise(parseTreeNode,options);\n\t}\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\n*/\nWidget.prototype.setVariable = function(name,value,params) {\n\tthis.variables[name] = {value: value, params: params};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n*/\nWidget.prototype.getVariable = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\tvalue = variable.value;\n\t\t// Substitute any parameters specified in the definition\n\t\tvalue = this.substituteVariableParameters(value,variable.params,actualParams);\n\t\tvalue = this.substituteVariableReferences(value);\n\t\treturn value;\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn this.evaluateMacroModule(name,actualParams,options.defaultValue);\n};\n\nWidget.prototype.substituteVariableParameters = function(text,formalParams,actualParams) {\n\tif(formalParams) {\n\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\tparamInfo, paramValue;\n\t\t// Step through each of the parameters in the macro definition\n\t\tfor(var p=0; p<formalParams.length; p++) {\n\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\tparamInfo = formalParams[p];\n\t\t\tparamValue = undefined;\n\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\tnextAnonParameter++;\n\t\t\t}\n\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t}\n\t\t\t// If we've still not got a value, use the default, if any\n\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t// Replace any instances of this parameter\n\t\t\ttext = text.replace(new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(paramInfo.name) + \"\\\\$\",\"mg\"),paramValue);\n\t\t}\n\t}\n\treturn text;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn macro.run.apply(this,args).toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tname = name || \"transclusion\";\n\tvar output = [],\n\t\tnode = this;\n\twhile(node && node.parentWidget) {\n\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\toutput.push(node.getVariable(name));\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn $tw.utils.hashString(output.join(\"\"));\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.render(parent,nextSibling);\n\t});\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar self = this,\n\t\trefreshed = false;\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\trefreshed = childWidget.refresh(changedTiddlers) || refreshed;\n\t});\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\treturn parent.findNextSiblingDomNode(index);\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 any action widgets that are immediate children of this widget\n*/\nWidget.prototype.invokeActions = function(event) {\n\tvar handled = false;\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\tif(child.invokeAction && child.invokeAction(this,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\nexports.widget = Widget;\n\n})();\n",
"title": "$:/core/modules/widgets/widget.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/wiki.js": {
"text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\";\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value) {\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tdata[index] = value;\n\t\tthis.setTiddlerData(title,data,this.getModificationFields());\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || [];\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,tiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tvar fields = {\n\t\t\tcreated: new Date()\n\t\t},\n\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\tif(creator) {\n\t\tfields.creator = creator;\n\t}\n\treturn fields;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tvar fields = Object.create(null),\n\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\tfields.modified = new Date();\n\tif(modifier) {\n\t\tfields.modifier = modifier;\n\t}\n\treturn fields;\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\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\tif(isNumeric) {\n\t\t\ta = Number(a);\n\t\t\tb = Number(b);\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\t// Count up the links\n\t\tvar links = [],\n\t\t\tcheckParseTree = function(parseTree) {\n\t\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\tif(parser) {\n\t\t\tcheckParseTree(parser.tree);\n\t\t}\n\t\treturn links;\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinks = [];\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\tbacklinks.push(title);\n\t\t}\n\t});\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\tvar self = this;\n\treturn this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\tvar tagmap = self.getTagMap();\n\t\treturn self.sortByList(tagmap[tag],tag);\n\t});\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tvar currPos = titles.indexOf(title),\n\t\t\t\tnewPos = -1,\n\t\t\t\ttiddler = this.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(newPos === -1) {\n\t\t\t\t\tnewPos = currPos;\n\t\t\t\t}\n\t\t\t\tif(newPos !== currPos) {\n\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t}\n\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerData(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerData(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\n// Temporarily disable caching so that tweakParseTreeNode() works\nreturn initializer();\n\n//\tthis.caches = this.caches || Object.create(null);\n//\tvar caches = this.caches[title];\n//\tif(caches && caches[cacheName]) {\n//\t\treturn caches[cacheName];\n//\t} else {\n//\t\tif(!caches) {\n//\t\t\tcaches = Object.create(null);\n//\t\t\tthis.caches[title] = caches;\n//\t\t}\n//\t\tcaches[cacheName] = initializer();\n//\t\treturn caches[cacheName];\n//\t}\n};\n\n// Clear all caches associated with a particular tiddler\nexports.clearCache = function(title) {\n\tthis.caches = this.caches || Object.create(null);\n\tif($tw.utils.hop(this.caches,title)) {\n\t\tdelete this.caches[title];\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.old_parseText = function(type,text,options) {\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.config.fileExtensionInfo[type]) {\n\t\tParser = $tw.Wiki.parsers[$tw.config.fileExtensionInfo[type].type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.old_parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"newInlineParseTree\" : \"newBlockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.old_parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nvar tweakMacroDefinition = function(nodeList) {\n\tif(nodeList && nodeList[0] && nodeList[0].type === \"macrodef\") {\n\t\tnodeList[0].type = \"set\";\n\t\tnodeList[0].attributes = {\n\t\t\tname: {type: \"string\", value: nodeList[0].name},\n\t\t\tvalue: {type: \"string\", value: nodeList[0].text}\n\t\t};\n\t\tnodeList[0].children = nodeList.slice(1);\n\t\tnodeList.splice(1,nodeList.length-1);\n\t\ttweakMacroDefinition(nodeList[0].children);\n\t}\n};\n\nvar tweakParser = function(parser) {\n\t// Move any macro definitions to contain the body tree\n\ttweakMacroDefinition(parser.tree);\n};\n\nexports.parseText = function(type,text,options) {\n\tvar parser = this.old_parseText(type,text,options);\n\tif(parser) {\n\t\ttweakParser(parser);\n\t}\n\treturn parser;\n};\n\nexports.parseTiddler = function(title,options) {\n\tvar parser = this.old_parseTiddler(title,options);\n\tif(parser) {\n\t\ttweakParser(parser);\n\t}\n\treturn parser;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type || \"text/vnd.tiddlywiki\",tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.children: optional array of children for the transclude widget\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTree = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"transclude\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttiddler: {\n\t\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: title}},\n\t\t\t\tisBlock: !options.parseAsInline}]}\n\t]};\n\tif(options.field) {\n\t\tparseTree.tree[0].children[0].attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.children) {\n\t\tparseTree.tree[0].children[0].children = options.children;\n\t}\n\treturn $tw.wiki.makeWidget(parseTree,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tliteral: If true, searches for literal string, rather than separate search terms\n\tfield: If specified, restricts the search to the specified field\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tmatch;\n\t\tfor(var t=0; t<searchTermsRegExps.length; t++) {\n\t\t\tmatch = false;\n\t\t\tif(options.field) {\n\t\t\t\tmatch = searchTermsRegExps[t].test(tiddler.getFieldString(options.field));\n\t\t\t} else {\n\t\t\t\t// Search title, tags and body\n\t\t\t\tif(contentTypeInfo.encoding === \"utf8\") {\n\t\t\t\t\tmatch = match || searchTermsRegExps[t].test(tiddler.fields.text);\n\t\t\t\t}\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.join(\"\\0\") : \"\";\n\t\t\t\tmatch = match || searchTermsRegExps[t].test(tags) || searchTermsRegExps[t].test(tiddler.fields.title);\n\t\t\t}\n\t\t\tif(!match) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(tiddler.fields.text !== undefined) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text;\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,callback) {\n\tvar result = [],\n\t\toutstanding = files.length;\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t});\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,callback) {\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.config.fileExtensionInfo[file.name.substr(dotPos)];\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\t// Deserialise the file contents\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\", type: type};\n\t\t// Are we binary?\n\t\tif(isBinary) {\n\t\t\t// The base64 section starts after the first comma in the data URI\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttiddlerFields.text = text.substr(commaPos+1);\n\t\t\t\tcallback([tiddlerFields]);\n\t\t\t}\n\t\t} else {\n\t\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\t\tif(encryptedJson) {\n\t\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields));\n\t\t\t}\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]);\n\tif(!origTiddler) {\n\t\treturn tiddler.fields.text !== \"\";\n\t}\n\treturn tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"] || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\thistoryTitle = historyTitle || \"$:/HistoryList\";\n\tvar titles = $tw.utils.isArray(title) ? title : [title];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.getTiddlerData(historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: fromPageRect});\n\t});\n\tthis.setTiddlerData(historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/wiki.js",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/palettes/Blanca": {
"title": "$:/palettes/Blanca",
"name": "Blanca",
"description": "A clean white palette to let you focus",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #fffffffff\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>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\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>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\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/Contrast": {
"title": "$:/palettes/Contrast",
"name": "Contrast",
"description": "High contrast and unambiguous",
"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>>\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: #000000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,0,0, 0.5)\nsidebar-foreground: #ffffff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ececec\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: #999999\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/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>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\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/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>>\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: #ececec\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ececec\nsidebar-tab-background: <<colour tab-background>>\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\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/core/readme": {
"title": "$:/core/readme",
"text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
},
"$:/core/templates/MOTW.html": {
"title": "$:/core/templates/MOTW.html",
"text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)http://tiddlywiki.com --> "
},
"$:/core/templates/alltiddlers.template.html": {
"title": "$:/core/templates/alltiddlers.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
},
"$:/core/templates/canonical-uri-external-image": {
"title": "$:/core/templates/canonical-uri-external-image",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/css-tiddler": {
"title": "$:/core/templates/css-tiddler",
"text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
},
"$:/core/templates/exporters/CsvFile": {
"title": "$:/core/templates/exporters/CsvFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/CsvFile}}",
"extension": ".csv",
"text": "\\define renderContent()\n<$text text=<<csvtiddlers filter:\"\"\"$(exportFilter)$\"\"\" format:\"quoted-comma-sep\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/JsonFile": {
"title": "$:/core/templates/exporters/JsonFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/JsonFile}}",
"extension": ".json",
"text": "\\define renderContent()\n<$text text=<<jsontiddlers filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/StaticRiver": {
"title": "$:/core/templates/exporters/StaticRiver",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/StaticRiver}}",
"extension": ".html",
"text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
},
"$:/core/templates/exporters/StaticRiver/Content": {
"title": "$:/core/templates/exporters/StaticRiver/Content",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n<<renderContent>>\n</$importvariables>\n"
},
"$:/core/templates/exporters/TidFile": {
"title": "$:/core/templates/exporters/TidFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/TidFile}}",
"extension": ".tid",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\"><<renderContent>></$importvariables>"
},
"$:/core/templates/html-div-tiddler": {
"title": "$:/core/templates/html-div-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
},
"$:/core/templates/html-tiddler": {
"title": "$:/core/templates/html-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
},
"$:/core/templates/javascript-tiddler": {
"title": "$:/core/templates/javascript-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
},
"$:/core/templates/module-tiddler": {
"title": "$:/core/templates/module-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
},
"$:/core/templates/plain-text-tiddler": {
"title": "$:/core/templates/plain-text-tiddler",
"text": "<$view field=\"text\" format=\"text\" />"
},
"$:/core/save/all": {
"title": "$:/core/save/all",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/empty": {
"title": "$:/core/save/empty",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-images": {
"title": "$:/core/save/lazy-images",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/templates/split-recipe": {
"title": "$:/core/templates/split-recipe",
"text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
},
"$:/core/templates/static-tiddler": {
"title": "$:/core/templates/static-tiddler",
"text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
},
"$:/core/templates/static.area": {
"title": "$:/core/templates/static.area",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n"
},
"$:/core/templates/static.content": {
"title": "$:/core/templates/static.content",
"type": "text/vnd.tiddlywiki",
"text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|http://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
},
"$:/core/templates/static.template.css": {
"title": "$:/core/templates/static.template.css",
"text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
},
"$:/core/templates/static.template.html": {
"title": "$:/core/templates/static.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
},
"$:/core/templates/static.tiddler.html": {
"title": "$:/core/templates/static.tiddler.html",
"text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`{{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river\">\n`<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>\n</$importvariables>`\n</section>\n</body>\n</html>\n`"
},
"$:/core/templates/store.area.template.html": {
"title": "$:/core/templates/store.area.template.html",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
},
"$:/core/templates/tid-tiddler": {
"title": "$:/core/templates/tid-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/tiddler-metadata": {
"title": "$:/core/templates/tiddler-metadata",
"text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
},
"$:/core/templates/tiddlywiki5.html": {
"title": "$:/core/templates/tiddlywiki5.html",
"text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html>\n<head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\t\t<!-- Force IE standards mode for Intranet and HTA - should be the first meta -->\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}\n</div>\n</body>\n</html>\n"
},
"$:/core/templates/version": {
"title": "$:/core/templates/version",
"text": "<<version>>"
},
"$:/core/templates/wikified-tiddler": {
"title": "$:/core/templates/wikified-tiddler",
"text": "<$transclude />"
},
"$:/core/ui/AdvancedSearch/Filter": {
"title": "$:/core/ui/AdvancedSearch/Filter",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Filter/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Shadows": {
"title": "$:/core/ui/AdvancedSearch/Shadows",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Shadows/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Standard": {
"title": "$:/core/ui/AdvancedSearch/Standard",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Standard/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/System": {
"title": "$:/core/ui/AdvancedSearch/System",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/System/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/AdvancedSearch": {
"title": "$:/AdvancedSearch",
"text": "<div class=\"tc-advanced-search\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" \"$:/core/ui/AdvancedSearch/System\">>\n</div>\n"
},
"$:/core/ui/AlertTemplate": {
"title": "$:/core/ui/AlertTemplate",
"text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button message=\"tm-delete-tiddler\" class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=\"0hh:0mm:0ss DD MM YYYY\"/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">(count: <$view field=\"count\"/>)</span></$reveal>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
},
"$:/core/ui/BinaryWarning": {
"title": "$:/core/ui/BinaryWarning",
"text": "\\define lingo-base() $:/language/BinaryWarning/\n<div class=\"tc-binary-warning\">\n\n<<lingo Prompt>>\n\n</div>\n"
},
"$:/core/ui/ControlPanel/Advanced": {
"title": "$:/core/ui/ControlPanel/Advanced",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
"text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" \"$:/core/ui/ControlPanel/TiddlerFields\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Appearance": {
"title": "$:/core/ui/ControlPanel/Appearance",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
"text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Theme\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Basics": {
"title": "$:/core/ui/ControlPanel/Basics",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Basics/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit-text tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Tags\" default=\"\" tag=\"input\"/> |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
},
"$:/core/ui/ControlPanel/EditorTypes": {
"title": "$:/core/ui/ControlPanel/EditorTypes",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/Info": {
"title": "$:/core/ui/ControlPanel/Info",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Info/Caption}}",
"text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Basics\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/LoadedModules": {
"title": "$:/core/ui/ControlPanel/LoadedModules",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
},
"$:/core/ui/ControlPanel/Palette": {
"title": "$:/core/ui/ControlPanel/Palette",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Palette/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/snippets/paletteeditor}}\n\n</$reveal>\n\n"
},
"$:/core/ui/ControlPanel/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\\define plugin-table-body(type,disabledMessage)\n<div class=\"tc-plugin-info-chunk\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<div>\n''<$view field=\"description\"><$view field=\"title\"/></$view>'' $disabledMessage$\n</div>\n<div>\n<$view field=\"title\"/>\n</div>\n<div>\n<$view field=\"version\"/>\n</div>\n</div>\n\\end\n\\define plugin-table(type)\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[description]]\" emptyMessage=<<lingo \"Empty/Hint\">>>\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$reveal type=\"nomatch\" text=\"\" state=\"!!list\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList={{!!list}} default=\"readme\" template=\"$:/core/ui/PluginInfo\"/>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=\"!!list\">\nNo information provided\n</$reveal>\n</div>\n</$reveal>\n</$set>\n</$list>\n</$set>\n\\end\n\n! <<lingo Plugin/Prompt>>\n\n<<plugin-table plugin>>\n\n! <<lingo Theme/Prompt>>\n\n<<plugin-table theme>>\n\n! <<lingo Language/Prompt>>\n\n<<plugin-table language>>\n"
},
"$:/core/ui/ControlPanel/Saving": {
"title": "$:/core/ui/ControlPanel/Saving",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Saving/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/\n\\define backupURL()\nhttp://$(userName)$.tiddlyspot.com/backup/\n\\end\n\\define backupLink()\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<a href=<<backupURL>>><$macrocall $name=\"backupURL\" $type=\"text/plain\" $output=\"text/plain\"/></a>\n</$set>\n</$reveal>\n\\end\n! <<lingo TiddlySpot/Heading>>\n\n<<lingo TiddlySpot/Description>>\n\n|<<lingo TiddlySpot/UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo TiddlySpot/Password>> |<$password name=\"upload\"/> |\n|<<lingo TiddlySpot/Backups>> |<<backupLink>> |\n\n''<<lingo TiddlySpot/Advanced/Heading>>''\n\n|<<lingo TiddlySpot/ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo TiddlySpot/Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo TiddlySpot/UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo TiddlySpot/BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>\n\n"
},
"$:/core/ui/ControlPanel/Settings/AutoSave": {
"title": "$:/core/ui/ControlPanel/Settings/AutoSave",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/AutoSave/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/AutoSave/\n\n<$link to=\"$:/config/AutoSave\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo Disabled/Description>> </$radio>\n"
},
"$:/core/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/ToolbarButtons": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/StoryView": {
"title": "$:/core/ui/ControlPanel/StoryView",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
"text": "{{$:/snippets/viewswitcher}}\n"
},
"$:/core/ui/ControlPanel/Theme": {
"title": "$:/core/ui/ControlPanel/Theme",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Theme/Caption}}",
"text": "{{$:/snippets/themeswitcher}}\n"
},
"$:/core/ui/ControlPanel/TiddlerFields": {
"title": "$:/core/ui/ControlPanel/TiddlerFields",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
},
"$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/PageControls": {
"title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars": {
"title": "$:/core/ui/ControlPanel/Toolbars",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
"text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" \"$:/state/tabs/controlpanel/toolbars\" \"tc-vertical\">>\n</div>\n"
},
"$:/ControlPanel": {
"title": "$:/ControlPanel",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Info\">>\n</div>\n"
},
"$:/core/ui/DefaultSearchResultList": {
"title": "$:/core/ui/DefaultSearchResultList",
"tags": "$:/tags/SearchResults",
"caption": "{{$:/language/Search/DefaultResults/Caption}}",
"text": "\\define searchResultList()\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search{$(searchTiddler)$}]\"/>\"\"\">\n\n{{$:/language/Search/Matches}}\n\n</$set>\n\n//<small>Title matches:</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>All matches:</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\\end\n<<searchResultList>>\n"
},
"$:/core/ui/EditTemplate/body": {
"title": "$:/core/ui/EditTemplate/body",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Body/\n<$list filter=\"[is[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[is[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<em class=\"tc-edit\"><<lingo Hint>></em> <$button type=\"set\" set=\"$:/state/showeditpreview\" setTo=\"no\"><<lingo Preview/Button/Hide>></$button>\n\n<div class=\"tc-tiddler-preview\">\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude />\n\n</div>\n\n<div class=\"tc-tiddler-preview-edit\">\n<$edit field=\"text\" class=\"tc-edit-texteditor\" placeholder={{$:/language/EditTemplate/Body/Placeholder}}/>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<em class=\"tc-edit\"><<lingo Hint>></em> <$button type=\"set\" set=\"$:/state/showeditpreview\" setTo=\"yes\"><<lingo Preview/Button/Show>></$button>\n<$edit field=\"text\" class=\"tc-edit-texteditor\" placeholder={{$:/language/EditTemplate/Body/Placeholder}}/>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/EditTemplate/controls": {
"title": "$:/core/ui/EditTemplate/controls",
"tags": "$:/tags/EditTemplate",
"text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
},
"$:/core/ui/EditTemplate/fields": {
"title": "$:/core/ui/EditTemplate/fields",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define new-field(name,value)\n<$reveal type=\"nomatch\" text=\"\" default=\"\"\"$name$\"\"\">\n<$button>\n<$action-sendmessage $message=\"tm-add-field\" $name$=\"\"\"$value$\"\"\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=\"\"\"$name$\"\"\">\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n\\end\n\n<div class=\"tc-edit-fields\">\n<table class=\"tc-edit-fields\">\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=\"$:/temp/newfieldname\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} class=\"tc-edit-texteditor\"/>\n</span>\n<span class=\"tc-edit-field-add-value\">\n<$edit-text tiddler=\"$:/temp/newfieldvalue\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\"/>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\" name={{$:/temp/newfieldname}} value={{$:/temp/newfieldvalue}}/>\n</span>\n</div>\n</$fieldmangler>\n\n"
},
"$:/core/ui/EditTemplate/shadow": {
"title": "$:/core/ui/EditTemplate/shadow",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$list>\n"
},
"$:/core/ui/EditTemplate/tags": {
"title": "$:/core/ui/EditTemplate/tags",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\n\\end\n<div class=\"tc-edit-tags\">\n<$fieldmangler>\n<$list filter=\"[all[current]tags[]sort[title]]\" storyview=\"pop\"><$set name=\"backgroundColor\" value={{!!color}}><span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\" />\n<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">×</$button></span>\n</$set>\n</$list>\n\n<div class=\"tc-edit-add-tag\">\n<span class=\"tc-add-tag-name\">\n<$edit-text tiddler=\"$:/temp/NewTagName\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\"/>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$button message=\"tm-add-tag\" param={{$:/temp/NewTagName}} set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n<<lingo Tags/Add/Button>>\n</$button>\n</span>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown\">\n<$linkcatcher set=\"$:/temp/NewTagName\" setTo=\"\" message=\"tm-add-tag\">\n<$list filter=\"[!is[shadow]tags[]search{$:/temp/NewTagName}sort[title]]\">\n<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n</$fieldmangler>\n</div>"
},
"$:/core/ui/EditTemplate/title": {
"title": "$:/core/ui/EditTemplate/title",
"tags": "$:/tags/EditTemplate",
"text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus=\"true\"/>"
},
"$:/core/ui/EditTemplate/type": {
"title": "$:/core/ui/EditTemplate/type",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-popup-handle\"/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>"
},
"$:/core/ui/EditTemplate": {
"title": "$:/core/ui/EditTemplate",
"text": "\\define frame-classes()\ntc-tiddler-frame tc-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$\n\\end\n<div class=<<frame-classes>>>\n<$set name=\"storyTiddler\" value=<<currentTiddler>>>\n<$keyboard key=\"escape\" message=\"tm-cancel-tiddler\">\n<$keyboard key=\"ctrl+enter\" message=\"tm-save-tiddler\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$list>\n</$keyboard>\n</$keyboard>\n</$set>\n</div>\n"
},
"$:/core/ui/Buttons/cancel": {
"title": "$:/core/ui/Buttons/cancel",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
"description": "{{$:/language/Buttons/Cancel/Hint}}",
"text": "<$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/delete": {
"title": "$:/core/ui/Buttons/delete",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
"description": "{{$:/language/Buttons/Delete/Hint}}",
"text": "<$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save": {
"title": "$:/core/ui/Buttons/save",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
"description": "{{$:/language/Buttons/Save/Hint}}",
"text": "<$button message=\"tm-save-tiddler\" tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/Filters/AllTags": {
"title": "$:/core/Filters/AllTags",
"tags": "$:/tags/Filter",
"filter": "[tags[]!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTags}}",
"text": ""
},
"$:/core/Filters/AllTiddlers": {
"title": "$:/core/Filters/AllTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTiddlers}}",
"text": ""
},
"$:/core/Filters/Drafts": {
"title": "$:/core/Filters/Drafts",
"tags": "$:/tags/Filter",
"filter": "[has[draft.of]sort[title]]",
"description": "{{$:/language/Filters/Drafts}}",
"text": ""
},
"$:/core/Filters/Missing": {
"title": "$:/core/Filters/Missing",
"tags": "$:/tags/Filter",
"filter": "[all[missing]sort[title]]",
"description": "{{$:/language/Filters/Missing}}",
"text": ""
},
"$:/core/Filters/Orphans": {
"title": "$:/core/Filters/Orphans",
"tags": "$:/tags/Filter",
"filter": "[all[orphans]sort[title]]",
"description": "{{$:/language/Filters/Orphans}}",
"text": ""
},
"$:/core/Filters/OverriddenShadowTiddlers": {
"title": "$:/core/Filters/OverriddenShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[shadow]]",
"description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentSystemTiddlers": {
"title": "$:/core/Filters/RecentSystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentSystemTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentTiddlers": {
"title": "$:/core/Filters/RecentTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentTiddlers}}",
"text": ""
},
"$:/core/Filters/ShadowTiddlers": {
"title": "$:/core/Filters/ShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[all[shadows]sort[title]]",
"description": "{{$:/language/Filters/ShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/SystemTags": {
"title": "$:/core/Filters/SystemTags",
"tags": "$:/tags/Filter",
"filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTags}}",
"text": ""
},
"$:/core/Filters/SystemTiddlers": {
"title": "$:/core/Filters/SystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTiddlers}}",
"text": ""
},
"$:/core/ui/ImportListing": {
"title": "$:/core/ui/ImportListing",
"text": "\\define lingo-base() $:/language/Import/\n\\define messageField()\nmessage-$(payloadTiddler)$\n\\end\n\\define selectionField()\nselection-$(payloadTiddler)$\n\\end\n\\define previewPopupState()\n$(currentTiddler)$!!popup-$(payloadTiddler)$\n\\end\n<table>\n<tbody>\n<tr>\n<th>\n<<lingo Listing/Select/Caption>>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\"/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n</td>\n</tr>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>>>\n<$transclude subtiddler=<<payloadTiddler>> mode=\"block\"/>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ListItemTemplate": {
"title": "$:/core/ui/ListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</div>"
},
"$:/core/ui/MissingTemplate": {
"title": "$:/core/ui/MissingTemplate",
"text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
},
"$:/core/ui/MoreSideBar/All": {
"title": "$:/core/ui/MoreSideBar/All",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/All/Caption}}",
"text": "<$list filter=\"[!is[system]sort[title]]\" 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=\"[has[draft.of]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Missing": {
"title": "$:/core/ui/MoreSideBar/Missing",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Missing/Caption}}",
"text": "<$list filter=\"[all[missing]sort[title]]\" 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=\"[all[orphans]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Recent": {
"title": "$:/core/ui/MoreSideBar/Recent",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/MoreSideBar/Shadows": {
"title": "$:/core/ui/MoreSideBar/Shadows",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Shadows/Caption}}",
"text": "<$list filter=\"[all[shadows]sort[title]]\" 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=\"[is[system]sort[title]]\" 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=\"[tags[]!is[system]sort[title]]\">\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/> <small class=\"tc-menu-list-count\"><$count filter=\"[all[current]tagging[]]\"/></small>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}} <small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n"
},
"$:/core/ui/MoreSideBar/Types": {
"title": "$:/core/ui/MoreSideBar/Types",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Types/Caption}}",
"text": "<$list filter=\"[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
},
"$:/core/ui/Buttons/advanced-search": {
"title": "$:/core/ui/Buttons/advanced-search",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
"description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
"text": "<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-all": {
"title": "$:/core/ui/Buttons/close-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
"description": "{{$:/language/Buttons/CloseAll/Hint}}",
"text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/control-panel": {
"title": "$:/core/ui/Buttons/control-panel",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
"description": "{{$:/language/Buttons/ControlPanel/Hint}}",
"text": "<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/encryption": {
"title": "$:/core/ui/Buttons/encryption",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
"description": "{{$:/language/Buttons/Encryption/Hint}}",
"text": "<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>"
},
"$:/core/ui/Buttons/export-page": {
"title": "$:/core/ui/Buttons/export-page",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
"description": "{{$:/language/Buttons/ExportPage/Hint}}",
"text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
},
"$:/core/ui/Buttons/full-screen": {
"title": "$:/core/ui/Buttons/full-screen",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
"description": "{{$:/language/Buttons/FullScreen/Hint}}",
"text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/home": {
"title": "$:/core/ui/Buttons/home",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
"description": "{{$:/language/Buttons/Home/Hint}}",
"text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/import": {
"title": "$:/core/ui/Buttons/import",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
"description": "{{$:/language/Buttons/Import/Hint}}",
"text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
},
"$:/core/ui/Buttons/language": {
"title": "$:/core/ui/Buttons/language",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
"description": "{{$:/language/Buttons/Language/Hint}}",
"text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down tc-drop-down-language-chooser\">\n<$linkcatcher to=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$link>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/language\" text=<<currentTiddler>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/language\" text=<<currentTiddler>>>\n \n</$reveal>\n</span>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/more-page-actions": {
"title": "$:/core/ui/Buttons/more-page-actions",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-journal": {
"title": "$:/core/ui/Buttons/new-journal",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
"description": "{{$:/language/Buttons/NewJournal/Hint}}",
"text": "\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<now \"$(journalTitleTemplate)$\">> tags=\"$(journalTags)$\"/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<<journalButton>>\n</$set></$set>"
},
"$:/core/ui/Buttons/new-tiddler": {
"title": "$:/core/ui/Buttons/new-tiddler",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
"description": "{{$:/language/Buttons/NewTiddler/Hint}}",
"text": "<$button message=\"tm-new-tiddler\" tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/refresh": {
"title": "$:/core/ui/Buttons/refresh",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
"description": "{{$:/language/Buttons/Refresh/Hint}}",
"text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save-wiki": {
"title": "$:/core/ui/Buttons/save-wiki",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
"description": "{{$:/language/Buttons/SaveWiki/Hint}}",
"text": "<$button message=\"tm-save-wiki\" param={{$:/config/SaveWikiButton/Template}} tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
},
"$:/core/ui/Buttons/storyview": {
"title": "$:/core/ui/Buttons/storyview",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
"description": "{{$:/language/Buttons/StoryView/Hint}}",
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/view\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$link to=<<storyview>>>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/view\" text=<<storyview>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/view\" text=<<storyview>>>\n \n</$reveal>\n</span>\n<$transclude tiddler=<<icon>>/>\n<$text text=<<storyview>>/></$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/tag-manager": {
"title": "$:/core/ui/Buttons/tag-manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
"description": "{{$:/language/Buttons/TagManager/Hint}}",
"text": "<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/theme": {
"title": "$:/core/ui/Buttons/theme",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
"description": "{{$:/language/Buttons/Theme/Hint}}",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\" variable=\"themeTitle\">\n<$link to=<<themeTitle>>>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/theme\" text=<<themeTitle>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/theme\" text=<<themeTitle>>>\n \n</$reveal>\n</span>\n<$view tiddler=<<themeTitle>> field=\"name\"/>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/PageTemplate/pagecontrols": {
"title": "$:/core/ui/PageTemplate/pagecontrols",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$reveal>\n</$list>\n</div>\n\n"
},
"$:/core/ui/PageStylesheet": {
"title": "$:/core/ui/PageStylesheet",
"text": "<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$importvariables>\n"
},
"$:/core/ui/PageTemplate/alerts": {
"title": "$:/core/ui/PageTemplate/alerts",
"tags": "$:/tags/PageTemplate",
"text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
},
"$:/core/ui/PageTemplate/sidebar": {
"title": "$:/core/ui/PageTemplate/sidebar",
"tags": "$:/tags/PageTemplate",
"text": "<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\">\n\n<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n\n<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n\n{{||$:/core/ui/PageTemplate/pagecontrols}}\n\n<$transclude tiddler=\"$:/core/ui/SideBarLists\" mode=\"inline\"/>\n\n</$reveal>\n\n</div>\n\n</$scrollable>"
},
"$:/core/ui/PageTemplate/story": {
"title": "$:/core/ui/PageTemplate/story",
"tags": "$:/tags/PageTemplate",
"text": "<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template=\"$:/core/ui/ViewTemplate\" editTemplate=\"$:/core/ui/EditTemplate\" storyview={{$:/view}} />\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
},
"$:/core/ui/PageTemplate/topleftbar": {
"title": "$:/core/ui/PageTemplate/topleftbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate/toprightbar": {
"title": "$:/core/ui/PageTemplate/toprightbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate": {
"title": "$:/core/ui/PageTemplate",
"text": "\\define containerClasses()\ntc-page-container tc-page-view-$(themeTitle)$ tc-language-$(languageTitle)$\n\\end\n\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$set name=\"themeTitle\" value={{$:/view}}>\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$set name=\"currentTiddler\" value=\"\">\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$dropzone>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$importvariables>\n"
},
"$:/core/ui/PluginInfo": {
"title": "$:/core/ui/PluginInfo",
"text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\nNo ''\"<$text text=<<currentTab>>/>\"'' found\n</$transclude>\n</$transclude>\n</$transclude>\n"
},
"$:/core/ui/SearchResults": {
"title": "$:/core/ui/SearchResults",
"text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n\n</div>\n"
},
"$:/core/ui/SideBar/More": {
"title": "$:/core/ui/SideBar/More",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/More/Caption}}",
"text": "<div class=\"tc-more-sidebar\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" \"$:/core/ui/MoreSideBar/Tags\" \"$:/state/tab/moresidebar\" \"tc-vertical\">>\n</div>\n"
},
"$:/core/ui/SideBar/Open": {
"title": "$:/core/ui/SideBar/Open",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Open/Caption}}",
"text": "\\define lingo-base() $:/language/CloseAll/\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" storyview=\"pop\">\n\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini\">×</$button> <$link to={{!!title}}><$view field=\"title\"/></$link>\n\n</$list>\n\n<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\n"
},
"$:/core/ui/SideBar/Recent": {
"title": "$:/core/ui/SideBar/Recent",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/SideBar/Tools": {
"title": "$:/core/ui/SideBar/Tools",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/SideBarLists": {
"title": "$:/core/ui/SideBarLists",
"text": "<div class=\"tc-sidebar-lists\">\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n{{$:/core/ui/SearchResults}}\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" \"$:/core/ui/SideBar/Open\" \"$:/state/tab/sidebar\">>\n\n</$reveal>\n\n</div>\n"
},
"$:/TagManager": {
"title": "$:/TagManager",
"text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/icon/$title$\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/icon/$title$\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$title$!!icon\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define qualifyTitle(title)\n$title$$(currentTiddler)$\n\\end\n\\define toggleButton(state)\n<$reveal state=\"$state$\" type=\"match\" text=\"closed\" default=\"closed\">\n<$button set=\"$state$\" setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal state=\"$state$\" type=\"match\" text=\"open\" default=\"closed\">\n<$button set=\"$state$\" setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td><$transclude tiddler=\"$:/core/ui/TagTemplate\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state=<<qualifyTitle \"$:/state/tag-manager/\">> /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td>\n<$reveal state=<<qualifyTitle \"$:/state/tag-manager/\">> type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n<td></td>\n<td></td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/TagTemplate": {
"title": "$:/core/ui/TagTemplate",
"text": "\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB)\n<$set name=\"foregroundColor\" value=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">>>\n<$set name=\"backgroundColor\" value=\"\"\"$colour$\"\"\">\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-tag-label\" style=<<tag-styles>>>\n<$transclude tiddler={{!!icon}}/> <$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\"><div class=\"tc-drop-down\"><$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]tagging[]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</$set>\n</$set>\n\\end\n\n\\define tag-body(colour,palette)\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}}/>\n</span>\n\\end\n\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}}/>\n"
},
"$:/core/ui/TiddlerFieldTemplate": {
"title": "$:/core/ui/TiddlerFieldTemplate",
"text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
},
"$:/core/ui/TiddlerFields": {
"title": "$:/core/ui/TiddlerFields",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
},
"$:/core/ui/TiddlerInfo/Advanced": {
"title": "$:/core/ui/TiddlerInfo/Advanced",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Fields": {
"title": "$:/core/ui/TiddlerInfo/Fields",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
"text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
},
"$:/core/ui/TiddlerInfo/List": {
"title": "$:/core/ui/TiddlerInfo/List",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/List/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Listed": {
"title": "$:/core/ui/TiddlerInfo/Listed",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Tagging": {
"title": "$:/core/ui/TiddlerInfo/Tagging",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Tools": {
"title": "$:/core/ui/TiddlerInfo/Tools",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/TiddlerInfo": {
"title": "$:/core/ui/TiddlerInfo",
"text": "<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>"
},
"$:/core/ui/TopBar/menu": {
"title": "$:/core/ui/TopBar/menu",
"tags": "$:/tags/TopRightBar",
"text": "<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$reveal>\n"
},
"$:/core/ui/UntaggedTemplate": {
"title": "$:/core/ui/UntaggedTemplate",
"text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/body": {
"title": "$:/core/ui/ViewTemplate/body",
"tags": "$:/tags/ViewTemplate",
"text": "<div class=\"tc-tiddler-body\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</div>\n"
},
"$:/core/ui/ViewTemplate/classic": {
"title": "$:/core/ui/ViewTemplate/classic",
"tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/import": {
"title": "$:/core/ui/ViewTemplate/import",
"tags": "$:/tags/ViewTemplate",
"text": "\\define lingo-base() $:/language/Import/\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n{{||$:/core/ui/ImportListing}}\n\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/plugin": {
"title": "$:/core/ui/ViewTemplate/plugin",
"tags": "$:/tags/ViewTemplate",
"text": "<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n\n{{||$:/core/ui/TiddlerInfo/Advanced/PluginInfo}}\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/subtitle": {
"title": "$:/core/ui/ViewTemplate/subtitle",
"tags": "$:/tags/ViewTemplate",
"text": "<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"relativedate\"/>\n</div>\n"
},
"$:/core/ui/ViewTemplate/tags": {
"title": "$:/core/ui/ViewTemplate/tags",
"tags": "$:/tags/ViewTemplate",
"text": "<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n"
},
"$:/core/ui/ViewTemplate/title": {
"title": "$:/core/ui/ViewTemplate/title",
"tags": "$:/tags/ViewTemplate",
"text": "\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list>\n</span>\n<$set name=\"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</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo\"/>\n\n</$reveal>\n</div>"
},
"$:/core/ui/ViewTemplate": {
"title": "$:/core/ui/ViewTemplate",
"text": "\\define frame-classes()\ntc-tiddler-frame tc-tiddler-view-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$ $(tiddlerTagClasses)$\n\\end\n<$set name=\"storyTiddler\" value=<<currentTiddler>>><$set name=\"tiddlerInfoState\" value=<<qualify \"$:/state/popup/tiddler-info\">>><$tiddler tiddler=<<currentTiddler>>><div class=<<frame-classes>>><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$tiddler></$set></$set>\n"
},
"$:/core/ui/Buttons/clone": {
"title": "$:/core/ui/Buttons/clone",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
"description": "{{$:/language/Buttons/Clone/Hint}}",
"text": "<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Clone/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-others": {
"title": "$:/core/ui/Buttons/close-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
"description": "{{$:/language/Buttons/CloseOthers/Hint}}",
"text": "<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseOthers/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close": {
"title": "$:/core/ui/Buttons/close",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
"description": "{{$:/language/Buttons/Close/Hint}}",
"text": "<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Close/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/edit": {
"title": "$:/core/ui/Buttons/edit",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
"description": "{{$:/language/Buttons/Edit/Hint}}",
"text": "<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Edit/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/export-tiddler": {
"title": "$:/core/ui/Buttons/export-tiddler",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
"description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
"text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
},
"$:/core/ui/Buttons/info": {
"title": "$:/core/ui/Buttons/info",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
"description": "{{$:/language/Buttons/Info/Hint}}",
"text": "<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Info/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/core/ui/Buttons/more-tiddler-actions",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n<$transclude tiddler=<<listItem>>/>\n</$reveal>\n</$list>\n</$set>\n</$set>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/new-here": {
"title": "$:/core/ui/Buttons/new-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
"description": "{{$:/language/Buttons/NewHere/Hint}}",
"text": "\\define newHereButtonTags()\n[[$(currentTiddler)$]]\n\\end\n\\define newHereButton()\n<$button tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<newHereButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewHere/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>"
},
"$:/core/ui/Buttons/new-journal-here": {
"title": "$:/core/ui/Buttons/new-journal-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
"description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
"text": "\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<now \"$(journalTitleTemplate)$\">> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournalHere/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set></$set></$set>"
},
"$:/core/ui/Buttons/permalink": {
"title": "$:/core/ui/Buttons/permalink",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
"description": "{{$:/language/Buttons/Permalink/Hint}}",
"text": "<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Permalink/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permaview": {
"title": "$:/core/ui/Buttons/permaview",
"tags": "$:/tags/ViewToolbar $:/tags/PageControls",
"caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
"description": "{{$:/language/Buttons/Permaview/Hint}}",
"text": "<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Permaview/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/DefaultTiddlers": {
"title": "$:/DefaultTiddlers",
"text": "GettingStarted\n"
},
"$:/temp/advancedsearch": {
"title": "$:/temp/advancedsearch",
"text": ""
},
"$:/snippets/allfields": {
"title": "$:/snippets/allfields",
"text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
},
"$:/config/AnimationDuration": {
"title": "$:/config/AnimationDuration",
"text": "400"
},
"$:/config/AutoSave": {
"title": "$:/config/AutoSave",
"text": "yes"
},
"$:/config/BitmapEditor/Colour": {
"title": "$:/config/BitmapEditor/Colour",
"text": "#ff0"
},
"$:/config/BitmapEditor/LineWidth": {
"title": "$:/config/BitmapEditor/LineWidth",
"text": "3"
},
"$:/config/EditTemplateFields/Visibility/title": {
"title": "$:/config/EditTemplateFields/Visibility/title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/tags": {
"title": "$:/config/EditTemplateFields/Visibility/tags",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/text": {
"title": "$:/config/EditTemplateFields/Visibility/text",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/creator": {
"title": "$:/config/EditTemplateFields/Visibility/creator",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/created": {
"title": "$:/config/EditTemplateFields/Visibility/created",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modified": {
"title": "$:/config/EditTemplateFields/Visibility/modified",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modifier": {
"title": "$:/config/EditTemplateFields/Visibility/modifier",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/type": {
"title": "$:/config/EditTemplateFields/Visibility/type",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.title": {
"title": "$:/config/EditTemplateFields/Visibility/draft.title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.of": {
"title": "$:/config/EditTemplateFields/Visibility/draft.of",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/revision": {
"title": "$:/config/EditTemplateFields/Visibility/revision",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/bag": {
"title": "$:/config/EditTemplateFields/Visibility/bag",
"text": "hide"
},
"$:/config/EditorTypeMappings/image/gif": {
"title": "$:/config/EditorTypeMappings/image/gif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpeg": {
"title": "$:/config/EditorTypeMappings/image/jpeg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpg": {
"title": "$:/config/EditorTypeMappings/image/jpg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/png": {
"title": "$:/config/EditorTypeMappings/image/png",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/x-icon": {
"title": "$:/config/EditorTypeMappings/image/x-icon",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "text"
},
"$:/config/Navigation/UpdateAddressBar": {
"title": "$:/config/Navigation/UpdateAddressBar",
"text": "no"
},
"$:/config/Navigation/UpdateHistory": {
"title": "$:/config/Navigation/UpdateHistory",
"text": "no"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
"text": "hide"
},
"$:/config/SaveWikiButton/Template": {
"title": "$:/config/SaveWikiButton/Template",
"text": "$:/core/save/all"
},
"$:/config/SaverFilter": {
"title": "$:/config/SaverFilter",
"text": "[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state]] -[prefix[$:/temp]]"
},
"$:/config/SearchResults/Default": {
"title": "$:/config/SearchResults/Default",
"text": "$:/core/ui/DefaultSearchResultList"
},
"$:/config/SyncFilter": {
"title": "$:/config/SyncFilter",
"text": "[is[tiddler]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]]"
},
"$:/config/TiddlerInfo/Default": {
"title": "$:/config/TiddlerInfo/Default",
"text": "$:/core/ui/TiddlerInfo/Fields"
},
"$:/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/permalink": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/snippets/currpalettepreview": {
"title": "$:/snippets/currpalettepreview",
"text": "\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch(colour)\n<$set name=\"swatchColour\" value={{##$colour$}}>\n<div class=\"tc-swatch\" style=<<swatchStyle>>/>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\">\n<<swatch foreground>>\n<<swatch background>>\n<<swatch muted-foreground>>\n<<swatch primary>>\n<<swatch page-background>>\n<<swatch tab-background>>\n<<swatch tiddler-info-background>>\n</div>\n"
},
"$:/snippets/download-wiki-button": {
"title": "$:/snippets/download-wiki-button",
"text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
},
"$:/language": {
"title": "$:/language",
"text": "$:/languages/en-GB"
},
"$:/snippets/languageswitcher": {
"title": "$:/snippets/languageswitcher",
"text": "{{$:/language/ControlPanel/Basics/Language/Prompt}} <$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/core/macros/CSS": {
"title": "$:/core/macros/CSS",
"tags": "$:/tags/Macro",
"text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"/></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n"
},
"$:/core/macros/export": {
"title": "$:/core/macros/export",
"tags": "$:/tags/Macro",
"text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n"
},
"$:/core/macros/lingo": {
"title": "$:/core/macros/lingo",
"tags": "$:/tags/Macro",
"text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
},
"$:/core/macros/list": {
"title": "$:/core/macros/list",
"tags": "$:/tags/Macro",
"text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\")\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\">\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n"
},
"$:/core/macros/tabs": {
"title": "$:/core/macros/tabs",
"tags": "$:/tags/Macro",
"text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template)\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n<$button set=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$button>\n</$list>\n</div><div class=\"tc-tab-divider $class$\"/><div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tag": {
"title": "$:/core/macros/tag",
"tags": "$:/tags/Macro",
"text": "\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
},
"$:/core/macros/timeline": {
"created": "20141212105914482",
"modified": "20141212110330815",
"tags": "$:/tags/Macro",
"title": "$:/core/macros/timeline",
"type": "text/vnd.tiddlywiki",
"text": "\\define timeline-title()\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday{!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}>\n<<timeline-title>>\n</$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
},
"$:/core/macros/toc": {
"title": "$:/core/macros/toc",
"tags": "$:/tags/Macro",
"text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$set>\n\\end\n\n\\define toc-body(rootTag,tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc\">\n<$list filter=\"\"\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\"\"\">\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link><$view field='caption'><$view field='title'/></$view></$link>\">\n<<toc-caption>>\n</$list>\n<$list filter=\"\"\"[all[current]] -[[$rootTag$]]\"\"\">\n<$macrocall $name=\"toc-body\" rootTag=\"\"\"$rootTag$\"\"\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$list>\n</li>\n</$set>\n</$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter)\n<<toc-body rootTag:\"\"\"$tag$\"\"\" tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"itemClassFilter\"\"\">>\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$link>\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<<toc-caption>>\n</$link>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc toc-expandable\">\n<$list filter=\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\">\n<$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<<toc-linked-expandable-body tag:'$tag$' sort:'$sort$' itemClassFilter:'$itemClassFilter$'>>\">\n<<toc-unlinked-expandable-body tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"itemClassFilter\"\"\">>\n</$list>\n</$list>\n</ol>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$link>\n<$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</$list>\n<<toc-caption>>\n</$link>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n</$list>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"\"\"toc-selective-expandable\"\"\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc toc-selective-expandable\">\n<$list filter=\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\">\n<$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=\"<<toc-linked-selective-expandable-body tag:'$tag$' sort:'$sort$' itemClassFilter:'$itemClassFilter$'>>\">\n<<toc-unlinked-selective-expandable-body tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"$itemClassFilter$\"\"\">>\n</$list>\n</$list>\n</ol>\n\\end\n\n\\define toc-tabbed-selected-item-filter(selectedTiddler)\n[all[current]field:title{$selectedTiddler$}]\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{$selectedTiddler$}}>\n<div class=\"tc-tabbed-table-of-contents\">\n<$linkcatcher to=\"$selectedTiddler$\">\n<div class=\"tc-table-of-contents\">\n<$macrocall $name=\"toc-selective-expandable\" tag=\"\"\"$tag$\"\"\" sort=\"\"\"$sort$\"\"\" itemClassFilter=<<toc-tabbed-selected-item-filter selectedTiddler:\"\"\"$selectedTiddler$\"\"\">>/>\n</div>\n</$linkcatcher>\n<div class=\"tc-tabbed-table-of-contents-content\">\n<$reveal state=\"\"\"$selectedTiddler$\"\"\" type=\"nomatch\" text=\"\">\n<$transclude mode=\"block\" tiddler=\"$template$\">\n<h1><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></h1>\n<$transclude mode=\"block\">$missingText$</$transclude>\n</$transclude>\n</$reveal>\n<$reveal state=\"\"\"$selectedTiddler$\"\"\" type=\"match\" text=\"\">\n$unselectedText$\n</$reveal>\n</div>\n</div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=\"\"\"$selectedTiddler$\"\"\">\n<$macrocall $name=\"toc-tabbed-external-nav\" tag=\"\"\"$tag$\"\"\" sort=\"\"\"$sort$\"\"\" selectedTiddler=\"\"\"$selectedTiddler$\"\"\" unselectedText=\"\"\"$unselectedText$\"\"\" missingText=\"\"\"$missingText$\"\"\" template=\"\"\"$template$\"\"\"/>\n</$linkcatcher>\n\\end\n\n"
},
"$:/snippets/minilanguageswitcher": {
"title": "$:/snippets/minilanguageswitcher",
"text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/minithemeswitcher": {
"title": "$:/snippets/minithemeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/modules": {
"title": "$:/snippets/modules",
"text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
},
"$:/palette": {
"title": "$:/palette",
"text": "$:/palettes/Vanilla"
},
"$:/snippets/paletteeditor": {
"title": "$:/snippets/paletteeditor",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n{{$:/language/Docs/PaletteColours/$colour$}}\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<table>\n<tbody>\n<$list filter=\"[all[current]indexes[]]\" variable=\"colourName\">\n<tr>\n<td>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<$edit-text index=<<colourName>> tag=\"input\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n</$set>\n"
},
"$:/snippets/palettepreview": {
"title": "$:/snippets/palettepreview",
"text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n<$transclude tiddler=\"$:/snippets/currpalettepreview\"/>\n</$set>\n"
},
"$:/snippets/paletteswitcher": {
"title": "$:/snippets/paletteswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n<<lingo Prompt>> <$view tiddler={{$:/palette}} field=\"name\"/>\n\n<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[description]]\"><div class=\"tc-chooser-item\"><$link to={{!!title}}><div><$reveal state=\"$:/palette\" type=\"match\" text={{!!title}}>•</$reveal><$reveal state=\"$:/palette\" type=\"nomatch\" text={{!!title}}> </$reveal> ''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/></div><$transclude tiddler=\"$:/snippets/currpalettepreview\"/></$link></div>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/temp/search": {
"title": "$:/temp/search",
"text": ""
},
"$:/tags/AdvancedSearch": {
"title": "$:/tags/AdvancedSearch",
"list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
},
"$:/tags/ControlPanel": {
"title": "$:/tags/ControlPanel",
"list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
},
"$:/tags/ControlPanel/Info": {
"title": "$:/tags/ControlPanel/Info",
"list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
},
"$:/tags/EditTemplate": {
"title": "$:/tags/EditTemplate",
"list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
},
"$:/tags/EditToolbar": {
"title": "$:/tags/EditToolbar",
"list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
},
"$:/tags/MoreSideBar": {
"title": "$:/tags/MoreSideBar",
"list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]]",
"text": ""
},
"$:/tags/PageControls": {
"title": "$:/tags/PageControls",
"list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
},
"$:/tags/PageTemplate": {
"title": "$:/tags/PageTemplate",
"list": "[[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]] [[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]]",
"text": ""
},
"$:/tags/SideBar": {
"title": "$:/tags/SideBar",
"list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
"text": ""
},
"$:/tags/TiddlerInfo": {
"title": "$:/tags/TiddlerInfo",
"list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
"text": ""
},
"$:/tags/TiddlerInfo/Advanced": {
"title": "$:/tags/TiddlerInfo/Advanced",
"list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
},
"$:/tags/ViewTemplate": {
"title": "$:/tags/ViewTemplate",
"list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
},
"$:/tags/ViewToolbar": {
"title": "$:/tags/ViewToolbar",
"list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]]"
},
"$:/snippets/themeswitcher": {
"title": "$:/snippets/themeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$view tiddler={{$:/theme}} field=\"name\"/>\n\n<$linkcatcher to=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\"><div><$reveal state=\"$:/theme\" type=\"match\" text={{!!title}}>•</$reveal><$reveal state=\"$:/theme\" type=\"nomatch\" text={{!!title}}> </$reveal> <$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$list>\n</$linkcatcher>"
},
"$:/core/wiki/title": {
"title": "$:/core/wiki/title",
"type": "text/vnd.tiddlywiki",
"text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
},
"$:/view": {
"title": "$:/view",
"text": "classic"
},
"$:/snippets/viewswitcher": {
"title": "$:/snippets/viewswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/StoryView/\n<<lingo Prompt>> <$select tiddler=\"$:/view\">\n<$list filter=\"[storyviews[]]\">\n<option><$view field=\"title\"/></option>\n</$list>\n</$select>"
}
}
}
\define tv-wikilink-template() static/$uri_doubleencoded$.html
\define tv-config-toolbar-icons() no
\define tv-config-toolbar-text() no
\define tv-config-toolbar-class() tc-btn-invisible
\rules only filteredtranscludeinline transcludeinline
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="generator" content="TiddlyWiki" />
<meta name="tiddlywiki-version" content="{{$:/core/templates/version}}" />
<meta name="format-detection" content="telephone=no">
<link id="faviconLink" rel="shortcut icon" href="favicon.ico">
<link href='http://fonts.googleapis.com/css?family=Merriweather:400,300,300italic,400italic,700,700italic,900,900italic' rel='stylesheet' type='text/css'>
<title>{{$:/core/wiki/title}}</title>
<div id="styleArea">
{{$:/boot/boot.css||$:/core/templates/css-tiddler}}
</div>
<style type="text/css">
{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}
</style>
</head>
<body class="tc-body">
{{$:/StaticBanner||$:/core/templates/html-tiddler}}
{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}
</body>
</html>
The following tiddlers were imported:
# [[trigger warning]]
/***
|''Name''|RandomTiddlersMacro|
|''Description''|returns a list of x out of y random tiddlers, optionally...<br>-> having a certain tag<br>-> returning a tiddler section, slice or field value|
|''Author''|Tobias Beer|
|''Version''|1.0.4 (2012-07-14)|
|''Source''|http://randomtiddlers.tiddlyspace.com/#RandomTiddlersMacro|
|''Documentation''|http://tobibeer.tiddlyspace.com/#RandomTiddlers|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion''|2.2|
!Usage
{{{<<randomTiddlers config>>}}}
!Example
<<randomTiddlers RandomTiddlersConfig>>
!Code
***/
/*{{{*/
config.macros.randomTiddlers={config:"RandomTiddlersConfig",txtConfirm1:"Please provide a name for the output tiddler:",txtConfirm2:'The tiddler "%0" already exists! Please provide another name for the output tiddler or enter "YES" to overwrite the tiddler "%0":',txtSavedTo:"The following list was saved to tiddler [[%0]]%1...\n",txtOpenStory:" (<<openStory [[%0]]>>)",txtAbortAt:"YES",txtNoConfig:'@@color:red;The configuration tiddler called "%0" could not be found!@@',handler:function(a,b,c,d,e,f){var g=c[0]||this.config;if(!store.getTiddler(g)){wikify(this.txtNoConfig.format([g]),a);return}var h=[],i,j=0,k=0,l="",m,n,o,p,q,r,s=[],t,u=parseInt(store.getTiddlerText(g+"::max"))||10,v=parseInt(store.getTiddlerText(g+"::sample"))||50,w=store.getTiddlerText(g+"::tagged"),x=store.getTiddlerText(g+"::exclude"),y=store.getTiddlerText(g+"::content"),z=store.getTiddlerText(g+"::type"),A=store.getTiddlerText(g+"::required")=="yes",B=store.getTiddlerText(g+"::saveTo"),C=store.getTiddlerText(g+"::saveWithTags")||"",D=store.getTiddlerText(g+"::sort"),E=store.getTiddlerText(g+"::dateformat"),F=store.getTiddlerText(g),G=store.getTiddlers(D);if(w)w=w.readBracketedList();if(x)x=x.readBracketedList();m=F.indexOf("!Template\n");F=F.substr(m+10)+"\n";if(F.substr(0,4)=="{{{\n"&&F.substr(F.length-5,4)=="\n}}}"){F=F.substr(3,F.length-8)}z=z?z.toLowerCase():"";z=z=="field"?"f":z=="slice"?"::":"##";if(!w)h=G;else{n=G.length;while(n>0){n--;p=G[n];q=p.tags;if(q&&q.containsAny(w)&&(!x||!q.containsAny(x))){if(z=="f")r=store.getValue(p,y);else r=store.getTiddlerText(p.title+z+y);if(!A||A&&r){h.push(G[n]);s[p.title]=r;j++}}if(j>=v)break}}while(h.length>0&&k<u){k++;j=Math.floor(Math.random()*h.length);i=h[j][D].formatString(E);l+=F.format([h[j].title,y,s[h[j].title],i,h[j].modifier,h[j].tags],k);h.splice(j,1)}l=l.substr(1);if(B){o=prompt(this.txtConfirm1,B);if(o&&o!=B){while(store.getTiddler(o)&&o!=this.txtAbortAt){t=o;o=prompt(this.txtConfirm2.format([o]))}}if(o==this.txtAbortAt)o=t;if(o){store.saveTiddler(o,o,l,config.options.txtUserName,new Date,C.readBracketedList(),merge({},config.defaultCustomFields));wikify(this.txtSavedTo.format([o,config.macros.openStory?this.txtOpenStory.format([o]):""]),a);if(config.options.chkAutoSave)autoSaveChanges(null,[o]);}}wikify(l,a)}}
/*}}}*/
my personal website and commonplace book
$:/core/ui/AdvancedSearch/Filter
$:/core/ui/ControlPanel/Theme
$:/core/ui/ControlPanel/Basics
$:/core/ui/ControlPanel/LoadedModules
$:/core/ui/ControlPanel/Saving
$:/core/ui/MoreSideBar/System
$:/core/ui/SideBar/Recent
$:/core/ui/ControlPanel/Toolbars/ViewToolbar
{
"tiddlers": {
"$:/info/browser": {
"title": "$:/info/browser",
"text": "yes"
},
"$:/info/node": {
"title": "$:/info/node",
"text": "no"
}
}
}
$:/themes/tiddlywiki/vanilla
{
"tiddlers": {
"$:/themes/tiddlywiki/snowwhite/base": {
"title": "$:/themes/tiddlywiki/snowwhite/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"5px 5px 5px rgba(0, 0, 0, 0.1)\">>\n\t}\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected svg {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal-displayed {\n\t-webkit-filter: blur(4px);\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\t<<background-linear-gradient \"left, rgb(216,216,216) 0%, rgb(236,236,236) 250px\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button {\n\t<<background-linear-gradient \"left, rgb(236,236,236) 0%, rgb(224,224,224) 100%\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgb(236,236,236) 0%, rgb(248,248,248) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"2px 2px 4px rgba(0,0,0,0.2)\">>\n}\n"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/vanilla/themetweaks": {
"title": "$:/themes/tiddlywiki/vanilla/themetweaks",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "Theme Tweaks",
"text": "You can tweak certain aspects of the ''Vanilla'' theme.\n\n! Settings\n\n* [[Font family|$:/themes/tiddlywiki/vanilla/settings/fontfamily]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/>\n\n! Sizes\n\n* [[Font size|$:/themes/tiddlywiki/vanilla/metrics/fontsize]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/>\n* [[Line height|$:/themes/tiddlywiki/vanilla/metrics/lineheight]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/>\n* [[Font size for tiddler body|$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/>\n* [[Line height for tiddler body|$:/themes/tiddlywiki/vanilla/metrics/bodylineheight]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/>\n* [[Story left position|$:/themes/tiddlywiki/vanilla/metrics/storyleft]] //(the distance between the left of the screen and the left margin of the story river or tiddler area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/>\n* [[Story top position|$:/themes/tiddlywiki/vanilla/metrics/storytop]] //(the distance between the top of the screen and the top margin of the story river or tiddler area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/>\n* [[Story right|$:/themes/tiddlywiki/vanilla/metrics/storyright]] //(the distance between the left side of the screen and the left margin of the sidebar area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/>\n* [[Story width|$:/themes/tiddlywiki/vanilla/metrics/storywidth]] //(the width of the story river or tiddler area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/>\n* [[Tiddler width|$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth]] //(the width of individual tiddlers -- used for zoomin storyview)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/>\n* [[Sidebar breakpoint|$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint]] //(the minimum width for the sidebar to be displayed alongside the story river)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/>\n"
},
"$:/themes/tiddlywiki/vanilla/base": {
"title": "$:/themes/tiddlywiki/vanilla/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\nhtml button {\n\tline-height: 1.2;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\t\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tword-wrap: break-word;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 14px;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n white-space: pre-wrap;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: normal;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: absolute;\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-btn-big-green {\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 300;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour tag-foreground>>;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-search-results {\n\tpadding-top: 14px;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg,\n.tc-search svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: auto;\n\t}\n\n\">>\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 28px;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.2em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor, .tc-tiddler-frame textarea.tc-edit-texteditor {\n\twidth: 100%;\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 48%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 3px 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n.tc-tiddler-preview-edit {\n\twidth: 48%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name {\n\tdisplay: inline-block;\n\twidth: 15%;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n\twidth: 40%;\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n\twidth: calc(100% - 84px);\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down-language-chooser img {\n\twidth: 2em;\n\tvertical-align: baseline;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: relative;\n\t\twidth: 50%;\n\t\tmargin: 30px auto;\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-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tmax-width: 500px;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 28px;\n\tpadding: 14px 14px 14px 14px;\n\tborder: 2px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 14px;\n\tright: 14px;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\t\n}\n\n.tc-static-alert {\n\tposition: relative;\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n\tposition: absolute;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: block;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground-colour: <<colour background>>;\n\tmargin: 1em 0 1em 0;\n\tpadding: 8px;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info-chunk {\n\tdisplay: inline-block;\n\tvertical-align: middle;\t\n}\n\na.tc-plugin-info img, a.tc-plugin-info svg {\n\twidth: 2em;\n\theight: 2em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 1em 1em 1em 1em;\n\tmargin-top: -1em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder: 1px solid <<colour table-border>>;\n}\n\n.tc-chooser-item {\n\tborder: 8px;\n}\n\n.tc-chooser-item a.tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tcolor: <<colour tiddler-link-foreground>>;\n\tbackground-color: <<colour tiddler-link-background>>;\n\tmargin: 4px;\n}\n\n.tc-chooser-item a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 4px;\n\tborder: 1px solid #000;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
"text": "15px"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
"text": "22px"
},
"$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
"text": "14px"
},
"$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
"text": "20px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storytop": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyright": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
"text": "686px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
"text": "960px"
},
"$:/themes/tiddlywiki/vanilla/reset": {
"title": "$:/themes/tiddlywiki/vanilla/reset",
"type": "text/plain",
"text": "/*! normalize.css v3.0.0 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n * user zoom.\n */\n\nhtml {\n font-family: sans-serif; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Correct `block` display not defined in IE 8/9.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9.\n * Hide the `template` element in IE, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n background: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n outline: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9, Safari 5, and Chrome.\n */\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n */\n\nb,\nstrong {\n font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari 5 and Chrome.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari 5, and Chrome.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9.\n */\n\nimg {\n border: 0;\n}\n\n/**\n * Correct overflow displayed oddly in IE 9.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari 5.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n * Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10.\n */\n\nbutton {\n overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8+, and Opera\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n * and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n * `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\n * (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; /* 2 */\n box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n border: 0; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/* Tables\n ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
"text": "\"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", sans-serif"
}
}
}
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
/*
** Start with the normalize CSS reset, and then belay some of its effects
*/
{{$:/themes/tiddlywiki/vanilla/reset}}
*, input[type="search"] {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
html button {
line-height: 1.2;
}
/*
** Basic element styles
*/
html {
font-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};
text-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */
}
html:-webkit-full-screen {
background-color: <<colour page-background>>;
}
body.tc-body {
font-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};
line-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};
color: <<colour foreground>>;
background-color: <<colour page-background>>;
word-wrap: break-word;
}
h1, h2, h3, h4, h5, h6 {
line-height: 1.2;
font-weight: 300;
}
pre {
display: block;
padding: 14px;
margin-top: 1em;
margin-bottom: 1em;
word-break: normal;
word-wrap: break-word;
white-space: pre;
white-space: pre-wrap;
background-color: <<colour pre-background>>;
border: 1px solid <<colour pre-border>>;
padding: 0 3px 2px;
border-radius: 3px;
}
code {
color: <<colour code-foreground>>;
background-color: <<colour code-background>>;
border: 1px solid <<colour code-border>>;
white-space: pre-wrap;
padding: 0 3px 2px;
border-radius: 3px;
}
blockquote {
border-left: 5px solid <<colour blockquote-bar>>;
margin-left: 25px;
padding-left: 10px;
}
dl dt {
font-weight: bold;
margin-top: 6px;
}
.tc-muted {
color: <<colour muted-foreground>>;
}
/*
Markdown likes putting code elements inside pre elements
*/
pre > code {
padding: 0;
border: none;
background-color: inherit;
color: inherit;
}
table {
border: 1px solid <<colour table-border>>;
width: auto;
max-width: 100%;
caption-side: bottom;
margin-top: 1em;
margin-bottom: 1em;
}
table th, table td {
padding: 0 7px 0 7px;
border-top: 1px solid <<colour table-border>>;
border-left: 1px solid <<colour table-border>>;
}
table thead tr td, table th {
background-color: <<colour table-header-background>>;
font-weight: bold;
}
table tfoot tr td {
background-color: <<colour table-footer-background>>;
}
.tc-csv-table {
white-space: nowrap;
}
.tc-tiddler-frame img,
.tc-tiddler-frame svg,
.tc-tiddler-frame canvas,
.tc-tiddler-frame embed,
.tc-tiddler-frame iframe {
max-width: 100%;
}
.tc-tiddler-body > embed,
.tc-tiddler-body > iframe {
width: 100%;
height: 600px;
}
/*
** Links
*/
button.tc-tiddlylink,
a.tc-tiddlylink {
text-decoration: none;
font-weight: normal;
color: <<colour tiddler-link-foreground>>;
-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */
}
.tc-sidebar-lists a.tc-tiddlylink {
color: <<colour sidebar-tiddler-link-foreground>>;
}
.tc-sidebar-lists a.tc-tiddlylink:hover {
color: <<colour sidebar-tiddler-link-foreground-hover>>;
}
button.tc-tiddlylink:hover,
a.tc-tiddlylink:hover {
text-decoration: underline;
}
a.tc-tiddlylink-resolves {
}
a.tc-tiddlylink-shadow {
font-weight: bold;
}
a.tc-tiddlylink-shadow.tc-tiddlylink-resolves {
font-weight: normal;
}
a.tc-tiddlylink-missing {
font-style: italic;
}
a.tc-tiddlylink-external {
text-decoration: underline;
color: <<colour external-link-foreground>>;
background-color: <<colour external-link-background>>;
}
a.tc-tiddlylink-external:visited {
color: <<colour external-link-foreground-visited>>;
background-color: <<colour external-link-background-visited>>;
}
a.tc-tiddlylink-external:hover {
color: <<colour external-link-foreground-hover>>;
background-color: <<colour external-link-background-hover>>;
}
/*
** Drag and drop styles
*/
.tc-tiddler-dragger {
position: relative;
z-index: -10000;
}
.tc-tiddler-dragger-inner {
position: absolute;
display: inline-block;
padding: 8px 20px;
font-size: 16.9px;
font-weight: bold;
line-height: 20px;
color: <<colour dragger-foreground>>;
text-shadow: 0 1px 0 rgba(0, 0, 0, 1);
white-space: nowrap;
vertical-align: baseline;
background-color: <<colour dragger-background>>;
border-radius: 20px;
}
.tc-tiddler-dragger-cover {
position: absolute;
background-color: <<colour page-background>>;
}
.tc-dropzone {
position: relative;
}
.tc-dropzone.tc-dragover:before {
z-index: 10000;
display: block;
position: absolute;
position: -webkit-sticky;
position: -moz-sticky;
position: -o-sticky;
position: -ms-sticky;
position: sticky;
top: 0;
left: 0;
right: 0;
background: <<colour dropzone-background>>;
text-align: center;
content: "<<lingo DropMessage>>";
}
/*
** Buttons
*/
button svg, button img {
vertical-align: middle;
}
.tc-btn-invisible {
padding: 0;
margin: 0;
background: none;
border: none;
}
.tc-btn-icon svg {
height: 1em;
width: 1em;
fill: <<colour muted-foreground>>;
}
.tc-btn-text {
padding: 0;
margin: 0;
}
.tc-btn-big-green {
padding: 8px;
margin: 4px 8px 4px 8px;
background: <<colour download-background>>;
color: <<colour download-foreground>>;
fill: <<colour download-foreground>>;
border: none;
font-size: 1.2em;
line-height: 1.4em;
}
.tc-sidebar-lists input {
color: <<colour foreground>>;
}
.tc-sidebar-lists button {
color: <<colour sidebar-button-foreground>>;
fill: <<colour sidebar-button-foreground>>;
}
.tc-sidebar-lists button.tc-btn-mini {
color: <<colour sidebar-muted-foreground>>;
}
.tc-sidebar-lists button.tc-btn-mini:hover {
color: <<colour sidebar-muted-foreground-hover>>;
}
button svg.tc-image-button, button .tc-image-button img {
height: 1em;
width: 1em;
}
/*
** Tags and missing tiddlers
*/
.tc-tag-list-item {
position: relative;
display: inline-block;
margin-right: 7px;
}
.tc-tags-wrapper {
margin: 4px 0 14px 0;
}
.tc-missing-tiddler-label {
font-style: italic;
font-weight: normal;
display: inline-block;
font-size: 11.844px;
line-height: 14px;
white-space: nowrap;
vertical-align: baseline;
}
button.tc-tag-label, span.tc-tag-label {
display: inline-block;
padding: 0.16em 0.7em;
font-size: 0.9em;
font-weight: 300;
line-height: 1.2em;
color: <<colour tag-foreground>>;
white-space: nowrap;
vertical-align: baseline;
background-color: <<colour tag-background>>;
border-radius: 1em;
}
.tc-untagged-separator {
width: 10em;
left: 0;
margin-left: 0;
border: 0;
height: 1px;
background: <<colour tab-divider>>;
}
button.tc-untagged-label {
background-color: <<colour untagged-background>>;
}
.tc-tag-label svg, .tc-tag-label img {
height: 1em;
width: 1em;
fill: <<colour tag-foreground>>;
}
.tc-tag-manager-table .tc-tag-label {
white-space: normal;
}
.tc-tag-manager-tag {
width: 100%;
}
/*
** Page layout
*/
.tc-topbar {
position: fixed;
z-index: 1200;
}
.tc-topbar-left {
left: 29px;
top: 5px;
}
.tc-topbar-right {
top: 5px;
right: 29px;
}
.tc-topbar button {
padding: 8px;
}
.tc-topbar svg {
fill: <<colour muted-foreground>>;
}
.tc-topbar button:hover svg {
fill: <<colour foreground>>;
}
.tc-sidebar-header {
color: <<colour sidebar-foreground>>;
fill: <<colour sidebar-foreground>>;
}
.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {
font-weight: 300;
}
.tc-sidebar-header .tc-sidebar-lists p {
margin-top: 3px;
margin-bottom: 3px;
}
.tc-sidebar-header .tc-missing-tiddler-label {
color: <<colour sidebar-foreground>>;
}
.tc-advanced-search input {
width: 60%;
}
.tc-search a svg {
width: 1.2em;
height: 1.2em;
vertical-align: middle;
}
.tc-search-results {
padding-top: 14px;
}
.tc-page-controls {
margin-top: 14px;
font-size: 1.5em;
}
.tc-page-controls button {
margin-right: 0.5em;
}
.tc-page-controls a.tc-tiddlylink:hover {
text-decoration: none;
}
.tc-page-controls img {
width: 1em;
}
.tc-page-controls svg,
.tc-search svg {
fill: <<colour sidebar-controls-foreground>>;
}
.tc-page-controls button:hover svg, .tc-page-controls a:hover svg,
.tc-search button:hover svg, .tc-search a:hover svg {
fill: <<colour sidebar-controls-foreground-hover>>;
}
.tc-menu-list-item {
white-space: nowrap;
}
.tc-menu-list-count {
font-weight: bold;
}
.tc-menu-list-subitem {
padding-left: 7px;
}
.tc-story-river {
position: relative;
}
@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-sidebar-header {
padding: 14px;
min-height: 32px;
margin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};
}
.tc-story-river {
position: relative;
padding: 0;
}
}
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-message-box {
margin: 21px -21px 21px -21px;
}
.tc-sidebar-scrollable {
position: fixed;
top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};
left: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};
bottom: 0;
right: 0;
overflow-y: auto;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
margin: 0 0 0 -42px;
padding: 71px 0 28px 42px;
}
.tc-story-river {
position: relative;
left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};
top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};
width: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};
padding: 42px 42px 42px 42px;
}
<<if-no-sidebar "
.tc-story-river {
width: auto;
}
">>
}
@media print {
body.tc-body {
background-color: transparent;
}
.tc-sidebar-header, .tc-topbar {
display: none;
}
.tc-story-river {
margin: 0;
padding: 0;
}
.tc-story-river .tc-tiddler-frame {
margin: 0;
border: none;
padding: 28px;
}
}
/*
** Tiddler styles
*/
.tc-tiddler-frame {
margin-bottom: 28px;
background-color: <<colour tiddler-background>>;
border: 1px solid <<colour tiddler-border>>;
}
.tc-tiddler-info {
padding: 14px 42px 14px 42px;
background-color: <<colour tiddler-info-background>>;
border-top: 1px solid <<colour tiddler-info-border>>;
border-bottom: 1px solid <<colour tiddler-info-border>>;
}
.tc-tiddler-info p {
margin-top: 3px;
margin-bottom: 3px;
}
.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour tiddler-info-tab-background>>;
border-bottom: 1px solid <<colour tiddler-info-tab-background>>;
}
.tc-view-field-table {
width: 100%;
}
.tc-view-field-name {
width: 1%; /* Makes this column be as narrow as possible */
text-align: right;
font-style: italic;
font-weight: 200;
}
.tc-view-field-value {
}
@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-tiddler-frame {
padding: 14px 14px 14px 14px;
}
.tc-tiddler-info {
margin: 0 -14px 0 -14px;
}
}
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-tiddler-frame {
padding: 28px 42px 42px 42px;
width: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};
border-radius: 2px;
}
<<if-no-sidebar "
.tc-tiddler-frame {
width: 100%;
}
">>
.tc-tiddler-info {
margin: 0 -42px 0 -42px;
}
}
.tc-site-title,
.tc-titlebar {
font-weight: 300;
font-size: 2.35em;
line-height: 1.2em;
color: <<colour tiddler-title-foreground>>;
margin: 0;
}
.tc-tiddler-title-icon {
vertical-align: middle;
}
.tc-system-title-prefix {
color: <<colour muted-foreground>>;
}
.tc-titlebar h2 {
font-size: 1em;
display: inline;
}
.tc-titlebar img {
height: 1em;
}
.tc-subtitle {
font-size: 0.9em;
color: <<colour tiddler-subtitle-foreground>>;
font-weight: 300;
}
.tc-tiddler-missing .tc-title {
font-style: italic;
font-weight: normal;
}
.tc-tiddler-frame .tc-tiddler-controls {
float: right;
}
.tc-tiddler-controls .tc-drop-down {
font-size: 0.6em;
}
.tc-tiddler-controls .tc-drop-down .tc-drop-down {
font-size: 1em;
}
.tc-tiddler-controls > span > button {
vertical-align: baseline;
margin-left:5px;
}
.tc-tiddler-controls button svg, .tc-tiddler-controls button img {
height: 0.75em;
fill: <<colour tiddler-controls-foreground>>;
}
.tc-tiddler-controls button.tc-selected svg {
fill: <<colour tiddler-controls-foreground-selected>>;
}
.tc-tiddler-controls button.tc-btn-invisible:hover svg {
fill: <<colour tiddler-controls-foreground-hover>>;
}
@media print {
.tc-tiddler-controls {
display: none;
}
}
.tc-tiddler-help { /* Help prompts within tiddler template */
color: <<colour muted-foreground>>;
margin-top: 14px;
}
.tc-tiddler-help a.tc-tiddlylink {
color: <<colour very-muted-foreground>>;
}
.tc-tiddler-frame input.tc-edit-texteditor, .tc-tiddler-frame textarea.tc-edit-texteditor {
width: 100%;
padding: 3px 3px 3px 3px;
border: 1px solid <<colour tiddler-editor-border>>;
line-height: 1.3em;
-webkit-appearance: none;
margin: 4px 0 4px 0;
}
.tc-tiddler-frame .tc-binary-warning {
width: 100%;
height: 5em;
text-align: center;
padding: 3em 3em 6em 3em;
background: <<colour alert-background>>;
border: 1px solid <<colour alert-border>>;
}
.tc-tiddler-frame input.tc-edit-texteditor {
background-color: <<colour tiddler-editor-background>>;
}
canvas.tc-edit-bitmapeditor {
border: 6px solid <<colour tiddler-editor-border-image>>;
cursor: crosshair;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
margin-top: 6px;
margin-bottom: 6px;
}
.tc-edit-bitmapeditor-width {
display: block;
}
.tc-edit-bitmapeditor-height {
display: block;
}
.tc-tiddler-frame .tc-tiddler-body {
font-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};
line-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};
}
.tc-titlebar, .tc-tiddler-edit-title {
overflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */
}
/*
** Toolbar buttons
*/
.tc-page-controls svg.tc-image-new-button {
fill: <<colour toolbar-new-button>>;
}
.tc-page-controls svg.tc-image-options-button {
fill: <<colour toolbar-options-button>>;
}
.tc-page-controls svg.tc-image-save-button {
fill: <<colour toolbar-save-button>>;
}
.tc-tiddler-controls button svg.tc-image-info-button {
fill: <<colour toolbar-info-button>>;
}
.tc-tiddler-controls button svg.tc-image-edit-button {
fill: <<colour toolbar-edit-button>>;
}
.tc-tiddler-controls button svg.tc-image-close-button {
fill: <<colour toolbar-close-button>>;
}
.tc-tiddler-controls button svg.tc-image-delete-button {
fill: <<colour toolbar-delete-button>>;
}
.tc-tiddler-controls button svg.tc-image-cancel-button {
fill: <<colour toolbar-cancel-button>>;
}
.tc-tiddler-controls button svg.tc-image-done-button {
fill: <<colour toolbar-done-button>>;
}
/*
** Tiddler edit mode
*/
.tc-tiddler-edit-frame em.tc-edit {
color: <<colour muted-foreground>>;
font-style: normal;
}
.tc-edit-type-dropdown a.tc-tiddlylink-missing {
font-style: normal;
}
.tc-edit-tags {
border: 1px solid <<colour tiddler-editor-border>>;
padding: 4px 8px 4px 8px;
}
.tc-edit-add-tag {
display: inline-block;
}
.tc-edit-add-tag .tc-add-tag-name input {
width: 50%;
}
.tc-edit-tags .tc-tag-label {
display: inline-block;
}
.tc-edit-tags-list {
margin: 14px 0 14px 0;
}
.tc-remove-tag-button {
padding-left: 4px;
}
.tc-tiddler-preview {
overflow: auto;
}
.tc-tiddler-preview-preview {
float: right;
width: 48%;
border: 1px solid <<colour tiddler-editor-border>>;
margin: 4px 3px 3px 3px;
padding: 3px 3px 3px 3px;
}
.tc-tiddler-preview-edit {
width: 48%;
}
.tc-edit-fields {
width: 100%;
}
.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {
border: none;
padding: 4px;
}
.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {
background-color: <<colour tiddler-editor-fields-odd>>;
}
.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {
background-color: <<colour tiddler-editor-fields-even>>;
}
.tc-edit-field-name {
text-align: right;
}
.tc-edit-field-value input {
width: 100%;
}
.tc-edit-field-remove {
}
.tc-edit-field-remove svg {
height: 1em;
width: 1em;
fill: <<colour muted-foreground>>;
vertical-align: middle;
}
.tc-edit-field-add-name {
display: inline-block;
width: 15%;
}
.tc-edit-field-add-value {
display: inline-block;
width: 40%;
}
.tc-edit-field-add-button {
display: inline-block;
width: 10%;
}
/*
** Storyview Classes
*/
.tc-storyview-zoomin-tiddler {
position: absolute;
display: block;
width: 100%;
width: calc(100% - 84px);
}
/*
** Dropdowns
*/
.tc-btn-dropdown {
text-align: left;
}
.tc-btn-dropdown svg, .tc-btn-dropdown img {
height: 1em;
width: 1em;
fill: <<colour muted-foreground>>;
}
.tc-drop-down-wrapper {
position: relative;
}
.tc-drop-down {
min-width: 380px;
border: 1px solid <<colour dropdown-border>>;
background-color: <<colour dropdown-background>>;
padding: 7px 0 7px 0;
margin: 4px 0 0 0;
white-space: nowrap;
text-shadow: none;
line-height: 1.4;
}
.tc-drop-down .tc-drop-down {
margin-left: 14px;
}
.tc-drop-down button svg, .tc-drop-down a svg {
fill: <<colour foreground>>;
}
.tc-drop-down button.tc-btn-invisible:hover svg {
fill: <<colour foreground>>;
}
.tc-drop-down p {
padding: 0 14px 0 14px;
}
.tc-drop-down svg {
width: 1em;
height: 1em;
}
.tc-drop-down img {
width: 1em;
}
.tc-drop-down-language-chooser img {
width: 2em;
vertical-align: baseline;
}
.tc-drop-down a, .tc-drop-down button {
display: block;
padding: 0 14px 0 14px;
width: 100%;
text-align: left;
color: <<colour foreground>>;
line-height: 1.4;
}
.tc-drop-down .tc-file-input-wrapper {
width: 100%;
}
.tc-drop-down .tc-file-input-wrapper button {
color: <<colour foreground>>;
}
.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {
color: <<colour tiddler-link-background>>;
background-color: <<colour tiddler-link-foreground>>;
text-decoration: none;
}
.tc-drop-down .tc-tab-buttons button {
background-color: <<colour dropdown-tab-background>>;
}
.tc-drop-down .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour dropdown-tab-background-selected>>;
border-bottom: 1px solid <<colour dropdown-tab-background-selected>>;
}
.tc-drop-down-bullet {
display: inline-block;
width: 0.5em;
}
.tc-drop-down .tc-tab-contents a {
padding: 0 0.5em 0 0.5em;
}
.tc-block-dropdown-wrapper {
position: relative;
}
.tc-block-dropdown {
position: absolute;
min-width: 220px;
border: 1px solid <<colour dropdown-border>>;
background-color: <<colour dropdown-background>>;
padding: 7px 0;
margin: 4px 0 0 0;
white-space: nowrap;
z-index: 1000;
}
.tc-block-dropdown a {
display: block;
padding: 4px 14px 4px 14px;
}
.tc-drop-down .tc-dropdown-item,
.tc-block-dropdown .tc-dropdown-item {
padding: 4px 14px 4px 7px;
color: <<colour muted-foreground>>;
}
.tc-block-dropdown a:hover {
color: <<colour tiddler-link-background>>;
background-color: <<colour tiddler-link-foreground>>;
text-decoration: none;
}
/*
** Modals
*/
.tc-modal-wrapper {
position: fixed;
overflow: auto;
overflow-y: scroll;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.tc-modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1000;
background-color: <<colour modal-backdrop>>;
}
.tc-modal {
z-index: 1100;
background-color: <<colour modal-background>>;
border: 1px solid <<colour modal-border>>;
}
@media (max-width: 55em) {
.tc-modal {
position: fixed;
top: 1em;
left: 1em;
right: 1em;
}
.tc-modal-body {
overflow-y: auto;
max-height: 400px;
}
}
@media (min-width: 55em) {
.tc-modal {
position: relative;
width: 50%;
margin: 30px auto;
}
}
.tc-modal-header {
padding: 9px 15px;
border-bottom: 1px solid <<colour modal-header-border>>;
}
.tc-modal-header h3 {
margin: 0;
line-height: 30px;
}
.tc-modal-body {
padding: 15px;
}
.tc-modal-footer {
padding: 14px 15px 15px;
margin-bottom: 0;
text-align: right;
background-color: <<colour modal-footer-background>>;
border-top: 1px solid <<colour modal-footer-border>>;
}
/*
** Notifications
*/
.tc-notification {
position: fixed;
top: 14px;
right: 42px;
z-index: 1300;
max-width: 280px;
padding: 0 14px 0 14px;
background-color: <<colour notification-background>>;
border: 1px solid <<colour notification-border>>;
}
/*
** Tabs
*/
.tc-tab-set.tc-vertical {
display: -webkit-flex;
display: flex;
}
.tc-tab-buttons {
font-size: 0.85em;
padding-top: 1em;
margin-bottom: -2px;
}
.tc-tab-buttons.tc-vertical {
z-index: 100;
display: block;
padding-top: 14px;
vertical-align: top;
text-align: right;
margin-bottom: inherit;
margin-right: -1px;
max-width: 33%;
-webkit-flex: 0 0 auto;
flex: 0 0 auto;
}
.tc-tab-buttons button.tc-tab-selected {
color: <<colour tab-foreground-selected>>;
background-color: <<colour tab-background-selected>>;
border-left: 1px solid <<colour tab-border-selected>>;
border-top: 1px solid <<colour tab-border-selected>>;
border-right: 1px solid <<colour tab-border-selected>>;
}
.tc-tab-buttons button {
color: <<colour tab-foreground>>;
padding: 3px 5px 3px 5px;
font-weight: 300;
border: none;
background: inherit;
background-color: <<colour tab-background>>;
border-left: 1px solid <<colour tab-border>>;
border-top: 1px solid <<colour tab-border>>;
border-right: 1px solid <<colour tab-border>>;
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.tc-tab-buttons.tc-vertical button {
display: block;
width: 100%;
margin-top: 3px;
text-align: right;
background-color: <<colour tab-background>>;
border-left: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
border-right: none;
border-top-left-radius: 2px;
border-bottom-left-radius: 2px;
}
.tc-tab-buttons.tc-vertical button.tc-tab-selected {
background-color: <<colour tab-background-selected>>;
border-right: 1px solid <<colour tab-background-selected>>;
}
.tc-tab-divider {
border-top: 1px solid <<colour tab-divider>>;
}
.tc-tab-divider.tc-vertical {
display: none;
}
.tc-tab-content {
margin-top: 14px;
}
.tc-tab-content.tc-vertical {
display: inline-block;
vertical-align: top;
padding-top: 0;
padding-left: 14px;
border-left: 1px solid <<colour tab-border>>;
-webkit-flex: 1 0 70%;
flex: 1 0 70%;
}
.tc-sidebar-lists .tc-tab-buttons {
margin-bottom: -1px;
}
.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour sidebar-tab-background-selected>>;
color: <<colour sidebar-tab-foreground-selected>>;
border-left: 1px solid <<colour sidebar-tab-border-selected>>;
border-top: 1px solid <<colour sidebar-tab-border-selected>>;
border-right: 1px solid <<colour sidebar-tab-border-selected>>;
}
.tc-sidebar-lists .tc-tab-buttons button {
background-color: <<colour sidebar-tab-background>>;
color: <<colour sidebar-tab-foreground>>;
border-left: 1px solid <<colour sidebar-tab-border>>;
border-top: 1px solid <<colour sidebar-tab-border>>;
border-right: 1px solid <<colour sidebar-tab-border>>;
}
.tc-sidebar-lists .tc-tab-divider {
border-top: 1px solid <<colour sidebar-tab-divider>>;
}
.tc-more-sidebar .tc-tab-buttons button {
background-color: <<colour sidebar-tab-background>>;
border-top: none;
border-left: none;
border-bottom: none;
border-right: 1px solid #ccc;
margin-bottom: inherit;
}
.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour sidebar-tab-background-selected>>;
border: none;
}
/*
** Alerts
*/
.tc-alerts {
position: fixed;
top: 0;
left: 0;
max-width: 500px;
z-index: 20000;
}
.tc-alert {
position: relative;
margin: 28px;
padding: 14px 14px 14px 14px;
border: 2px solid <<colour alert-border>>;
background-color: <<colour alert-background>>;
}
.tc-alert-toolbar {
position: absolute;
top: 14px;
right: 14px;
}
.tc-alert-toolbar svg {
fill: <<colour alert-muted-foreground>>;
}
.tc-alert-subtitle {
color: <<colour alert-muted-foreground>>;
font-weight: bold;
}
.tc-alert-highlight {
color: <<colour alert-highlight>>;
}
.tc-static-alert {
position: relative;
}
.tc-static-alert-inner {
padding: 0 2px 2px 42px;
color: <<colour static-alert-foreground>>;
position: absolute;
}
/*
** Control panel
*/
.tc-control-panel td {
padding: 4px;
}
.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {
width: 100%;
}
.tc-plugin-info {
display: block;
border: 1px solid <<colour muted-foreground>>;
background-colour: <<colour background>>;
margin: 1em 0 1em 0;
padding: 8px;
}
.tc-plugin-info-disabled {
background: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);
background: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);
}
.tc-plugin-info-disabled:hover {
background: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);
background: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);
}
a.tc-tiddlylink.tc-plugin-info:hover {
text-decoration: none;
background-color: <<colour primary>>;
color: <<colour background>>;
fill: <<colour foreground>>;
}
a.tc-tiddlylink.tc-plugin-info:hover svg {
fill: <<colour foreground>>;
}
.tc-plugin-info-chunk {
display: inline-block;
vertical-align: middle;
}
a.tc-plugin-info img, a.tc-plugin-info svg {
width: 2em;
height: 2em;
fill: <<colour muted-foreground>>;
}
.tc-plugin-info-dropdown {
border: 1px solid <<colour muted-foreground>>;
padding: 1em 1em 1em 1em;
margin-top: -1em;
}
/*
** Message boxes
*/
.tc-message-box {
border: 1px solid <<colour message-border>>;
background: <<colour message-background>>;
padding: 0px 21px 0px 21px;
font-size: 12px;
line-height: 18px;
color: <<colour message-foreground>>;
}
/*
** Pictures
*/
.tc-bordered-image {
border: 1px solid <<colour muted-foreground>>;
padding: 5px;
margin: 5px;
}
/*
** Floats
*/
.tc-float-right {
float: right;
}
/*
** Chooser
*/
.tc-chooser {
border: 1px solid <<colour table-border>>;
}
.tc-chooser-item {
border: 8px;
}
.tc-chooser-item a.tc-tiddlylink {
display: block;
text-decoration: none;
color: <<colour tiddler-link-foreground>>;
background-color: <<colour tiddler-link-background>>;
margin: 4px;
}
.tc-chooser-item a.tc-tiddlylink:hover {
text-decoration: none;
color: <<colour tiddler-link-background>>;
background-color: <<colour tiddler-link-foreground>>;
}
/*
** Palette swatches
*/
.tc-swatches-horiz {
}
.tc-swatches-horiz .tc-swatch {
display: inline-block;
}
.tc-swatch {
width: 2em;
height: 2em;
margin: 4px;
border: 1px solid #000;
}
/*
** Table of contents
*/
.tc-sidebar-lists .tc-table-of-contents {
white-space: nowrap;
}
.tc-table-of-contents button {
color: <<colour sidebar-foreground>>;
}
.tc-table-of-contents svg {
width: 0.7em;
height: 0.7em;
vertical-align: middle;
fill: <<colour sidebar-foreground>>;
}
.tc-table-of-contents ol {
list-style-type: none;
padding-left: 0;
}
.tc-table-of-contents ol ol {
padding-left: 1em;
}
.tc-table-of-contents li {
font-size: 1.0em;
font-weight: bold;
}
.tc-table-of-contents li a {
font-weight: bold;
}
.tc-table-of-contents li li {
font-size: 0.95em;
font-weight: normal;
line-height: 1.4;
}
.tc-table-of-contents li li a {
font-weight: normal;
}
.tc-table-of-contents li li li {
font-size: 0.95em;
font-weight: 200;
line-height: 1.5;
}
.tc-table-of-contents li li li a {
font-weight: bold;
}
.tc-table-of-contents li li li li {
font-size: 0.95em;
font-weight: 200;
}
.tc-tabbed-table-of-contents {
display: -webkit-flex;
display: flex;
}
.tc-tabbed-table-of-contents .tc-table-of-contents {
z-index: 100;
display: inline-block;
padding-left: 1em;
max-width: 50%;
-webkit-flex: 0 0 auto;
flex: 0 0 auto;
background: <<colour tab-background>>;
border-left: 1px solid <<colour tab-border>>;
border-top: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {
display: block;
padding: 0.12em 1em 0.12em 0.25em;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {
border-top: 1px solid <<colour tab-background>>;
border-left: 1px solid <<colour tab-background>>;
border-bottom: 1px solid <<colour tab-background>>;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {
text-decoration: none;
border-top: 1px solid <<colour tab-border>>;
border-left: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
background: <<colour tab-border>>;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {
border-top: 1px solid <<colour tab-border>>;
border-left: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
background: <<colour background>>;
margin-right: -1px;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {
text-decoration: none;
}
.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {
display: inline-block;
vertical-align: top;
padding-left: 1.5em;
padding-right: 1.5em;
border: 1px solid <<colour tab-border>>;
-webkit-flex: 1 0 50%;
flex: 1 0 50%;
}
/*
** Dirty indicator
*/
body.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {
fill: <<colour dirty-indicator>>;
color: <<colour dirty-indicator>>;
}
/*
** File inputs
*/
.tc-file-input-wrapper {
position: relative;
overflow: hidden;
display: inline-block;
vertical-align: middle;
}
.tc-file-input-wrapper input[type=file] {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
font-size: 999px;
max-width: 100%;
max-height: 100%;
filter: alpha(opacity=0);
opacity: 0;
outline: none;
background: white;
cursor: pointer;
display: inline-block;
}
/*
** Errors
*/
.tc-error {
background: #f00;
color: #fff;
}
'Merriweather', "Helvetica Neue", Helvetica, Arial, Garamond, "Lucida Grande", sans-serif
[img[http://i.imgur.com/hKSlZMW.gif]]
See also: [[Furiosa]], [[Get up, Trinity]]
!!! 'Moscow Project' Anxiety
I'm worried about how people will interact with my '[[Moscow Project]]' series of essays. My personality is interested in organizing and taxonomizing - as a kid I wanted to be a librarian when I grew up, and that stayed with me for a very long time.
I want to document the ''ideas and people'' of who've shaped this community, to help me contextualize the things I appreciate and the things I have trouble with.
I think in other contexts this wouldn't feel weird at all. But one of the weaknesses of this community is that while they like to examine outside people and movements in terms of sociological and psychological motivation, they're very resistant to any attempt to look inwardly in the same way.
They sometimes poke fun at foibles within the broader movements they've fostered - granola homeschooling or some such - but not foibles within the actual local community.
So I find myself wanting to defend this tiny wiki project, but I know that any defense or word of explanation is immediately admitting you're wrong. 'Throw a rock into a pack of dogs, and the one that hollers is the one that got hit.'
Also people don't usually have an occasion to question things until they're disgruntled and searching for things to get upset about. I wouldn't say I'm exactly //gruntled//, but I'm not disgruntled either.
The other reason this sort of inward look doesn't happen is the 'ugly sister' heuristic. The idea is that if someone outside of your family says your sister is ugly, you're going to punch them whether or not it's true. You are free to observe that your sister is ugly, because you're family, but only within your family.
In other words, keep your critiques in-house and don't provide any ammunition to someone outside the community with an axe to grind.
That's not my goal, so I guess... I won't do that?
!!! Parable of the Organized Fool
I have a fixation on being a more organized person. I'm [[fastidious, not organized|my personality]]. Being more organized often becomes the single biggest measure of personal progress, in my own mind anyway.
The other day I was looking in despair at the unorganized pile of half-full paint cans from past painting projects. I can't get rid of them - what if I need one of them later for touch-ups? How do I tell which ones are safe to throw away?
Ok, I should be honest - the paint cans live in the bathroom. I was in the bathroom, looking at this inescapable reminder of how disorganized so many aspects of my life are.
I started thinking about Pinterest - surely Pinterest has the answer. I remember seeing baby food jars with little amounts of each paint in the house, just in case you need some later. But the scale of my paint collection is just too large.
Then I was gripped with a mania. What if I'm the man who keeps building bigger barns from the Gospel of Luke (often called the parable of the Rich Fool), except instead of bigger barns my particular folly is being more organized? I often say to myself, "If only I were more organized." Organization sometimes feels like the only obstacle to personal fulfillment. What if I achieve some kind of organizational enlightenment, and immediately drop dead?
The Rich Fool's problem was that he wasn't 'rich toward God'. I'm not sure how to share my disorganization with God, but maybe I should embrace it as a reminder toward humility. Trips to the bathroom / paint storage closet don't always yield such terrifyingly Anne Lamott-esque fruit, but I'm always open to it. Maybe I should polish it up and submit it to Our Daily Bread.
Indolence, which is most of what is described by 'cool' - practiced disinterest
Acedia
Ennui
Write a post differentiating them.
I want to recover the 12 Days of Christmas (who doesn't!) but it's a hard thing to wrap one's head around, especially if the first day has so much gifting.
So my suggestion is to break the gifts into categories, and give along those lines during the 12 day:
# Gifts from their list
# Gifts not from their list
# Gifts of alcohol and cheese
# Handmade gifts
I just need to figure out the other 8...
I'm rediscovering the joys of hypertext. Everyone has seen this joke:
[img[https://denisewymore.files.wordpress.com/2013/11/remembering-life-before-the-internet-22005-1308596743-187.jpg]]
Before the Internet, there were some things you just had to live with not knowing. The early Internet was all giddiness - the thrill of clicking from site to site, the sound of getting a new email. It passed quickly.
The only thing like it in my experience now is TV Tropes. A beautiful collection of esoterica. Only pop culture can thrill me now.
But I was reading about outsider art, created worlds that took their creators a lifetime to make, and stopped only when the creator died. I was thinking about what sort of useless lifelong creative project I could undertake, and I couldn't get a wiki out of my head.
I've had personal wikis before. But I've always wanted them to be relentlessly organized, taxonimized within an inch of their lives. Then I got frustrated by the unorganized or out-of-date parts.
Perhaps I'll be able to let this one sprawl - accept [[the endless pursuit|That endless pursuit]] and build something substantial. If not substantial, than something with a large page count.
//Future goals for this wiki://
MoscowProject vs AlternateMoscow
Cultural Ambition, MoscowProject's loss of
Cultural Imagination, different from ambition
Commonplaces - from Fbook and TWitter
Essays in hypertext form - 200~ index card size
Book reviews, Movie reviews
Cardigan programmer virtues - not only the virtues but the wiki structure itself
Talking head interview segments, personal question list, history of MoscowProject, loving look
ala comedians in cars
I'm still in the process of compiling commonplaces from all sorts of sources (my book annotations, Twitter/Facebook, old blog and commonplace books) and there's something rewarding about this. Hypertext is exciting (well, sometimes - TV Tropes makes hypertext exciting, for instance), and I hope I can bring that to my own collection of resources.
But the ones that relate to the [[Moscow Project]] are depressing, because it at times feels like I'm building up a mountain of things to be irritated at. I'm aware of Doug Wilson's helpful distinction between [[disagreements and grievances|disagreements versus grievances]] and I think I need to push a bit more on the [[last time I became frustrated with something Toby tweeted|Nose piercings are not sinful]]. I give myself pretty strict time limits on this stuff - either try to has it out or let it go.
I can't wait to be done with the compiling so that I can start writing little hypertext essays on topics that I care about.
Things are getting tidier, which always seems to happen as life is falling apart. It's a gift - tidy, not clean.
Hopefully the Anchor is heading toward completeness. I feel quite helpless, but it could all still come to a very good end. The end justifies so much, it seems.
Notez for postz:
[[side eyeball]] - being reserved in conversation, for fear someone will say something foolish. As opposed to being affirming; function on body language
[[my body]]
is trying to kill me - ambivalence to detente
chameleon, or what being all-american looking gave me
Eyesight, hearing - look pleasantly blank
My personality, galvanized by crisis. or crises
[[WP:Notable]] - perspective
[[maximalist eclecticism]]
[[false nostalgia]], what is the word for this?
Folk school to future Moscow
two tiers for folk school? voc/cont/career, real prices
student/local folk type lessons
[[saints]], //Millions//-style - Oscaro Romero, St. Francis
<<<
“Star Wars” is like getting a box of Cracker Jack which is all prizes.
<<< Pauline Kael
She means it as a sort of criticism that would work equally well to describe //Avatar//, but unlike Avatar there's something that allows //Star Wars// to transcend. The full quotation:
<<<
“Star Wars” is like getting a box of Cracker Jack which is all prizes. This is the writer-director George Lucas’s own film, subject to no business interference, yet it’s a film that’s totally uninterested in anything that doesn’t connect with the mass audience. There’s no breather in the picture, no lyricism; the only attempt at beauty is in the double sunset. It’s enjoyable on its own terms, but it’s exhausting, too: like taking a pack of kids to the circus. An hour into it, children say that they’re ready to see it again; that’s because it’s an assemblage of spare parts—it has no emotional grip. “Star Wars” may be the only movie in which the first time around the surprises are reassuring…. It’s an epic without a dream. But it’s probably the absence of wonder that accounts for the film’s special, huge success. The excitement of those who call it the film of the year goes way past nostalgia to the feeling that now is the time to return to childhood.
<<< Pauline Kael, “Contrasts,” The Current Cinema, September 26, 1977.
<<<
//For a lot of artists, one of the biggest challenges is finding an audience for what they make. Clearly, you already have one. So what do you feel you’re working towards?//
''Miley Cyrus:'' I’ve been around a lot of money my whole life. They say money can’t buy happiness and it’s totally true. Money can buy you a bunch of s* to glue to a bunch of other s* that will make you happy, but besides that, there’s no more happiness. There’s no point in me focusing on getting any f*ing richer. Obviously the s* you buy doesn’t make you happier because I’m sitting here gluing a bunch of junk to stuff.
<<< Miley Cyrus
<<<
Everyone who struggles for justice, everyone who makes just claims in unjust surroundings, is working for God’s reign, even if not a Christian. The church does not comprise all of God’s reign; that goes beyond the church’s boundaries. The church values everything that is in tune with its struggle to set up God’s reign. A church that tries to keep itself pure and uncontaminated would not be a church of God’s service to people. The authentic church is one that does not mind conversing with prostitutes and publicans and sinners, as Christ did – and with Marxists and those of various political movements – in order to bring them salvation’s true message.
<<< Oscar Romero, The Violence of Love
<<<
What is it about the Internet, with its pretty graphics and simple clicks, that makes users feel so inundated; and about the spreadsheet—so complicated a tool—that makes them bold? The received wisdom about user-friendliness is challenged here.
[…]
The spreadsheet is the program that all but created the personal computer. The spreadsheet and the word processor—two tools empty of information, two little programs sitting patiently and passively for their human owners to put something interesting into them. Now, fifteen years later, the Internet browser is the program creating the second generation of the personal computer. The browser—a click-click baby tool for searching the Web, where everything of interest already resides. It is a journey through the looking glass in the age of information: one pill makes you larger, and one pill makes you small.
<<< Ellen Ullman, Close to the Machine
<<<
Capitalism is probably the first instance of a cult that creates guilt, not atonement.
<<< Walter Benjamin
<<<
A dead thing can go with the stream, but only a living thing can go against it.
<<< Chesterton
<<<
If nothing else, a student must get from his training a feeling of security in change.
<<< Charles Eames
<<<
I suddenly found I could...make a fighting demagogic speech. It is so exciting but so degrading; I felt covered in dirt afterwards.
<<< W.H. Auden
<<<
…the scientists, who are mostly liberal and unbelievers, and the businessmen, who are mostly conservative and Christian, live side by side in Paradise Estates. Though the two make much of their differences — one speaking of “outworn dogmas and creeds,” the other of “atheism and immorality,” etcetera, etcerera — to tell the truth, I do not notice a great deal of difference between the two.
<<< from Love in the Ruins
<<<
Ah, but a man's reach should exceed his grasp, /
Or what's a heaven for?
<<< Robert Browning, 'Andrea del Sarto'
<<<
If you have three or more it’s a collection: a museum has over three collections.
<<< John Preble of Abita Mystery House
<<<
A principle is what I thought yesterday.
<<< Eugen Rosenstock-Huessy
<<<
The modern habit of saying, 'This is my opinion, but I may be wrong,' is entirely irrational. If I say that it may be wrong, I say that it is not my opinion. The modern habit of saying, 'Every man has a different philosophy; this is my philosophy and it suits me' - the habit of saying this is mere weak-mindedness. A cosmic philosophy is not constructed to fit a man; a cosmic philosophy is constructed to fit a cosmos. A man can no more posses a private religion than he can possess a private sun and moon.
<<< G.K. Chesterton, Introduction to the Book of Job
<<<
NB: A lot of them end up at my church. I think a sacramental life—it’s Christianity. It’s not spiritual, it’s physical. You can’t even get started without a loaf of bread and a jug of wine and a river. There is this incredible physicality to what we believe. This is spirituality in the dirt. We have a God who slipped into the vulnerability of human skin, and walked among us, and was born amongst straw and animals, and walked the earth, and ate with his friends, and spat in the dirt, and used mud and his own spit to heal people. This is not an ethereal, transcendent, otherworldly, escape-this-earth kind of god. Even after his resurrection, he was disturbingly physical about all of it. He was grilling fish on the beach and having people touch his actual wounds. This is why I am not a fan of the liberalism in Christianity. I actually believe in the physical, actual resurrection of Jesus. You can’t have a Gospel that’s that disturbingly physical the entire time, and then at the end, it’s just an idea. It’s just a memory. I think the actual wounded body of the resurrected Christ is of great importance to humanity, given the fact that we walk around with bodies that are also wounded in the same way. I think that that says something important to us. Take St. Peter. He couldn’t have been filled with anything but shame, not being the man that he wanted to be, having denied Jesus three times around a charcoal fire. And then after the resurrection, he’s fishing, and he sees Jesus on the beach, and what is he doing? He’s grilling fish on a charcoal fire, you know, this sort of olfactory-triggered memory of shame. It’s not like Jesus mentions it. He just gives him three opportunities to say he loves him, one for each denial. And the physicality of that is important. That’s not an idea or a memory or a feeling. So I think that if people sense God in nature, then a sacramental life is definitely for them.
<<< an [[interview with Nadia Bolz-Weber|http://religionandpolitics.org/2015/07/28/for-all-the-sinners-and-saints-an-interview-with-nadia-bolz-weber/#sthash.VRxPiFCe.dpuf]]
<<<
There is a fresh, sanctified I-don’t-care-ness that accompanies belief in the gospel. Whether you like me or not doesn’t matter, because my worth and my dignity and my identity are anchored in God’s approval. Christ won all of the approval and acceptance I need...
The pressure’s off. Jesus measured up so I wouldn’t have to live under the enslaving pressure of measuring up for others. And that’s good news.
<<< Tullian Tchividjian, [[interview|http://www.christianitytoday.com/le/2011/fall/warpeace.html?start=1]]
<<<
A photograph is a secret about a secret. The more it tells you the less you know.
<<< Diane Arbus
<<<
Committed a sin yesterday, in the hallway, at noon. I roared at my son, I grabbed him by the shirt collar, I frightened him so badly that he cowered and wept, and when he turned to run I grabbed him by the arm so roughly that he flinched, and it was that flicker of fear and pain across his face, the bright eager holy riveting face I have loved for ten years, that stopped me then and haunts me this morning; for I am the father of his fear, I sent it snarling into his heart, and I can never get it out now, which torments me.
Yes, he was picking on his brother, and yes, he had picked on his brother all morning, and yes, this was the culmination of many edgy incidents already, and no, he hadn’t paid the slightest attention to warnings and remonstrations and fulminations, and yes, he had been snide and supercilious all day, and yes, he had deliberately done exactly the thing he had specifically been warned not to do, for murky reasons, but still, I roared at him and grabbed him and terrified him and made him cower, and now there is a dark evil wriggle between us that makes me sit here with my hands over my face, ashamed to the bottom of my bones.
I do not know how sins can be forgiven. I grasp the concept, I admire the genius of the idea, I suspect it to be the seed of all real peace, I savor the Tutus and Gandhis who have the mad courage to live by it, but I do not understand how foul can be made fair. What is done cannot be undone, and my moment of rage in the hallway is an indelible scar on his heart and mine, and while my heart is a ragged old bag after nearly half a century of slings and stings, his is still new, eager, open, suggestible, innocent; he has committed only the small sins of a child, the halting first lies, the failed test paper hidden in the closet, the window broken in petulance, the stolen candy bar, the silent witness as a classmate is bullied, the insults flung like bitter knives.
Whereas I am a man, and have had many lies squirming in my mouth, and have committed calumny, and have evaded the mad and the ragged in the street, ignored the stinking Christ, his rotten teeth, his cloak of soggy newspapers, his voice of broken glass.
No god can forgive what we do to each other; only the injured can summon that extraordinary grace, and where such grace is born we cannot say, for all our fitful genius and miraculous machinery. We use the word god so easily, so casually, as if our label for the incomprehensible meant anything at all; and we forget all too easily that the wriggle of holy is born only through the stammer and stumble of us, who are always children. So we turn again and again to each other, and bow, and ask forgiveness, and mill what mercy we can muster from the muddle of our hearts.
The instant I let go of my son’s sinewy arm in the hallway he sprinted away and slammed the door and flew off the porch and ran down the street and I stood there simmering in shame; then I walked down the hill into the laurel thicket as dense and silent as the dawn of the world and found him there huddled and sobbing. We sat in the moist green dark for a long time, not saying anything, the branches burly and patient. Finally I asked for his forgiveness and he asked for mine and we walked out of the woods changed men.
<<< Brian Doyle, from Portland Magazine
<<<
I beg you, wait for God quietly, and don’t be so religious. To have nothing to show for yourself and to wait for God is better than to be polishing your piety. You shall not become godless by waiting for God. On the contrary, the truth of God’s cause will grow in your heart, and that is all that matters. A true word once in ten years is dearer to God than a daily sermon. It is your genuineness that matters…A single genuine moment has much greater consequences in God’s kingdom than a thousand religious practices.
<<< Christoph Friedrich Blumhardt, 19th century celebrity Lutheran/socialist
<<<
"""
''A Sleep Poem''
//by Wendell Berry//
The body in the invisible
Familiar room accepts the gift
Of sleep, and for a while is still;
Instead of will, it lives by drift
In the great night that gathers up
The earth and sky. Slackened, unbent,
Unwanting, without fear or hope,
The body rests beyond intent.
Sleep is the prayer the body prays,
Breathing in unthought faith the Breath
That through our worry-wearied days
Preserves our rest, and is our truth.
"""
<<<
<<<
Throughout the history of civilization, the historical process has essentially consisted of the 'right' way, the 'correct' way—a better one every time—conceived in the minds of the ideologues and politicians, being offered to people for the salvation of the world and the improvement of man's position within it. In order to be part of this process of reorganization, 'the few' had each time to waive their own way of thinking and direct their efforts outside themselves to fit in with the proposed plan of action. Thus involved in dynamic outward activity for the sake of a 'progress' that would save the future and mankind, the individual forgot about all that was specifically, personally, and essentially his own; caught up in the general effort he came to underestimate the significance of his own spiritual nature, and the result has been an ever more irreconcilable conflict between the individual and society. Concerned for the interests of the many, nobody thought of his own in the sense preached by Christ: 'Love your neighbor as yourself That is, love yourself so much that you respect in yourself the supra-personal, divine principle, which forbids you to pursue your acquisitive, selfish interests and tells you to give yourself, without reasoning or talking about it; to love others. This requires a true sense of your own dignity: an acceptance of the objective value and significance of the 'I' at the center of your life on earth, as it grows in spiritual stature, advancing towards the perfection in which there can be no egocentricity.
<<< Andrei Tarkovsky
[img[http://i.imgur.com/DrcBYPs.png]]
Wendell Berry, “A Warning To My Readers,” from The Selected Poems of Wendell Berry
<<<
I don’t believe in this 'gifted few' concept, just in people doing things they are really interested in doing. They have a way of getting good at whatever it is.
<<< Charles and Ray Eames
<<<
I feel like I ate a whole coffee plantation... plus the llama!
<<< Guybrush Threepwood
<<<
People use up their lives in heartbreaking political struggles, or get themselves killed in civil wars, or tortured in the secret prisons of the Gestapo, not in order to establish some central-heated, air-conditioned, strip-lighted Paradise, but because they want a world in which human beings love one another instead of swindling and murdering one another.
<<< George Orwell, The Collected Essays, Journalism and Letters of George Orwell
<<<
In Christ, we are free, and no Christian man or woman should be bound by man-made customs or traditions regarding eating or fasting, food or drink, days or seasons. No one should feel any tinge of guilt for doing absolutely nothing different during Lent.
<<< Toby Sumpter, [[Resources for Lent|http://www.tobyjsumpter.com/putting-on-the-armor-of-light-resources-for-lent/]]
Agreed, but I imagine if someone in our church didn't celebrate Christmas they would be made to feel quite odd. The most significant question is one of emphasis - a lot of "it's very easy to sin when observing Lent". Not a lot of "it's very easy to sin when celebrating Christmas".
I think it's a [[this far, no farther]] situation.
<<<
“Logistically I suppose my process of making art is driven less by abstractions of faith or politics and more by practical theory: composition and balance and color,” said Stevens. “It’s not so much that faith influences us as it lives in us. In every circumstance (giving a speech or tying my shoes), I am living and moving and being. This absolves me from ever making the embarrassing effort to gratify God (and the church) by imposing religious content on anything I do.”
<<< Sufjan Stevens, [[this interview|http://www.theatlantic.com/entertainment/archive/2015/03/sufjan-stevens-and-a-better-way-to-write-music-about-faith/388802/]]
<<<
Accept your loneliness. It is one stage, and only one stage, on a journey that brings you to God. It will not always last. Offer up your loneliness to God, as the little boy offered to Jesus his five loaves and two fishes. God can transform it for the good of others. Above all, do something for somebody else!
<<< Elisabeth Elliot, Passion and Purity
<iframe width="420" height="315" src="https://www.youtube.com/embed/0rYjvlu8zfU" frameborder="0" allowfullscreen></iframe>
<<<
...the acedia of our age. Paul Griffiths has recently written that acedia “finds only sadness in the good things of the LORD,” and R.J. Snell speaks of acedia as disgust at being.
<<< Peter Leithart, [[How to Preach About Bruce Jenner|http://www.firstthings.com/web-exclusives/2015/06/preaching-about-bruce]]
<<<
Christian spiritual wisdom has always regarded acedia as a vice that, unchecked, will eventually prove deadly to the Christian life. For spiritual apathy first leads us to despair of God’s love and mercy and eventually issues in a sadness that will always cause problems. For, as St. Thomas Aquinas observes in On Evil, “No human being can long remain pleasureless and sad.” People engulfed by the sadness to which their indulgence in spiritual apathy led them tend to avoid such sadness first by shirking and then by resenting and scorning God’s love and mercy.
This vice’s post-Christian secular offshoot, an unthematic despair posing as boredom, covers—like a fungus—the spiritual, intellectual, and emotional life of many, if not most, who inhabit the affluent segments of the Western secular world. The old vice of acedia, of spiritual apathy, is the root cause of the typically bourgeois ennui, boredom.
<<< Reinhard Hutter, [[Pornography and Acedia|http://www.firstthings.com/article/2012/04/pornography-and-acedia]]
Best analysis of pornography I've read, connecting it to ressentiment.
Activity feeds, along with [[info cards]] are the metaphors I see the web going in right now.
If I had to do them, I'd start with http://getstream.io/
Then I'd refactor later, or build an internal service that mirrored the getstream API endpoints. They've actually open-sourced their framework:
https://github.com/tschellenbach/Stream-Framework
It uses a fairly open Atom activity stream structure
---
Open standard, from 2011 (!): http://activitystrea.ms/
<<<
I’ve referred in the past to the phenomenon of “affinity posting”. The idea of affinity posting is you post not to spread information or start a discussion, but to demonstrate your membership in certain affinity groups. You’re a fan of Doctor Who or Twilight. You’re a beer drinker. You’re a teacher who believes the lecture is dead. You’re a pacifist. A libertarian. A skeptic. An ally.
I do a lot of affinity posting. So do you. If I retweet a John Oliver rant about the minimum wage, it’s probably not because there’s something particularly useful in the rant. It’s largely to show hey, I’m in this group too. You like this, I like this, and that’s a communion of sorts.
There’s nothing wrong with affinity posting, and lots of times it serves a good purpose. People have some pretty advanced ideas about what I believe and like and support before they meet me, and that’s nice. And it can be pleasant in a world where one feels like they struggle alone for a cause to see an internet full of others supporting this or that.
<<<
<<<
I won’t go into it too deeply, but I think affinity posting as an interaction model is lousy and keeps the web in an infantile state.
I’ve been thinking about an alternate way of thinking about re-posting the things of others: the metaphor of a personal library... In a library if we found books by nobody but post-structuralists, we’d think “This is a narrow thinker,” not “Thank God there is nothing I disagree with on these shelves!”
When I look at someone’s library, I don’t ask “Is this book correct?” or “Do you really agree with this person?!?” Instead, I ask “Is this worth reading? Why?”
<<< Mike Caulfield, [[Hapgood|http://hapgood.us/2015/07/27/adopting-a-library-metaphor-for-sharing/]]
<<<
If I look back on the couple of moments of success I’ve been lucky enough to have in my life, they all seem to come after a good ass-kicking.
<<< Jason Calacanis
<<<
Our current obsession with gratitude is just another indication that we’ve lost our heads in a race to make the mundane glorious. We aren’t shocked to find God hiding beneath the salt cellar, as the art critic John Berger once put it—we fully expect him there. We’ve already Instagrammed the saltshaker and tagged it blessed….I should be grateful, yes. But beware how quickly an exhibition of gratitude begins to look like self-righteousness, privilege, even naivety.
<<< Jessica Griffith, [[Against Gratitude|http://www.patheos.com/blogs/goodletters/2014/04/against-gratitude/]]
This is good, but I think there's a bigger case beyond social media.
I need to find that post on the inadequacy of basing one's religion on gratefulness for privilege. And there's the idea that the prophets and other Bible heroes were mostly big whiners.
<<<
The Benedict Option, as I understand it, is based on three premises.
# The dominant media of our technological society are powerful forces for socializing people into modes of thought and action that are often inconsistent with, if not absolutely hostile to, Christian faith and practice.
# In America today, churches and other Christian institutions (schools at all levels, parachurch organizations with various missions) are comparatively very weak at socializing people, if for no other reason than that they have access to comparatively little mindspace.
# Healthy Christian communities are made up of people who have been thoroughly grounded in, thoroughly socialized into, the the historic practices and beliefs of the Christian church.
From these three premises proponents of the Benedict Option draw a conclusion: //If we are to form strong Christians, people with robust commitment to and robust understanding of the Christian life, then we need to shift the balance of ideological power towards Christian formation, and that means investing more of our time and attention than we have been spending on strengthening our Christian institutions.//
<<<
From this: http://blog.ayjay.org/uncategorized/questions-for-the-critics-of-the-benedict-option/
I understand opposition to the term not as a reaction to Dreher's rhetoric per se, but about the competition to name cultural trends in a pop-sociology way. "BoBos in Paradise", the term "Millenial" and other such bullshit.
<<<
The next time you see someone talking about algorithms, replace the term with ‘God’ and ask yourself if the sense changes any?
<<<
<<<
The scientific revolution was meant to challenge tradition and faith, particularly a faith in religious superstition. But today, Enlightenment ideas like reason and science are beginning to flip into their opposites. Science and technology have become so pervasive and distorted, they have turned into a new type of theology...
...the algorithm has taken on a particularly mythical role in our technology-obsessed era, one that has allowed it wear the garb of divinity. Concepts like ‘algorithm’ have become sloppy shorthands, slang terms for the act of mistaking multipart complex systems for simple, singular ones. Of treating computation theologically rather than scientifically or culturally.
<<< Ian Bogost, [[The Cathedral of Computation|http://www.theatlantic.com/technology/archive/2015/01/the-cathedral-of-computation/384300/]]
Alicea was a dear friend and early patron of [[The Storm Cellar]]. She introduced Laura to a favorite almond tea, and gave me a smoking jacket which I regretfully donated when I stopped smoking.
She called her house 'Alicea's Kramit Inn' and loved kitsch and collectibles. She had a collection of vintage smoking paraphernalia, and loved to smoke cigarettes. She cared for five cats with the help of Margretta at Cedar Veterinary.
She died on Oct. 5, 2011.
<<<
For three or four years all I listened to were folk standards. I went to sleep singing folk songs. I sang them everywhere, clubs, parties, bars, coffeehouses, fields, festivals. And I met other singers along the way who did the same thing and we just learned songs from each other. I could learn one song and sing it next in an hour if I’d heard it just once…. If you sang “John Henry” as many times as me… If you had sung that song as many times as I did, you’d have written “How many roads must a man walk down?” too.
<<< Bob Dylan, from his [[2015 Person of the Year Speech|http://www.latimes.com/entertainment/music/posts/la-et-ms-grammys-2015-transcript-of-bob-dylans-musicares-person-of-year-speech-20150207-story.html]]
<<<
I’m more surprised people become only one or the other. All kids are scientists, and all kids are artists. They all read. How is it that we give up such big things? That’s the question if you ask me. I just didn’t give stuff up.
<<< Janna Levin, when asked how she managed to become both an astrophysicist and a writer
https://www.quantamagazine.org/20160505-janna-levins-theory-of-doing-everything/
<<<
The twelfth conclusion is that the multitude of crafts not needful used in our church nourisheth much sin in waste, curiosity, and disguising. This showeth experience, and reason proveth, for nature with a few crafts sufficeth to need of man. The corollary is, since Saint Paul sayeth, we having our bodily food and clothing, we should hold ourselves satisfied, us thinketh that goldsmiths and armourers and all manner crafts not needful to men, after [according to] the Apostle, should be destroyed for the increase of virtue. For though to these crafts named were much more needful in the Old Law, the New testament hath voided these and many others.
<<< John Wycliffe, from the Twelve Conclusions of the Lollards
<<<
All media work us over completely. They are so pervasive in their personal, political, economic, aesthetic, psychological, moral, ethical, and social consequences that they leave no part of us untouched, unaffected, unaltered.
<<< Marshall ~McLuhan, The Medium is the Massage
<<<
All men dream, but not equally. Those who dream by night in the dusty recesses of their minds, wake in the day to find that it was vanity: but the dreamers of the day are dangerous men, for they may act on their dreams with open eyes, to make them possible.
<<< T.E. Lawrence
<<<
"All real living," Martin Buber wrote, "is meeting."
One consequence of this emphasis is the recognition that "the fundamental reality of human existence is to be found not in conceptual abstractions, but in concrete human relationships." Not in "I think, therefore I am," but in "How are you?"
<<< James Carroll, Christ Actually (p. 150)
<<<
Making films is all about - as soon as you're finished - continually regretting what you've done. When we look at films we've made, all we can see are the flaws; we can't even watch them again in a normal way. [laughs] I never feel like watching my own films again. So unless I start working on a new one, I'll never be free from the curse of the last one. I'm serious. Unless I start working on the next film, the last one will be a drag on me for another two or three years.
<<< Hayao Miyazaki
I feel this way about every creative venture, every time
The Kingdom of God was inaugurated in the life, death, and resurrection of Jesus Christ. But there is still tension between this world and the world to come, and Christians are called to live in [[this tension|Cross of reality]].
The phrase 'already / not yet' describes the Christian's sure hope in the resurrection while acknowledging the brokenness we see in the world.
//See also//
* John Piper, [[Is the Kingdom Present or Future?|http://www.desiringgod.org/sermons/is-the-kingdom-present-or-future]]
<<<
The Church quickly assumed religious configurations appropriate both to its age and to its own spiritual content. Jewish Scripture provided a grammar for worship, while the common cultic forms of ancient society were easily adaptable to Christian use. And there was also a certain degree of natural “pseudomorphism” in the process, a crystallization of Christian corporate life (with all its novelty) within the religious space vacated by the pagan cults it displaced. This was inevitable and necessary; a wholly apocalyptic consciousness, subsisting upon a moment of pure interruption, can be sustained for only a very brief period. Even then, the alloy was never entirely stable. At least, it has often seemed as if the Christian event is of its nature something too refractory—the impulse to rebellion too constitutive of its own spiritual logic— to be contained even within its own institutions. This might be one of the reasons why Christianity over the centuries not only has proved so irrepressibly fis- sile (as all large religious traditions, to some degree, are), but has also given rise to a culture capable of the most militant atheism, and even of self-conscious nihilism. Even in its most enduring and necessary historical forms, there is an ungovernable energy within it, something that strives not to crystallize but rather to disperse itself into the future, to start always anew, more spirit than flesh or letter. I am not speaking, I hasten to add, of some sup- posed “inner essence” of the faith, some pure Wesen des Christentums that somehow became trapped in the amber of subsequent tradition. I am speaking, rather, of a distinct element of Christianity’s power that cannot be ignored without fundamentally ignoring the very character of the Gospel: an element that may occasionally generate certain intrinsic stresses within the Church, but that could not help but produce a far greater and more chronic tension once an extrinsic accommodation had been reached with political authority. This was, of course, a fruitful tension, producing as it did all the immense social goods of the Christian order: the cultural creativity, the slow amelioration of laws, the birth of the hospital, the establishment of an immeasurably richer moral grammar than the West had ever known, a whole vast and various range of artistic, technical, and scientific achievements—all of which were inseparable in one way or another from the radical revision of the under- standing of the human being and of nature that Christianity introduced into the world. Yet its moral failures were no less astonishing or numerous. And now we live in the time after Christendom, among the rapidly vanishing fragments of its material cul- ture, bound to it by only a few lingering habits of thought. Modernity is the post-Christian age, the reality of a culture that was shaped by the final fail- ure of that accommodation …Which yields the troubling thought that perhaps the historical force ultimately most destructive of the unity of the Christian culture of the West has been not principally atheism, materialism, capitalism, collectivism, or what have you—these may all be secondary manifestations of some deeper problem—but Christianity. Or, rather, I suppose I should say, an essential Christian impulse that, as a result of the contradictions inherent in Christendom, had become alienated from its true rationality and ultimate meaning. …So perhaps the best moral sense Christians can make of the story of Christendom now, from the special vantage of its aftermath, is to recall that the Gospel was never bound to the historical fate of any political or social order, but always claimed to enjoy a transcendence of all times and places. Perhaps its presence in human history should always be shatteringly angelic: It announces, even over against one’s most cherished expectations of the present or the future, a truth that breaks in upon history, ever and again, always changing or even destroying the former things in order to make all things new. That being so, surely modern Christians should find some joy in being forced to remember that they are citizens of a Kingdom not of this world, that here they have no enduring city, and that they are called to live as strangers and pilgrims on the earth.
<<< David Bentley Hart, No Enduring City
<<<
...the best description of much contemporary evangelicalism is not ‘always reforming’ but ‘always reacting’.
<<< Kevin Vanhoozer
http://amberlink.org/
Service that prevents link rot by caching copies of pages when linked on a site.
49% of links in Supreme Court decisions are dead
135445 Wikipedia articles contain dead external links
<<<
Not only was the ambiguity in the text unclear to the senders, it was unclear to the receivers as well. At the end of the experiment, we asked the receivers to guess how many of the items they had interpreted correctly. They thought they had done a superb job, interpreting nine out of 10 of the sentences correctly, regardless of whether the communication had been over the phone or by e-mail. Here you can see why ambiguous mediums like e-mail and texting and Twitter are such fertile ground for misunderstanding. People using ambiguous mediums think they are communicating clearly because they know what they mean to say, receivers are unable to get this meaning accurately but are certain that they have interpreted the message accurately, and both are amazed that the other side can be so stupid. As the context in which you’re trying to understand another mind becomes more ambiguous, the influence of your own perspective increases. If you really want to understand your coworker or competitor or children, don’t rely on modern mediums of communication that give you only a modern Rorschach test about the mind of another person. Twitter does not allow others to understand your deep thoughts and broad perspective. It only allows others to confirm how stupid they already think you are.
<<< [[Why We Can’t Get Over Ourselves - Issue 27: Dark Matter - Nautilus|http://nautil.us/issue/27/dark-matter/why-we-cant-get-over-ourselves]]
More ambiguous mediums = increased importance of one's perspective (vs. actually communicating clearly)
<<<
"""I will do such things,—
What they are, yet I know not: but they shall be
The terrors of the earth"""
<<< King Lear
<<<
Ambitions for God, if they are to be worthy, can never be modest.
<<< William Carey
John Stott quotes a variation on this:
<<<
Ambitions for self may be quite modest. . . . Ambitions for God, however, if they are to be worthy, can never be modest. There is something inherently inappropriate about cherishing small ambitions for God. How can we ever be content that he should acquire just a little more honour in the world? No. Once we are clear that God is King, then we long to see him crowned with glory and honour, and accorded his true place, which is the supreme place. We become ambitious for the spread of his kingdom and righteousness everywhere.
<<< John Stott, The Message of the Sermon on the Mount (IVP, 1993), 172–173.
<<<
This is an age of divorce … and you can’t put it all back together again. What you do is the only thing that you can do. You take two things that ought to be together and you put them back together. Two things. Not all things.
<<< Wendell Berry
<<<
Who is able to withstand evil? Only those whose final standard is not their own reason, principles, conscience, freedom, or virtue, but who are ready to sacrifice all this when called to obedient and responsible actions in faith and in exclusive allegiance to God – people who try to make their whole life an answer to the question and call of God.
<<< Dietrich Bonhoeffer, Widerstand und Ergebung
<<<
"""''An Embarrassment''
by Wendell Berry
"Do you want to ask
the blessing?"
"No. If you do,
go ahead."
He went ahead:
his prayer dressed up
in Sunday clothes
rose a few feet
and dropped with a soft
thump.
If a lonely soul
did ever cry out
in company its true
outcry to God,
it would be as though
at a sedate party
a man suddenly
removed his clothes
and took his wife
passionately into his arms."""
<<<
This reminds me of Annie Dillard's [[certain words people have successfully addressed to God]] - the surreal shock of communication with God
<<<
An entrepreneur is a person who, in order to avoid working eight hours a day, works sixteen hours a day.
<<< Chin-Ning Chu
<<<
The real hero is always a hero by mistake; he dreams of being an honest coward like everybody else.
<<< Umberto Eco
<<<
An ignorant person is one who doesn’t know what you have just found out.
<<< Will Rogers
<<<
"Another fantasy of liberal education is that the student who advances to the university should take up the study that interests him most. For a small number of students this is in the main right. Even at a very early stage of school life, we can identify a few individuals with a definite inclination towards one group of studies or another. The danger for these unfortunate ones is that if left to themselves they will overspecialize, they will be wholly ignorant of the general interests of human beings. We are all in one way or another naturally lazy, and it is much easier to confine ourselves to the study of subjects in which we excel. But the great majority of the people who are to be educated have no very strong inclination to specialize, because they have no definite gifts or tastes. Those who have more lively and curious minds will tend to smatter. No one can become really educated without having pursued some study in which he took no interest – for it is a part of education to learn to interest ourselves in subjects for which we have no aptitude."
<<< T. S. Eliot (1932)
<<<
It's also counterintuitive: When most people feel anxious, they likely tell themselves to just relax. "When asked, 'how do you feel about your upcoming speech?', most people will say, 'I'm so nervous, I'm trying to calm down,'" said Alison Wood Brooks, a professor at Harvard Business School who has studied the phenomenon.
<<<
http://www.theatlantic.com/health/archive/2016/03/can-three-words-turn-anxiety-into-success/474909/
<<<
An 'American tradition' is anything that happened to a baby boomer twice.
<<< Randall Munroe (xkcd)
Different than API-first development, but APIs are still central to openness and adaptability.
http://apicommons.org/
<<<
Architecture arouses sentiments in man. The architect’s task therefore, is to make those sentiments more precise.
<<< Adolf Loos
[img[http://i.imgur.com/j2J1ge8.jpg]]
[img[http://i.imgur.com/YcjTMXP.gif]]
<<<
Art arises out of our desire for both beauty and truth and our knowledge that they are not identical.
<<< W. H. Auden
<<<
Art for Art’s sake is a philosophy of the well-fed.
<<< Frank Lloyd Wright
<<<
Thus the origin of art does not lie in the perception of something which is present, but in an impulse to go beyond that which already exists. Art is always the child of the longing for something else. It shapes something which is not present, for and through the imagination, because that which is present does not satisfy man. In this sense it has more to do with Redemption than with Creation. It is an expression of the fact that man is conscious of his need for Redemption—otherwise how is it that he cannot be content with the world as it is? and it shows that he has a dim premonition and a vision of the possibility of a better world. It is, therefore, an indication, given with the created order, even to fallen man, of man’s knowledge of his origin, which he has never lost, of its restoration and its consummation.
<<< Emil Brunner, on art and faith
<<<
Art is human; error is human; ergo, art is error. Inevitably, your work (like, uh, the preceding syllogism) will be flawed.
<<< Ted Orland & David Bayles, Art & Fear
<<<
The most important thing in art is The Frame. For painting: literally; for other arts: figuratively—because, without this humble appliance, you can’t know where The Art stops and The Real World begins. You have to put a ‘box’ around it because otherwise, what is that s* on the wall?
<<< Frank Zappa
<<<
When the London newspaper the Daily Telegraph did a story on [Lewis] in 1944, the writer referred to him at one point as “ascetic Mr. Lewis,” a description that made Tolkien splutter with incredulity and indignation. He wrote to his son, “‘Ascetic Mr. Lewis’ –!!! I ask you! He put away three pints in a very short session we had this morning, and said he was ‘going short for Lent.’ To any who might might criticize such gusto as unseemly for a Christian, Lewis could reply, “There is no good trying to be more spiritual than God. God never meant man to be a purely spiritual creature. That is why He uses material things like bread and wine to put the new life in us. We may think this rather crude and unspiritual. God does not: He invented eating. He likes matter. He invented it.”
<<< Alan Jacob's The Narnian, p.190
<<<
"""
''Ash Wednesday''
//by T. S. Eliot//
Because I do not hope to turn again
Because I do not hope
Because I do not hope to turn
Desiring this man's gift and that man's scope
I no longer strive to strive towards such things
(Why should the aged eagle stretch its wings?)
Why should I mourn
The vanished power of the usual reign?
Because I do not hope to know again
The infirm glory of the positive hour
Because I do not think
Because I know I shall not know
The one veritable transitory power
Because I cannot drink
There, where trees flower, and springs flow, for there is nothing again
Because I know that time is always time
And place is always and only place
And what is actual is actual only for one time
And only for one place
I rejoice that things are as they are and
I renounce the blessed face
And renounce the voice
Because I cannot hope to turn again
Consequently I rejoice, having to construct something
Upon which to rejoice
And pray to God to have mercy upon us
And pray that I may forget
These matters that with myself I too much discuss
Too much explain
Because I do not hope to turn again
Let these words answer
For what is done, not to be done again
May the judgement not be too heavy upon us
Because these wings are no longer wings to fly
But merely vans to beat the air
The air which is now thoroughly small and dry
Smaller and dryer than the will
Teach us to care and not to care
Teach us to sit still.
Pray for us sinners now and at the hour of our death
Pray for us now and at the hour of our death.
II
Lady, three white leopards sat under a juniper-tree
In the cool of the day, having fed to satiety
On my legs my heart my liver and that which had been contained
In the hollow round of my skull. And God said
Shall these bones live? shall these
Bones live? And that which had been contained
In the bones (which were already dry) said chirping:
Because of the goodness of this Lady
And because of her loveliness, and because
She honours the Virgin in meditation,
We shine with brightness. And I who am here dissembled
Proffer my deeds to oblivion, and my love
To the posterity of the desert and the fruit of the gourd.
It is this which recovers
My guts the strings of my eyes and the indigestible portions
Which the leopards reject. The Lady is withdrawn
In a white gown, to contemplation, in a white gown.
Let the whiteness of bones atone to forgetfulness.
There is no life in them. As I am forgotten
And would be forgotten, so I would forget
Thus devoted, concentrated in purpose. And God said
Prophesy to the wind, to the wind only for only
The wind will listen. And the bones sang chirping
With the burden of the grasshopper, saying
Lady of silences
Calm and distressed
Torn and most whole
Rose of memory
Rose of forgetfulness
Exhausted and life-giving
Worried reposeful
The single Rose
Is now the Garden
Where all loves end
Terminate torment
Of love unsatisfied
The greater torment
Of love satisfied
End of the endless
Journey to no end
Conclusion of all that
Is inconclusible
Speech without word and
Word of no speech
Grace to the Mother
For the Garden
Where all love ends.
Under a juniper-tree the bones sang, scattered and shining
We are glad to be scattered, we did little good to each other,
Under a tree in the cool of the day, with the blessing of sand,
Forgetting themselves and each other, united
In the quiet of the desert. This is the land which ye
Shall divide by lot. And neither division nor unity
Matters. This is the land. We have our inheritance.
III
At the first turning of the second stair
I turned and saw below
The same shape twisted on the banister
Under the vapour in the fetid air
Struggling with the devil of the stairs who wears
The deceitul face of hope and of despair.
At the second turning of the second stair
I left them twisting, turning below;
There were no more faces and the stair was dark,
Damp, jagged, like an old man's mouth drivelling, beyond repair,
Or the toothed gullet of an aged shark.
At the first turning of the third stair
Was a slotted window bellied like the figs's fruit
And beyond the hawthorn blossom and a pasture scene
The broadbacked figure drest in blue and green
Enchanted the maytime with an antique flute.
Blown hair is sweet, brown hair over the mouth blown,
Lilac and brown hair;
Distraction, music of the flute, stops and steps of the mind over the third stair,
Fading, fading; strength beyond hope and despair
Climbing the third stair.
Lord, I am not worthy
Lord, I am not worthy
but speak the word only.
IV
Who walked between the violet and the violet
Who walked between
The various ranks of varied green
Going in white and blue, in Mary's colour,
Talking of trivial things
In ignorance and knowledge of eternal dolour
Who moved among the others as they walked,
Who then made strong the fountains and made fresh the springs
Made cool the dry rock and made firm the sand
In blue of larkspur, blue of Mary's colour,
Sovegna vos
Here are the years that walk between, bearing
Away the fiddles and the flutes, restoring
One who moves in the time between sleep and waking, wearing
White light folded, sheathing about her, folded.
The new years walk, restoring
Through a bright cloud of tears, the years, restoring
With a new verse the ancient rhyme. Redeem
The time. Redeem
The unread vision in the higher dream
While jewelled unicorns draw by the gilded hearse.
The silent sister veiled in white and blue
Between the yews, behind the garden god,
Whose flute is breathless, bent her head and signed but spoke no word
But the fountain sprang up and the bird sang down
Redeem the time, redeem the dream
The token of the word unheard, unspoken
Till the wind shake a thousand whispers from the yew
And after this our exile
V
If the lost word is lost, if the spent word is spent
If the unheard, unspoken
Word is unspoken, unheard;
Still is the unspoken word, the Word unheard,
The Word without a word, the Word within
The world and for the world;
And the light shone in darkness and
Against the Word the unstilled world still whirled
About the centre of the silent Word.
O my people, what have I done unto thee.
Where shall the word be found, where will the word
Resound? Not here, there is not enough silence
Not on the sea or on the islands, not
On the mainland, in the desert or the rain land,
For those who walk in darkness
Both in the day time and in the night time
The right time and the right place are not here
No place of grace for those who avoid the face
No time to rejoice for those who walk among noise and deny the voice
Will the veiled sister pray for
Those who walk in darkness, who chose thee and oppose thee,
Those who are torn on the horn between season and season, time and time, between
Hour and hour, word and word, power and power, those who wait
In darkness? Will the veiled sister pray
For children at the gate
Who will not go away and cannot pray:
Pray for those who chose and oppose
O my people, what have I done unto thee.
Will the veiled sister between the slender
Yew trees pray for those who offend her
And are terrified and cannot surrender
And affirm before the world and deny between the rocks
In the last desert before the last blue rocks
The desert in the garden the garden in the desert
Of drouth, spitting from the mouth the withered apple-seed.
O my people.
VI
Although I do not hope to turn again
Although I do not hope
Although I do not hope to turn
Wavering between the profit and the loss
In this brief transit where the dreams cross
The dreamcrossed twilight between birth and dying
(Bless me father) though I do not wish to wish these things
From the wide window towards the granite shore
The white sails still fly seaward, seaward flying
Unbroken wings
And the lost heart stiffens and rejoices
In the lost lilac and the lost sea voices
And the weak spirit quickens to rebel
For the bent golden-rod and the lost sea smell
Quickens to recover
The cry of quail and the whirling plover
And the blind eye creates
The empty forms between the ivory gates
And smell renews the salt savour of the sandy earth This is the time of tension between dying and birth The place of solitude where three dreams cross Between blue rocks But when the voices shaken from the yew-tree drift away Let the other yew be shaken and reply.
Blessed sister, holy mother, spirit of the fountain, spirit of the garden,
Suffer us not to mock ourselves with falsehood
Teach us to care and not to care
Teach us to sit still
Even among these rocks,
Our peace in His will
And even among these rocks
Sister, mother
And spirit of the river, spirit of the sea,
Suffer me not to be separated
And let my cry come unto Thee.
"""
<<<
<<<
A person whose financial requirements are modest and whose curiosity, skepticism, and indifference to reputation are outsized is a person at risk of becoming a journalist.
<<< Louis Menand
http://www.newyorker.com/magazine/2011/09/05/browbeaten
<<<
As for literary criticism in general: I have long felt that any reviewer who expresses rage and loathing for a novel or a play or a poem is preposterous. He or she is like a person who has put on full armor and attacked a hot fudge sundae or a banana split.
<<< Kurt Vonnegut
<<<
Almost every man wastes part of his life in attempts to display qualities which he does not possess.
<<< Samuel Johnson
[img[http://i.imgur.com/LdPnUmB.jpg]]
[[My name|My name]] is Austin Storm. Here are a few things you might want to know, or [[maybe you just forgot|I see what you did there]].
I like [[starting businesses|entrepreneurship]] more than running them. I try to temper my restlessness by forcing myself to follow through.
I have a [[quail|Sticks the Quail]] and a sparrow.
I am a [[distributist|Distributism]] – a ‘Christian socialist’.
I am [[optimistic|my personality]], but prone to bouts of [[depression|depression]].
As a child I decided that success meant orange juice with every breakfast and haircuts every other week. By that measure, I have not yet arrived.
I dislike [[the telephone|The telephone was an aberration]].
I prefer liquor to beer, and Gin is my favorite liquor.
I'm probably a belletrist.
I grew up in [[Annapolis, Maryland]] and now live in [[Moscow, Idaho|Moscow]]. All things being equal, I’d like to live in South America.
I think I would be very happy if I was able to [[start a new business|projects]] every few years for the rest of my life.
<<<
... if anyone was ever less prepared for a job, I'd be surprised.
Well, what cards, if any, did I hold?
Just one. I was a lifelong autodidact.
I'd done some teaching, but I'd always disliked being taught. You know the wonderful teacher everyone has at some point in their school career, the one who opens your eyes, inspires you, fills you with enthusiasm... Well, I never met that teacher. All the ones I met I either tolerated or flat-out disliked. After the first two days at university I found lectures weren't compulsory and never went to another one. I'd figured out how they did it. They just regurgitated their own books. You could read the d--n books yourself in one tenth of the time, and leave the rest free for all the fun things undergraduates do.
Most students don't know how to do this, so here's my secret. I read aggressively, and I never hit my head on a brick wall.
Most students read passively. They see themselves as vessels waiting to be filled. They have awe and respect for the printed word. I don't. I want to catch the authors out. I assume, correctly, that part of the stuff, maybe most of it, will be wrong. And I'm going to figure out which part it is. Even if you know nothing about a subject you can spot self-contradictions, and if you read two authors on the same topic, you can spot regular contradictions. They can't both be wrong. (They could both be wrong, though.)
Most students hit their heads on brick walls. They're given a text to read, and somewhere in Chapter 1 or 2 they bog down completely. But they persevere, oh, do they persevere! (That's unless they decide to drop out completely.) They feel if they don't absorb Chapter 2 to its very last syllable, they'll be totally lost when they get to Chapter 3. So they keep slugging away until their eyes glaze, trying to force understanding. Finally they sleep on it and start over the next day.
What I do is skim through the text looking for anything I understand. Sometimes at first it's as little as the introduction and a couple of paragraphs here and there. No matter. I store that in my mind and do something else. Read stuff about the subject that I do understand, stop again the moment it gets to be hard work. Then after a week or two, I come back to the first text, skim it again for anything that makes sense. There will be more this time. I guarantee it. Maybe not much, but a little more will start to make sense. Repeat the process. You'll probably find you're getting patches all over the book. Okay, fine. The patches spread like ink-blots; eventually they'll link up. Suddenly, what a few weeks before was a trek into impenetrable jungle becomes a stroll through the park.
<<< Derek Bickerton, Bastard Tongues
[img[https://nyogalleristny.files.wordpress.com/2013/06/hansulrichkanye.jpg]]
<<<
Good taste is a gift, but bad taste is a privilege.
<<< Kanye West, as told to Hans Ulrich Obrist
perhaps after Dave Hickey? I feel certain I've heard it before...
<<<
"'Bad, bad,' says the buyer, But when he goes his way, then he boasts."
<<< Prov. 20:14, one of the Storm Cellar's 'life verses'
Code-named BAHKP, my semantic web / linked data utility social network thing.
The authoritative place to find information is still 1) the Google project doc, and 2) Pinboard bookmarks
But since I keep jumping through the same index-card conceptual exercises, maybe this will help.
One of the themes of this project is trying to fix problems that have been identified by such people as the creator of the WWW, over a decade ago, with variations on solutions that were attempted by the world's most powerful corporations (Facebook, Google), with a bootstrap budget and small social utilities. It's a total disaster.
Grouped cards:
* Metaphors / Observations
** [[big data iceberg]]
** [[FRBR]]
** [[the Barcode]]
** [[ownership of your online persona]]
* Design concepts
** [[activity feeds]]
** [[info cards]]
** [[web components]]
** [[semantic wiki]]
* Strategy
** [[utility to network]]
** [[Wordpress plugin]]
** [[.org/.com]]
** [[API emphasis]]
** [[No VC, not ever, no never]]
* Little services / APIs to employ
** [[amberlink.org]]
* Similar Services
** Semantic Everything Sites
*** [[Freebase]]
*** [[Hunch.com]]
*** [[Wikidata]]
** Specific Datasets
*** [[Food - Open Food Facts|Open Food Facts]]
*** [[Products - Outpan|Outpan]]
*** [[Products - Semantics3|Semantics3]]
** Personality Prediction
** Item Tracking
*** [[HistoryTag]]
!!! Vital Malcontents
First off, the [[semantic web]] has utterly failed. No one cares about the integrity of your data.
Yet uncategorized cards (tagged 'BAHKP' and tagged 'stub'):
<$list filter="[tag[BAHKP]tag[stub]] +[sort[title]]">
<div class="tc-menu-list-item">
<$link to={{!!title}}><$view field="title"/></$link>
</div>
</$list>
<<<
Why all my students love love love gay marriage: because they are, for all intents and purposes, gay.
That is: their relationships are temporary, experimental, experiential, and casually genital.
In other words, they have grown up in an insane “achievement first” culture that prizes credential grabbing, resume building (in the Brooks’ sense) over and always against a kind of semi-serious “courting” of middle-America or their perceptions “of the way things used to be.” They have grown up with the notion that relationships are necessarily divorced from any kind long term commitment, because how can you focus on your career and not have the flexibility to move from NY or BOS to DC and back on a whim. And they have been taught that they should NOT tie themselves down prematurely…every friggin’ movie that came out in the 90′s seemed to have a throughline in it that their parents were divorced because they got married to early “and then grew apart” or some such bit.
But for them, sex is sex. All is a la carte. All relationships, since they are sterile and contracepted, are actually “gay” relationships.
Thus, when one of their gay friends comes out, they see this as a way of carving out a meaningful future for themselves, they who have forsaken so much to “achieve.” They got into Duke, dammit, or Yale, or Stanford. They should be able to get their own “cherry on top.” It’s like their gay friends are finally able to live the upside down world that they are trying to live, too. It’s a version of white guilt. It is an odd expression of hope that they too might be able to find a meaningful relationship in this barren wasteland of Tinder and brunch.
And make no mistake, they are most certainly obsessed with “identity” because they too have none. The sad thought is that we have carved out a real blank canvas in which these kids can do whatever they want, and in the end, they waste it with tawdry hook ups, and selfie-sticked memories on their Facebook pages.
I quote my favorite paragraph from Lewis Mumford’s The City in History, about late Roman Decadence:
//From the standpoint of both politics and urbanism, Rome remains a significant lesson of what to avoid: its history presents a series of classic danger signals to warn one when life is moving in the wrong direction. Wherever crowds gather in suffocating numbers, wherever rents rise steeply and housing conditions deteriorate, wherever a one-sided exploitation of distant territories removes the pressure to achieve balance and harmony nearer at hand, there the precedents of Roman building almost automatically revive, as they have come back today: the arena, the tall tenement, the mass contests and exhibitions, the football matches, the international beauty contests, the strip-tease made ubiquitous by advertisement, the constant titillation of the senses by sex, liquor and violence—all in true Roman style. So, too, the multiplication of bathrooms and the over-expenditure on broadly paved motor roads, and above all, the massive collective concentration on glib ephemeralities of all kinds, performed with supreme technical audacity. These are symptoms of the end: magnifications of demoralized power, minifications of life. When these signs multiply, Necropolis is near, though not a stone has yet crumbled. For the barbarian has already captured the city from within. Come, hangman! Come, vulture!//
Come, hangman indeed.
<<<
<<<
The gospels are basically conspiracy stories.
<<< Doug Jones
<<<
And we are put on earth a little space, /
That we may learn to bear the beams of love,
<<< William Blake, The Little Black Boy
<<<
"""''Before the Beginning''
//by Christina Rossetti//
Before the beginning Thou hast foreknown the end,
Before the birthday the death-bed was seen of Thee:
Cleanse what I cannot cleanse, mend what I cannot mend.
O Lord All-Merciful, be merciful to me.
While the end is drawing near I know not mine end:
Birth I recall not, my death I cannot foresee:
O God, arise to defend, arise to befriend,
O Lord All-Merciful, be merciful to me."""
<<<
<<<
We’re only here for a short while. And I think it’s such a lucky accident, having been born, that we’re almost obliged to pay attention. In some ways, this is getting far afield. I mean, we are — as far as we know — the only part of the universe that’s self-conscious. We could even be the universe’s form of consciousness. We might have come along so that the universe could look at itself. I don’t know that, but we’re made of the same stuff that stars are made of, or that floats around in space. But we’re combined in such a way that we can describe what it’s like to be alive, to be witnesses. Most of our experience is that of being a witness. We see and hear and smell other things. I think being alive is responding.
<<< Mark Strand, in an interview with Mihaly Csikszentmihalyi
<<<
The nearest we can come to being impartial is to admit that we are partial...
<<< G.K. Chesterton
<<<
I do not mind when people lie to me. People lie to me all the time. I am a teacher, and students lie to me all the time. Occasionally, parents lie to me on behalf of their children. I do not mind this either. When someone lies to me, I do not accuse them of lying. I make certain lied-to noises and look away in a forlorn manner for just a moment. I flatly smile.
I find it strange that I should be a person to be feared. We only lie to those we fear. When people lie to me, I feel misunderstood. You don't need to lie to me. I am powerless. I can do nothing to you. You lie to me as though I were someone good, whose approval was needed. If you knew me, you would tell me everything about yourself and feel vindicated. You could walk away proud.
<<< Joshua Gibbs, //Being Lied To.//
He later expanded it into a [[full article|https://www.circeinstitute.org/blog/when-student-lies]]
<<<
Nothing is capable of being well set to music that is not nonsense.
<<< Joseph Addison
<<<
You are better off doing nothing than doing something badly.
<<< Charles Bukowski
From this interview:
<<<
//Your poem “[[friendly advice to a lot of young men|don't write poetry]]” says that one is better off living in a barrel than he is writing poetry. Would you give the same advice today?//
Bukowski: I guess what I meant is that you are better off doing nothing than doing something badly. But the problem is that bad writers tend to have the self-confidence, while the good ones tend to have self-doubt. So the bad writers tend to go on and on writing crap and giving as many readings as possible to sparse audiences. These sparse audiences consist mostly of other bad writers waiting their turn to go on, to get up there and let it out in the next hour, the next week, the next month, the next sometime. The feeling at these readings is murderous, airless, anti-life. When failures gather together in an attempt at self-congratulation, it only leads to a deeper and more, abiding failure. The crowd is the gathering place of the weakest; true creation is a solitary act.
<<< Charles Bukowski
//See also://
* [[worth doing badly]]
* [[worth doing right]]
<<<
Whoever cannot be alone should beware of community. Such people will only do harm to themselves and to the community. Alone you stood before God when God called you. Alone you had to obey God’s voice. Alone you had to take up your cross, struggle, and pray and alone you will die and give an account to God. You cannot avoid yourself, for it is precisely God who has singled you out. If you do not want to be alone, you are rejecting Christ’s call to you, and you can have no part in the community of those who are called… But the reverse is also true. Whoever cannot stand being in community should beware of being alone. You are called into the community of faith; the call was not meant for you alone. You carry your cross, you struggle, and you pray in the community of faith, the community of those who are called. You are not alone even when you die, and on the day of judgment you will be only one member of the great community of faith of Jesus Christ. If you neglect the community of other Christians, you reject the call of Jesus Christ, and thus your being alone can only become harmful for you... We recognize, then, that only as we stand within the community can we be alone, and only those who are alone can live in the community. Both belong together... Whoever cannot be alone should beware of community. Whoever cannot stand being in community should beware of being alone.
<<< Dietrich Bonhoeffer, from Life Together
Someone who is right-thinking, orthodox, conformist.
<<<
“When I hear adults say, ‘Well I don’t like a big church, I like about 200, I want to be able to know everybody,’ I say, ‘You are so stinking selfish. You care nothing about the next generation. All you care about is you and your five friends. You don’t care about your kids…anybody else’s kids.’ You’re like, ‘What’s up?’ I’m saying if you don’t go to a church large enough where you can have enough Middle Schoolers and High Schoolers to separate them so they can have small groups and grow up the local church, you are a selfish adult. Get over it. Find yourself a big old church where your kids can connect with a bunch of people and grow up and love the local church.”
“Instead… you drag your kids to a church they hate, and then they grow up and hate the local church. And then they go to college and you pray that there will be a church in the college town that they connect with. And guess what? All those churches are big.”
<<< Andy Stanley, preached March 2016
He later apologized / clarified, but it sums up contemporary attitudes. Small churches can be really messy, and they can fail to care for congregants in the same way that big churches can.
Lots of people thought the semantic web was going to be the next big thing on the Internet, web 3.0 and such.
Google and Facebook invested a lot of energy in it, and then people didn't use it in ways they anticipated.
It's there, but all hidden below the surface. Our search results are more tailored to us, our Facebook News Feed is magically pulled from the sea of possible posts, in a process that is almost entirely opaque.
This is the big data iceberg.
<<<
...we need to distinguish between bigotry and blasphemy. Blasphemy is the practice of questioning a tradition from within. In contrast, bigotry is an assault on that tradition from the outside.
<<< Mahmood Mamdani
The corrosive influence of bitterness was on of the earliest and most productive teaching emphases of the [[Moscow Project]], //stub//
Led by [[Jim Wilson]] and his book [[How to Be Free From Bitterness]]
<<<
"""
''Blessing the Animals''
//by R.A. Villanueva//
We have gathered up animals on this feast of St. Francis
to be blessed. In a parking lot beside the church, cleared
save for bales of hay and traffic horses, the goats
and llamas from the petting zoo a town over
are chewing at their cords, the camels' necks hung
with scapulae. The Elks and Legion men have leashed
border collies to terriers, will garland parakeets with rosaries.
They hold house cats in their arms. Our Monsignor crosses
himself in front of a statue of Jesus and His Most Sacred
Heart, beside the flagpole where I learned to pledge allegiance,
where I will later fold the stars and stripes into triangles
to lock up in the headmaster's desk. Next month, on my dare,
Howie will throw a bottle of Wite-Out at Christ's face, break-
off every finger on the Lord's right hand except his third.
"""
<<<
<<<
"""
Blessings
by Ronald Wallace
occur.
Some days I find myself
putting my foot in
the same stream twice;
leading a horse to water
and making him drink.
I have a clue.
I can see the forest
for the trees.
All around me people
are making silk purses
out of sows’ ears,
getting blood from turnips,
building Rome in a day.
There’s a business
like show business.
There’s something new
under the sun.
Some days misery
no longer loves company;
it puts itself out of its.
There’s rest for the weary.
There’s turning back.
There are guarantees.
I can be serious.
I can mean that.
You can quite
put your finger on it.
Some days I know
I am long for this world.
I can go home again.
And when I go
I can
take it with me.
"""
<<<
!!! About the Blog
Lots of the blog entries are just scattered notes reminding me to look something up or write something later.
The more substantive ones usually have descriptive titles, instead of just dates.
!!! Blog Entries
//All <$count filter="[tag[Blog]]"></$count> blog entries, most recent first://
<$list filter="[tag[Blog]] +[!sort[modified]]">
<div class="tc-menu-list-item">
<$link to={{!!title}}><$view field="title"/></$link>
</div>
</$list>
<<<
His parents say they “always knew that Bobby had a real streak of talent, but we didn’t know what kind. We just could not corral it.” […] "He wanted to have free rein,“ says Zimmerman. "He wanted to be a folk singer, an entertainer. We couldn’t see it, but we felt he was entitled to the chance. It’s his life, after all, and we didn’t want to stand in the way. So we made an agreement that he could have one year to do as he pleased, and if at the end of that year we were not satisfied with his progress he’d go back to school.”
<<<
[[Link|http://attic.areavoices.com/2008/11/01/bob-dylan-1963/]]
<<<
My son is a corporation and his public image is strictly an act.
<<< Abe Zimmerman
<<<
[I pit myself] compulsively against bogus valorizing notions of originality, authenticity, or naturalism in the arts….For if we consent that what appears natural in art is actually constructed from series of hidden postures, decisions, and influences, etc., we make ourselves eligible to weight the notion that what’s taken as natural in our experience of everyday life could actually be a construction as well.
<<< Jonathan Lethem
<<<
At the risk of approaching a definition, a bohemian conservative believes humans ought to appreciate, live amidst, and even love the eccentric particularity of physical nature, of distinctive persons, of local culture, of odd traditions that reach back before memory, and more generally of the person rooted in time and place–a historical expression as unique as the proverbial snowflake. The bohemian conservative appreciates less the abstract beauty of the woman on the billboard and more the peculiar beauty of the woman who works at the diner. The bohemian conservative does not love the individualist as much as the eccentric person who is rooted in cultural soil unprocessed by sanitizing consumerism. The bohemian conservative admires the unique and peculiar over the abstracted perfection of a universal form.
The person, understood as a being rooted in history, culture, and tradition, is not any one thing. He isn’t defined by the composition of his body. He isn’t defined by his individual experiences. He isn’t defined by his accomplishments, or failings, or abilities, or limitations. The complexity of his person, as contextualized in a living culture, allows him to think of himself as physical and spiritual, as an individual and part of a group, as living in the flux of existence that is nonetheless situated in the timelessness of reality.
<<< Ted McAllister
after Russell Kirk, of course. Apparently the bohemian conservative is a rather red-blooded fellow. Still, I like it.
<<<
"A wall covered in spines, shelved from floor to ceiling, recognises the correspondence between bricks and books. It is the point at which knowledge becomes embedded in structure and the appearance is of books holding up the ceiling. The implication is that enlightenment, the journey towards the sky or the sublime is available within these pages. It is a metaphor made clearer by the special pieces of furniture, the chairs and stools which ingeniously convert to become ladders or in the sliding steps which glide along the floor scanning the shelves. And just as bricks humanise the scale of even a vast wall by introducing an element of human scale – a solid unit designed to fit perfectly into the hand, so books define the space and give scale to even the largest the wall. They are endlessly reproduced and faked in a game of trompe l’oeil in which their symbolic role alone is invoked. There are bookish wallpapers, there are rows of fake books spines, there are hidden jib doors hidden amongst the bookshelves which open, just as do books themselves to reveal another world and there are dealers who specialise in slightly-worn, leather-spined books by the yard, not for reading but for recreating a country house effect, the impression of history and wisdom. Already in the 1st Century AD Seneca swore by a small library, for knowledge rather than vanity, not ‘endless bookshelves for the ignorant to decorate their dining rooms.’"
<<< Edwin Heathcote, [[Books|http://www.readingdesign.org/books/]]
<<<
Boredom is a mask that frustration wears.
<<< Neal Stephenson
In order of preference:
# French Toast
# Pancakes
# Waffles
Wildcards, highly approved: crêpes, æbleskivers
<<<
Nine women can't make a baby in one month.
<<< Fred Brooks
This is Brooks's law, according to which "adding manpower to a late software project makes it later." Coined by Fred Brooks in his 1975 book //The Mythical Man-Month//.
<<<
It is quite easy to found a community. There are always plenty of courageous people who want to be heroes, are ready to sleep on the floor, to work hard hours each day, to live in dilapidated houses. It’s not hard to camp – anyone can rough it for a time. The problem comes in living with brothers and sisters whom we have not chosen but who have been given to us, and in working ever more truthfully towards the goal. A community is only being created when its members accept that they are not going to achieve great things, that they are not going to be heroes, but simply live each day with new hope, like children, in wonderment as the sun rises and in thankfulness as it sets.
<<< Jean Vanier
[img[http://www.ohiobarns.com/othersites/buildings/fl/09-XXbdc.jpeg]]
On the back lot of the MGM/Disney Studios Park. It was the café that the movie the Rocketter was filmed. Now demolished.
Q: What do great artists have in common?
<<<
I personally think that what the big ones have in common is a fierce moral sensibility, which is unquenchable. And they are all burning with some anger at the way the world is. The littler ones have made a peace with it. The bigger ones can’t make any peace.
<<< Arthur Miller, interviewed [[by Charlie Rose|https://www.youtube.com/watch?v=BirqjuayQTA]]
[[TiddlyWiki]] is novel in this way. You can edit posts but the edits are local to your browser. It's designed for primarily local storage of personal notebooks. If you had your own TiddlyWiki you could drag and drop any page on my site into your own site. Or you can hit save and get a copy of this entire site on your computer.
Craziness!
<<<
But in the modern West, it is //universally recognized// that the resurgence of nose piercing has come about in conjunction with widespread rebellion.
...our children need to be taught that rebellion ''looks'' a certain way. And frequently for the last several decades, nose piercings have been part of the getup.
<<< Toby Sumpter, [[Nose Piercing|http://havingtwolegs.blogspot.com/2010/11/nose-piercing.html]]
This is a similar appeal to 'universally accepted cultural meaning' that Toby often appeals to (see [[smoking has become a universal symbol]]).
The world is full of meaning, and one should certainly examine one's heart from time to time. But if you want to get a nose piercing, and you're not doing it to piss people off, don't overthink it. Nose piercings may be a 'universal symbol' of rebellion in the American south, but they sure aren't in the Pacific Northwest.
And if you're a Christian, I've got good news for you - symbols are highly fungible, and we are '[[the maker of manners|We are the makers of manners]]'. We cannot be held within the confines of a country's arbitrary customs. Embrace your nobility, '[[Love God and do what you will]]'.
<<<
My life has come to me or I have gone to it mainly by way of mistakes and surprises.
<<< Wendell Berry
<<<
Let me be absolutely clear. I reject nearly everything Paglia believes. I find her ideas nothing short of repulsive. But in a world that inches ever closer toward a bland conformity of life and opinion, Paglia’s spirit inspires me, even as her views disgust me. The Western world would be so much the healthier with a number of Paglias, all eccentric, rather than merely the one. Long may she rage.
<<< Bradley J. Birzer on Paglia
[img[http://i.imgur.com/tIpyn4m.gif]]
"Design clothes so hideous that they can't be worn ironically." - John Waters
[img[http://i.imgur.com/TBe7Sgi.jpg]]
<<<
Since the collapse of the USSR and the rise of post-Tiananmen China it has become glaringly obvious that capitalism does not require democracy. Or even benefit from it. Capitalism as a system may well work best in the absence of democracy.
<<< Charlie Stross, [[A different cluetrain|http://www.antipope.org/charlie/blog-static/2015/02/a-different-cluetrain.html]]
<<<
Books aren’t just commodities; the profit motive is often in conflict with the aims of art. ''We live in capitalism, its power seems inescapable – but then, so did the divine right of kings. Any human power can be resisted and changed by human beings. Resistance and change often begin in art.'' Very often in our art, the art of words.
<<< Ursula K. Le Guin, from her [[National Book Awards speech|http://www.theguardian.com/books/2014/nov/20/ursula-k-le-guin-national-book-awards-speech]] (emphasis mine)
[img[http://blog.vernaculartypography.com/wp-content/uploads/2013/10/Woodward-Vernacular-Typography-Historical-Society_045.jpg]]
<<<
Automobiles are a fact of modern life, and they are not going away… Most people
will continue to drive their cars, so streets must oblige traffic. But we need better
streets and public places than most new ones being built. They must be reasonably
pleasant and convenient for motoring, but delightful for walking and cycling…
One successful design strategy [to provide parking] is to move storefronts flush to
the street and to locate the off-street parking out of the way [behind the
buildings]… Too often we vilify the car without acknowledging its central place in
our culture. When we shape our investments in automobile infrastructure more
carefully, we can reclaim public spaces in cities while designing new communities
that celebrate the pedestrian as well as the automobile.
<<< The Charter
The Charter is a definitional document for new urbanism.
<<<
By far the most difficult skill I learned as CEO was the ability to manage my own psychology. Organizational design, process design, metrics, hiring, and firing were all relatively straightforward skills to master compared with keeping my mind in check. I thought I was tough going into it, but I wasn’t tough. I was soft.
Over the years, I’ve spoken to hundreds of CEOs, all with the same experience. Nonetheless, very few people talk about it and I have never read anything on the topic. It’s like the fight club of management: The first rule of the CEO psychological meltdown is don’t talk about the psychological meltdown.
<<< Ben Horowitz, The Hard Thing About Hard Things
Of course he's talking about venture-backed, technology start-ups and it's hard to imagine a more stressful business segment.
In describing what he thought was one of the biggest lessons learned about his current, successful company compared with his previous struggling company, someone I interviewed recently responded to the effect of “I’ll be honest, a lot of this stuff is just mindset.”
The tools of production is now the nexus of a $1000 laptop, a $40 internet connection, and your brain.
<<<
The higher Christian churches - where, if anywhere, I belong - come at God with an unwarranted air of professionalism, with authority and pomp, as though they knew what they were doing, as though people in themselves were an appropriate set of creatures to have dealings with God. I often think of the set pieces of liturgy as certain words which people have successfully addressed to God without their getting killed. In the high churches they saunter through the liturgy like Mohawks along a strand of scaffolding who have long since forgotten their danger. If God were to blast such a service to bits, the congregation would be, I believe, genuinely shocked. But in the low churches you expect it any minute. This is the beginning of wisdom.
<<< Annie Dillard, Holy the Firm
<<<
Good teachers make it possible for people to change their positions without shame.
<<< Rosaria Butterfield
<<<
Faced with the choice between changing one’s mind and proving that there is no need to do so, almost everyone gets busy on the proof.
<<< John Kenneth Galbraith
<<<
I have learned there is no harm in charging oneself up with delusions between moments of valid inspiration.
<<< Steve Martin
<<<
The huge modern heresy is trying to fit G.K. Chesterton into skinny jeans.
<<< Tony Reinke
as quoted by [[Toby Sumpter]]
[[Doug Wilson]] uses a similar phrase for the title of a [[blog post|http://dougwils.com/s7-engaging-the-culture/why-chesterton-doesnt-fit-in-skinny-jeans.html]] attempting to separate Chesterton from his social concerns.
I don't think this works, because while Chesterton was a very successful mainstream author, his ideas were often idiosyncratic and against the mainstream along lines we could associate with today's 'hipsters' - he was highly concerned with what we'd call 'localism', and held extremely unorthodox economic views.
<<<
“Children, be curious. Nothing is worse (I know it) than when curiosity stops. Nothing is more repressive than the repression of curiosity. Curiosity begets love. It weds us to the world. It’s part of our perverse, madcap love for this impossible planet we inhabit. People die when curiosity goes. People have to find out, people have to know.”
<<< Graham Swift, Waterland
https://www.youtube.com/watch?v=TDnO5hQcCQM
<<<
It is wrong to be sad. Christians cannot be pessimists. Christians must always nourish in their hearts the fullness of joy. Try it, brothers and sisters; I have tried it many times and in the darkest moments, when slander and persecution were at their worst: to unite myself intimately with Christ, my friend, and to feel a comfort that all the joys of the earth do not give – the joy of feeling yourself close to God, even when humans do not understand you. It is the deepest joy the heart can have.
<<< Oscar Romero, The Violence of Love
I don't know if I agree with this, but it suits my personality very much
<<<
Cinema is the ultimate pervert art. It doesn't give you what you desire - it tells you how to desire.
<<< Slavoj Žižek
<<<
Francis Schaeffer said, Christian may be at times, ‘cobelligerents’ with the Left or the Right, but never allies. ‘If there is social injustice, say there is social injustice. If we need order, say we need order… But do not align yourself as though you are in either of these camps: You are an ally of neither. The church of the Lord Jesus Christ is different from either — totally different.’
<<< Tim Keller, Ministries of Mercy, 26.
The idea of 'cobelligerents' is a common one in discussions of the [[culture wars]] within the [[Moscow Project]]
I believe Schaeffer is using it in the best sense - trying to get people past ideology. But it is often used to reinforce [[ideological tribalism]] by encouraging only pragmatic interaction with those outside the tribe.
[img[http://i.imgur.com/kNEIe5z.jpg]]
<<<
We open our mouths and out flow words whose ancestries we do not even know. We are walking lexicons. In a single sentence of idle chatter we preserve Latin, Anglo-Saxon, Norse: we carry a museum inside our heads, each day we commemorate peoples of whom we have never heard.
<<< Penelope Lively
A commonplace book is a personal collection of quotations, anecdotes, observations, links to articles, poems, etc. that I come across during my reading and want to save for easy access later.
For information on keeping a commonplace book, check out [[this article|http://thoughtcatalog.com/ryan-holiday/2013/08/how-and-why-to-keep-a-commonplace-book/]]. I highly recommend TiddlyWiki for storing them, which is how I run this site. If you use ~TiddlyWiki, you can simply 'drag and drop' pages from my website to yours.
//All <$count filter="[tag[commonplace]]"></$count> entries, most recent first://
<$list filter="[tag[commonplace]] +[!sort[modified]]">
<div class="tc-menu-list-item">
<$link to={{!!title}}><$view field="title"/></$link>
</div>
</$list>
<<<
I became interested in clothes as an adolescent. I think that I grew up at a time when – as a young person – you could use what you wore to communicate identities independent of actually belonging to the social movements or classes that certain clothing styles used to signal, in a way that hadn’t been the case before. Subcultures became unanchored from the time periods that gave them context. Items of clothing by themselves could become lifestyle signifiers where in the past the activities they were designed for were what signified a certain lifestyle. Ralph Lauren was a pioneer of this, realizing that clothes branded and logoed “Polo” substituted for mallets and ponies and the wealth needed to maintain them, and so on. But by the late 1980s and 1990s, various other styles – punk, goth, mod, etc. – were all being appropriated outside the eras that gave them relevance and meaning. So much had taken place that we had missed. You could wear the clothes to signal allegiance to a movement that had died out decades ago, or – in true adolescent fashion – try out different identities every week depending on what you wore. In the time and place I came of age the one that was freighted with the most baggage was prep.
...
I think that the way that I dress came out of my natural attitude, which is a bit of a contrarian. So I dressed in reaction to certain settings, to begin with a particularly prescriptive, grasping preppy environment, and later in college and thereafter and the sort of apathy that has encompassed how most people have dressed since about 1995.
<<< Réginald-Jérôme de Mans, from [[this interview|http://www.keikari.com/english/interview-with-reginald-jerome-de-mans/]]
<<<
The book I am here treating seems to me to demonstrate that (at least some) ‘complementarians’ themselves have realised what serious scholars already knew: this argument too fails. It relied on an extreme version of social Trinitarianism which had no purchase in the Christian tradition, and was unsustainable exegetically. In their different ways, Starke, Claunch, and others here offer chastened versions of the argument – but it is lost.
If I wished to defend ‘complementarianism’, I would abandon the Trinitarian argument completely; there is a potential Christological argument available in Eph. 5; I do not think this works, for reasons I have explored elsewhere, but it is less obviously wrong than the Trinitarian position explored in this book.
<<< Steve Holmes, [[Shored Fragments|http://steverholmes.org.uk/blog/?p=7507]]
[img[http://i.imgur.com/fOKqJKP.jpg]]
<<<
Computing is pop culture. [...] Pop culture holds a disdain for history. Pop culture is all about identity and feeling like you're participating. It has nothing to do with cooperation, the past or the future — it's living in the present. I think the same is true of most people who write code for money. They have no idea where [their culture came from]...
<<< Alan Kay
While we were starting [[The Storm Cellar]] we realized that the software options for inventory management and point-of-sale for consignment shops were limited.
After four years of in-house development we started marketing the software to other consignment stores in 2013.
For more information, visit our website at [[ConsignCloud.com|https://www.consigncloud.com/external/]].
<<<
I require constant infusions of popular culture and bloggers blogging about popular culture in order to survive.
<<< Farmhand Brock
<<<
Work on a contemporary author as if he were ancient, and an ancient one as if he were contemporary. You will have more fun and write a better thesis.
<<< Umberto Eco, How to Write a Thesis
This goes along with not thinking of the house as a productive place, where one can make money or... produce things. Which I guess is the definition of productive.
<<<
The contempt for the house cultivated by this history is not easy to do away with. Personal ambition alone, and especially money alone, won’t solve the underlying problem. Although we don’t pay people enough for housework, the real problem is that we think that money will be enough to cover over our contempt and forgetfulness for the work itself—that we can somehow avoid our forgetfulness of the house itself. This forgetfulness is written into all our thoughts about the properly ambitious work outside the house that people are meant to desire; and the most pressing result is that, again, it obscures the simple practical necessity that someone—a human being—did or will do the domestic work that orders the space around you, right now, both for the place you sit to read this, and if you’re lucky, for the place you’ll sleep tonight.
<<< Mary Townsend of the Hedgehog Review
quoted [[here|http://www.theamericanconservative.com/olmstead/dont-dismiss-housework/]]
<<<
...striving for cultural maturation includes the recognition that context matters. When we use the expression “good clothes” we know that a wedding tuxedo fits in that category, and coveralls for changing the oil in the car do not. But this general tag should not mislead. The tuxedo is an inferior clothing choice if what you are doing is changing the oil in the car. Depending on context, the superior item is often the inferior choice. To use another illustration I have used before, a cathedral is a superior architectural specimen to a typical suburban house. But a suburban house is far superior if the task at land is frying up some bacon, or watching Monday Night Football.
<<< Doug Wilson, [[Infinite at the Top|http://dougwils.com/s7-engaging-the-culture/infinite-at-the-top.html]]
This is helpful, until it's not - if that makes any sense. It gets into trouble as we move into more subjective categories.
<<<
If you take human autonomy as your starting point, you lose sight of the most central characteristic of human nature: we learn who we are and how to behave from one another. How we treat children is who they will become. This bit of wisdom has gone by many names, among them the popular notion of the “self-fulfilling prophecy”. If teachers consistently have low expectations for certain groups of kids, say minorities or those labeled as “problem kids”, the kids will meet those meager expectations but rarely exceed them. Why? Because our sense of identity is not something we own or develop in isolation. We become ourselves in and through the significant relationships that nurture us from the cradle and envelop us as we move out into the world.
<<< Suzanne Ross, in a blog post on the failure of the 'Warrior Mindset' among law enforcement - [[link|https://www.ravenfoundation.org/how-the-warrior-mindset-has-damaged-policing-children-and-youth/]]
[img[http://i.imgur.com/bxnZYS0.jpg]]
<<<
My advice to people has always been: copy old shit. For instance, the style of Every Frame a Painting is NOT original at all. I am blatantly ripping off two sources: the editing style of F for Fake, and the critical work of David Bordwell/Kristin Thompson, who wrote the introductory text on filmmaking called Film Art. I’ve run into quite a few video essays that are trying to be “like Every Frame a Painting” and I always tell people, please don’t do that because I’m ripping of someone else. You should go to the source. When any art form or medium becomes primarily about people imitating the dominant form, we get stifling art. If you look at all of the great filmmakers, they’re all ripping someone off but it was someone 50 years ago. It rejuvenated the field to be reminded of the history of our medium.
<<< Tony Zhou
https://talkshow.im/show/aEJTBbyXTHyzisOV
Companies providing benefits that eventually make employees dependent on their employers.
Personal chef, gym, housing, transportation...
<<<
My education had implied, over and again, that you couldn’t amount to anything in a place like this.
<<< Wendell Berry
http://www.neh.gov/humanities/2012/mayjune/conversation/wendell-berry-landsman
<<<
Pastors should not think that creating questions and confusion is failure. Even when words might have been chosen more carefully, we should always think of those situations as opportunities. If you need to correct what you said, then correct it. But when people demand answers, the answer is always Jesus.
<<< Toby Sumpter, [[In Defense of Pastoral Tweet Bombs|http://www.tobyjsumpter.com/in-defense-of-pastoral-tweet-bombing/]]
I can't say I'm a big fan of this, if only because I can't imagine a situation where someone in the [[Moscow Project]] would apologize for a tweet. 'Correcting' in this context usually means telling people they didn't understand what the tweet meant.
<<<
A college professor once offered the following creative final exam: Write a suitable final exam for this course and supply a key.
The first paper handed in read ‘Final Exam: Write suitable final exam for this course and supply a key. Key: Any reasonable variation of the previous sentence = 100%.’
<<< Michael Stueben, Twenty Years Before the Blackboard
<<<
The saving of our world from pending doom will come, not through the complacent adjustment of the conforming majority, but through the creative maladjustment of a nonconforming minority.
<<< Martin Luther King Jr.
<<<
Creativity is hard to come by in the fashion industry — perhaps harder than in almost any other creative field. Because when something daring and mesmerizing bubbles up in fashion, it can’t just be framed and hung on a wall, it isn’t just the soundtrack to your life; it is the coccoon in which you live, it’s your calling card. Fear isn’t the hurdle facing fashion. The human body is.
<<< Robin Givhan in the [[Washington Post on the latest Kanye x Adidas fashion show|http://www.washingtonpost.com/blogs/style-blog/wp/2015/02/13/nyfw-what-kanye-west-gets-right-about-fashion-and-what-he-gets-wrong/]]
<<<
Criticism is language that expresses the awareness of language.
<<< Northrop Frye
<<<
[[Critics|Statler and Waldorf]] are like eunuchs in a harem; they know how it's done, they've seen it done every day, but they're unable to do it themselves.
<<< Brendan Behan
The Cross of Reality is an attempt to describe in post-theological terms the tension and suffering that is a universal human experience.
<<<
Specifically, human beings are stretched out on two axes. The horizontal axis is a temporal one, stretching between past and the future. The vertical axis is spatial, as we are stretched out between “inner” and “outer.”...
We hang at the center of this cross, nailed and pulled in all four directions at once: “man’s life, social as well as individual, is lived at a crossroads between four ‘fronts’: backward toward the past, forward into the future, inward among ourselves, our feelings wishes and dreams, and outward against what we must fight or exploit or come to terms with or ignore.” This is a painful position, often agonizing, and so we are tempted to relieve the tension by embracing only one of the four points of this compass. But the goal of life is not “adjustment,” as modern psychology might suggest; the goal is integrating the demands of each, all of which are legitimate demands (ERH's Christian Future, p. 169).
<<< Peter J. Leithart
This model also places people as natural inclined to one of the four axes, giving us another example for understanding [[differences between people|Personality types]].
//See also//
[[The Cross of Eugen Rosenstock Huessy|http://www.credenda.org/index.php/Uncategorized/the-cross-of-eugen-rosenstock-huessy.html]]
A crowdsourced list from [[Rod Dreher's blog|http://www.theamericanconservative.com/dreher/the-good-the-true-the-beautiful/]] on 'cultivating an ability to see the Good, the True, and the Beautiful, to embrace them and to defend them in a hostile culture'
* Gregory Wolfe’s “The New Religious Humanists: A Reader”
* Schmemann
* Eliot's The Four Quartets
* The Power and the Glory by Graham Greene
* Zen and the Art of Motorcycle Maintenance
* Beauty for Truth's Sake: On the Re-enchantment of Education by Stratford Caldecott
* Tolstoy, Nabokov
* Richard Wilbur's poetry
* The End of Vandalism by Tom Drury
* The Dog Stars by Peter Heller
* The Sparrow by Mary Doria Russell
* David Bentley Hart’s The Experience of God: Being, Consciousness, Bliss
* "Anything by De Sade, if you actually read it and contemplate it long enough. He had the Enlightenment “pegged” you could say"
* Gilead by Marilynne Robinson
* T.H. White’s “The Once and Future King”. Although not a religious believer, White’s grasp of Medieval Catholic piety & sacramentality is outstanding, and the whole work is profoundly beautiful.
* The Path to Rome, by Belloc
* the Spirit of Early Christian Thought, by Robert Louis Wilken
* Robert Pirsig’s “Zen and the Art of Motorcycle Maintenance”. The entire book is an investigation into the existence of Quality. He finally concludes that quality exists before, and outside of, the rationalist scientific system.
* The Arena, Saint Ignatius Brianchaninov & Wounded by Love, Saint Porphyrios
* The Brothers Karamazov, Fyodor Dostoevsky
* Watership Down, Olive Kitteridge, the Selfish Giant
* Desert Solitaire & The Monkey Wrench Gang by Edward Abbey
* Any Mark Helprin, but more specifically A Soldier of the Great War, The Pacific and Other Stories, In Sunlight and In Shadow. Also, the title story from A Dove of the East.
<<<
The deepest likings and impulses of any man are the raw material, the starting-point, with which the Enemy has furnished him. To get him away from those is therefore always a point gained; even in things indifferent it is always desirable substitute the standards of the World, or convention, or fashion, for a human’s own real likings and dislikings. I myself would carry this very far. I would make it a rule to eradicate from my patient any strong personal taste which is not actually a sin, even if it is something quite trivial such as a fondness for county cricket or collecting stamps or drinking cocoa. Such things, I grant you, have nothing of virtue them; but there is a sort of innocence and humility and self-forgetfulness about them which I distrust. The man who truly and disinterestedly enjoys any one thing in the world, for its own sake, and without caring twopence what other people say about it, is by that very fact fore-armed against some of our subtlest modes of attack. You should always try to make the patient abandon the people or food or books he really likes in favour of the “best” people, the “right” food, the “important” books. I have known a human defended from strong temptations to social ambition by a still stronger taste for tripe and onions.
<<< from the Screwtape Letters, of course
<<<
The point is that the dialogue of cultural appropriation presumes impossible weakness on the part of other countries. It claims to speak from a place of ultimate respect towards the nonwhite people of the world, but it treats them as permanently neutered children, incapable of making change in the world or having their own ideas about the proper spread of their own cultural artifacts.
<<< Fredrik deBoer
[[the sublime narcissism of getting offended on other people's behalf|http://fredrikdeboer.com/2016/03/17/the-sublime-narcissism-of-getting-offended-on-other-peoples-behalf/]]
The whole thing is good.
<<<
Remember folks, culture is a soil to be stewarded, and not a territory to be fought over...no one wins in culture wars battle.
<<< Makoto Fujimura
<iframe width="560" height="315" src="https://www.youtube.com/embed/lqmORiHNtN4" frameborder="0" allowfullscreen></iframe>
<<<
"""Bring wings to the weak, and bring grace to the strong.
May all evil stumble as it flies in the world.
All the tribes will come, and the mighty will crumble.
We must brave this night and have faith in love.
"""
<<<
"This is a cold war, you better know what you're fighting for."
<<<
Some people are cursed because they refuse to start businesses & sell their goods or services for the blessing of others (Prov 11:26).
<<< Toby Sumpter
A cyclorama is a building wherein a centrally located audience can observe a round painting all around them.
[img[http://www.mission66.com/cyclorama/images/boston.jpg]]
They were an early attempt at virtual reality. Lighting, 3d landscape and a faithfully rendered painting combined to give the effect of being in the scene. People were into it.
[img[http://www.riesenrundgemaelde.at/mat/mitchell.gif]]
There is only one left (in the U.S.?) - by Richard Neutra and Robert Alexander, located at Gettysburg, Pennsylvania.
[img[http://pbs.twimg.com/media/B6EtbP2IIAINNLm.jpg]]
<<<
Dear Ben,
I assume you want basic guides to metaphysics to begin with. Richard Taylor’s Metaphysics (4th edition) is a good introduction to certain classic questions. Two volumes by E. L. Mascall–He Who Is and Existence and Analogy–are excellent guides to Christian metaphysics in the West, as is W. Norris Clarke’s The One and the Many. Avoid Peter van Inwagen: he’s brilliant at confusing things. Perhaps William Hasker’s Metaphysics is good, but I haven’t read it.
As for theology, always start with the fathers: Gregory of Nyssa’s On the Making of Man and On the Soul and Resurrection, Ps-Dionysius Complete Works (a short volume), Cyril of Alexandria’s On the Unity of Christ, Athanasius On the Incarnation, St Isaac of Ninevah’s treatises (especially the “Second Volume”), Maximus the Confessor’s Chapters on Love and the SVS volume “The Cosmic Mystery of Christ.” Don’t bother with Augustine until later, because for all his genius he got so much wrong (because he couldn’t read Greek, in large part). For mediaeval and early modern theology, Symeon the New Theologian’s Mystical Discourses (or whatever it’s called in English), Bonaventure’s Journey of the Mind into God, and the Paulist Press volume of Nicholas of Cusa. Thomas Traherne’s Centuries and all three volumes of George ~MacDonald’s Unspoken Sermons are indispensable masterpieces. As for modern theologians, Bulgakov’s Bride of the Lamb, Hans Urs von Balthasar’s Glory of the Lord, Lossky’s Mystical Theology of the Eastern Church, Schmemann’s For the Life of the World, part IV of Karl Barth’s Church Dogmatics, Henri de Lubac’s Supernatural (currently being translated I believe, but if you read French go ahead), Rowan Williams’ Resurrection (2nd edition).
I hope this helps,
David
<<<
Source: http://theologianslibrary.com/2015/11/21/an-email-from-david-bentley-hart/
<<<
The first big thing suffering does is it drags you deeper into yourself. The theologian Paul Tillich wrote that people who endure suffering are taken beneath the routine busyness of life and find they are not who they believed themselves to be. The pain involved in, say, composing a great piece of music or the grief of having lost a loved one smashes through a floor they thought was the bottom floor of their soul, revealing a cavity below, and then it smashes through that floor, revealing another cavity, and so on and so on. The person in pain descends to unknown ground.
Suffering opens up ancient places of pain that had been hidden. It exposes frightening experiences that had been repressed, shameful wrongs that had been committed. It spurs some people to painfully and carefully examine the basement of their own soul. But it also presents the pleasurable sensation that one is getting closer to the truth. The pleasure in suffering is that you feel you are getting beneath the superficial and approaching the fundamental. It creates what modern psychologists call “depressive realism,” an ability to see things exactly the way they are. It shatters the comforting rationalizations and pat narratives we tell about ourselves as part of our way of simplifying ourselves for the world.
Then, too, suffering gives people a more accurate sense of their own limitations, of what they can control and not control. When people are thrust down into these deeper zones, thrust into lonely self-scrutiny, they are forced to confront the fact that they can’t determine what goes on there.
Suffering, like love, shatters the illusion of self-mastery. Those who suffer can’t tell themselves to stop feeling pain, or to stop missing the one who has died or gone. And even when tranquility begins to come back, or in those moments when grief eases, it is not clear where that relief comes from. The healing process, too, feels as though it’s part of some natural or divine process beyond individual control. For people in this striving culture, in this Adam I world where everything is won by effort, exertion, and control, suffering teaches dependence. It teaches that life is unpredictable and that the meritocrat’s efforts at total control are an illusion.
...
Recovering from suffering is not like recovering from a disease. Many people don’t come out healed; they come out different. They crash through the logic of individual utility and behave paradoxically. Instead of recoiling from the sorts of loving commitments that often lead to suffering, they throw themselves more deeply into them. Even while experiencing the worst and most lacerating consequences, some people double down on vulnerability and become available to healing love. They hurl themselves deeper and more gratefully into their art, loved ones, and commitments.
This way, suffering becomes a fearful gift, very different from that other gift, happiness, conventionally defined. The latter brings pleasure, but the former cultivates character.
<<< David Brooks, The Road to Character
He's talking about the life of Dorothy Day
<<<
A better metaphor is that we are in a deadly race between politics and technology. The future will be much better or much worse, but the question of the future remains very open indeed. We do not know exactly how close this race is, but I suspect that it may be very close, even down to the wire. Unlike the world of politics, in the world of technology the choices of individuals may still be paramount. The fate of our world may depend on the effort of a single person who builds or propagates the machinery of freedom that makes the world safe for capitalism.
<<< Peter Thiel
I so agree with Thiel in regards to his disposition toward politics:
<<<
I believe that politics is way too intense. That’s why I’m a libertarian. Politics gets people angry, destroys relationships, and polarizes peoples’ vision: the world is us versus them; good people versus the other. Politics is about interfering with other people’s lives without their consent. That’s probably why, in the past, libertarians have made little progress in the political sphere. Thus, I advocate focusing energy elsewhere, onto peaceful projects that some consider utopian.
<<<
And I have no doubt that if I was wealthy I'd have the same exceptionalist streak.
What's delightfully bonkers is how enthusiastic about Girard he is, because it allows him to see himself as that persecuted figure.
http://blakemasters.com/post/24578683805/peter-thiels-cs183-startup-class-18-notes
This is in line with the tragic self-narrative of
[img[https://media.giphy.com/media/KbVgI3kk4c7oQ/giphy.gif]]
<<<
Lose you life and you will save it. Submit to death, death of your ambitions and favorite wishes every day, and death to your whole body in the end: submit with every fibre of your being, and you will find eternal life. Keep back nothing. Nothing that you have not given away will be really yours. Nothing in you that has not died will be raised from the dead. Look for yourself, and you will find in the long run only hatred, loneliness, despair, rage, ruin, and decay. But look for Christ and you will find him, and with him everything else thrown in.
<<< C.S. Lewis, Mere Christianity
<<<
I’ve defined myself as a decadent. One of my first influences was Oscar Wilde. I stumbled on a little book called The Epigrams of Oscar Wilde in a secondhand bookstore in Syracuse, New York, when I was like 14, and I was fascinated by his statements. So I am a Wildean, and he identifies himself as a kind of decadent in that period of aestheticism.
<<< Camille Paglia
Hahaha ohmahgosh.
This whoel thing is just too much: http://reason.com/archives/2015/05/30/everythings-awesome-and-camill/3
<<<
There is a deep sadness to American poverty, greater than the sadness of any other kind. It’s because America has such an ideology of success.
<<< Will Self
<<<
The term déjà vu was coined in 1876 by the French philosopher Emile Boirac. It is the overwhelming sense that you have already experienced something before. But there are other, lesser known, phenomena which are thought to be related.
''Jamais vu'' - translated as "never seen", this is the sense that something which should be familiar is alien, for example a common word which suddenly seems strange.
''Presque vu'' - translated as "almost seen", this is the sense of being on the edge of an epiphany or realisation, for example recalling a memory.
''Déjà entendu'' - translated "already heard", this is the sense of feeling sure you have heard something before, like a snippet of conversation or a musical phrase.
<<<
<<<
But I am furious at a world in which women and POC are being told to be as self-confident as a group of mostly white dudes who are basically delusional megalomaniacs. We’re great the way we are, level-headed self-assessments and all. Stop rewarding them for being jackasses.
<<< [[Stop Blowhard Syndrome|http://xuhulk.tumblr.com/post/110549967516/stop-blowhard-syndrome]] by 'xuhulk' on Tumblr
This is my critique of the 'Lean In' school of thought - I vacillate between crippling self-doubt and straight-up delusional self-confidence. If other entrepreneurs (whatever their background) have the option to take risks while being more even-keeled, I say choose that route. I think my disposition as the norm in a large institutional setting would be terrifying.
<<<
“My father was a very disciplined and punctual man; it was a prerequisite for his creativity. There was a time for everything: for work, for talk, for solitude, for rest. No matter what time you get out of bed, go for a walk and then work, he’d say, because the demons hate it when you get out of bed, demons hate fresh air. So when I make up excuses not to work, I hear his voice in my head: Get up, get out, go to your work.”
<<< Linn Ullmann on her father, Ingmar Bergman
http://www.vogue.com/872539/linn-ullmann-novel-the-cold-song/
<<<
As early as the colonial era, writers, politicians, and other vocal critics denounced the sale of used goods...
<<< Jennifer Le Zotte, [[Philanthropic Capitalism and the Rise of American Thrift Stores|http://wilsonquarterly.com/stories/how-thrift-shop-once-widely-denounced-became-popular-in-america/]]
[img[http://i.imgur.com/NCJW0XM.jpg]]
I struggle to describe my depression in ways that will be make sense to me later (when I'm not depressed), let alone in ways that will make sense to other people.
Taxonomizing it is one way to feel some understanding. Naming is a way of expressing ownership, taking dominion. There is a distinction between [[acedia]], [[malaise]], and [[ennui]].
When I was young (17, which didn't feel young at all at the time) I did not understand my depression at all, and was depressed to the point of contemplating [[suicide]].
I was briefly medicated, but found that I disliked the experience. I felt like my emotions were 'flattened'. I'm sure anti-depressants are a good choice for many people, but I prefer living on a sort-of manic-depressive rollercoaster. I do my best to manage it, to see it coming and not put the people around my through hell by complaining about how depressed I am.
A lot of this might just be a function of [[my personality]], of course.
<<<
Before you diagnose yourself with depression or low self-esteem, first make sure that you are not, in fact, just surrounded by assholes.
<<< William Gibson, source unknown
Definin' some terms, neologisin' some neologisms.
This is a 'dictionary' ala Samuel Johnson or Ambrose Bierce, but only in the sense that it's not a real dictionary, not in the sense that it's clever.
There are probably lots of pithy quotes under [[commonplace]] that could be considered aphorisms, but organizing stuff is hard and time consuming.
//All <$count filter="[tag[dictionary]] [tag[aphorism]]"></$count> entries, alphabetically://
<$list filter="[tag[dictionary]] [tag[aphorism]] +[sort[title]]">
<div class="tc-menu-list-item">
<$link to={{!!title}}><$view field="title"/></$link>
</div>
</$list>
<<<
Can this be the difference between the post-modern and the modern: despair with irony as opposed to despair without irony?
<<< Errol Morris
<<<
Poets have, indeed, often communicated in their own mode of expression truths identical with the theologians’ truths; but just because of the difference in the modes of expression, we often fail to see the identity of the statements.
<<< Dorothy Sayers, The Mind of the Maker
<<<
//Dear Miss Manners:
The girl who tortured me daily in junior high is my fellow bridesmaid in an upcoming wedding. My co-worker's husband's ex, who sued the co-worker and her husband, will be at their daughter's graduation celebration. Today I will see a man at a funeral who hacked into my computer.
Can you advise us on how to handle ourselves correctly when we are forced to see people we loathe socially?
//
By turning down the social temperature, which is normally set at Warm for such occasions.
But Miss Manners insists that you understand that there is not simply one setting marked Cold. You may loathe them all, but the offenses are different and require different settings.
For the bridesmaid, it is Slightly Cool. Your mouth turns up when you have to say hello to her, but your eyes do not participate in the smile. Then you endeavor to keep at a distance. That should remind her of your grievance, and if she has grown into a different person, she will endeavor to make it up to you.
The ex gets Cold. All the formalities, but no smile. You do not have a personal grievance against him; you are merely treating him as the sort of person you do not want to know.
The hacker deserves Freeze. You do not greet him, you do not acknowledge his presence, and if he approaches you, you turn away.
Mind you, all of this has to be performed without the notice of others. Putting a chill on such occasions is itself a grievance that will have others giving you the cold shoulder.
<<<
Miss Manners, Wed Mar 19 2008
<<<
I always find it more difficult to say the things I mean than the things I don’t.
<<< W. Somerset Maugham
<<<
Something that is easy to copy makes it more likely that it will be copied. And if it is copied, it has more chances of living beyond it’s original life. A thousand version of something seems to me to be the ultimate sustainability plan for any piece of content.
<<< Clint Lalonde, [[on Wordpress|http://clintlalonde.net/2014/03/07/wordpress-let-a-thousand-textbooks-bloom/]]
<<<
All of this will sound like a digression to you, of course, but bear with me. Because digressions are what you need right now: focusing on something that has nothing to do with who you are, how lonely you are, how tired you are of looking on the bright side. Because looking on the bright side is impossible when you feel as bad as you do now. You can't perk up and be more optimistic. What you can do is simply look away from yourself. Or, as Yes put it, "Don't surround yourself with yourself."
<<< Ask Polly
Using the band 'Yes' to answer a very world-weary, depressed person:
http://nymag.com/thecut/2015/11/ask-polly-im-sick-of-being-unhappy-and-alone.html
<<<
There are two sins related to this that we must overcome before we can obey the Lord here. The first is the idea, just mentioned, that we have a right to our disagreements so long as they are amicably held. Of course, it is better to be amicable than nasty, but this is still a means to the end. The end is agreement, not agreeable disagreement. An important means to like-mindedness is amicable disagreement, but it must never be mistaken for the end.
The second sin we must fight is the sin of the grievance. A grievance is never mere disagreement. A grievance always has an edge; a grievance is personal; a grievance resents; a grievance imputes motives; a grievance is suspicious; a grievance is an insult to the love of God in Christ.
<<< Doug Wilson, [[Grievances in Perspective|http://dougwils.com/s7-engaging-the-culture/grievances-in-perspective.html]]
This relates to the [[registers of language]], and refers to how information is organized.
The formal-register discourse pattern goes straight to the point. The casual register is related to the oral storytelling tradition and often goes around the issue before coming to the point.
Formal-register typically goes chronologically. Casual-register leads with the part with the greatest emotional impact - often the end! Then contains a series of vignettes. Characters are more important than unfolding narrative; narrative illustrates character.
<<<
"""
''Discrepancies, Happy and Sad''
//by Li-Young Lee//
We’ve moved into a bigger house.
Now our voices wander among the rooms
calling, Where are you?
And what we can’t forget
of other houses confuses us
as we answer back and forth, Over here!
It’s a little like returning to the village
where you were born, the sad bewilderment
of discrepancies between
what you remember and what’s there.
No. It’s more like a memory of heaven.
Voices coming closer, voices moving away,
and what we thought we knew
about life on earth confounding us.
And then that question
from which all the other questions begin."""
<<<
<<<
//Q10. Does New St. Andrews offer a distance education program?//
No. A quality education relies on the personal interaction between teacher and student within an academic community with a shared Christian worldview, high intellectual standards, moral integrity, biblical wisdom, and spiritual maturity. New St. Andrews seeks to be such a personally nurturing and spiritually encouraging community of Christian scholars.
<<< New Saint Andrews website, June 2003
<<<
''Statement on Distance or Extension Education''
New Saint Andrews College regularly receives inquiries from those who would like to participate in our academic programs, but are unable to attend classes in Moscow for various reasons. While we appreciate the difficulty this presents for some, the College is nevertheless committed to a model of classical and Christian education that cannot be distributed through a distance education program. The intrinsically personal, communal, and covenantal nature of the College's pedagogy is inextricably linked to close contact with our faculty and the local Moscow Christian community. Therefore, New Saint Andrews College offers no extension or distance learning programs.
<<< ibid
[img[http://i.imgur.com/fiCG8f7.jpg]]
John William Waterhouse - Ulysses and the Sirens (1891)
<<<
Distraction is the only thing that consoles us for miseries and yet it is itself the greatest of our miseries.
<<< Blaise Pascal, Pensees
<<<
I believe everything out of the common. The only thing to distrust is the normal.
<<< John Buchan
The "ditch on either side of the road" is an almost koan-like aphorism. It's an extension of the idea of the 'narrow way', and expresses the idea that there are two opposite ways of erring when considering a topic. It's also often invoked when discussing the balance between liberty and license - over scrupulousness vs. lasciviousness.
Example: “Some think all things should be suffered, and they are loose and cause divisions on the one hand. Others think nothing is to be suffered, and these are rigid and cause divisions on the other hand” (Burroughs, Irenicum, p. 69).
<<<
You can’t clobber a reader while he’s looking. You divert his attention, then clobber him & he never knows what hit him.
<<< Flannery O'Connor
<<<
Below are a few other questions that we might ask in order to get at the wide-ranging “moral dimension” of our technologies. There are, of course, many others that we could ask, but this is a start.
# What sort of person will the use of this technology make of me?
# What habits will the use of this technology instill?
# How will the use of this technology affect my experience of time?
# How will the use of this technology affect my experience of place?
# How will the use of this technology affect how I relate to other people?
# How will the use of this technology affect how I relate to the world around me?
# What practices will the use of this technology cultivate?
# What practices will the use of this technology displace?
# What will the use of this technology encourage me to notice?
# What will the use of this technology encourage me to ignore?
# What was required of other human beings so that I might be able to use this technology?
# What was required of other creatures so that I might be able to use this technology?
# What was required of the earth so that I might be able to use this technology?
# Does the use of this technology bring me joy?
# Does the use of this technology arouse anxiety?
# How does this technology empower me? At whose expense?
# What feelings does the use of this technology generate in me toward others?
# Can I imagine living without this technology? Why, or why not?
# How does this technology encourage me to allocate my time?
# Could the resources used to acquire and use this technology be better deployed?
# Does this technology automate or outsource labor or responsibilities that are morally essential?
# What desires does the use of this technology generate?
# What desires does the use of this technology dissipate?
# What possibilities for action does this technology present? Is it good that these actions are now possible?
# What possibilities for action does this technology foreclose? Is it good that these actions are no longer possible?
# How does the use of this technology shape my vision of a good life?
# What limits does the use of this technology impose upon me?
# What limits does my use of this technology impose upon others?
# What does my use of this technology require of others who would (or must) interact with me?
# What assumptions about the world does the use of this technology tacitly encourage?
# What knowledge has the use of this technology disclosed to me about myself?
# What knowledge has the use of this technology disclosed to me about others? Is it good to have this knowledge?
# What are the potential harms to myself, others, or the world that might result from my use of this technology?
# Upon what systems, technical or human, does my use of this technology depend? Are these systems just?
# Does my use of this technology encourage me to view others as a means to an end?
# Does using this technology require me to think more or less?
# What would the world be like if everyone used this technology exactly as I use it?
# What risks will my use of this technology entail for others? Have they consented?
# Can the consequences of my use of this technology be undone? Can I live with those consequences?
# Does my use of this technology make it easier to live as if I had no responsibilities toward my neighbor?
# Can I be held responsible for the actions which this technology empowers? Would I feel better if I couldn’t?
<<< Michael Sacasas, [[Do Artifacts Have Ethics?|http://thefrailestthing.com/2014/11/29/do-artifacts-have-ethics/]]
His notable essay, I need to look it up.
<<<
An aspiring minister once asked Karl Barth, “What one thing, sir, would you tell a young pastor today if you were asked, is necessary in this day and age to pastor a Church?” and Barth answered: "I would ask you… are you willing now to deal with humanity as it is? Humanity in this twentieth century with all its passions, sufferings, errors, and so on? Do you like them, these people? Not only the good Christians, but do you like people as they are? People in their weakness? Do you like them, do you love them? And are you willing to tell them the message that God is not against them, but for them? That’s the one real thing in pastoral service and that is the question for you."
<<<
[img[http://www.futilitycloset.com/wp-content/uploads/2015/02/2015-02-02-unquote.jpg]]
<<<
An inventor is simply a fellow who doesn't take his education too seriously.
<<< Charles F. Kettering
<<<
Knowing how we are, Jesus says very clearly, “Don’t make a mess of your face. If someone praises you for praying so hard, that’s all the reward you’re going to get. God wants you to keep this between Him and you.” So no ashes on your forehead. The whole point of smearing ashes on your forehead is to disfigure it in a way everyone else is bound to notice.
Why do Catholics and other Christians do it anyway? Jesus did say no. But He didn’t say no to what many of us do on Ash Wednesday. Jesus means a private fast made public so that people would applaud. He’s talking about someone who’s doing something by himself, who makes himself look miserable and then says to the world, “Hey, look at me, I’m praying hard.” Adding, under his voice, “And you’re not.”
Jesus isn’t referring to something his followers would do together and in public. You don’t get any rewards for doing the same thing as everyone else, no matter how miserable you make yourself look. If someone at church the Sunday after Ash Wednesday declared, “Hey, I had ashes put on my forehead last Wednesday,” he’d get an answer like “Big whoop.” It is like asking for praise because you didn’t sing a hymn during the sermon or came to the 11:00 am service at 11:00 am. You win no fame or favor for doing what everyone is supposed to do.
For Catholics, one of the great points of disciplines is that you can do the things you ought to do without worrying about whether you are doing them for the right reasons. You don’t have to worry about showing off because you’re not showing off — you’re just doing what everyone else is doing. You’re just part of the marching band turning left when everyone else does, not a soloist standing at the front of the stage.
<<< David Mills, [[Hey, Buddy, Jesus Said No Ashes|https://stream.org/hey-buddy-jesus-said-no-ashes/]]
<<<
Don't let anyone tell you Lent is weird. A season of self-examination and repentance is as normal as a confession of sin in the liturgy.
<<< Peter Leithart
<<<
"""FRIENDLY ADVICE TO A LOT OF YOUNG MEN
by Charles Bukowski
Go to Tibet
Ride a camel.
Read the bible.
Dye your shoes blue.
Grow a beard.
Circle the world in a paper canoe.
Subscribe to The Saturday Evening Post.
Chew on the left side of your mouth only.
Marry a woman with one leg and shave with a straight razor.
And carve your name in her arm.
Brush your teeth with gasoline.
Sleep all day and climb trees at night.
Be a monk and drink buckshot and beer.
Hold your head under water and play the violin.
Do a belly dance before pink candles.
Kill your dog.
Run for mayor.
Live in a barrel.
Break your head with a hatchet.
Plant tulips in the rain.
But don’t write poetry."""
<<<
He interprets this poem a bit [[here|better off doing nothing]]. For a counterpoint, [[Robert Heinlein|specialization is for insects]]
<<<
Doubt both doubt and doubters.
<<< Thomas Chalmers
//All <$count filter="[tag[Doug Wilson]]"></$count> entries, most recent first://
<$list filter="[tag[Doug Wilson]] +[!sort[modified]]">
<div class="tc-menu-list-item">
<$link to={{!!title}}><$view field="title"/></$link>
</div>
</$list>
Dress for the job you want, not the job you have.
[img[https://pbs.twimg.com/media/BVnivt2CcAAbuuG.jpg]]
[img[http://i.imgur.com/jGX52fy.jpg]]
<<<
The less you know about a field, the better your odds. Dumb boldness is the best way to approach a new challenge.
<<< Jerry Seinfeld, [[Jerry Seinfeld, Online Force|http://www.nytimes.com/2015/05/31/arts/television/jerry-seinfeld-online-force.html]]
<<<
Young neurotics are sometimes haunted by the recurring impression that dumb people are much happier than they are. Sparks’s oeuvre seems to suggest that this fabled shadow world of earnest, satisfied simpletons is real.
<<<
http://www.bookforum.com/inprint/022_05/15585
<<<
If you’re absolutely no good at something at all, then you lack exactly the skills that you need to know that you’re absolutely no good at it.
<<< John Cleese on the Dunning/Kruger thesis
<<<
Some of the best things I have ever thought of I have thought of during bad sermons.
<<< Wendell Berry
<<<
Each day is a gift and I am horrible at opening presents in front of people.
<<< Hope Cantwell
<<<
The world is no disposable ladder to heaven. Earth is not convenient; it is good; it is, by God's design, our lawful love.
<<< Robert Farrar Capon
An idea borrowed by Arthur ~McGill and David Kelsey and expounded upon by Richard Beck in his book The Slavery of Death.
<<<
[I discuss] how an eccentric identity can emancipate us from our slavery to the fear of death, a fear which functions as the power of the devil in our lives (Hebrews 2.14-15).
The key idea behind an eccentric identity is coming to receive your life (and the things in your life) as gift. The experience of gift, cultivated through the practices of doxological gratitude, reduces both our basic and neurotic experiences of anxiety and scarcity, our worries about having enough (basic anxiety) and being enough (neurotic anxiety).
<<< Richard Beck, [[Eucharistic Identity|http://experimentaltheology.blogspot.com/2015/02/eucharistic-identity.html]]
<<<
Maybe writing can’t be taught, but editing can be taught—prayer, fasting and self-mutilation. Notions of the lousy can be taught. Ethics.
<<< Donald Barthelme
from his [[Paris Review interview|http://www.theparisreview.org/interviews/3228/the-art-of-fiction-no-66-donald-barthelme]]
<<<
The test of a first-rate intelligence is the ability to hold two opposed ideas in the mind at the same time, and still retain the ability to function.
<<< F. Scott Fitzgerald
<<<
It is the mark of an educated mind to be able to entertain a thought without accepting it.
<<< Aristotle
<<<
Education enables you to express assent or dissent in graduated terms.
<<< William Cory
<<<
Education is the ability to listen to almost anything without losing your temper or your self-confidence.
<<< Robert Frost
<<<
To change an opinion without a mental process is the mark of the uneducated.
<<< Geoffrey Madan
<<<
To have doubted one’s own first principles is the mark of a civilized man.
<<< Oliver Wendell Holmes
[img[http://i.imgur.com/ZLo5iWB.gif]]
<<<
In London a young artist said to me, "How wonderful it must be for an American traveling in Europe the first time; you can never be a part of it, so none of the pain is yours, you will never have to endure it - yes, for you there is only the beauty."
Not understanding what he meant, I resented this; but later, after some months in France and Italy, I saw that he was right: I was not a part of Europe, I never would be. Safe, I could leave when I wanted to, and for me there was only the honeyed, hallowed air of beauty. But it was not so wonderful as the young man had imagined; it was desperate to feel that one could never be a part of moments so moving, that always one would be isolated from this landscape and these people; and then gradually I realized I did not have to be a part of it: rather, it could be a part of me. The sudden garden, opera night, wild children snatching flowers and running up a darkening street, a wreath for the dead and nuns in noon light, music from the piazza, a Paris pianola and fireworks on La Grande Nuit, the heart-shaking surprise of mountain visions and water views (lakes like green wine in the chalice of volcanoes, the Mediterranean flickering at the bottoms of cliffs), forsaken far-off towers falling in twilight and candles igniting the jeweled corpse of St. Zeno of Verona - all a part of me, //elements for the making of my own perspective.//
<<< Truman Capote, Portraits and Observations (emphasis mine)
[img[http://i.imgur.com/I6Xfib2.jpg]]
<<<
"When thou prayest, enter into thy closet, and when thou hast shut thy door, pray to thy Father which is in secret." --(Matt. vi.6)"
The closet is twofold, outer and inner, material and spiritual: the material place is of wood or stone, the spiritual closet is the heart or mind: St. Theophylact interprets this phrase as meaning secret thought or inner vision. Therefore, the material closet remains always fixed in the same place, but the spiritual one you carry about within you wherever you go. Wherever man is, his heart is always with him, and so, having collected his thoughts inside his heart, he can shut himself in and pray to God in secret, whether he be talking or listening, whether among few people or many. Inner prayer, if it comes to a man's spirit when he is with other people, demands no use of lips or of books, no movement of the tongue or sound of the voice: and the same is true even when you are alone. All that is necessary is to raise your mind to God, and descend deep into yourself, and this can be done everywhere.
The material closet of a man who is silent embraces only the man himself, but the inner spiritual closet also holds God and all the Kingdom of Heaven, according to the Gospel words of Christ Himself: 'The Kingdom of God is within you.' (Luke xvii.21). Explaining this text, St. Makarios of Egypt writes: 'The heart is a small vessel, but all things are contained in it; God is there, the angels are there, and there also is life and the Kingdom, the heavenly cities and the treasures of grace.'
Man needs to enclose himself in the inner closet of his heart more often than he need go to church: and collecting all his thoughts there, he must place his mind before God, praying to Him in secret with all warmth of spirit and with living faith.
<<< St. Dimitri of Rostov
<<<
Feminism is the idea that women should have equal rights as men, and vice versa. That women should have equal access to education, equal pay for equal work, equal health coverage. That women should not be abused for being smaller (or bigger) any more than men should be abused for being smaller (or bigger).
<<< Katie Botkin, [[Feminism 101|http://kbotkin.com/2015/02/03/feminism-101/]]
[img[http://i.imgur.com/ttPWfbu.jpg]]
//Eros, god of love//
[img[http://4.bp.blogspot.com/-GenhvgatbDc/VMD9QtNl5VI/AAAAAAAAZr8/YxQ8-k03chY/s1600/Kronberg_Julius.sm.jpg]]
<<<
“Error has no rights, but the man who errs has equal rights with him who errs not.”
<<< Orestes Brownson
https://books.google.com/books?id=Sk8YAAAAYAAJ&pg=PA317&lpg=PA317&dq=orestes+brownson+error+man+who+errs&source=bl&ots=BdLBf694Kl&sig=JIPnjcAE72ttaHa0JHjBJ9a9ur4&hl=en&sa=X&ved=0ahUKEwjyjJzBkPDLAhUkyYMKHUdRByYQ6AEIIzAB#v=onepage&q=orestes%20brownson%20error%20man%20who%20errs&f=false
<<<
A brother was restless in the community and often moved to anger. So he said: 'I will go and live somewhere by myself. And since I shall be able to talk or listen to no one, I shall be tranquil, and my passionate anger will cease.' He went out and lived alone in a cave. But one day he filled his jug with water and put it on the ground. It happened suddenly to fall over. He filled it again, and again it fell. And this happened a third time. And in a rage he snatched up the jug and broke it. Returning to his right mind, he knew that the demon of anger had mocked him, and he said: 'Here am I by myself, and he has beaten me. I will return to the community. Wherever you live, you need effort and patience and above all God's help.' And he rose up, and went back.
<<< recounted by Owen Chadwick in Western Asceticism
<<<
Because children have abounding vitality, because they are in spirit fierce and free, therefore they want things repeated and unchanged. They always say, “Do it again”; and the grown-up person does it again until he is nearly dead. For grown-up people are not strong enough to exult in monotony. But perhaps God is strong enough to exult in monotony. It is possible that God says every morning, “Do it again” to the sun; and every evening, “Do it again” to the moon. It may not be automatic necessity that makes all daisies alike; it may be that God makes every daisy separately, but has never got tired of making them. It may be that he has the eternal appetite of infancy; for we have sinned and grown old, and our Father is younger than we.
<<< G.K. Chesterton, Orthodoxy
<<<
Many years ago I was working on a television show with the local PBS station at WSU, and Nancy and I were invited over to dinner by the producer and his wife. They were very gracious, and we enjoyed our time with them. But one of the events of the evening that turned out to be a dud was when our host brought out a game which was called, I think, Scruples. Something like that. At any rate, the point of the game was that you drew a card that dealt you some kind of thumb-sucker from a stack of ethical conundra, to make up a funny-sounding plural. If you are stuck in a lifeboat, and you will most certainly die if you don’t do something, do you eat the fat guy or the skinny guy first? That kind of thing. You were then supposed to say something like whoa, and think about it for a while, twisting in the wind. I can really see how a living room full of wealthy relativists in an upscale neighborhood in the eighties could really be flummoxed by the game, but we were no fun at all. There are certain things you just don’t do because the Ten Commandments were not suggestions, and the game is over.
<<< Doug Wilson, [[What Did Everdeen Ever Do?|http://credenda.brainfog.com/index.php/Reviews/what-did-everdeen-ever-do.html]]
Similar to a [[false dilemma]]. I think false dilemmas work pretty well as premises in fiction, though...
Here I am talking more about how Christians talk to one another - whether in a church community or a more academic context.
//Related:// [[the prophetic voice|prophetic voice]]
<<<
The new evangelical communicator is all too often an ideas guru, spreading non-conventional, novel, and cool insights that make us feel good and encourage us to buy into their teaching...
<<<
<<<
Where persuasion occurs through feeling, truth becomes bound up in the authentic communication of the ‘self’ and its passion, rather than in the more objective criteria of traditional discourses, where truth was tested by realities and practices outside of ourselves. This is truth in the mode of sharing one’s personal ‘sacred story’.
It is for this reason that narrative, anecdote, metaphor, and potent images are so important for such approaches. All of these are non-argumentative ways of drawing and inviting you, the reader, into the feelings of the text. They also serve as ways of avoiding direct ideological confrontation and engagement. By couching what would otherwise have to be presented as a theological argument in an impressionistic narrative they make it very difficult to frame disagreements.
<<< Alastair Roberts
[[Rob Bell and Don Draper - the Ad Man's Gospel|https://alastairadversaria.wordpress.com/2013/03/11/rob-bell-and-don-draper-the-ad-mans-gospel/]]
<<<
Step 1: For a variety of well-intentioned reasons, choose a preferred political ideology you believe is the right one and will adequately to address the differentiated problems in society. As David Koyzis, explains it could be libertarianism, socialism, nationalism, conservatism, progressivism, or democracy.
Step 2: Read your preferred political ideology into Bible in a such way that it becomes a tool for interpreting and applying the Bible to social issues. That is, your political ideology becomes your hermeneutic for “Biblical” views on justice.
Step 3: Cherry-pick Bible verses (often taken out of context) and repackage them to make the case that your preferred, tribal, political ideology is indeed “Biblical,” “follows the teaching of Jesus,” is “Christian,” and so on. Here the goal is to prove that God must obviously be on your tribe’s side.
Step 4: Now that you have baptized your political ideology by pouring on a random assortment of Bible verses, you are ready to declare your ideological tribe and those who agree with you, “right.” As a result, any other tribe that does not read the Bible through your ideological lens is not only wrong, they are the enemy and a threat to the church and the world.
Step 5: Issue a call for all other Christians to embrace your tribal ideology. Now that your tribe is “right” you are free in the blogosphere, for example, to declare all of those who are not-like-us — that is, not in our tribe — to be “wrong.” Those in the other tribe (i.e., the enemy tribe) need to change their views so that they can more closely adhere to what your tribe believes the Bible teaches and, therefore, advance to the right side of Truth. Your tribe’s truth.
<<< Anthony Bradley, [[Ideological Tribalism: How Evangelicals Go About Social Ethics|http://blog.acton.org/archives/71854-evangelicals-develop-perspectives-social-ethics.html]]
<<<
A couple years ago, my friend Michael Sippey coined the brilliant phrase “Even if it’s fake, it’s real.” He was referring to a possibly-faked Google Street View image making the rounds of an in-progress childbirth. Sippey explains that, regardless of where the truth lies (and there are four distinct potential outcomes, not just two), it doesn’t affect the entertainment value of the image and that we should embrace this new uncertainty.
<<< [[Source|http://www.niemanlab.org/2013/12/even-if-its-fake-its-real/]]
Sippey plotted the possibilities along two axes:
[img[http://farm5.static.flickr.com/4148/5204079263_7a04c666ab.jpg]]
<<<
# Real baby / real Google: wow, what a coincidence.
# Fake baby / real Google: wow, nice stunt. Involved not an insignificant amount of planning...least of which is understanding just when that street view car would come by.
# Fake baby / fake Google: wow, nice stunt. Involves getting people out on the street, staging the scene, snapping the photo, doing the right Photoshop work, and seeding it in the right communities where it finds its way to, you know, bloggers.
# Real baby / fake Google: wow, creepy. Amazingly, impressively creepy that (a) someone would grab this shot and then (b) do the right Photoshop work, seed it in the right communities, etc.
I honestly don't care which quadrant this item actually lives in. Because even if this is a faked baby with a faked Google street view, it's still real.
<<< [[Original post|http://www.sippey.com/2010/11/even-if-its-fake-its-real.html]]
<<<
civilization makes all good things available, even to cowards
<<< Nietzsche
paraphrase, I need to look up the actual quotation
nb: Lewis abbreviated extensively in his letters, v. = very, shd. = should. He abbreviates 'homosexual' as 'homo.' but his usage predates and is oblivious to 'homo' as a slur.
<<<
I have seen less than you but more than I wanted of this terrible problem. I will discuss your letter with those whom I think wise in Christ. This is only an interim report. First, to map out the boundaries within which all discussion must go on, I take it for certain that the physical satisfaction of homosexual desires is sin. This leaves the homo. no worse off than any normal person who is, for whatever reason, prevented from marrying. Second, our speculations on the cause of the abnormality are not what matters and we must be content with ignorance. The disciples were not told why (in terms of efficient cause) the man was born blind (Jn. IX 1-3): only the final cause, that the works of God shd. be made manifest in him. This suggests that in homosexuality, as in every other tribulation, those works can be made manifest: i.e. that every disability conceals a vocation, if only we can find it, wh. will 'turn the necessity to glorious gain.' Of course, the first step must be to accept any privations wh., if so disabled, we can't lawfully get. The homo. has to accept sexual abstinence just as the poor man has to forego otherwise lawful pleasures because he wd. be unjust to his wife and children if he took them. That is merely a negative condition. What shd. the positive life of the homo. be? I wish I had a letter wh. a pious male homo., now dead, once wrote to me--but of course it was the sort of letter one takes care to destroy. He believed that his necessity could be turned to spiritual gain: that there were certain kinds of sympathy and understanding, a certain social role which mere men and mere women cd. not give. But it is all horribly vague and long ago. Perhaps any homo. who humbly accepts his cross and puts himself under Divine guidance will, however, be shown the way. I am sure that any attempt to evade it (e.g. by mock or quasi-marriage with a member of one's own sex even if this does not lead to any carnal act) is the wrong way. Jealousy (this another homo. admitted to me) is far more rampant and deadly among them than among us. And I don't think little concessions like wearing the clothes of the other sex in private is the right line, either. It is the duties, burdens, the characteristic virtues of the other sex, I suspect, which the patient must try to cultivate. I have mentioned humility because male homos. (I don't know about women) are rather apt, the moment they find you don't treat them with horror and contempt, to rush to the opposite pole and start implying that they are somehow superior to the normal type. I wish I could be more definite. All I have really said is that, like all other tribulations, it must be offered to God and His guidance how to use it must be sought.
<<< C.S. Lewis, from Sheldon Vanauken's A Severe Mercy, pp. 146-148
<<<
Every place deserves an atlas, an atlas is implicit in every place, and to say that is to ask first of all what a place is.
<<< Rebecca Solnit
<<<
I’ve always been sickened by the whole discussion of natural tone, natural voice. I think that’s ridiculous. Every tone, every voice is unnatural, and it is natural to be unnatural. So there’s nothing to talk about. It works or it doesn’t work. I don’t think that anybody ought to tolerate the tyranny of the idea of “natural” voice.
<<< Kay Ryan
from the [[Paris Review interview|http://www.theparisreview.org/interviews/5889/the-art-of-poetry-no-94-kay-ryan]]
<<<
Everyone complains of his memory, and no one complains of his judgment.
<<< La Rochefoucauld
<<<
Everyone lies about writing. They lie about how easy it is or how hard it was. They perpetuate a romantic idea that writing is some beautiful experience that takes place in an architectural room filled with leather novels and chai tea. They talk about their ‘morning ritual’ and how they ‘dress for writing’ and the cabin in Big Sur where they go to ‘be alone’ - blah blah blah. No one tells the truth about writing a book. Authors pretend their stories were always shiny and perfect and just waiting to be written. The truth is, writing is this: hard and boring and occasionally great but usually not. Even I have lied about writing. I have told people that writing this book has been like brushing away dirt from a fossil. What a load of shit. It has been like hacking away at a freezer with a screwdriver.
<<< Amy Poehler, Yes, Please
<<<
Periodically, people ask whether Agile is a cargo-cult. The simple answer is – yes. Because everything is to some degree. People find something that works and they attempt to make it work for things that it was not designed for. It’s a natural strategy to try and sometimes it works. But we shouldn’t be surprised when it falls short. Sometimes different problems require completely different solutions. Scale may be one of those problems.
<<< Michael Feathers, [[Moving Past the Scaling Myth|https://michaelfeathers.silvrback.com/the-myth-of-scaling]]
<<<
Everything will feel broken all the time - the diversity and magnitude of the disasters will surprise you. Your job is to fix them with a smile on your face and reassure your team that it'll all be ok.
<<< Sam Altman
<<<
Evil is unspectacular and always human / And shares our bed and eats at our own table.
<<< W.H. Auden, 'Herman Melville'
<<<
The human existent is redeemed and delivered into the full freedom of the Christian person when it is liberated from the demonic and futile project of self-redemption – the self-contradictory and self-defeating enterprise of establishing itself in unassailable security as if its existence were identical with being, and as if it were completely autonomous. This hateful enterprise is carried on by the existent maintaining itself as “being” and as autonomous self-fulfillment, challenging and defying every other existent, seeking either to dominate or to placate all that it confronts. This implies a constant wearying effort at deception, with eager thrusts of passion and power, constantly frustrated and falling back into the cunning futility of trying to outwit reality itself.
Legal virtuousness is one of the ways in which the human existent seeks to carry out this project of deception and to gain mastery over the death that is inexorably present in the very fact of bodily life itself. There are other, more complex spiritual ways of attempting this same deception . . . All are self-defeating except the Gospel mercy, in which the self-seeking self is liberated from its search and its concern, therefore to some extent from anguish, by finding not self but truth in Christ. This “finding” is the discovery, in grace and faith, that one is “mercifully understood” and that in the Spirit of this mercy and this understanding one is enabled to understand others in mercy and pity. The weakness and defenselessness in our hearts, which make us pitiless to others, are then dispelled not by power but by trust in divine mercy, which is given us when we no longer seek to defend our defenselessness, and are ready to accept our own boundless need in a merciful exchange with others whose poverty is as great as our own!
Man is fallen into self-contradiction and ambiguity from which no self-study, no individualistic or social ethic, no philosophy, no mere mysticism can liberate him. His Christian calling is not a calling to self-purification or to good works, to the elimination of sensual desires, to the cleansing of concepts, to the emptying of the intellect and will, to ultimate inner tranquility, and to liberation from slavery to cravings. On the contrary, his very tendency to understand the meaning of liberation in such terms may ultimately make liberation impossible.
This is a view of life, essentially “under sin,” because it is under the old Law, by which Law gives sin and passion the appearance of liberty. For whenever the Law says, “Thou shalt not,” there springs up in the heart of the self-alienated man a doubt, and an occasion, a project of self-recovery and self-fulfillment of defiance of the Law. The promises, menaces, and demands of the Law are ambiguous because they point to self-possession and suggest two conflicting possible ways to autonomy: one by following the Law and the other by defying it. It is always possible for man under the Law, in his fallenness and confusion, to outline projects of liberty “against” the Law. But these are illusory projects which receive their apparent substance from the Law in its promises or in its threats. Thus, the Law tends to become an incitement to a despairing self-realization. It incites the self-seeking self to plunge into its own void. The very Law itself perversely and cruelly seems to define this void as “liberty” and “realization,” for it tells man that he can “choose” sin and that, therefore, sinning is a form of freedom.
Why this illusion? Because at the same time the Law offers a deceptive promise of fulfillment to the self-seeking self in legal righteousness. The Law is a guarantee of respectability, security, and power, and to keep the Law is to enter into the human and social structure which is founded on the Law and provides its rewards and sanctions. It is to share the power that belongs to the “elements of the world” (forgetting that they are at best “feeble elements”) or even worse, perhaps, the power of the archontes (Ephesians 1:21). The Law offers the self-seeking self the spurious autonomy which comes from creating a place for itself in the minds of men by human righteousness and achievements: he who is justified by the Law is understood not mercifully but righteously, not by God but by men (God says “I know you not”). He receives his reward (Matthew 6:16). This reward may be a righteous unbelief, the hardening of the heart in self-respect (“How can you believe who seek glory from another?”). At the same time, this hardening issues in a deceptive dialogue of claims and demands with others who tend to accept this self-righteousness as its own evaluation. They accept the Law or rebel against it as it appears, incarnate in those who claim they have been justified by it.
Thus, Law without mercy kills mercy in the hearts of those who seek justification solely by socially acceptable virtuousness and by courting the favor of authority. This legal holiness, in its turn, destroys the hope of mercy in those who despair of the Law.
We must, therefore, remember the religious and Christian importance of not implicitly identifying external “Law” with interior “Mercy,” either in our doctrine (and in this we usually manage to keep them distinct) or in our lives (here we tend in practice to confuse them by making the fulfillment of the Law’s inexorable demand either a condition for receiving mercy or a guarantee that one has received it).
<<< Thomas Merton, The Climate of Mercy – For Albert Schweitzer
[img[http://i.imgur.com/OtLIiYn.gif]]
experiential design
n. interior design / architecture with an emphasis on how people will physically interact with the finished product, in a sensorially holistic way.
Because We Can calls this the [['Choreography of Space'|http://becausewecan.org/content/choreography-space-or-how-make-your-interior-design-have-great-experience]]
I first thought of it in terms of Disney Imagineering
[[Roman and Williams|Roman and Williams interview snippets]] also exemplifies this in my mind. They're not afraid of beauty, even verging on the anachronistic, and its power to transport people.
<<<
Faith steals upon you like dew: some days you wake and it is there. And like dew, it gets burned off in the rising sun of anxieties, ambitions, distractions.
<<< Christian Wiman
[img[http://i.imgur.com/u5QfwdV.png]]
Myst's opening image, the 'Falling Man' - most likely the 'Stranger', the first-person protagonist of the series.
[img[http://i.imgur.com/xvunuj5.png]]
Simple and enigmatical enough to be iconic, a [[palimpsest]].
Neo getting lifted out of the 'amniotic fluid' after his rebirth, etc.
[img[http://i.imgur.com/YRvRsey.jpg]]
//'Falling Man', Ron A Cheek//
[img[http://www.funnyphotos.net.au/images/national-lampoon-if-you-dont-buy-this-magazine-we-1.jpg]]
I mean false nostalgia for something that possibly didn't exist, certainly something you didn't experience but have only imagined.
Like thinking that you would be better suited to a different time in history, the desire to travel extensively by train, etc.
I swear there's a word for this, but I can't find it. There are several words that get close to the concept.
!!!! Saudade
A Portuguese word for deep nostalgic and melancholic longing for something absent.
!!!! Sehnsucht
German mystical word with no direct English analogue, yearning mixed with an addictive quality. A very excellent concept, but slightly different from what I'm after.
C.S. Lewis used this word, referring to Sehnsucht as the "inconsolable longing" in the human heart for "we know not what."
This is different for every person. For Lewis, he describes
<<<
That unnameable something, desire for which pierces us like a rapier at the smell of bonfire, the sound of wild ducks flying overhead, the title of The Well at the World's End, the opening lines of "Kubla Khan", the morning cobwebs in late summer, or the noise of falling waves.
<<<
!!!! Examples
In the movie The Grand Budapest Hotel, the main character M. Gustave represents a way of life that no longer exists, and //may never have existed outside of his own mind//. His approach to his work perpetuates and perhaps creates an entire way of life.
What self-respecting website doesn't have FAQs?
A: That question is rhetorical.
''Commonplace Book''
//Why do you have all these quotes you clearly disagree with? Are you harboring bitterness?//
I am not saving up rocks to throw in a future big ol' huffy departure. But I often have to find quotations to support what I think of as easy assertions about the [[Moscow Project]] like "there's a lot of opposition to [[Lent]]". I got tired of tracking down the same thing, and that's what [[commonplace books|commonplace]] are for - keeping track of quotations!
''Moscow Project''
//Again, what's the deal with the seeming sociological look at your church community?//
I consider Moscow my home, and one of the things I've struggled with the most is its [[lack of institutional memory]]. Writing things down helps me remember and contextualize my experiences.
//Southern Slavery, the Great Unpleasantness, NSA Zoning, etc.//
I am significantly uninterested in creating a timeline of happenings. The //Southern Slavery// controversy, 'Morton Street Casino', and NSA Zoning issue were complicated by people with axes to grind. It is beyond my ability to find out what happened in the Great Unpleasantness, and time has largely made it irrelevant. My goal is to stick to ideas and not attempt to interpret past events.
//Who's this for?//
It's for me. This site is entirely selfish in that way. But if you find it helpful, that's great.
<<<
For the righteousness of God goes far beyond mere deeds, and requires of us love and helping mercy as our highest obligation, and justice to our fellow humans, those of them too who have done nothing for us – those even who have done us wrong. Our relations with others, God first and then our neighbors, must one day become as in true nature they are, the gladness of our being; and nothing then will ever appear good for us that is not in harmony with those blessed relations.
<<< George ~MacDonald
<<<
Far from being a secret Muslim who was indifferent to the death of an American diplomat, or a progressive peacenik who resents U.S. leadership, Obama was something much more destructive to the interests of Americans — he was a typical American hawk. He was different from George W. Bush only in preferring air power for aiding revolutionaries and rebels on the ground, rather than a ground invasion and think-tank conquerors like Ahmed Chalabi. The result of the policy of our foolish Christians is worse than the fever dreams of any Manchurian Mohammedan or American weakling: a continuation and intensification of the wars that are leading to the eradication of Christianity from the Middle East. ISIS is conquering territory and killing Christians with American materiel.
The fact is that the opposition party in America can’t honestly investigate Obama’s foreign policy without doing fatal collateral damage to its own. And so Hillary Clinton can say in public that the intervention she championed in Libya is “smart power at its best,” even though that country is being terrorized by ISIS and other jihadists and is one source of the refugee crisis. The supposedly mean-spirited GOP that would do anything to attack Clinton has run into something it won’t do: challenge our recklessly hawkish foreign policy.
<<< Michael Brendan Doughtery, on [[why the Republicans offer no challenge to Democratic foreign policy|http://theweek.com/articles/584817/why-republicans-keep-missing-giant-benghazi-scandal-right-before-eyes]]
[img[http://i.imgur.com/lgDVScI.jpg]]
<<<
Tillman’s personal style draws from his musical heroes — Reed, Nick Cave, Serge Gainsbourg. “He always looked great,” says Tillman of Gainsbourg. “He went from suits to sort of a cowboy thing, and then a really great phase in the ’80s when he was just wearing denim pants with denim shirts, like, unbuttoned to his navel.” Tillman says that though he hasn’t gone full navel, he does have “a button-up dysmorphia,” meaning: “I think one button lower, to me, looks more normal than it does to other people.”
Tillman tells me he’s wearing snakeskin shoes and purple-and-green Dries Van Noten pants. What he can’t stand are “basic-ass dude” clothes. “Like, everyone kind of looks like a graphic designer. I just hate that look.” It’s a trend, he says, that mirrors what’s happening in music. “It’s predicated on not fucking up, as opposed to the emphasis really being on expression. There’s a lot of prescriptive fashion — ‘Oh, you need the perfect white shirt, and you need the perfect khaki’ — and it’s just so boring.” If he could have any influence over the fashion choices of the men of the world, he says, “I would like to see more of a Moroccan-slash-pajama vibe.”
<<<
http://nymag.com/thecut/2015/10/on-road-with-fashionable-father-john-misty.html
<<<
“Fear of missing out” was a common theme during my conversations in Startup Alley. In fact, spend enough time at ~TechCrunch Disrupt and it becomes apparent that fear is the central organizing principle of the conference. The fear of missing out. The fear of being late to market. The fear of a similar-but-superior idea coming along at the perfect moment.
The rhetoric of the conference is the language of violence and rending. Entrepreneurs aren’t just supposed to build a competent product, but to disrupt and turn their chosen industry on its head. The ~TechCrunch theme song features a gurgling robot voice shouting “disrupt” over and over on top of an assaultive EDM synth line, as if to will the sea of entrepreneurs toward their inevitable moonshot ideas. The big, $50,000-prize startup competition is called the “Battlefield” because this is war and, as anyone who’s been around the tech world long enough knows, there are casualties.
The fear also keeps people from criticizing Disrupt itself, at least not on the record. When I asked what he thought of Disrupt’s spectacle, one entrepreneur, well-schooled in reporter-speak, gave me two answers: one on the record, the other on background, without attribution.
[…]
~TechCrunch Disrupt, like the industry it represents, is more than a little broken. The fear that runs Disrupt runs the whole industry. It’s the same fear that drives monster investments — better to lose a little money than let someone beat you to the next Facebook or Uber or Apple, right? — and hundreds of millions of dollars in funding. It’s the same fear that moves even those well-versed in the precarious economics of the industry to jump headfirst into what could be another catastrophic bubble.
And it’s the same fear that elicits the worst in what should — and could — be a progressive, welcoming industry. That creates insular, homogeneous communities and cultures and then silences the voices that don’t sound like their own. It’s a collective fear that can lead to the embrace of mediocrity and copycats and rhetorically bankrupt jargon, all of which were on display this week.
But it’s also a fear that motivates people to create. It pushes and empowers intelligent people to take big swings and labor in the service of something, however lasting. It’s a fear that forces the awkward to attempt to shed their uncomfortableness and be vulnerable and do. At its worst, that building and creating and doing is lazy, self-satisfied, alienating, and small-minded. But at its best, it’s world-changing.
<<< ~BuzzFeed, [[Searching For Signs Of Life At TechCrunch Disrupt|http://www.buzzfeed.com/charliewarzel/in-search-of-humanity-at-techcrunch-disrupt#.sfR0BQy24N]]
<<<
I now inhabit a life I don’t deserve, but we all walk this earth feeling we are frauds. The trick is to be grateful and hope the caper doesn't end soon.
<<< David Carr, The Night of the Gun
articulated around 2002 by Doug Wilson, group of people with griefs who get together and agitate each other. Well is poisoned, Girard, etc
<<<
Once someone has enlisted in what I call “the fellowship of the grievance” (FOG) all other differences with other members of that fellowship fade into the background. Adversaries become cobelligerents, and then cobelligerents mysteriously become allies. And all because of “the shared grievance,” which almost assumes a quasi-sacramental status. It truly becomes a tie that binds.
<<< Doug Wilson, [[Odd Bedfellows|http://dougwils.com/s7-engaging-the-culture/odd-bedfellows.html]]
<<<
To our conflicted relationship with feminism. By “feminism” I mean a perspective on life and culture that seeks to safeguard the dignity of women, elevate their position where it’s been unjustly sullied, and dismantle the abusive aspects of patriarchy.
<<< David Zahl, [[Mockingbird|http://www.mbird.com/2015/05/feministic-fallout-more-thoughts-on-underachieving-boys-and-gracious-g-a-w-f-s/]]
<<<
[Feminism is] a socialist, anti-family, political movement that encourages women to leave their husbands, kill their children, practice witchcraft, destroy capitalism, and become lesbians.
<<< Pat Robertson
I've heard Robertson's description used to describe negative stereotypes of the feminist movement. This was from a time when the term was more politicized, but this reminds me of anti-suffragette cartoons:
[img[http://thesocietypages.org/socimages/files/2014/12/4-500x793.jpg]]
The term is still largely negative - associated with strident activism. Think of Taylor Swift distancing herself from the term in a 2013(?) interview. But a good portion of that can probably be attributed to opposition trying to discredit it, as with the suffragettes.
<<<
An order in which everyone treated his neighbor as himself would be one where... few could be fruitful and multiply.
<<< Friedrich Hayek
<<<
The problem with writing fiction is that it has to be plausible. The same is not true for nonfiction.
<<< Tom Wolfe
<<<
One of the best pieces of advice I ever got, back when I was 23 and newly out of school, is this: look around and figure out who you want to be on your team. Figure out the people around you that you want to work with for the rest of your life. Figure out the people who are smart & awesome, who share your values, who get things done — and maybe most important, who you like to be with and who you want to help win. And treat them right, always. Look for ways to help, to work together, to learn. Because in 20 years you’ll all be in amazing places doing amazing things.
<<< John Lilly
<<<
There is a different kind of prayer without ceasing; it is longing. Whatever you may be doing, if you long for the day of everlasting rest do not cease praying. If you do not wish to cease praying, then do not cease your longing. Your persistent longing is your persistent voice. But when love grows cold, the heart grows silent. Burning love is the outcry of the heart! If you are filled with longing all the time, you will keep crying out, and if your love perseveres, your cry will be heard without fail.
<<< Augustine
<<<
When you are standing in the pulpit, you must sound as though you know what you’re talking about. When you’re writing, you’re trying to find out something which you don’t know. The whole language of writing for me is finding out what you don’t want to know, what you don’t want to find out. But something forces you to anyway.
<<< James Baldwin
Again, Paris Review interview: http://www.theparisreview.org/interviews/2994/the-art-of-fiction-no-78-james-baldwin
<<<
First be sure that you know exactly what you want to say. Then be sure you have said exactly that.
<<< C.S. Lewis
<<<
I may not be a first-rate composer, but I am a first-class second-rate composer.
<<< Richard Strauss
Marge Laney quotes an Accenture study that found that 70% of online clothing purchases were returned due to fit issues.
Evidence for the continued value of local clothing retail.
Source: Fit Happens: Analog Buying in a Digital World
<<<
Would you like me to list also the paths of repentance? They are numerous and quite varied, and all lead to heaven.
A first path of repentance is the condemnation of your own sins: Be the first to admit your sins and you will be justified. For this reason, too, the prophet wrote: I said: I will accuse myself of my sins to the Lord, and you forgave the wickedness of my heart. Therefore, you too should condemn your own sins; that will be enough reason for the Lord to forgive you, for a man who condemns his own sins is slower to commit them again. Rouse your conscience to accuse you within your own house, lest it become your accuser before the judgment seat of the Lord.
That, then, is one very good path of repentance. Another and no less valuable one is to put out of our minds the harm done us by our enemies, in order to master our anger, and to forgive our fellow servants' sins against us. Then our own sins against the Lord will be forgiven us. Thus you have another way to atone for sin: For if you forgive your debtors, your heavenly Father will forgive you.
Do you want to know of a third path? It consists of prayer that is fervent, careful and comes from the heart.
If you want to hear of a fourth, I will mention almsgiving, whose power is great and far-reaching.
If, moreover, a man lives a modest, humble life, that, no less than the other things I have mentioned, takes sin away. Proof of this is the tax-collector who had no good deeds to mention, but offered his humility instead and was relieved of a heavy burden of sins.
Thus I have shown you five paths of repentance; condemnation of your own sins, forgiveness of our neighbor's sins against us, prayer, almsgiving and humility.
Do not be idle, then, but walk daily in all these paths; they are easy, and you cannot plead your poverty. For, though you live out your life amid great need, you can always set aside your wrath, be humble, pray diligently and condemn your own sins...
Now that we have learned how to heal these wounds of ours, let us apply the cures. Then, when we have regained genuine health, we can approach the holy table with confidence, go gloriously to meet Christ, the king of glory, and attain the eternal blessings through the grace, mercy and kindness of Jesus Christ, our Lord.
<<< --from a homily of St. John Chrysostom
Flaubert enjoyed outlandish dress; after a trip to Turkey he wore striped culottes and a tunic (reminds me of David Sedaris's article on Kapital &cet). Said his contemporary Emile Zola: “He claimed that it was for comfort, but I’m inclined to believe that this attire derived from romantic fashions, for I also saw him in checkered pants, frock coats pleated at the waist, and wide-brimmed fedoras, cocked over one ear.”
Flaubert, even at his poorest, carried two gold coins in his pocket, to give him “a sense of weight.”
<<<
it’s like you’re floating in an ocean, and you want to build a raft. so you just float there and you wait and wait. and eventually this little piece of something comes drifting by, maybe a memory, and you hang on to it, and then another little piece comes around, it is unrelated, maybe it’s a funny sentence you overheard somewhere. and you keep collecting all these little things that just sort of drift by… a dream, a beautiful sentence in your head that just appeared while doing the dishes, an anecdote you stole from your old diary… and eventually you find connections between all the things and with all these parts you’ve gathered up you now have enough stuff to build a raft. and then once you have the raft you can remove all the bits that don’t quite fit anymore, the spare parts that you didn’t need after all, you toss them back or maybe save them for another raft later. when i write, there isn’t a lot of active effort or swimming around, or calculation… for me that can be very poisonous to creativity. the big ideas won’t happen right when you mentally stress on them… it is more a matter of being patient and being open to all the things that just drift in
<<< Don Hertzfeldt, from his Reddit AMA
[img[http://i.imgur.com/2Q7X2gK.png]]
Csíkszentmihályi once described flow as “being completely involved in an activity for its own sake. The ego falls away. Time flies. Every action, movement, and thought follows inevitably from the previous one, like playing jazz. Your whole being is involved, and you’re using your skills to the utmost.”
I think there's already a group named Palouse Folk School, maybe a music education cooperative?
two tiers for folk school? voc/cont/career, real prices
student/local folk type lessons
I would love to build a poured-concrete folly on some property of mine at some point. I love these architectural flights of fancy.
Here are some of my favorites:
The Dunmore Pineapple
[img[http://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Dunmore_pineapple.jpg/1280px-Dunmore_pineapple.jpg]]
The Swallow's Nest
[img[http://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Crimea_South_Coast_04-14_img10_Gaspra_Swallows_Nest.jpg/640px-Crimea_South_Coast_04-14_img10_Gaspra_Swallows_Nest.jpg]]
Los Pozas
[img[http://i.imgur.com/qADIOzP.jpg]]
<<<
Be sure to follow your dreams, unless your dreams are stupid.
<<< Eugene Mirman
<<<
There is also something to be said for a country where things like food or drink actually differ by region.
<<< Tim Wu, [[Small is Bountiful|http://www.newyorker.com/business/currency/small-bountiful-small-business-craft-beer?mbid=social_twitter]]
In the context of the article it seems like a modest suggestion - a "wouldn't that be neat" kind of thing - but it contains multitudes. Chesterton wouldn't have it any other way (cf his essays on America and the preservation of national identity among immigrants).
<<<
"""''For the Unknown Enemy''
//by William Stafford//
This monument is for the unknown
good in our enemies. Like a picture
their life began to appear: they
gathered at home in the evening
and sang. Above their fields they saw
a new sky. A holiday came
and they carried the baby to the park
for a party. Sunlight surrounded them.
Here we glimpse what our minds long turned
away from. The great mutual
blindness darkened that sunlight in the park,
and the sky that was new, and the holidays.
This monument says that one afternoon
we stood here letting a part of our minds
escape. They came back, but different.
Enemy: one day we glimpsed your life.
This monument is for you."""
<<<
<<<
There are those fornication pantaloons, made on purpose for whores to button up in front. My pantaloons button where they belong, that my secrets, that God has given unto me, should not be exposed.
<<< Brigham Young, denouncing the button fly
<<<
And most evident to me now is that the ends of things are much more anticipatory than I’ve realized. Something will follow, and until the unknown thing arrives, we can hope and wonder at what it might be. Sad-good is intriguing. It’s like the clearing of fertile ground for a new kind of good. It’s clearing the way for new growth.
As we all go from here, let’s do the courageous things. Let’s practice at living in the place between thinking too much or too little of ourselves and of others. Let’s err on the side of love. And when the usual things eclipse the special, let’s remember “it’s easy to be heavy; hard to be light” (G.K. Chesterton). May we be among those who are found to be light.
All joy and courage,
<<< Jennifer Tharp, Founder
Upon the closing of [[In Earnest magazine|http://inearnestmag.com/in-earnest/2015/2/2/a-goodbye-from-our-founder]]
Milton Friedman on the four ways you can spend money
# You can spend your own money on yourself. When you do that, why then you really watch what you’re doing, and you try to get the most for your money.
# You can spend your own money on somebody else. For example, I buy a birthday present for someone. Well, then I’m not so careful about the content of the present, but I’m very careful about the cost.
# I can spend somebody else’s money on myself. And if I spend somebody else’s money on myself, then I’m sure going to have a good lunch!
# I can spend somebody else’s money on somebody else. And if I spend somebody else’s money on somebody else, I’m not concerned about how much it is, and I’m not concerned about what I get.
<<<
''55 Maxims of the Christian Life''
Fr. Thomas Hopko
//(Below is a series of short phrases, or maxims, that I have found to be very practical and helpful. We can often times think that the spiritual life is very complicated and and hard to live. Fr. Thomas was asked to come up with a simple and concise list of the essence of our Life in Christ as we struggle on the path towards salvation. He came up with these 55 maxims. I would encourage you to post them somewhere where you can see them often. -Fr. Christopher)//
# Be always with Christ and trust God in everything.
# Pray as you can, not as you think you must.
# Have a keepable rule of prayer done by discipline.
# Say the Lord's Prayer several times each day.
# Repeat a short prayer when your mind is not occupied.
# Make some prostrations when you pray.
# Eat good foods in moderation and fast on fasting days.
# Practice silence, inner and outer.
# Sit in silence 20 to 30 minutes each day.
# Do acts of mercy in secret.
# Go to liturgical services regularly.
# Go to confession and holy communion regularly.
# Do not engage intrusive thoughts and feelings.
# Reveal all your thoughts and feelings to a trusted person regularly.
# Read the scriptures regularly.
# Read good books, a little at a time.
# Cultivate communion with the saints.
# Be an ordinary person, one of the human race.
# Be polite with everyone, first of all family members.
# Maintain cleanliness and order in your home.
# Have a healthy, wholesome hobby.
# Exercise regularly.
# Live a day, even a part of a day, at a time.
# Be totally honest, first of all with yourself.
# Be faithful in little things.
# Do your work, then forget it.
# Do the most difficult and painful things first.
# Face reality.
# Be grateful.
# Be cheerful.
# Be simple, hidden, quiet and small.
# Never bring attention to yourself.
# Listen when people talk to you.
# Be awake and attentive, fully present where you are.
# Think and talk about things no more than necessary.
# Speak simply, clearly, firmly, directly.
# Flee imagination, fantasy, analysis, figuring things out.
# Flee carnal, sexual things at their first appearance.
# Don't complain, grumble, murmur or whine.
# Don't seek or expect pity or praise.
# Don't compare yourself with anyone.
# Don't judge anyone for anything.
# Don't try to convince anyone of anything.
# Don't defend or justify yourself.
# Be defined and bound by God, not people.
# Accept criticism gracefully and test it carefully.
# Give advice only when asked or when it is your duty.
# Do nothing for people that they can and should do for themselves.
# Have a daily schedule of activities, avoiding whim and caprice.
# Be merciful with yourself and others.
# Have no expectations except to be fiercely tempted to your last breath.
# Focus exclusively on God and light, and never on darkness, temptation and sin.
# Endure the trial of yourself and your faults serenely, under God's mercy.
# When you fall, get up immediately and start over.
# Get help when you need it, without fear or shame.
<<<
<<<
I used to be a fragile worshiper.
I'd go to church and there would always be something that set me off. Sometimes it would be a song lyric that I found theologically problematic or overly sentimental. Sometimes it was something someone said from the stage. And a lot of the time it would be getting upset about something I wished we'd do differently. "I wish we would do it this way instead of that way," I'd often remark.
The littlest thing would get me disgruntled and annoyed. Worship had to be perfect. Any theological slip ups and I'd pounce. I had to agree with and like everything. Start to finish.
Perhaps you've been a fragile worshiper, and maybe still are. Are you overly sensitive to and emotionally triggered by anything that is said or sung in church that you don't like or agree with?
Over the years I've worked hard to become less brittle in worship, more tolerant of song lyrics or shared thoughts I don't really like or agree with. I got fed up with the vanity and entitlement of being a fragile worshiper, fatigued by the narcissism of making myself the measure of all things theological and liturgical.
Yes, any given Sunday there is a bunch of stuff I which I wish wasn't said or sung. But I'm filled with a lot more grace about it all.
I've given up being a fragile worshiper.
<<<
Source: http://experimentaltheology.blogspot.com/2016/03/fragile-worshipers.html
(Functional Requirements for Bibliographic Records)
This defines WEMI, which is
* Work
* Expression
* Manifestation
* Item
Work and expression are the fuzzy ones, and would likely be grouped in the BAHKP.
Manifestation is what you would call an 'edition' for a book.
Item is a specific individual copy.
For a movie, the work (Die Hard) would have a manifestation (Blu-Ray Special Edition), and the item would be the copy sitting on your shelf.
Some metadata inherents, augmenting down the chain. Other metadata is specific to a particular manifestation, like the theater experience of a movie vs. the home experience.
Source: [[http://everybodyslibraries.com/2010/09/17/the-concept-of-a-work-in-the-catalog-web/]]
<<<
The Hebrew prophets are in a category of their own. Within the canonical, sacred scriptures of other world religions you don't find major texts that are largely critical of that religion. The Hebrew prophets were free to love their tradition and to criticize it at the same time, which is a very rare art form. Even today, one of the most common judgments I hear from other priests is, "You criticize the Church." But criticizing the Church, as such, is just being faithful to the pattern set by the prophets and Jesus. That's exactly what they did (see Matthew 23). The only question is whether one does it in a negative way or in a way that is faithful to God. I pray that I am doing the second. You pray too!
The presumption for anyone with a dualistic mind is that if you criticize something, you don't love it. Wise people like the prophets would say the opposite. The Church's sanctification of the status quo reveals that we have not been formed by the prophets, who were radical precisely because they were traditionalists. Institutions always want loyalists and "company men"; we don't want prophets. We don't want people who point out our shadow side or our dark side. It is no accident that the prophets and the priests are usually in opposition to one another (e.g., Amos 5:21-6:7, 7:10-17). I think it is fair to say that the prophetic charism was repressed in almost all of Catholic, Orthodox, and Protestant Christianity. None of us have been known for criticizing ourselves. We only criticize one another, sinners, and heretics--who were always elsewhere! Yet, Paul says the prophetic gift is the second most important charism for the building up of the Gospel (1 Corinthians 12:28, Ephesians 4:11).
Human consciousness does not emerge at any depth except through struggling with your shadow. I wish someone had told me that when I was young. It is in facing your conflicts, criticisms, and contradictions that you grow up. You actually need to have some problems, enemies, and faults! You will remain largely unconscious as a human being until issues come into your life that you cannot fix or control and something challenges you at your present level of development, forcing you to expand and deepen. It is in the struggle with our shadow self, with failure, or with wounding, that we break into higher levels of consciousness. I doubt whether there is any other way. People who refine this consciousness to a high spiritual state, who learn to name and live with paradoxes, are the people I would call prophetic speakers. We must refine and develop this gift.
<<< Richard Rohr, [[adapted from Way of the Prophet|http://myemail.constantcontact.com/Richard-Rohr-s-Meditation--Self-Critical-Thinking.html?soid=1103098668616&aid=rnft6vyUO0Q]] (no longer available)
STUB: add the Facebook OPen Graph, too
Google's semantic web project, similar project.
They've inevitably abandoned the open and ostensibly human (but in practice developer) readable part of the project:
https://groups.google.com/forum/#!msg/freebase-discuss/s_BPoL92edc/Y585r7_2E1YJ
They'll close down the open part and keep the closed Google Knowledge Graph to enhance search results in a black-box big data way.
Turns Freebase into industry-standard RDF (soon to be irrelevant because of the shutdown):
http://basekb.com/
To make an early exit without saying good-bye
"Cinderella made a French exit from the ball."
"What's the difference between a Jew and a Frenchman? A Frenchman leaves without saying goodbye, and a Jew says goodbye and never leaves." - Mel Brooks
[img[http://i.imgur.com/beJrVkX.jpg]]
Kahlo’s leg was amputated in 1953. She designed this prosthetic leg with embroidered red lace-up boots and a bell attached
<<<
All morning on the following day they sailed in fairly shallow water and the bottom was weedy. Just before midday Lucy saw a large shoal of fishes grazing on the weed. They were all eating steadily and all moving in the same direction. “Just like a flock of sheep,” thought Lucy. Suddenly she saw a little Sea Girl of about her own age in the middle of them—a quiet, lonely-looking girl with a sort of crook in her hand. Lucy felt sure that this girl must be a shepherdess—or perhaps a fish-herdess—and that the shoal was really a flock at pasture. Both the fishes and the girl were quite close to the surface. And just as the girl, gliding in the shallow water, and Lucy, leaning over the bulwark, came opposite to one another, the girl looked up and stared straight into Lucy’s face. Neither could speak to the other and in a moment the Sea Girl dropped astern. But Lucy will never forget her face. It did not look frightened or angry like those of the other Sea People. Lucy had liked that girl and she felt certain the girl had liked her. In that one moment they had somehow become friends. There does not seem to be much chance of their meeting again in that world or any other. But if ever they do they will rush together with their hands held out.
<<< C.S. Lewis, from The Voyage of the Dawn Treader
<<<
"""
''From a Window''
//by Christian Wiman//
Incurable and unbelieving
in any truth but the truth of grieving,
I saw a tree inside a tree
rise kaleidoscopically
as if the leaves had livelier ghosts.
I pressed my face as close
to the pane as I could get
to watch that fitful, fluent spirit
that seemed a single being undefined
or countless beings of one mind
haul its strange cohesion
beyond the limits of my vision
over the house heavenwards.
Of course I knew those leaves were birds.
Of course that old tree stood
exactly as it had and would
(but why should it seem fuller now?)
and though a man's mind might endow
even a tree with some excess
of life to which a man seems witness,
that life is not the life of men.
And that is where the joy came in.
"""
<<<
<<<
Notice how entirely different [Christianity] is from the Gnostic and Neoplatonic thought which characterises the great Oriental religions and so often tried to infiltrate into Christianity. For the Gnostics, creation is evil, and the outflowing of the One into the Many is a disaster: the true end of the Many is to lose the derived self and be reabsorbed into the One. But for the Christian, it is not so. The derived self is the glory of the creature and the multiplicity and otherness of the universe is its joy. The true end of the creature is that it should reflect, each in its own way and to its capacity great or small, some tiny facet of the infinite variety comprised within the unity of the One….The higher the created being is, and the nearer to God, the more utterly it is itself and the more it differs from its fellow-creatures.” (Introductory Papers on Dante page 48)
“…there is a fundamental error about the Church’s attitude to the Active Life – a persistent assumption that Catholic Christianity, like any Oriental Gnosticism, despises the flesh and enjoins a complete detachment from all secular activities. Such a view is altogether heretical. No religion that centres about a Divine Incarnation can take up such an attitude as that. What the Church enjoins is quite different: namely, that all the good things of this world are to be loved because God loves them, as God loves them, for the love of God, and for no other reason. (Introductory Papers on Dante p. 113)
“The visible universe is not an illusion, nor a mere aspect of Divinity, nor identical with god (as in Pantheism), still less a ‘fall into matter’ and an evil delusion (as in the various Gnostic or Manichee cults). It is made by God, as an artist makes a work of art, and given a genuine, though contingent, real existence of its own, so that it can stand over against Him and know Him as its real Other. …From the Incarnation springs the whole doctrine of sacraments – the indwelling of the moral buy the immortal, of the material by the spiritual, the phenomenal by the real. After an analogous manner, we all bear about with us not only the immortal soul but also the glorified body in which we shall be known at the Resurrection, though now it is known only to God, or to those to whom love may reveal it. It is this that lies at the bottom of Dante’s whole Beatrician Vision: because he loved the mortal Florentine girl, it was given to him to behold her, as it were, walking the earth in her body of glory. And this is why, in the Commedia, a stress so disconcerting to the minds of those who like their religion to be very ‘spiritual’ is laid continually upon her bodily beauty. A sure mark of Catholic Christianity is the honouring of the ‘holy and glorious flesh’, and indeed of all material things, because they are sacraments and symbols of the Divine glory.” (Further Papers on Dante)
<<< Dorothy Sayers
[img[http://i.imgur.com/E05yEOJ.gif]]
See also: [[Get up, Trinity]], [[10 seconds at a time]]
//Future Moscow// was a 2012 attempt to imagine an alternate-universe Moscow with bohemian assortment of new businesses. You can view [[the original map|https://www.google.com/maps/d/edit?mid=z7ziDxzac4T0.kLQBbsk1i3oU]].
It included:
* ''Pickletown'' - mini burgers (sliders by the bag) and milkshakes in a diner-style setting that featured a large mahogany shelf with library ladder behind the bar with seemingly endless apothecary jars filled with pickled items of all kinds.
* ''The Early Owl'' - owl-themed donut place / diner. Attached museum to the arts and crafts depiction of the owl, roadside America style.
* ''The Book Thing'' - so named after the Baltimore institution. A place where people can drop off books, and take books for free. Like a media thrift store, without the store. Because everything's free. It's also a cyber-cafe, maybe.
* ''Drafthouse Cinema'' - an untitled single-screen second run movie theatre in the location of the old Micro, serving beer and pub food, with a subscription option for unlimited monthly movie viewing and a variety of genre and arthouse focused programming.
* ''Tiny Market'' - a specialty food convenience store with the deepest selection of beers in the area. A microscopic Food Co-op open 24/7.
* ''Craft Distillery'' - untitled local spirits.
* ''Casa Storm'' - Swiss Family Storminson, located in the old Stookey's Feed complex.
* ''DDR Laundromat'' - a laundromat and arcade.
* ''Gin Rickey's'' - a speakeasy-style cocktail bar, complete with 'secret entrance'.
* ''Hotel'' - a hotel with individual cabins, each designed to look like a tiny house with a distinct architectural style representing American home styles - Craftsman, Victorian, Neoclassical, Farmhouse, etc.
* ''Palouse [[Folk School]]'' - voc-tech school, probably in a rural town around Moscow.
Elusive, noir-ish vignettes directed by David Fincher. “Each one features a confident woman at the center and tells a story of how liberating it is when you are being your most authentic self. We believe everyone who watches them will identify with one or more of the characters,” says Gap’s marketing head Seth Farbman.
“When you’re dressing normal, you’re really your truest and most confident and authentic self.”
[img[http://i.imgur.com/Zq19nLR.png]]
* “Simple clothes for you to complicate”
* “Dress like no one’s watching”
* “The uniform of rebellion and conformity”
* “Let your actions speak louder than your clothes”
Vaguely reminiscent of [[normcore]], ironic (or non-ironic) embrace of nondescript clothes.
Sortof. "In the fashion world, there's a trend and a conversation around this idea that's called normcore,' I'm sort of edified in a way to see that there's a fashion trend that is more extreme but recognizes this same truth. We're not normcore, but we're seeing this same truth."
Jezebel's 'Mark Copyranter' described as "Positive Anxiety. Happy Noir. Safe Danger.Rebellious Conformity. Synthetic Authenticity. Thoughtless Ideation. Uncreative Creativity."
I loved the campaign, but it seems to have bombed for Gap.
<<<
“As early as the 17th century it was recognised that each ‘day’ in the Creation story might represent something far longer, preparing the way for the notion of geological epochs.”
<<< [[Steven Mithen|http://www.lrb.co.uk/v37/n15/steven-mithen/sharks-teeth?utm_source=newsletter&utm_medium=email&utm_campaign=3715&utm_content=usca_nonsubs&hq_e=el&hq_m=3855287&hq_l=24&hq_v=de3e02d61e]]
early fifth century, Augustine
And the allegorical interpretation is [[still earlier|http://www.newadvent.org/fathers/04124.htm]].
[img[http://i.imgur.com/vuqdjqB.png]]
<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">I would support instating a National Conversation Topic Czar if that allowed us to get rid of celebrities.</p>— Steven Kaas (@stevenkaas) <a href="https://twitter.com/stevenkaas/status/22206547821">August 26, 2010</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<<<
I would support instating a National Conversation Topic Czar if that allowed us to get rid of celebrities.
<<< Steve Kaas
[img[http://www.raptitude.com/wp-content/uploads/2015/03/prosc-graph-1-e1427750773712.png]]
There's so much of this sort of thing, but this is one of my all-time favorite productivity / life hack / GTD type articles:
[[How to Get Yourself to Do Things|http://www.raptitude.com/2015/03/how-to-get-yourself-to-do-things/]]
[img[http://i.imgur.com/beiaHsj.gif]]
See also: [[Furiosa]], [[10 seconds at a time]]
<<<
"""Your ankles make me want to party,
want to sit and beg and roll over
under a pair of riding boots with your ankles
hidden inside, sweating beneath the black tooled leather;
they make me wish it was my birthday
so I could blow out their candles, have them hung
over my shoulders like two bags
full of money. Your ankles are two monster-truck engines
but smaller and lighter and sexier
than a saucer with warm milk licking the outside edge;
they make me want to sing, make me
want to take them home and feed them pasta,
I want to punish them for being bad
and then hold them all night long and say I’m sorry, sugar, darling,
it will never happen again, not
in a million years. Your thighs make me quiet. Make me want to be
hurled into the air like a cannonball
and pulled down again like someone being pulled into a van.
Your thighs are two boats burned out
of redwood trees. I want to go sailing. Your thighs, the long breath of them
under the blue denim of your high-end jeans,
could starve me to death, could make me cry and cry.
Your ass is a shopping mall at Christmas,
a holy place, a hill I fell in love with once
when I was falling in love with hills.
Your ass is a string quartet,
the northern lights tucked tightly into bed
between a high-count-of-cotton sheets.
Your back is the back of a river full of fish;
I have my tackle and tackle box. You only have to say the word.
Your back, a letter I have been writing for fifteen years, a smooth stone,
a moan someone makes when his hair is pulled, your back
like a warm tongue at rest, a tongue with a tab of acid on top; your spine
is an alphabet, a ladder of celestial proportions.
When I place my fingers along it there isn’t an instrument in the world
I’d rather be playing. It’s a map of the world, a time line,
I am navigating the North and South of it.
Your armpits are beehives, they make me want
to spin wool, want to pour a glass of whiskey, your armpits dripping their honey,
their heat, their inexhaustible love-making dark.
Your arms are the arms of nations, they hail me like a cab.
I am bright yellow for them.
I am always thinking about them,
resting at your side or high in the air when I’m pulling off your shirt. Your arms
of blue and ice with the blood running
through them. Close enough to your shoulders
to make them believe in God. Your shoulders
make me want to raise an arm and burn down the Capitol. They sing
to each other underneath your turquoise slope-neck blouse.
Each is a separate bowl of rice
steaming and covered in soy sauce. Your neck
is a skyscraper of erotic adult videos, a swan and a ballet
and a throaty elevator
made of light. Your neck
is a scrim of wet silk that guides the dead into the hours of Heaven.
It makes me want to die, your mouth, which is the mouth of everything
worth saying. It’s abalone and coral reef. Your mouth,
which opens like the legs of astronauts
who disconnect their safety lines and ride their stars into the billion and one
voting districts of the Milky Way.
Darling, you’re my President; I want to get this right!"""
<<<
<<<
''Gilding the Lily''
by Lisa Ampleman
To keep anxiety at bay, my friend called chemo //dragonfly love//. Those insects — christened, in places, the devil’s darning needles — hover as they contort their joined bodies into a heart, the male with pincers. Finger cutter, horse killer, ear stick, eye pisser. //Look closely at the eyes of a female darner and you may well see dark puncture marks.// As a slow drip through an IV. As a pill. Through a port into a vein. She called nausea //erotica//. Just the same, we name our storms to lessen them —
not a tropical cyclone, but //Arabella//, with ballet shoes and bun. Tumors, too, were //friends//, waiting at the bus stop with backpacks in the morning. Cindy French braids Carrie’s hair, yanking at the scalp to form the tight crisscross. Not hair loss, but //deep conditioning//. She gave us the new lexicon on stationery embossed with a red rose speckled by raindrops. The stem still had its thorns. Ring-around-the-rosy, red rover, red rover, send her right over. She called death //the world of 10,000 things//: the dragon courting its damsel, catheter tubing in the wastebin, video of a toddler biting his brother, pas de deux, full-
sugar ice cream, Crimson Queen, Trumpeter, Red Knockout, Tuscany Superb ... I knew her as Rose Shapiro. At the funeral I learned she was born //Passalacqua//: to cross the river, to pass a glass of water.
<<<
[img[http://i.imgur.com/UoUkEOF.jpg]]
from the //New Yorker//
<<<
Given current idols, it's far safer for thoughtful, Jesus-loving Christians to eat at ~McDonalds than the Food Coop. But all food is clean.
<<< Toby Sumpter, [[1/22/2013|https://twitter.com/TJSumpter/status/294238817156751360]]
Ehhh, don't think this is that helpful. If anything it should be easier to avoid the 'idolatry' that comes with the whole foods movement because it has transparently ideological baggage. Fast food is no less culturally loaded, but it's been around long enough that it has become part of the cultural fabric - it's unexamined.
<<<
The desire to do something big and, when that’s successful to go on to something else even bigger is like the little boy who’s blowing up a balloon and all of a sudden it goes Boom! right in his face. I never reason that way. I might say to myself, “Psycho will be a nice little picture to do.” I never think, “I’m going to shoot a picture that will bring in fifteen million dollars”: that idea never enters into my mind.
<<< Alfred Hitchcock
<<<
God draws straight with crooked lines.
<<< credited to Father Andrew Greeley, likely proverbial
Also the theme of a wonderful David Byrne song:
<<<
You might think you are lost, but then you will find /
That god draws straight, but with crooked lines
<<< David Byrne (with Fatboy Slim), 'God Draws Straight'
https://www.youtube.com/watch?v=QzCoh5SuDUU
<<<
Success consists of going from failure to failure without loss of enthusiasm.
<<< Winston Churchill
<<<
“Insure that you experience this journey as thoroughly as possible,” the unctuous voice urges at the start. What follows confirms the general rule that whenever anything artistic is described as a “journey,” you can be pretty certain of going nowhere.
<<< Peter Schjeldahl, on the ~MoMA's Björk show
<<<
"""
''Good Bones''
Maggie Smith
Life is short, though I keep this from my children.
Life is short, and I’ve shortened mine
in a thousand delicious, ill-advised ways,
a thousand deliciously ill-advised ways
I’ll keep from my children. The world is at least
fifty percent terrible, and that’s a conservative
estimate, though I keep this from my children.
For every bird there is a stone thrown at a bird.
For every loved child, a child broken, bagged,
sunk in a lake. Life is short and the world
is at least half terrible, and for every kind
stranger, there is one who would break you,
though I keep this from my children. I am trying
to sell them the world. Any decent realtor,
walking you through a real shithole, chirps on
about good bones: This place could be beautiful,
right? You could make this place beautiful.
"""
<<<
<<<
Because we can, in this world, achieve so little, and so little perfectly, we are prepared to pay good money in order to acquire a vicarious sensation of achievement. The detective novelist knows this, and so do the setters of puzzles.
<<< Dorothy Sayers, from the essay Problem Picture
Gamification, etc.
<<<
There has been some remarkably graceful commentary for the mother of the boy who fell into the gorilla pit. We are telling stories about losing our kids in the grocery store or about that time they unbuckled their own car seats. But I want us to go a little deeper than even that. We should not see articles criticizing this woman and think, “There but for the Grace of God go I.” We should see her image and think, “Hey! Look! There I am!”
Because our kids are always falling into gorilla pits. There may not be a camera there. And people may not be internet shaming you. But every single day mothers (and fathers) make terrible parenting decisions that have the potential for dire consequences.
...
Life is full of gorilla pit failures. But we live in a culture that is only interested in talking about failure if there is a perceived victory to absolve the mistake.
<<<
Jacob Smith (also of Mbird), “We are all three days away from being tabloid news. And most of us are on day two.”
http://www.mbird.com/2016/06/you-are-one-day-away-from-being-tabloid-news-why-we-are-all-the-gorilla-pit-mom/
[img[http://i.imgur.com/csjLsGx.jpg]]
The original newspaper caption:
<<<
"GRATE," BUT IS IT ART? is an example of candid humor where the photographer does not intrude or control the situation. This picture was taken several years ago by staff photographer Herb Slodounik in the San Francisco Museum of Art Shot with a Rolleiflex 2.
<<<
<<<
I told Miyazaki I love the “gratuitous motion” in his films; instead of every movement being dictated by the story, sometimes people will just sit for a moment, or they will sigh, or look in a running stream, or do something extra, not to advance the story but only to give the sense of time and place and who they are.
“We have a word for that in Japanese,” he said. “It’s called ma. Emptiness. It’s there intentionally.”
Is that like the “pillow words” that separate phrases in Japanese poetry?
“I don’t think it’s like the pillow word.” He clapped his hands three or four times. “The time in between my clapping is ma. If you just have non-stop action with no breathing space at all, it’s just busyness, But if you take a moment, then the tension building in the film can grow into a wider dimension. If you just have constant tension at 80 degrees all the time you just get numb.”
Which helps explain why Miyazaki’s films are more absorbing and involving than the frantic cheerful action in a lot of American animation. I asked him to explain that a little more.
“The people who make the movies are scared of silence, so they want to paper and plaster it over,” he said. “They’re worried that the audience will get bored. They might go up and get some popcorn.
But just because it’s 80 percent intense all the time doesn’t mean the kids are going to bless you with their concentration. What really matters is the underlying emotions–that you never let go of those.
What my friends and I have been trying to do since the 1970’s is to try and quiet things down a little bit; don’t just bombard them with noise and distraction. And to follow the path of children’s emotions and feelings as we make a film. If you stay true to joy and astonishment and empathy you don’t have to have violence and you don’t have to have action. They’ll follow you. This is our principle.”
<<< (Source: [[rogerebert.com|http://www.rogerebert.com/interviews/hayao-miyazaki-interview]])
<<<
The trick of enjoying New York is not to be so busy grinding your way to the center of the earth that you fail to notice the sparkle of the place, a scale and a kind of wonder that puts all human endeavors in their proper place.
<<< David Carr, The Night of the Gun
<<<
[In America] the general average of intelligence, of knowledge, of competence, of integrity of self-respect, of honor is so low that any man who knows his trade, does not fear ghosts, has read fifty good books, and practices the common decencies stands out as brilliantly as a wart on a bald head, and is thrown willy-nilly into a meager and exclusive aristocracy.
<<<
<<<
Nowhere else in the world is superiority more easily attained or more eagerly admitted [than in America]. The chief business of the nation, as a nation, is the setting up of heroes, mainly bogus.
<<<
<<<
The most conspicuous and respected American in nearly every field of endeavor, saving only the purely commercial (I exclude even the financial), is a man who would attract little attention in any other country. The leading American critic of literature, after twenty years of diligent exposition of his ideas, has yet to make it clear what he is in favor of, and why
<<<
<<<
...the United States is essentially a commonwealth of third-rate men-- that distinction is easy here because the general level of culture, of information, of taste and judgment, of ordinary competence is so low.
<<<
I have a hard time sleeping when it rains. If I wake up in the night and I can't sleep, I know it's raining even if I otherwise have no other way of ascertaining the weather. I've never figured this out... air pressure? One day I'll puzzle through it.
<<<
I am so much more happy hanging out than I am actually writing. I’ll do anything not to write. My wife and I go through this multi-hour ritual in the morning, it’s called warming up, a.k.a. going online and looking at shoes and rare books, and, “You know, I never answered this email this guy sent me from 2011, he’s probably wondering, I’d better answer it now.” It’s so hard to get to the place of writing, because when you start writing, it’s like you leave your own body and have to inhabit these characters. I always say it’s like levitation. It’s worse than jogging. It feels so excruciating before you do it, and you’re thinking about it, and you’re thinking about it, you’re thinking about it, and all of a sudden you start doing it, and you go, “Oh.” I always use the example of people who jog and hate to jog, so they’ll mess around for four hours getting new sneaker laces, and stretching, and, “Wait, I want to watch this thing on ESPN, maybe it will inspire me.” You go out, and you jog for a half hour, and then you are done; but you spent four hours getting to the half hour of the jog. After a certain number of years, you just accept [that] that’s who you are and that’s how I roll, and once I get started, I’m in.
<<< [[David Simon interviews Richard Price|https://www.guernicamag.com/interviews/the-cousins-karamazov/]]
<<<
I think we’re creative all day long. We have to have an appointment to have that work out on the page. Because the creative part of us gets tired of waiting, or just gets tired.
<<< Mary Oliver, from [[this interview|http://onbeing.org/program/mary-oliver-listening-to-the-world/7267]]
David Byrne on Tibor Kalman (who designed a number of album covers for Byrne, including Remain in Light):
<<<
Tibor and company don’t have a signature style, and that is a worthy ambition in life…. Having a recognizable style relegates you to the status of quotable icon. And while being an icon is flattering, I imagine, once it happens, you become irrelevent.
My own ambition is to write a song that sounds like I stole it—like “I” didn’t write it, but it has always been there. To get the “I” out of the song is the ultimate compositional coup, whether in music or design.
<<<
<<<
Jesus lived this new creation out in his table fellowship with those whom the religious establishment had branded outcasts, sinners, renegades: the enemies of God. He did not wait for them to repent, become respectable, and do works of restitution in hopes of gaining divine forgiveness and human restoration. Instead, he audaciously burst upon these sinners with the declaration that their sins had been forgiven, prior to their repentance, prior to their having done any acts of restitution or reconciliation. Everything is reversed: you are forgiven; now you can repent! God loves you; now you can lift your eyes to God! The enmity is over. You were enemies and yet God accepts you! There is nothing you must do to earn this. You need only accept it. (Jesus’ understanding is scarcely reflected in most Christian worship services, which make forgiveness conditional on repentance.)
<<< Walter Wink, The Powers That Be
<<<
If a man who is in love is asked what gives his beloved such unique value for him over all other persons, he can only answer: “She is the fulfillment of all my dreams.” If the questioner has undergone any similar experience, the subjectivity of this answer causes no offense because the lover makes no claim that others should feel the same. He not only admits that “she is beautiful” means “she is beautiful for me but not necessarily for you” but glories in this admission.
If a man who professes himself a Christian is asked why he believes Jesus to be the Christ, his position is much more difficult, since he cannot believe this without meaning that all who believe otherwise are in error, yet at the same time he can give a no more objective answer than the lover: “I believe because He fulfills none of my dreams, because He is in every respect the opposite of what He would be if I could have made Him in my own image.”
Thus, if a Christian is asked: “Why Jesus and not Socrates or Buddha or Confucious or Mahomet?” perhaps all he can say is: “None of the others arouse all sides of my being to cry ‘Crucify Him’.”
<<< W.H. Auden, writing in The Chimera summer 1943
<<<
Peter Molyneux has no credit with me - he must always pay in advance, cash only.
<<< Tycho from Penny-Arcade
<<<
He was so bitter with his tongue because his heart believed so much.
<<< Thomas Wolfe
<<<
Blessed is he who has found his work.
<<< Vincent van Gogh
I had a third example, but now I can't remember it. A character in a novel loses their mojo, their driving purpose. They meet a character who subjects them to some intense BDSM, and it gets them back on track.
* Terry Goodkind's Sword of Truth series, the objectivist [[messterpiece]] has an extensive sequence in the first book
* Y: The Last Man's protagonist as part of a staged suicide intervention
[img[http://www.babynamewizard.com/sites/default/files/Ty-Hardin-Tab-Hunter-Guy-Madison-Rock-Hudson-Composite.jpg]]
Most famous: Troy Donahue, Chad Everett, Rock Hudson, Clint Walker and Tab Hunter
Lesser-known:
* Rad Fulton
* Cal Bolder
* Rand Saxon
* Race Gentry
* Chance Nesbitt
* Dack Rambo
* Van Williams
* Dare Harris
* Trax Colton
Inspired-by:
* Scott
* Dirk
* Dean
* Tad
* Lance
MST3K also made up names for lead character Dave Ryder from the movie 'Space Mutiny': http://mst3k.wikia.com/wiki/List_of_Nicknames_for_Dave_Ryder
Sources: http://www.babynamewizard.com/archives/2015/10/how-one-man-launched-a-generation-of-baby-names
<<<
If something cannot go on forever, it will stop.
<<< Herbert Stein, What I Think: Essays on Economics, Politics, & Life
I don't know that this is actual the case. Maybe in the light of eternity?
Americans like to think we've achieved a classless society, so we don't talk about class unless we're talking about the extremely rich (the 1%).
But the poor and middle classes operate by hidden 'rules', patterns of thought, social interaction, cognitive strategies, &cet.
But hidden rules also govern life in ethnic groups, subcultures, any group of people.
[[middle class vs. poverty]]
<<<
When someone tells me that they respect my Catholicism and my “right to believe what I want,” or that, while not agreeing with me, they celebrate the diverse viewpoint my “cherished religious convictions” bring to the community — this usually indicates that they have stripped, reduced, and re-fashioned me into an image they can bear.
...
But I would be highly tempted to wrap the other up in a big, fat Apostolic hug — his insult would meet me in my otherness. It would take me as Catholic. It would negatively affirm the difference I claim as my own.
<<< Bad Catholic, [[Please Don't Respect My Beliefs|http://www.patheos.com/blogs/badcatholic/2015/12/please-dont-respect-my-beliefs.html]]
[img[https://s-media-cache-ak0.pinimg.com/736x/cc/33/64/cc33645b58c3050bc4471dcb7fb953b0.jpg]]
"Now I deserve what I get for searching for wisdom among memes. This bold, respectful joke sums up our popular, symbolic understanding of equality: You are all worthy of respect, insofar as you are reduced to a common denominator."
<<<
But I often admire the way Tim is wrong more than the way some of my friends seem to handle being right. In other words, I admire his martial spirit. Real men fight for what they believe in. But lots of guys get criticized or misunderstood and get all whiny and moody. They resent the fight. They resent the fact that somebody has misunderstood them, that they have to punch back. But God made men to fight, to punch back, and yes, that can be done sinfully, but many men use this pseudo-piety to cover their cowardice and laziness. I think it’s high time we had more gentlemen in the field, men with backbones and conviction and grace. We could use more men with as much chutzpa as Tim.
<<< Toby Sumpter, [[In Defense of Lent, Masculinity, and Tim Bayly|http://www.tobyjsumpter.com/in-defense-of-lent-masculinity-and-tim-bayly/]]
A [[site|http://historytag.com/]] that allows you to tag an individual item, for instance a pair of jeans. You can see pictures of it during its manufacture, then take pictures that attach an ownership history to it.
This reminds me of the catch-and-release free book exchange site - ~BookCrossing. A site I joined in 2002!
People might want to see the source of their products, but how much of an incentive is there for people to track things once they are out in the wild? Perhaps if such tracking was passive and 'opt-in', with a combination of image recognition services and always-on cameras? Or RFID chips?
Or things that are designed to be communal, tool lending libraries where each tool has the 'DNA' of all its past projects. Users of the library can choose to make their activity public or anonymous, but it's included on the tool regardless of whether user is attached.
<<<
"""''HOME BIRTH''
by Carolyn Jess-Cooke
They said she was stuck
as though she was a nine-pound human fork
pronged in the dishwasher,
an umbrella that wouldn’t fold to size.
I pushed until I thought I’d turn inside out
and yet she sat in my cervix for hours,
as the contractions collapsed on me
like skyscrapers,
as they talked about the knife.
Second time round, the sour sensation
of complete idiocy
for willing this pain again, going through it,
risking so much for someone
who remained at the fringes of knowing,
ghosted by awful wisdom
that birth isn’t the end of it, nor the worst –
episiotomy; infections; afterpains; breastfeeding.
But my body remembered,
it took the first shunt of his head, yawned, then
toboganned him out in a gush of brine,
red as a crab. I remember his arms
like socks full of eggs, muscular, fists bunched,
as though he’d been prepared to fight.
"""
<<<
<<<
A fourth consequence is that we should fight tooth and nail, not for mere employment, but for the quality of the work that we had to do. We should clamor to be engaged on work that was worth doing, and in which we can take pride.
The worker would demand that the stuff he helped to turn out should be good stuff….
There would be protests and strikes — not only about pay and conditions, but about the quality of the work demanded and the honesty, beauty, and usefulness of the goods produced. The greatest insult which a commercial age has offered to the worker has been to rob him of all interest in the end-product of the work and to force him to dedicate his life to making badly things which were not worth making.
<<< Dorothy Sayers, "Why Work?"
http://www.faith-at-work.net/docs/whywork.pdf
<<<
The kind of hope I often think about (especially in hopeless situations like prison or the sewer) is, I believe, a state of mind, not a state of the world. Either we have hope within us or we don't. Hope is not a prognostication — it's an orientation of the spirit. Each of us must find real, fundamental hope within himself. You can't delegate that to anyone else.
Hope in this deep and powerful sense is not the same as joy when things are going well, or willingness to invest in enterprises that are obviously headed for early success, but rather an ability to work for something to succeed. Hope is definitely not the same thing as optimism. It's not the conviction that something will turn out well, but the certainty that something makes sense, regardless of how it turns out.
<<< Vaclav Havel
http://www.esquire.com/news-politics/news/a12135/vaclav-havel-hope-6619552/
[img[http://i.imgur.com/LHK1Amu.jpg]]
<<<
By the time Dillard decided to write Pilgrim, she had filled dozens of journals with passages from what she had been reading, anecdotes from her walks, facts about natural history, and dreams about luna moths mating. She had started writing in journals to help her quit smoking, but by the time she was writing in her second spiral notebook, she’d realized writing down her thoughts gave her physical access to the contents of her mind, as if everything she had ever read were fresh in her mind.
She decided to use her journals to write the book and set about copying what she thought was most interesting onto notecards. She ended up with a 17-inch box filled with 1,100 notecards that she shuffled and reshuffled, trying to divide the anecdotes, facts, quotes, and ideas into chapters.
The glee of coming up with the idea for the book soon gave way to the struggle of putting the book together. She asked in one notebook, “What the hell am I going to do with these notecards?” Pages later, she wrote, “I am going nuts over this book. What kind of book is it?”
<<< Diana Saverin, [[The Thoreau of the Suburbs|http://www.theatlantic.com/features/archive/2015/02/the-thoreau-of-the-suburbs/385128/]]
<<<
How much larger your life would be if your self could become smaller in it.
<<< G.K. Chesterton
<<<
"Tell me how much you know of the sufferings of your fellowmen and I will tell you how much you have loved them.”
<<< Helmut Thielicke
https://li.st/ajesster/how-my-friends-described-some-colors-to-me-when-i-couldn-t-see-2S35UflTxaoovQ0DaihhgD
<<<
It begins to be asked on many sides how the possessors of the land became possessed of it.
<<< John Ruskin
<<<
However, one group of employees were encouraged to create plans by writing down where, when, and how they would complete these unfinished tasks. Dr Smit found that they detached themselves from work more effectively than employees who did not create plans.
Dr Smit said: "If you have an important deadline looming on the horizon, for example, your brain will keep nudging you with reminders, which makes it difficult to get a break from work demands. It seems like we have the ability to 'turn off', or at least 'turn down', these cognitive processes by planning out where, when, and how goals will be accomplished.
"This is primarily true for people that already have a difficult time forgetting about work during leisure because their job plays a central role in their life. For them, a simple change to their work routine like task planning near the end of the workday would likely make a real difference."
<<< http://www.sciencedaily.com/releases/2015/11/151112055502.htm
Yes, it's from Science Daily. But it feel anecdotally true, too.
<<<
1. Writhe. If you writhe hard enough, and sinuously enough, the compliments will fall off of your body like water from a duck’s back, and you won’t have to deal with the strange, clinging feeling of them on your shoulders.
2. Carefully take off your skin and hand it to the compliment-giver. It’s their problem now.
3. Hiss softly until you have equalized your internal pressure.
4. If you know how to do backflips, do so many of them that whoever is trying to compliment you can no longer see you against the horizon.
5. Take the compliment to your Alchemy Dungeon and transmute it into something negative about yourself.
6. YOU’RE WRONG, YOU’RE WRONG, YOU’RE WRONG, YOU’RE WRONG, YOU’RE WRONG, YOU DON’T KNOW ME AT ALL AND YOU’RE WRONG
7. Pull out your fingernails and hurl them at the complimenter, screaming “IS THIS WHAT YOU WANTED? ARE YOU HAPPY NOW? IS THIS A FAIR EXCHANGE?”
8. Carefully wrap yourself around the leg of whoever praised you like a frightened cat, and force them to drag you around with them wherever they go for the rest of their natural life.
9. Find out what they’re trying to hide by saying nice things at you. Expose them.
10. Throw your entire throat into a river so that no one can ever talk to you again.
11. Downplay the compliment. Play it so far down you can pick it wriggling in your fingers and crush it under your thumb. Grind your knuckles into it, then blow the dust in your would-be admirer’s face.
12. Take to the sea.
13. CHOKE on the words “THANK YOU” so that you DIE and it’s ALL THEIR FAULT and if ONLY THEY HAD HONORED THE SOCIAL COMPACT by NEVER MENTIONING ANYTHING YOU DID WELL EVER, you would be alive today, and now you’re not, and they’ll never do it again.
<<< published in [[The Toast|http://the-toast.net/2015/05/14/how-to-accept-compliments-and-handle-praise/]]
<<<
Once you become an empire, once you become a brand, people will gather around you and tell you that you’re a fucking genius. And your brand becomes the ship that slowly sails away from you. All of the sudden, you believe you are your brand. You believe that you’re supposed to speak in sound bites. I see that as an incredible danger. The thing is: being good on TV requires kind of boiling yourself down, right? Being a kind of advertisement for yourself. A walking advertisement for yourself. I know that I can never be that effectively, and that’s kind of a bummer, because there are times where it would be convenient to be that, so I shouldn’t even fear it. I just know now: I don’t give a shit if I succeed or fail or what I do next, I just want to do things that are strange and not soundbite-y. I don’t want to be polished. I want to be such a wreck that no one will say ‘let’s put her on her own talk show.’
<<< Heather Havrilesky, writer of Ask Polly, and the forthcoming, How To Be A Person In The World
[[Link to the full book|http://mediadownload.radiantwebtools.com/communitychristianministries/Articles/Bitterness2010.pdf]]
<<<
The real way of mending a man's taste is not to denigrate his present favorites but to teach him how to enjoy something better.
<<< C.S. Lewis
<<<
Online, moralizing is part of the scrum of communities attempting to define and protect their values; it’s worst on Twitter because that’s where communities are allowed no distinct spaces but are instead mixed like armies on a battlefield; they have no choice but to fight. Nevertheless, it’s been amazing to me to see how ubiquitous sanctimony has become, how social our moralizing has become, how relentless our politicization and judgment.
[…]
There is no self-flattery like privileging your own moral conceptions over those of others, because moral elevation is something we all seek. Humans in general like to know that they are “good,” especially in the sense of being “in good standing” with their community; there is no cheaper and easier way to accomplish this than by othering, which is why humans do it. Narratives that make othering easier will always be popular online. And the more “intellectual” they seem, the better.
<<< Mills Baker, [[Pop Sanctimony|http://metaismurder.com/post/111794457021/pop-sanctimony]]
<<<
//Q3. So many historically Christian colleges have been apostate longer than they were faithful, and more are faltering. How will New St. Andrews maintain its faithfulness?//
Unlike so many formerly or nominally Reformed and Presbyterian colleges today, New St. Andrews refuses to bow the knee before the idols of our age: feminism, multiculturalism, liberalism, statism, and postmodernism. The College’s trustees, administrators, faculty, and staff have an unwavering commitment—pledged in writing annually—to the historic Reformed faith and biblical worldview. The College concentrates its attention and energies on faithful Christian scholarship and Christian enculturation, not on coveting the world’s respect or elevating athletics to a collegiate priority. The College refuses to build dormitories that encourage spiritual immaturity and remove students from familial accountability. Instead, the College encourages students to live with Christian families or to share rooms with other Christians in the local community under the spiritual oversight of the local church. The College accepts no state or federal funds because we refuse to compromise our Christian testimony or to waffle on biblical principles by receiving any state or federal government funding or benefits. That also helps keep our costs considerably lower than most private colleges.
<<< New Saint Andrews website, June 2003
I find this really intriguing - to what extent can you 'ensure' institutional faithfulness? How much is institutional faithfulness the product of institutional structure?
For someone who spends so much time attempting to build lasting institutions, I'm skeptical about this pursuit. Something about old wineskins - perhaps each institution, no matter how wonderful, has a limited lifespan and is destined to die just like every person.
<<<
I respect the modest vision of “humane localism” cast by [Mark] Mitchell. “In short,” he writes, “humane localism is rooted in respect, not in homogeneity; in love of one’s place, not hatred of other places; and in the realization that human flourishing is best realized in the company of friends and neighbors sharing a common place in the world.”
So how do you share that place? No one life-change can guarantee it, because sin follows us wherever we move. But you can make some simple adjustments. Move into a house with a front porch. Resist the urge to retreat in front of the tv. Invite your neighbors to dinner. Volunteer in your church and another organization dedicated to civic well-being. Limit your commute time. Avoid activities that require you to shuttle your kids across the city each day. Settle somewhere people have known you across various stages of life, maybe even somewhere they knew your parents or grandparents. Make regular errands where you see familiar faces. Seek unpaid adult involvement—whether family or friends—in your children’s lives. Weigh the economic advantages of taking a new job against the human cost of upheaval to your church, school, and family life. Stay put if at all possible. And if God calls you to go, make a home of this new place by following this same time-tested wisdom wherever you can.
This lifestyle probably won’t make you famous, but it just might make people want to attend your funeral.
<<< Collin Hansen, [[Why Place Matters|http://www.booksandculture.com/articles/2014/novdec/why-place-matters.html?paging=off]]
[[The whole thing|https://sanseverything.wordpress.com/2015/09/05/tidiness-the-state-and-us/]]
<<<
The Martin Luther King I had imagined before reading the biography was a man of strong, unbending convictions — a towering, convincing, comported person, a born leader who was ready to die for his cause.
The Martin Luther King I came to know from the biography was a complicated man in his personal and external life. He felt thrown into a story he was both dedicated to and often conflicted about. He despaired often. He sometimes questioned the reasonableness of his non-violent approach in the face of opposition. He felt a strong sense of responsibility, if not guilt, for the lives that had been lost to the struggle. His personal life and habits were also not what one might associate with the stereotypical preacher, especially one whose rhetoric drew so strongly from his spirituality.
<<< Ebele Mogo, [[Not Perfect, But Heroic: Humanizing Our Heroes|http://www.onbeing.org/blog/not-perfect-but-heroic-humanizing-our-heroes/7262]]
The whole thing is worth a read.
Caterina Fake (flickr.com), epic shaper of the web.
Decision tree graph prediction engine thing.
You answered yes/no or multiple-choice questions, and based on the collection of answers it predicted what your preferences would be. Worked rather well, struggled to find a business model as a shopping aid - algorithmic consumer reports or something.
Purchased by eBay, no clue if eBay does anything interesting with it. (semantic web / [[big data iceberg]])
<<<
The world is full of hundreds of beautiful things we can never possibly have time to discover, and there is no time to be unkind or envious or ungenerous, and no sense in enslaving the mind to the trivialities of the moment. For you can be equal to the greatness of life only by marching with it; not by seeking love but by giving it, nor by seeking to be understood, but by learning to understand.
<<< Vivienne de Watteville, Speak to the Earth
<<<
If someone reads this or any other book whatever not for the sake of spiritual profit but to hunt for phrases to reproach the author so that he might then set himself up in his own opinion as wiser than he, such a person will never receive any profit of any kind.
<<< Maximus the Confessor
related to C.S. Lewis's advised approach to art
It's the Choose-Your-Own-Adventure book of the internet world. It's a longread, but only if you want it to be! It could also be a very short read!
Currently just one, on the [[Moscow Project]]. Many more in the future.
<<<
I am still every age that I have been. Because I was once a child, I am always a child. Because I was once a searching adolescent, given to moods and ecstasies, these are still part of me, and always will be. This does not mean that I ought to be trapped or enclosed in any of these ages. The delayed adolescent, the childish adult, but that they are in me to be drawn on; to forget is a form of suicide. Far too many people misunderstand what putting away childish things means, and think that forgetting what it is like to think and feel and touch and smell and taste and see and hear like a three-year-old or a thirteen-year-old or a twenty-three-year-old means being grownup. When I’m with these people I, like the kids, feel that if this is what it means to be a grown-up, then I don’t ever want to be one. Instead of which, if I can retain a child’s awareness and joy, and be fifty-one, then I will really learn what it means to be grownup.
<<< Madeleine L’Engle
<<<
I could open the door or keep it shut. I chose to open. I say, 'I chose,' yet it did not seem possible to do the opposite.
<<< C.S. Lewis
I believe he's talking about conversion in this, but it refers so well to the sense I get about most major decisions in my life.
<<<
I deny that the big shop is the best shop; and I especially deny that people go there because it is the best shop...
<<< G.K. Chesterton
<<<
Any rumbling desire to turn my religion into something fashionably rebellious is an artifact of ego. It’s an attempt to make this story about me, someone who did something and then changed, ta-da—cue workout montage and triumphant final scene. On some level,I still want credit for the spiritual makeover—I was lost, but now am found, and I am the one that found me. But if I understand God’s grace correctly, the miracle of redemption is that I was found all along.
One of the most painful and reoccurring stumbling blocks in my journey is my inability to accept that I am completely whole and loved by God without doing anything. That’s accompanied by a corresponding truth: There is nothing so great I can do to make God love me more.
Because before I found God, I had an unconsciously manufactured higher power: I spent a lifetime trying to earn extra credit from some imaginary teacher, grade-grubbing under the delusion that my continuing mistakes—missed assignments, cheating, other nameless sins—were constantly held against me. And I knew in my heart that failure was inevitable.
What Christ teaches me, if I let myself be taught, is that there is only one kind of judgment that matters. I am saved not because of who I am or what I have done (or didn’t do), but simply because I have accepted the infinite grace that was always offered to me.
<<< Ana Marie Cox, [[Why I'm Coming Out as a Christian|http://www.thedailybeast.com/articles/2015/02/28/why-i-m-coming-out-as-a-christian.html]]
<<<
I don’t have a gun and I don’t have even one wife and my sentences tend to go on and on and on, with all this syntax in them. Ernest Hemingway would have died rather than have syntax. Or semicolons. I use a whole lot of half-assed semicolons; there was one of them just now; that was a semicolon after “semicolons,” and another one after “now.”
And another thing. Ernest Hemingway would have died rather than get old. And he did. He shot himself. A short sentence. Anything rather than a long sentence, a life sentence. Death sentences are short and very, very manly. Life sentences aren’t. They go on and on, all full of syntax and qualifying clauses and confusing references and getting old. And that brings up the real proof of what a mess I have made of being a man: I am not even young. Just about the time they finally started inventing women, I started getting old. And I went right on doing it. Shamelessly. I have allowed myself to get old and haven’t done one single thing about it, with a gun or anything.
<<< Ursula K. Le Guin, The Wave in the Mind
[img[http://i.imgur.com/WnQDMIw.jpg]]
<<<
I play John Wayne in every part, regardless of the character, and I’ve been doing okay, haven’t I?
<<< John Wayne
<<<
I prefer neurotic people. I like to hear rumblings beneath the surface.
<<< Stephen Sondheim
[img[http://media.giphy.com/media/yWeAjUbsx1EgU/giphy.gif]]
<<<
I swear by my life and my love of it that I will never live for another man, nor ask another man to live for me.
<<< Ayn Rand
//Yikes!//
<<<
I used to not be able to work if there were dishes in the sink. Then I had a child and now I can work if there is a corpse in the sink.
<<< Anne Lamott
<<<
I'm afraid of losing my obscurity. Genuineness only thrives in the dark. Like celery.
<<< Aldous Huxley
<<<
I’m making explorations. I don’t know where they’re going to take me…. I want to map new terrain rather than chart old landmarks… As an investigator, I have no fixed point of view, no commitment to any theory—my own or anyone else’s. As a matter of fact, I’m completely ready to junk any statement I’ve ever made about any subject if events don’t bear me out, or if I discover it isn’t contributing to an understanding of the problem. The better part of my work on media is actually somewhat like a safe-cracker’s. I don’t know what’s inside; maybe it’s nothing. I just sit down and start to work. I grope, I listen, I test, I accept and discard; I try out different sequences–until the tumblers fall and the doors spring open.
<<< Marshall ~McLuhan on writing
[img[http://i.imgur.com/j0K6MiR.jpg]]
[img[http://i.imgur.com/pDkixHL.gif]]
Learned this at #NARTS15. This is a much lesser version of the story than the one I heard, which involved a parade:
<<<
When Christian Herter was governor of Massachusetts, he was running hard for a second term in office. One day, after a busy morning chasing votes he arrived at a church barbecue. It was late afternoon and Herter was famished. As Herter moved down the serving line, he held out his plate to the woman serving chicken. She put a piece on his plate and turned to the next person in line.
“Excuse me,” Governor Herter said, “do you mind if I have another piece of chicken?”
“Sorry,” the woman told him. “I’m supposed to give one piece of chicken to each person.”
“But I’m starved,” the governor said.
“Sorry,” the woman said again “Only one to a customer.”
Governor Herter was a modest and unassuming man, but he decided that this time he would throw a little weight around. “Do you know who I am?” he said. “I am the governor of this state.”
“Do you know who I am?” the woman said. “I’m the lady in charge of the chicken. Move along, mister.”
<<<
<<<
When I’m working on something, and right after I’ve finished it, that’s when I care about it most. I want to get it out there into the world while I still care about it. That’s when it feels most alive to me. Waiting for a publisher to schedule a work is and waiting for it to finally see print is like watching it die, or even a bit like dying myself. By the time the book is published it’s already practically dead to me, I’ve moved on to other work.
<<< James Kochalka
Comics Reporter interview: http://www.comicsreporter.com/index.php/cr_sunday_interview_james_kochalka/
<<<
The problem isn’t coming up with ideas, it is how to contain the invasion. My ideas are like uninvited guests. They don’t knock on the door; they climb in through the windows like burglars who show up in the middle of the night and make a racket in the kitchen as they raid the fridge. I don’t sit and ponder which one I should deal with first. The one to be wrestled to the floor before all others is the one coming at me with the most vehemence. I have, over the years, developed methods to deal with the invaders as quickly and efficiently as possible, though the burglars never stop coming. You invite a handful of friends for dinner, but the door bursts open and a hundred people are pushing in. You might manage to get rid of them, but from around the corner another fifty appear almost immediately… Finishing a film is like having a great weight lifted from my shoulders. It’s relief, not necessarily happiness. But you relish dealing with these “burglars.” I am glad to be rid of them after making a film or writing a book. The ideas are uninvited guests, but that doesn’t mean they aren’t welcome.
<<< Werner Herzog
<<<
8. Murder. If zygotes are people, abortion is infanticide, a very serious crime. Kevin Williamson, a correspondent for National Review, has said that women who have abortions should be hanged. That’s going pretty far. After all, if every woman who had an abortion were executed, who would raise the children? But if abortion becomes a crime, what do you think the punishment should be? I’m assuming you approve of jailing the provider, but what about the parent who makes the appointment, the man who pays, the friend who lends her car? Aren’t they accomplices? And what about the woman herself? No fair exempting her as a victim of coercion or manipulation or the culture of death. We take personal responsibility very seriously in this country. Patty Hearst went to prison despite being kidnapped, raped, locked in a closet and brainwashed into thinking her captors were her only friends. Our prisons are full of people whose obvious mental illness failed to move prosecutors or juries. Why should women who hire a fetal hit man get a pass?
This is the hardest and most reasonable question, and the place where I least expect my answer to convince. But here I think the pro-choice side of the argument, the argument for not making abortion illegal at all, rests on a belief that many pro-lifers actually share: That while abortion is killing, while it is murder, it is also associated with a situation, pregnancy, that’s unlike any other in human affairs, and as such requires a distinctive legal response. No other potential murderer has his victim inside his body, no other potential murder victim is not in some sense fully physically visible and present to his assailant and the world, no other human person presents herself (initially, in the first trimester) to her potential killer in what amounts to a pre-conscious state. And again: no other human experience is like pregnancy, period, whether or it comes expectedly or not.
These are not, in my view, strong arguments for the pro-choice view that we should license the killing of millions of unborn human beings. But I think they are strong arguments for maintaining the distinctive approach to enforcement that largely prevailed prior toRoe v. Wade, in which the law targeted abortionists and almost never prosecuted women. And I don’t think pro-lifers should be afraid to say that a pregnant woman’s decision to take a first-trimester life is simply a different kind of murder than the murder of a five-year-old, and one where the law should err on the side of mercy toward the woman herself in a way that it shouldn’t in other cases, and reserve the force of prosecution for the abortionist, the man or woman who isn’t experiencing the pregnancy, instead.
This approach is, yes, exceptional in terms of how the state treats homicide. But its “exception from the general rule seems to be justified by the wisdom of experience,” as a pre-Roe court ruling put it. And while — again — pregnancy is unique, it is not the only situation where older legal forms approached killing in distinctive ways. Suicide, for instance, was historically treated as a form of murder in many jurisdictions, but attempted suicides were hardly ever prosecuted for the attempted murder that they had committed, whereas people who assisted in suicide were more likely to be charged. And a version of that distinction survives today: Suicide itself has now been largely decriminalized but assisting a suicide is still illegal, though of course a subject of much culture-war controversy, in most U.S. states.
Could one argue that this combination is illogical — that if we don’t throw attempted suicides in jail we shouldn’t make it illegal to help them make their quietus? Certainly; this is an increasingly popular position. But I think the older position, which recognizes the reality that suicide is murder but also treats it distinctively and assigns legal culpability in a particular-to-that-distinction way, is actually the one more consonant with justice overall. And in a different-but-related way, the same is true for abortion: A just society needs to both recognize abortion as murder and grapple with its distinctives, and that’s what an effective pro-life legal regime would need to do.
<<<
From this exchange: http://douthat.blogs.nytimes.com/2015/08/25/pro-choice-questions-pro-life-answers-part-ii/?_r=0
<<<
If you can’t measure it, you can’t manage it.
<<<
Incorrectly attributed to Peter Drucker, or W. Edwards Deming. Smacks of Taylorism and big data dystopias. I've seen it so many times - I'd love to find out where it came from originally.
<<<
"""
''If I Could Tell You''
//by Wystan Hugh Auden//
Time will say nothing but I told you so,
Time only knows the price we have to pay;
If I could tell you I would let you know.
If we should weep when clowns put on their show,
If we should stumble when musicians play,
Time will say nothing but I told you so.
There are no fortunes to be told, although,
Because I love you more than I can say,
If I could tell you I would let you know.
The winds must come from somewhere when they blow,
There must be reasons why the leaves decay;
Time will say nothing but I told you so.
Perhaps the roses really want to grow,
The vision seriously intends to stay;
If I could tell you I would let you know.
Suppose all the lions get up and go,
And all the brooks and soldiers run away;
Will Time say nothing but I told you so?
If I could tell you I would let you know.
"""
<<<
<<<
They didn’t have to name the bigger game. Everyone who had been on the team for a while knew what it was called. It didn’t involve stock options. Rasala and Alsing and many of the team had long since decided that they would never see more than token rewards of a material sort. The bigger game was “pinball.” West had coined the term; all the old hands used it. “You win one game, you get to play another. You win with this machine, you get to build the next.” Pinball was what counted. It was the tacit promise that lay behind signing up, at least for some. Holberger felt that way. “I said, ‘I will do this, I want to do it. I recognize from the beginning it’s gonna be a tough job. I’ll have to work hard, and if we do a good job, we get to do it again.’”
<<< Tracy Kidder, Soul of a New Machine p. 228
<<<
If you ever find yourself in the wrong story, leave.
<<< Mo Willems, Goldilocks and the Three Dinosaurs
<<<
If you want people to bleed, you have to hemorrhage.
<<< Unknown
<<<
Wallace had his reasons for grammatical zealotry in the classroom, but it wasn’t about being Gradgrindian or prescriptive. I think Wallace is rightly understood as a moral writer – so much of his work explores what it means not just to be human, but to be a good human – but he was also an ethical one. He was always talking about a writer’s responsibilities: the responsibility to be clear, the responsibility to be interesting. Because Wallace’s work could be difficult, because he asked the reader to work, he wanted to be sure he was doing his work too, saying exactly what he intended, in a way that was compelling. Another entry from my notebook: ‘If you’re more interested in what you’re saying than the person listening to you is, you’re the definition of a boring person.’ I remember feeling like I’d been slapped with a stick.
<<< on David Foster Wallace
from: https://www.theguardian.com/books/booksblog/2016/sep/12/david-foster-wallace-my-teacher
<<<
Where attainable knowledge could have changed the issue, ignorance has the guilt of vice.
<<< A. N. Whitehead on Lk 12:48
I agree with this, to some extent:
<<<
Another thing that Imgur does, explains Alan [Schaff, who founded Imgur with his sister Sarah], is that it lets introverts become extroverts. “They don’t have to worry about curating their own personal brand,” he says of this crowd. Instead, people can go on Imgur and be themselves while connecting with others like themselves.
“Over the years, the Internet has been going down the path of becoming a more personalized experience,” Alan continues. It’s the same people around us every day, like a mirror of our life, but online, he says.
“We want to let people break outside their friends list.”
<<< from http://techcrunch.com/2015/09/22/imgur-is-the-anti-facebook/
[img[http://i.imgur.com/1krrkkd.gif]]
[img[http://i.imgur.com/6WoQXnk.jpg]]
//In Bed//
by Federico Zandomeneghi
<<<
"For in order for capitalism to work — in order for it to produce a good and a stable society—the traditional Christian virtues are essential."
<<< Antonin Scalia
<<<
"""''In the Corners of Fields ''
by Ted Kooser
Something is calling to me
from the corners of fields,
where the leftover fence wire
suns its loose coils, and stones
thrown out of the furrow
sleep in warm litters;
where the gray faces
of old No Hunting signs
mutter into the wind,
and dry horse tanks
spout fountains of sunflowers;
where a moth
flutters in from the pasture,
harried by sparrows,
and alights on a post,
so sure of its life
that it peacefully opens its wings."""
<<<
<<<
He assaulted indignant tradesmen and threw them and their belongings out of the Temple; he drove a coach-and-horses through a number of sacrosanct and hoary regulations; he cured diseases by any means that came handy, with a shocking casualness in the matter of other people’s pigs and property; he showed no proper deference for wealth or social position; when confronted with neat dialectical traps, he displayed a paradoxical humor that affronted serious-minded people, and he retorted by asking disagreeably searching questions that could not be answered by rule of thumb. He was emphatically not a dull man in his human lifetime, and if he was God, there can be nothing dull about God either. But he had “a daily beauty in his life that made us ugly,” and officialdom felt that the established order of things would be more secure without him. So they did away with God in the name of peace and quietness.
<<<
'daily beauty in his life' is from Othello 5.1
They pull content from other places and present it in a responsive way.
They also seem to, in their own way, return us to the comprehensible information / hypertext web instead of the terrifying webapp web.
http://blog.intercom.io/why-cards-are-the-future-of-the-web/
http://www.subtraction.com/2014/08/26/what-is-a-card/
http://www.trywildcard.com/docs/intro
http://techcrunch.com/2015/02/27/cards-transforming-web/
Info cards are implemented as [[web components]]
<<<
Innovate as a last resort. More horrors are done in the name of innovation than any other.
<<< Charles Eames
[img[https://pbs.twimg.com/media/BqldQnrIYAIBAUE.jpg]]
[img[http://i.imgur.com/YTsKYnI.jpg]]
//New Yorker Cartoon by Roz Chast//
<<<
Institutions are the result of past inspirations.
<<< Eugen Rosenstock-Huessy
<<<
All representations, even the most abstract, infer a rendezvous with intelligibility or, at the least, with a strangeness attenuated, qualified by observance and willed form. Apprehension (the meeting with the other) signifies both fear and perception. The continuum between both, the modulation from one to the other, lie at the source of poetry and the arts.
<<< George Steiner, Real Presences
<<<
[T]he reason we suddenly need such a word [as “interactivity”] is that during this century we have for the first time been dominated by non-interactive forms of entertainment: cinema, radio, recorded music and television. Before they came along all entertainment was interactive: theatre, music, sport—the performers and audience were there together, and even a respectfully silent audience exerted a powerful shaping presence on the unfolding of whatever drama they were there for. We didn’t need a special word for interactivity in the same way that we don’t (yet) need a special word for people with only one head.
<<< Douglas Adams, 1999
* the South side of 3rd and Main, crossing from East to West (three times)
* the West side of 3rd and Washington, crossing from South to North
* the North side of 6th and Main, crossing from West to East
<<<
Advertising we all know. Someone pays you to convince your users that they'll be happy if they buy a product or service.
Advertising is really lucrative if you run your own ad network. That's like running a casino. You can't help but make money.
If you don't run your own ad network, advertising is a scary business. You bring your user data to the altar and sacrifice it to ~AdSense. If the ~AdSense gods are pleased, they rain earnings down upon you.
And your users, of course, HATE advertising. So to keep revenue from falling, you're stuck in an arms race where you have to keep changing up your approach.
Right now, the frontier of advertising is in mobile apps. Next year it will be something else.
Maybe some of you have seen these things popping up recently; paid ads that pretend to be related links. In another few weeks, people will learn to tune them out, and a different plague of ads will descend on us.
Advertising is like the flu. If it's not constantly changing, people develop immunity.
Let's compare this to investor storytime.
Recall that advertising is when someone pays you to tell your users they'll be happy if they buy a product or service.
Yahoo is an example of a company that runs on advertising. Gawker is a company that runs on advertising.
Investor storytime is when someone pays you to tell them how rich they'll get when you finally put ads on your site.
Pinterest is a site that runs on investor storytime. Most startups run on investor storytime.
Investor storytime is not exactly advertising, but it is related to advertising. Think of it as an advertising future, or perhaps the world's most targeted ad.
Both business models involve persuasion. In one of them, you're asking millions of listeners to hand over a little bit of money. In the other, you're persuading one or two listeners to hand over millions of money.
I like to think of the quote from King Lear:
I will do such things,—
What they are, yet I know not: but they shall be
The terrors of the earth
That's the essence of investor storytime. Give us money now, and you won't believe how awesome our ads will be when we finally put them on the site.
King Lear would have killed it in Silicon Valley.
Investor storytime has a vastly higher ROI than advertising. Startups are rational, and so that's where they put their energy.
<<< Maciej Cegłowski
<<<
"""Irony
//by Thomas Lux//
A handgrenade – thunk – lands in a bunker.
Two brave men dive
to smother it with their helmets and bellies,
their heads collide,
both are knocked out
and seconds later die
in the unmuffled blast: hard irony, a device
we turn to
when each door, hatch, gate, path
we turn to
opens to
the blank. And it can make us laugh,
which is good,
human. And it says one thing
when it means another,
which we love: it's safe there, one foot
on each side
of a crevasse, one can be both numb
and acute, brave
and fearful, at ease
in a mink-lined noose: we love
this tool
and the comfort, the justice, it provides,
it provides."""
<<<
<<<
It’s an old comedy idea: The character is forced to live in a place where she doesn’t belong. Eastbound & Down is a great fish-out-of-water story. Sister Act, obviously. Barbara Stanwyck in Ball of Fire. A fish out of water is only funny to people who are watching the fish. Being the fish sucks because, you know, you’re about to die. But that feeling made me want to write…. So, is it better to live in a place that you love? Sure. I think so. But what if living in L.A. while kind of hating it can actually become a source of inspiration? Some of my favorite movies and shows about L.A. are written by people who felt conflicted by the place. Think of Barton Fink. The Player. L.A. Story. Modern Romance. Clueless. David Mamet’s Speed-the-Plow. The Larry Sanders Show. Curb Your Enthusiasm. Even Singin’ in the Rain. (Are you too fancy for Troop Beverly Hills?) Comedy rarely comes from characters at home in their world. Maybe it’s okay to make the wrong choice and live in the wrong place — maybe it gives you something to write about.
<<< Liz Meriwether, “Hating L.A. Is Good for Comedy”
http://www.vulture.com/2016/02/liz-meriwether-los-angeles-hate-is-good-for-comedy.html
[img[http://i.imgur.com/GFgOr6J.png]]
Source: https://www.law.berkeley.edu/files/FINAL_PublicDomain_Handbook_FINAL(1).pdf
<<<
“It is a good rule in life never to apologize. The right sort of people do not want apologies, and the wrong sort take a mean advantage of them.”
<<< P.G. Wodehouse, The Main Upstairs
<<<
It is difficult not to write satire.
<<< Juvenal
<<<
It is easy to be heavy: hard to be light.
<<< G.K. Chesterton
The context:
<<<
Seriousness is not a virtue. It would be a heresy, but a much more sensible heresy, to say that seriousness is a vice, It is really a natural trend or lapse into taking one's self gravely, because it is the easiest thing to do. It is much easier to write a good Times leading article than a good joke in Punch. For solemnity flows out of men naturally, but laughter is a leap. It is easy to be heavy: hard to be light. Satan fell by the force of gravity.
<<< G.K. Chesterton, Orthodoxy
<<<
At any of these moments and at many others, you may have had the impression of a contemporary strangeness whose character is holistic and atmospheric and unable to be reduced to a set of articulable causes. It involves the incoherent appeal of capitalist aesthetics, but isn’t only that. It involves the atomization of narrative, but isn’t only that. It involves the peculiar quality of loneliness in an interconnected world, but isn’t only that. It involves the confused determinism of individuals caught up in systems, but isn’t only that, isn’t only any of these things, is all of them plus a thousand others, orbiting each other and merging together and working on each other in ways it’s impossible to be entirely conscious of. That orbiting and merging and working is largely what we mean by “the present,” and one advantage of fictional narrative is that, because it can depict situations without insisting on interpretations, it can offer something of the nuance and complexity that are inescapable in our real apprehension of life. “There is no excellent beauty, that hath not some strangeness in the proportion,” Francis Bacon wrote. I think this is true, and no wonder; look at the world.
<<<
<<<
It’s ironic, I guess, that the strangeness, alienation, and terror that Franzen (sort of) wants to chronicle are busy revealing themselves all day long on the Internet, which Franzen is so determined to reject. An hour on Twitter is a more harrowing and affirming plunge into the ocean of the age than three days reading //Purity//. Many of us who feel this deeply, who are nearly overwhelmed by the dissonance Franzen’s novels merely frown toward, are on there a lot, and we could possibly tell him something. Or maybe not; in any case, he isn’t listening.
<<< [[Brian Phillips on Jonathan Franzen|http://grantland.com/hollywood-prospectus/the-franzen-of-it-all-purity-and-the-great-american-novelist/]]
This is almost a takedown, but not. It gets at the heart of Franzen's novels.
<<<
"""People turn the TV on, it looks just like a window
People turn the TV on, it looks just like a window
Digital witnesses, what's the point of even sleeping?
If I can't show it, if you can't see me
What's the point of doing anything?
This is no time for confessing"""
<<< St. Vincent, 'Digital Witness'
<<<
It treats a prophet of God like a lunatic
<<< Glenn Beck, summarizing what he didn't like about Darren Aronofsky's Noah
<<<
“When you visualized a man or a woman carefully, you could always begin to feel pity . . . that was a quality God's image carried with it . . . when you saw the lines at the corners of the eyes, the shape of the mouth, how the hair grew, it was impossible to hate. Hate was just a failure of imagination.”
<<< Graham Greene, The Power and the Glory
<<<
As every journalist knows, you are only as interesting as your subject. As an entrepreneur, it was my job to be interesting. What reporter doesn't appreciate it when you help him do his job by being quotable?
<<< Mel Ziegler, founder of Banana Republic
<<<
Nothing is more practical than finding God, that is, than falling in love in a quite absolute, final way. What you are in love with, what seizes your imagination, will affect everything. It will decide what will get you out of bed in the morning, what you will do with your evenings, how you will spend your weekends, what you read, who you know, what breaks your heart, and what amazes you with joy and gratitude.
Fall in love, stay in love and it will decide everything.
<<< Pedro Arrupe, S.J.
<<<
It’s like quitting cigarettes. There are days when someone says something on Twitter, and I’m like, ‘I have the best tweet for this.’ But I let it pass.
<<< Parker Thompson, who ran the popular Startup L Jackson twitter
<<<
It's like we finish each other's -
- sandwiches.
<<< Arrested Development
<<<
"""
It’s proven
that how
time moves for you
depends on
where you are
in the universe.
It’s relative
to beings
and other places.
But on the level
of being here
on earth,
if you are aware
in a moment,
one second
can last
a year.
And if you
are unaware,
your whole childhood,
your whole
life
can pass by
in six seconds.
But it’s also such a thing
that you can get lost in.
"""
<<< Jaden Smith, from [[this interview|http://tmagazine.blogs.nytimes.com/2014/11/17/jaden-and-willow-smith-exclusive-joint-interview/]]
Versified by [[Josh Stevenson|https://stervenson.wordpress.com/2015/05/19/found-poem/]]
<<<
“When you thwart what’s real about you in order to keep creating content for financial need, you’re just not gonna make it. You’re not gonna keep going. You have your number. It’s very dangerous to be liked by more people than should like you. It’s bad for them, and it’s bad for you. There’s gonna be a shock down the road for them, or you’re gonna dilute yourself and take yourself to a place where you can’t live with who you are. I think that you make an honest account of who you are and you live with the results. The results will be appropriate to who you are… If you’re saying things just to piss people off, then I don’t know why do it. If you’re saying things just to please people, that’s a short-lived victory. But if you just say the things you believe, and the things you like to say, and that mean something to you — if you stay close to the gut — then everything will work itself out.”
<<< Louis C.K.
[img[http://i.imgur.com/vQ9bZL7.jpg]]
//Jack Dorsey, co-founder and interim CEO of Twitter and founder and CEO of Square.//
This is the most absurd sartorial power play I can possibly imagine. It's like turning your hand sideways when shaking someone else's.
I have been told four times in my life that I look like Jeffrey Dahmer, the serial killer. I believe they're referring to this photo:
[img[http://pbs.twimg.com/media/B2WtvDJCAAA8tgH.jpg]]
<<<
The whole world knows that Jesus is a pacifist, except for the Christians.
<<< Gandhi acknowledging a debt to Tolstoy, from his autobiography
//stub//
saturation love
how to be free from bitterness
principles of warfare
Borrowing from the 'antifragile' concept, this:
<<<
# You are working on a problem and you get an idea and with it the initial idea high
# You should instantly try to defeat your idea – think of all the ways it could not work, test it out, put it under stress
# If the idea survive the brutal scrutiny then it has legs for further investigations or implementation
# If the idea is implemented and it works then that’s great
# If the idea fails the scrutiny or implementation you can quickly move on to the next idea without feeling the lows because you haven’t obsessed or talked about it i.e. it’s not your pet idea.
<<<
It becomes a game where you're trying to defeat your own ideas.
Source: http://amasad.me/2016/03/09/john-carmack-on-idea-generation/
<<<
The catastrophe suffered by the subject is no simple matter of an unflattering likeness or a misrepresentation of his views; what pains him, what rankles and sometimes drives him to extremes of vengefulness, is the deception that has been practiced on him. On reading the article or book in question, he has to face the fact that the journalist — who seemed so friendly and sympathetic, so keen to understand him fully, so remarkably attuned to his vision of things — never had the slightest intention of collaborating with him on his story but always intended to write a story of his own. The disparity between what seems to be the intention of an interview as it is taking place and what it actually turns out to have been in aid of always comes as a shock to the subject.
<<< Janet Malcolm, from "The Journalist and the Murderer”
[img[http://upload.wikimedia.org/wikipedia/en/b/b5/Unknownpleasures.jpg]]
One of those images you know even if you don't know it - a beautiful [[palimpsest]].
<<<
Are we creating a better future or just scrambling up the present?
<<< Alex Payne, [[Letter to a Programmer Considering a Startup|https://al3x.net/2013/05/23/letter-to-a-young-programmer.html]]
This whole thing is really good. "Startups are part of the system, not a rebellious wrench in the cogs."
<<<
I recently interviewed a young man. I asked him where he wants to be in four years. “Running my own company,” he said without hesitation. I asked why. “Because entrepreneurship is in my blood,” he replied. There was no mention of what his hypothetical company would do, what problem it would solve for people. His goal was business for the sake of business. That’s what he had gone to school for, after all.
<<<
In response to evidence of profound injustice in the world and our powerlessness to right things, some people relieve the stress of that realization by convincing themselves that the world isn't so unjust after all.
This isn't just "blame the victim", it potentially explains valorizing the rich in America. The Horatio Alger myth part of the American Dream contributes to it, as well. We believe that rich people have earned and deserve their success, and are reluctant to 'penalize' them through taxation.
<<<
You needn’t be explicitly racist or sexist to hold such views, nor committed to a highly individualistic political position (such as libertarianism); the researchers controlled for those. You need only cling to a conviction that the world is basically fair. That might be a pretty naive position, of course – but it’s hard to argue that it’s a hateful one. Similar associations have been found between belief in a just world and a preference for authoritarian political leaders. To shield ourselves psychologically from the terrifying thought that the world is full of innocent people suffering, we endorse politicians and policies more likely to make that suffering worse.
<<< Oliver Burkeman, [[Believing that life is fair might make you a terrible person|http://www.theguardian.com/commentisfree/oliver-burkeman-column/2015/feb/03/believing-that-life-is-fair-might-make-you-a-terrible-person]]
[img[http://i.imgur.com/5BmPcvb.jpg]]
From his [[Reddit Q&A|http://www.reddit.com/r/IAmA/comments/16k598/iama_columnist_and_reporter_on_media_and_culture/]]:
[img[http://i.imgur.com/jk8AMFc.png]]
[img[http://upload.wikimedia.org/wikipedia/commons/b/b2/Tea_bowl_fixed_in_the_Kintsugi_method.jpg]]
kingsugi (also called kintsukuroi)
n. / v. phr. "to repair with gold"; the art of repairing pottery with gold or silver lacquer and understanding that the piece is more beautiful for having been broken
related to the concept of Wabi Sabi
<<<
So pretty much when anybody tells me they are really concerned about nutritional issues, organic farming, or are just really into healthy eating, I pretty much just picture them going home and kissing little icons of Charles Darwin and Sigmund Freud.
<<< Toby Sumpter, [[Free Range Gluten Free Yoga vs. Jesus|http://www.tobyjsumpter.com/free-range-gluten-free-yoga-vs-jesus/]]
This is designed to be incendiary (the [[prophetic voice]]) and doesn't bother me that much. The challenging part of the piece comes further down:
<<<
Organic, free range chickens may or may not be worth anything. Maybe in a hundred years, our great grand children will snicker about us and our stupid farming theories. Or maybe everybody will go to free range, and they’ll look back and despise our chicken factories. Maybe, maybe not.
<<<
This reminds me of [[Don Miller]]'s //Blue Like Jazz//, where he explains his particularly post-modern epistemology by saying, in effect (I can't find the book) - well, I'll wait until I find the book so I can quote it correctly.
But the idea that we can't know the judgement of history, and the implication is that it's not a worthy cultural project to try to figure out whether factory farming is bad. Focus on the fundamentals. This is a good example of the [[Moscow Project]]'s [[loss of cultural imagination]]. Statements like this typically come with an [[accompanying exhortation to explore and enjoy the world|http://www.tobyjsumpter.com/you-dont-love-stuff-enough/]], but maybe not anything au courant.
<<<
Jock ~McGregor, my tutor during my second term at L’Abri, explained it to me this way: He said that L’Abri is a place that challenges it’s non-Christian students by sharing the Christian faith with them while also welcoming them with a hospitality that is directly attributable to that faith. So as these students consider the intellectual claims of the faith they can’t simply look at the teachings of the faith in an exclusively intellectual way. They are not just principles to be affirmed or rejected. These students are forced to reckon with the undeniable delight of the place and the fact that the people who have created it say it all comes from Christianity. You are, essentially, being asked whether you believe in apples as you enjoy a slice of apple pie.
This is, of course, how all evangelization ought to work but most of the people reading this essay, Christian or not, will have had the experience of being lectured by a boorish believer about why their religious beliefs are true. In such circumstances it is easy to dismiss the person with an exasperated wave of one’s hand. L’Abri, however, is a place that resists such simple dismissals of religious life.
In light of recent conversations, you might reasonably think that L’Abri sounds an awful lot like Rod Dreher’s much-discussed Benedict Option. It’s an intentional community in which people, many of whom are Christian though not all, share life together in a way that resists the accelerated pace and materialist values of the modern west. Indeed, the word “retreat” has often been used to describe L’Abri and L’Abri itself may even invite that characterization since it’s name is the French word for shelter.
But it’s significant that L’Abri’s impact has not been limited to its own institutional life. Nor can L’Abri’s work be reduced down to the thing that a former resident learned while living there or the way it equipped a former resident to do market-focused task X. These are the measures of many modern institutions, of course. They are most notably the measure of the modern university which has become as much a part of the post-industrial “knowledge economy” as Wall Street. But it is not the measure of L’Abri. Rather, L’Abri has become a different world and it has begotten other places like it, places like Littlefield Abbey and Toad Hall.
The begetting is the key. The Benedict Option cannot simply be a refuge or haven from the forces that exist outside of it. It must also be an incubator, a place that remakes the world. If the Benedict Option is not an incubator as well as a retreat it will fail. The world outside does not regard these places with benign indifference. It will either attack them directly as we may see in the post-same-sex marriage world or it will simply eat away at them over time through more gradual but no less deadly means.
This is why Dreher rightly insists that the Benedict Option would be necessary even without the added challenges posed by same-sex marriage. The technocratic, materialist west will grind these places down into nothing just as the industrial economy has obliterated the idea of human people existing as creatures in a family.
Yet this work is not hopeless. The 60 years of L’Abri tell us what can happen in time as these places transform the minds and hearts of the people who come to them and help them to imagine another world. The work of L’Abri is no longer confined to those dozen places that are explicitly affiliated with the institution. It does continue there, but it has also unleashed the people touched by those places to remake the world in their local contexts. Thus it moves forward in places like Littlefield Abbey and Toad Hall, places where the possibility of another world seems immediate and tangible thanks to the warmth, tenderness, and delight that seems to almost exist innately in the place.
<<< Jake Meador, [[Home, Retreat, and the Benedict Option|http://mereorthodoxy.com/home-retreat-and-the-benedict-option/]]
<<<
There is nothing more frightening than a labyrinth that has no center.
<<< G.K. Chesterton
Reportedly Errol Morris's favorite Chesterton quotation
<<<
“The novelist with Christian concerns will find in modern life distortions which are repugnant to him, and his problem will be to make these appear as distortions to an audience which is used to seeing them as natural; and he may well be forced to take ever more violent means to get his vision across to this hostile audience. When you can assume that your audience holds the same beliefs you do, you can relax a little and use more normal ways of talking to it; when you have to assume that it does not, then you have to make your vision apparent by shock -- to the hard of hearing you shout, and for the almost blind you draw large and startling figures.”
<<< Flanney O'Connor
<<<
We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris.
<<< Larry Wall, Programming Perl
Unpacked in a later edition of the book:
<<<
"""''Laziness''
The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful, and document what you wrote so you don't have to answer so many questions about it. Hence, the first great virtue of a programmer. Also hence, this book. See also impatience and hubris. (p.609)
''Impatience''
The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to. Hence, the second great virtue of a programmer. See also laziness and hubris. (p.608)
''Hubris''
Excessive pride, the sort of thing Zeus zaps you for. Also the quality that makes you write (and maintain) programs that other people won't want to say bad things about. Hence, the third great virtue of a programmer. See also laziness and impatience. (p.607)"""
<<<
//See also://
* [[An entrepreneur is a person who]]
'Pivoting' and 'Product-Market Fit' are the acknowledgement of a natural intuitive approach. When success comes people feel the need to prove that it was not luck.
The biggest example from recent memory is "Snapchat's confusing UI was a brilliant move designed to alienate adults."
Twitter's is similar, too. It 'pivoted' out of a podcast network. And flickr out of an MMO.
VC and tech journalism are heavily 'invested' (haha) in ratifying the compelling narratives of a genius creating the future.
But what about Steve Jobs? Not discounting his genius (or Thiel's, for that matter) he created the template for this sort of nonsense through his masterful manipulation of the media. Showmanship, the regulation of access, an ability to write out his past failures.
From: https://medium.com/thinkpiece-dot-club/techs-scapegoat-complex-38a4bfb37f22#.prip6ksnb
This is an extension of the Californian Ideology: http://www.imaginaryfutures.net/2007/04/17/the-californian-ideology-2/
<<<
Finally, if becoming a Christian is about learning a new language, then that language is primarily the first-order language of prayer: penitence, supplication, thanks, and adoration. But anyone who has gone through the slog of learning a new language knows that a key component of that process is the hard work of memorizing vocabulary. This takes daily repetition, carrying flashcards around with you on the bus, reviewing them in your head as you brush your teeth, as you lie in bed, as you sit in the doctor’s office. Only when you have a very firm command of the lexical content of a language can you begin meaningfully to converse in it. Similarly, to be fluent in the language of prayer requires that you have an intimate familiarity with the vocabulary of that language, a storehouse of words and phrases ingrained on your soul through days and weeks and years of repetition. And the lexicon from which these words come is the inexhaustibly rich storehouse that is the prayers of the church. Her collects, hymns, antiphons, sentences, versicles, responds, readings, and — probably above all — her psalms.
The good news is that if your life is already inundated with this language on a daily and weekly basis — by regular Mass attendance, keeping the Offices, singing hymns with your family, studying Scripture — then much of this “memorization work” will happen automatically. We may not be able to say the whole Psalter from memory every day, but we can at least aspire to be fluent enough in this language that God may, through it, cleanse the thoughts of our hearts by the inspiration of his Holy Spirit.
<<< Mac Stewart, [[A pitch for memorization|http://livingchurch.org/covenant/?p=4901]]
<<<
"Don’t try to put in a tenth of what you see, it is the continually leaving out that makes things charming."
"Mystery is caused by leaving out, but don’t leave out the big interest."
"If you put in too many accessories the interest will have no chance."
"When things are not interesting lose them."
"In a scene you will always have one part to your liking; neglect the rest for that favorite spot."
"When you are before nature give way forcibly to your big convictions. Put in what you feel the most, and not all the ab solute details that you see. You can’t put all the hairs on a cat, or the whiskers on the wheat."
<<< From Practical Hints for Art Students by Charles Lasar, 1910
<<<
"""
Lenten Complaint
by Scott Cairns
The breakfast was adequate, the fast
itself sub-par. We gluttons, having
modified our habits only somewhat
within the looming Lenten dark, failed
quite to shake our thick despair, an air
that clamped the heart, made moot the prayer.
As dim disciples having seen the light,
we supplied to it an unrelenting gloom.
Wipe your chin. I’m dying here
in Omaha, amid the flat, surrounded
by the beefy, land-locked generations,
the river, and the river’s rancid shore.
O what I wouldn’t give for a lifting,
cool salt breeze, a beach, a Labrador.
"""
<<<
<<<
''The Road to Wisdom?''
"""Well, it's plain
and simple to express.
Err and err and err again,
but less and less and less.
"""
<<< Piet Hein
<<<
The sins of the rich, such as greed and selfishness, are obvious for all to see. The sins of the poor are less conspicuous, yet equally corrosive of the soul. Some poor people are tempted to envy the rich; indeed this is a form of vicarious greed, because the poor person wanting great wealth is in spirit no different from the rich person amassing great wealth. Many poor people are gripped by fear: their hearts are caught in a chain of anxiety, worrying whether they will have food on their plates tomorrow or clothes on their backs. Some poor people are constantly formulating in their minds devious plans to cheat the rich to obtain their Wealth; this is no different in spirit from the rich making plans to exploit the poor by paying low wages. The art of being poor is to trust in God for everything, to demand nothing-and to be grateful for all that is given.
<<< St. John Chrysostom, On Living Simply, Homily 7
511's are a bit too slim for me. 510's are comically slim. 501's are not quite right. Still looking for the ideal.
[img[http://images.fineartamerica.com/images-medium-large/woman-using-the-card-catalog-everett.jpg]]
[img[http://i.imgur.com/Aa0t5pc.jpg]]
<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">60% of my fav links from 10 yrs ago are 404. I wonder if Library of Congress expects 60% of their collection to go up in smoke every decade.</p>— Bret Victor (@worrydream) <a href="https://twitter.com/worrydream/status/478087637031325697">June 15, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<<<
Life is meant to be lived from a Center, a divine Center…Life from the Center is a life of unhurried peace and power. It is simple. It is serene. It is amazing. It is triumphant. It is radiant. It takes no time, but it occupies all our time. And it makes our life programs new and overcoming. We need not get frantic. He is at the helm. And when our little day is done we lie down quietly in peace, for all is well.
<<< Thomas Raymond Kelly, Quaker
<<<
It’s impossible to imagine another situation where you can’t write a book ’cause you weren’t born with a penis, except maybe //Life With My Penis//.
<<< Annie Dillard, from her journals
How do you change your mind?
[img[http://i.imgur.com/yp5iUX4.jpg]]
<<<
The idea is that I’m standing in the bubble on the left, atop an unconscious pyramid of belief formation. You are standing in the bubble on the right, atop your own unconscious pyramid. And our two pyramids rest on different regions of an underlying reality. How can we engage in productive discourse?
[Dave] Gray says it requires two tricky maneuvers. First I need to shine a light down into the unconscious fog, climb down my own “ladder of inference,” and reflect on how my own experience of reality informs my own beliefs. Then, he says, I need to take that flashlight, walk over to your pyramid, and climb up your ladder of inference. “Liminal thinking,” he tweeted the other day, “is the art of creating change by understanding, shaping, and reframing beliefs.”
<<<
from this https://blog.jonudell.net/2016/01/17/liminal-thinking-at-scale/
This relates to social media discourse, too:
<<<
There’s a lot of debate today on how to combat online harassment and fight trolls. This is so important. No one could argue against that. But we need to also think about how to design social media experiences that promote civility and reward thoughtfulness. I know for a fact if I write a post that is more sensational, more one-sided, sometimes angry and aggressive, I get to have more people see that post. I will get more attention.
But what if we put more focus on quality? What is more important: the total number of readers of a post you write, or who are the people who have impact that read what you write? Couldn’t we just give people more incentives to engage in conversations, rather than just broadcasting opinions all the time? Or reward people for reading and responding to views that they disagree with? And also, make it socially acceptable that we change our minds, or probably even reward that?
<<< Wael Ghonim's Ted Talk
<<<
//Q2. Why does New St. Andrews College limit enrollment?//
The College is small by design so that students may enjoy the close personal attention of the senior scholars and experience Christian community in tangible ways. The College limits each entering class to a maximum of 40 full-time students. New St. Andrews employs a small-group tutorial system centered on discussions of readings of the great literature of Western civilization. The College is also small because its founders and Board of Trustees believe that quality, integrity, and faithfulness are better preserved by maintaining close personal familiarity and accountability between the church, faculty, students, and community, and by rejecting the secular business models of growth and expansion that helped undermine many Christian colleges and confused their priorities.
<<< New Saint Andrews website, June 2003
//Stub: worth also looking up the hubbub about NSA's expansion (the zoning / parking thing which in part gave birth to the GMA), wherein Dr. Atwood laid out his goals for NSA's maximum enrollment.//
<<<
Moscow Superintendent Greg Bailey said freedom of speech is limited in school settings and he was disappointed in the students displaying the flags.
<<<
Also good, this on the objective meaning of symbols from an offended student:
<<<
Eigenbrode said she believes those who use the flag as a symbol for Southern pride think it can be separated from its history of hate.
"Using it as a symbol of Southern heritage is not really legitimate because the flag really is a symbol of hate," she said.
<<<
Here: http://dnews.com/local/moscow-high-students-fly-confederate-flags-spark-debate/article_cfda06e3-61d2-51d8-963f-13be3a554cc5.html
//All <$count filter="[tag[lists]]"></$count> entries, most recent first://
<$list filter="[tag[lists]] +[!sort[modified]]">
<div class="tc-menu-list-item">
<$link to={{!!title}}><$view field="title"/></$link>
</div>
</$list>
<<<
We make lists of things we want to remember, and then we lose the lists.
<<< Jonathan Lethem, The Ecstasy of Influence
<<<
Ruling is hard. This was maybe my answer to Tolkien, whom, as much as I admire him, I do quibble with. //Lord of the Rings// had a very medieval philosophy: that if the king was a good man, the land would prosper. We look at real history and it's not that simple. Tolkien can say that Aragorn became king and reigned for a hundred years, and he was wise and good. But Tolkien doesn't ask the question: What was Aragorn's tax policy? Did he maintain a standing army? What did he do in times of flood and famine? And what about all these orcs? By the end of the war, Sauron is gone but all of the orcs aren't gone -- they're in the mountains. Did Aragorn pursue a policy of systematic genocide and kill them? Even the little baby orcs, in their little orc cradles?
<<< George R.R. Martin
//Petit a petit, l’oiseau fait son nid//
Little by little, the bird makes its nest
<<<
I believe that what we become depends on what our fathers teach us at odd moments, when they aren't trying to teach us. We are formed by little scraps of wisdom.
<<< Umberto Eco
<<<
Stop wasting time running after the perfect community; Live your life fully in your community today.
<<< Jean Vanier (of l'Arche)
<<<
It is true that we all do live in the ruins of the lives of other generations.
<<< Marilynne Robinson, from //Gilead//
<<<
Living affordably and trying to climb higher than your parents did were once considered complementary ambitions. Today, young Americans increasingly have to choose one or the other—they can either settle in affordable but stagnant metros or live in economically vibrant cities whose housing prices eat much of their paychecks unless they hit it big.
<<< [[The Miracle of Minneapolis|http://www.theatlantic.com/magazine/archive/2015/03/the-miracle-of-minneapolis/384975/]]
The case for living in a mid-sized city.
<<<
We may be living on the edge of eternity – but that should not make us dismal. The early Christians rejoiced to think that the end of the world was near, as they thought. Are we so unready to face God? Are we so avid for joys here, that we perceive so darkly those to come?
<<< Dorothy Day, On Pilgrimage
<<<
It is always dangerous to draw too precise parallels between one historical period and another; and among the most misleading of such parallels are those which have been drawn between our own age in Europe and North America and the epoch in which the Roman Empire declined into the Dark Ages. None the less certain parallels there are. A crucial turning point in that earlier history occurred when men and women of good will turned aside from the task of shoring up the Roman imperium and ceased to identify the continuation of civility and moral community with the maintenance of that imperium. What they set themselves to achieve instead—often not recognising fully what they were doing—was the construction of new forms of community within which the moral life could be sustained so that both morality and civility might survive the coming ages of barbarism and darkness. If my account of our moral condition is correct [one characterized by moral incoherence and unsettlable moral disputes in the modern world], we ought to conclude that for some time now we too have reached that turning point. What matters at this stage is the construction of local forms of community within which civility and the intellectual and moral life can be sustained through the new dark ages which are already upon us. And if the tradition of the virtues was able to survive the horrors of the last dark ages, we are not entirely without grounds for hope. This time however the barbarians are not waiting beyond the frontiers; they have already been governing us for quite some time. And it is our lack of consciousness of this that constitutes part of our predicament. We are waiting not for a Godot, but for another—doubtless very different—St. Benedict.
<<< Alasdair ~MacIntyre
[img[http://i.imgur.com/1mj5zHI.jpg]]
One of Bob Mazzer’s London Underground photos from the 1970s and ‘80s.
As the [[Moscow Project]] moves into a new generation, it's circling around a few central distinctives - right worship, Christian education, I can't remember the other one
'young fogey', a joke-y pejorative aimed at a movement form the late 1970s/early 1980s of young people reacting against modernism by reaching back to celebrate the taste of Victorian and Georgian England. The movement (not entirely dead) was primarily concerned with architecture and design rather than clothing.
Gavin Stamp, quoted in the book //The Englishman's Room//, is very aphoristic:
<<<
“There is nothing like destruction–or the threat of destruction–to make people value things.”
“With a few rare and special exceptions, I prefer my architects dead.”
“I would rather have lots of moderately good things than one exceptional object.”
“As regards the pictures, I like anything, providing it is of a building"
“As for the furniture … the important thing is that tables should be able to bear the weight of piles of books and that chairs should perform as filing cabinets.“
<<<
<<<
Love God and do what you will.
<<< St. Augustine (attributed)
//See also://
* [[We are the makers of manners]]
* [[a sanctified I-don't-care-ness]]
<<<
Love is our true destiny. We do not find the meaning of life by ourselves alone – we find it with another. We do not discover the secret of our lives merely by study and calculation in our own isolated meditations. The meaning of our life is a secret that has to be revealed to us in love, by the one we love. And if this love is unreal, the secret will not be found, the meaning will never reveal itself, the message will never be decoded. At best, we will receive a scrambled and partial message, one that will deceive and confuse us. We will never be fully real until we let ourselves ‘fall’ in love – either with another human person or with God. "Hence, our attitude toward life is also going to be in one way or another an attitude toward love. Our conception of ourselves is bound to be profoundly affected by our conceptions – and our experience – of love. And our love, or our lack of it, our willingness to risk it or our determination to avoid it, will in the end be an expression of ourselves: of who we think we are, of what we want to be, of what we think we are here for."
<<< Thomas Merton (Love and Living, p.28)
<<<
I stand in the skeptical Christian tradition of Montaigne, Pascal and Kierkegaard - figures in touch with (and often tortured by) an inescapable demon of doubt inscribed within their humble faith. This tradition enables me feebly to love my way through the absurdity of life and the darkness of history.
<<< Dr. Cornel West
'feebly to love my way through the absurdity of life'
For Lovecraft, his “new artificial myths” represented an “aesthetic crystallization of that burning & inextinguishable feeling of mixed wonder & oppression which the sensitive imagination experiences upon scaling itself & its restrictions against the vast & provocative abyss of the unknown.”
“[A]ll my tales are based on the fundamental premise that common human laws and interests and emotions have no validity or significance in the vast cosmos-at-large.”
<<<
One of the things that science does is a really curious thing. Every time we use science to try to answer a question, to give us some insight, invariably that insight or answer provokes two or three other new questions. Anybody who works in science knows that they're constantly finding out new things that they don't know. It increases their ignorance, and so in a certain sense, while science is certainly increasing knowledge, it's actually increasing our ignorance even faster. So you could say that the chief effect of science is the expansion of ignorance.
In a curious way, Google is all about answers. So you could say that Google is increasing answers over time, but what's interesting is that answers are becoming cheap; they're almost free, and I think what becomes scarce in this kind of place that we're headed to is questions, a really good question, because a really good question can unleash new questions.
In a certain sense what becomes really valuable in a world running under Google's reign, are great questions, and that means that for a long time humans will be better at than machines.
Machines are for answers; humans are for questions.
The world that Google is constructing—a world of cheap and free answers—having answers is not going to be very significant or important. Having a really great question will be where all the value is.
<<< Kevin Kelly, [[this interview|http://edge.org/conversation/the-technium]]
<object id="flashObj" width="480" height="270" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0"><param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&isUI=1" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="videoId=4232420164001&linkBaseURL=http%3A%2F%2Fwww.slate.com%2Fblogs%2Fthe_slatest%2F2015%2F05%2F12%2Fobama_fox_news_obamaphone_president_draws_laughs_at_poverty_conference.html&playerID=58264559001&playerKey=AQ~~,AAAAAASoY90~,_gW1ZHvKG_0UvBsh7aZU7MXZe77OcsGq&domain=embed&dynamicStreaming=true" /><param name="base" value="http://admin.brightcove.com" /><param name="seamlesstabbing" value="false" /><param name="allowFullScreen" value="true" /><param name="swLiveConnect" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&isUI=1" bgcolor="#FFFFFF" flashVars="videoId=4232420164001&linkBaseURL=http%3A%2F%2Fwww.slate.com%2Fblogs%2Fthe_slatest%2F2015%2F05%2F12%2Fobama_fox_news_obamaphone_president_draws_laughs_at_poverty_conference.html&playerID=58264559001&playerKey=AQ~~,AAAAAASoY90~,_gW1ZHvKG_0UvBsh7aZU7MXZe77OcsGq&domain=embed&dynamicStreaming=true" base="http://admin.brightcove.com" name="flashObj" width="480" height="270" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed></object>
<<<
“ … over the last 40 years, sadly, I think there’s been an effort to either make folks mad at folks at the top, or to be mad at folks at the bottom. And I think the effort to suggest that the poor are sponges, leeches, don’t want to work, are lazy, are undeserving, got traction. … I have to say that if you watch Fox News on a regular basis, it is a constant menu — they will find folks who make me mad … They’re like, I don’t want to work, I just want a free Obama phone — or whatever. And that becomes an entire narrative … very rarely do you hear an interview of a waitress — which is much more typical — who’s raising a couple of kids and is doing everything right but still can’t pay the bills.
<<< Barack Obama, [[link|http://sojo.net/blogs/2015/05/21/who-said-it-fox-news-or-jesus]]
A genre of art which endows otherworldly significance to ordinary things.
"The suggestion of death, the hint of history invading the present, or the sense of inanimate objects coming to love is woven into mundane reality." - [[James Gurney]]
Borges, George Tooker, Andrew Wyeth, Gary Ruddell, Gregory Crewdson, Jean-Pierre Jeunet, etc.
I like magic realism for its //implied// storytelling. When you see a Gregory Crewdson picture you absolutely cannot help but imagine the backstory.
<<<
Make ‘em laugh, make ‘em cry, make ‘em wait.
<<< Wilkie Collins on writing
<<<
There is hardly anything in the world that some man cannot make a little worse and sell a little cheaper.
<<< John Ruskin
<<<
A writer is someone who can make a riddle out of an answer.
<<< Karl Kraus
As quoted by Donald Barthelme:
<<<
No, it’s not. But the task is not so much to solve problems as to propose questions. To quote Karl Kraus, “A writer is someone who can make a riddle out of an answer.” There’s also an element of reportage, the description of new situations or conditions, but that’s pretty much a matter of identifying them rather than talking about solutions. Baudelaire noticing that the boulevards of Paris were no longer a means of getting from here to there but had become more like theater lobbies, places to be, and writing about that. The search is for a question that will generate light and heat.
All this has to do with a possible extension of means. Abstraction is a little heaven I can’t quite get to. How do you achieve, for example, “messy”? De Kooning can do “messy” by making a charcoal stroke over paint and then smudging same with his talented thumb—in prose the same gesture tends to look like simple ineptitude. De Kooning has a whole vocabulary of bad behavior that enables him to set up the most fruitful kinds of contradictions. It frees him. I have trouble rendering breaking glass.
<<< Donald Barthelme, Paris Review interview
<<<
What we would like to do is change the world – make it a little simpler for people to feed, clothe, and shelter themselves as God intended for them to do.…We can, to a certain extent, change the world; we can work for the oasis, the little cell of joy and peace in a harried world. We can throw our pebble in the pond and be confident that its ever widening circle will reach around the world. We repeat, there is nothing that we can do but love, and, dear God, please enlarge our hearts to love each other, to love our neighbor, to love our enemy as well as our friend.
<<< Dorothy Day, “Love Is the Measure,” The Catholic Worker, June 1946
<<<
If only I could figure out a way to make money by holding fashionable opinions decades prematurely.
<<< Charles Platt
<<<
Make no little plans; they have no magic to stir men’s blood and probably themselves will not be realized.
<<< Daniel Burnham
(architect, urban designer)
<<<
Make visible that which, without you, would remain unseen.
<<< Robert Bresson
<<<
Make your dietary decisions with the best information you can find. Discuss and debate the nutritional and aesthetics merits of food freely, publicly, respectfully, charitably.
<<< Peter Leithart, [[link|http://www.firstthings.com/blogs/leithart/2013/02/exhortation-128/]]
This is expansive, generous cultural engagement, [[maker of manners|We are the makers of manners]]-style.
[img[http://i.imgur.com/L9fA2zv.gif]]
If you're going to say Malki-TSE-dek is the "right way to say it", you need to say Mo-SHEH, ee-SOOS, and a bunch of other things that no one would do unless you're trying to get at some gnostic source of authority to establish your Hebraic, "First-Century Jew" bona fides.
Reminds me of community college and Byron's Don Juan. The teacher pronounced it 'correctly' even when he wasn't reading the poem, but it just made him seem like an idiot.
<<<
In the postwar years, a suburban dad would have retreated to his dignified “den.” But now that same dad is likely to have a wife who also works, and his space has devolved down the evolutionary scale to the Cro-Magnon terminology of “man cave.” No one really says “A man’s home is his castle” any more, and changes in American life have made it nearly impossible for a man to afford to buy a house without a domestic partner. The “man cave” is the pathetic cocoon-retreat for the kind of gelded schlub one finds in every television sitcom, dressed in his open-front plaid shirt with gray tee underneath, perpetually outfoiled by his stylish wife and quick-witted children.
In facat, the man-cave is patriarchy’s graveyard.
Perhaps if men took a more active role in the furnishing of the rest of the house, rather than handing it entirely over to the wife, they wouldn’t need a cave in which to hide with porn and football, which is to say, other men’s sexual and athletic prowesses.
<<<
http://masculineinteriors.com/man-caves-are-where-patriarchy-goes-to-die/
<<<
… for the novelist who has remained Christian, like myself, man is someone creating himself or destroying himself. He is not an immobile being, fixed, cast in a mold once and for all. This is what makes the traditional psychological novel so different from what I did or thought I was doing. The human being as I conceive him in the novel is a being caught up in the drama of human salvation, even if he doesn’t know it.
<<< François Mauriac
<<<
Management is deeply involved in moral concerns—the nature of man, good and evil. Management is thus what tradition used to call a liberal art. Managers draw on all the knowledge and insights of the humanities and the social sciences—on psychology and philosophy, on economics and history, on ethics—as well as on the physical sciences. But they have to focus this knowledge on effectiveness and results—on healing a sick patient, teaching a student, building a bridge, designing and selling a user friendly software program. For these reasons, management will increasingly be the discipline and the practice through which the humanities will again acquire recognition, impact, and relevance.
<<< Peter Drucker
This is a fully realized version of pastiche. When you go into a chain restaurant, and Applebee's or a Red Robin, there's a bunch of junk glued on the walls. Photos of local sports teams, license plates, half a car (!) - in the dining room of the casual dining Tex-Mex restaurant where I worked, Chevy's.
The maximalist eclectic aesthetic takes this one step further with found objects, local art, and a deliberate combination of styles and high-low elements.
The aesthetic is best represented in commercial design by the ~McMenamins hospitality chain.
<<<
[The provocateur] calculates the phrase or attitude which will provoke in his interlocutor the maximum displeasure or discomfort; and then, rationally, applies the result of his calculation...
[in contrast to his own] form of perverse sincerity: I search obstinately, relentlessly, for the worst that might be inside me in order to lay it … at the feet of the public.
<<< Michel Houellebecq
Houellebecq creates landscapes of shock in order to show the shallowness of modernity and western life. “The Enlightenment is dead, may it rest in peace.”
<iframe width="420" height="315" src="https://www.youtube.com/embed/6ljOj6GVcnQ" frameborder="0" allowfullscreen></iframe>
<<<
Laws are made to be broken by law-abiding people.
<<< G.M. Young
IT SEEMED LIKE A GOOD IDEA AT THE TIME: the Austin Storm Story
I'M ASKING FOR A FRIEND: the Austin Storm Story
<<<
Men don't and can't live by exchanging articles, but by producing them. They don't live by trade, but by work.
<<< John Ruskin
<<<
Men who are unhappy, like men who sleep badly, are always proud of the fact.
<<< Bertrand Russell
[img[http://i.imgur.com/4VFjki8.png]]
from Community, as in
<<<
I give this _____ zero Meow Meow Beenz
<<<
//noun//
a masterpiece of trash. A trashterpiece. A disasterpiece. So bad it's good, except that [[isn't really a thing]].
//Non-exhaustive list off the top of my head right at this moment://
* Game of Thrones
* Christopher Paolini's Inheritance cycle
* Peyton Place
* Flowers in the Attic
* 50 Shades of Grey
[img[http://i.imgur.com/aM4GmWk.jpg]]
A man-made island city in Mexico, floods during rainy season. "Mexico's Venice"
!!! Rules
Schools and businesses operate from middle-class norms.
The hidden rules of the middle class are not taught, they are assumed.
Middle-class self-sufficiency. In poverty, clear understanding that one will never get ahead, so money is always shared or spent immediately. People are what you have, so you share so that you can rely on one another.
Discipline is about change, versus discipline about penance and forgiveness.
!!! Orientations
| |!Poverty |!Middle class |!Wealth |
|Possessions |People |Things |Legacies, pedigrees|
|Personality |For entertainment; sense of humor valued |For stability; achievement valued |For connections |
|Social emphasis |Social inclusion |Self-governance and sufficiency |Social exclusion |
|Food |Quantity - do you have enough? |Quality - did you like it? |Presentation - presented well? |
|Clothing |Valued for style and self-expression |Valued for quality and acceptance into norm; label important |Valued for artistic sense and expression; designer important. |
|Time |Present most important - decisions based on moment / survival |Future most important - decisions made against future ramifications |Traditions and history most important - tradition and decorum |
|Education |Valued and revered in abstract |Crucial for climbing success ladder |Necessary tradition for making and maintaining connections |
|Destiny |Fate, cannot do much to change |Self-determination, can change future / rise |Noblesse oblige |
|Language |Casual register |Formal register; language is about negotiation |Formal register; language is about connections |
|Family Structure |Tends to be matriarchal |Tends to be patriarchal |Depends on money / history |
//Source, even more directly than the rest of this: A Framework for Understanding Poverty//
This is the best FAQ summary of Rene Girard's work, mimetic theory and scapegoating I've ever read. An excerpt:
<<<
Q. Why is mimetic theory important?
A. Mimetic theory is important because it allows us to think clearly and honestly about the greatest threat to human survival: our own violence. It offers the best available analysis of the causes of conflict, the contagion of violence, and the pervasive use of scapegoating by individuals and communities. But its enduring value is found in the guidance it offers for how to end the plague of violence and establish a real and lasting peace.
<<<
[[Read the rest|https://www.ravenfoundation.org/faqs/]]
<<<
I’ve never quite… understood modernity as being a rupture or break from a virtuous past. Instead, the formulation I use is that things are getting better and worse at the same time, all the time. The dazzling achievements of modern life are real but also can have a dark underbelly, which means it’s not always possible to clearly separate out what is “good” from what is “bad.” I resist narratives of decline because they seem to miss this, which means the task of discerning the signs of the times, thinking through them as a Christian, is a complex and difficult task. I reject both optimism and despair about modern life.
<<< Matthew Sitman
writing about the ~BenOp for [[The Dish|http://dish.andrewsullivan.com/2014/08/20/to-be-a-christian-in-modern-america/]]
'one has to be suspicious of any view of history or ourselves that would place us at a particular apex or nadir'
Sitman goes on:
<<<
I… resist the notion that Christianity is fundamentally about morality, //at least not in the ultimate sense// [italics added]. Christianity is premised on our inability to be moral, and its most important idea is that of grace, or God’s one-way love for us, which isn’t premised on how much we have our acts together.
<<<
My thoughts: The Church / the Christian should exist as a perpetual critique of the age, which would diffuse the sense that we are perpetually on the brink.
<<<
Modernity: we created youth without heroism, age without wisdom, and life without grandeur.
<<< Nassim Taleb
Six modes of representation in the documentary genre:
# poetic
# expository
# participatory
# observational
# reflexive
# performative
The full quote:
<<<
Individual voices lend themselves to an auteur theory of cinema, while shared voices lend themselves to a genre theory of cinema. Genre study considers the qualities that characterize groupings of various of filmmakers. In documentary film and video, we can identify six modes of representation that function something like sub-genres of the documentary genre itself: poetic, expository, participatory, observational, reflexive, performative. These six modes establish a loose framework of affiliation within which individuals may work; they set up conventions that a given film may adopt; and they provide specific expectations viewers anticipate having fulfilled.
<<< Bill Nichols' Introduction to Documentary
<<<
What if our normative image of love was not marriage but monasticism? Or, better, what if we recognized both marriage and celibate life as images of Heaven, where love can be expressed in ways that are equally real, equally intimate, and equally beautiful?
If you don’t honor celibacy, do you distort your image of Jesus? He died a virgin; if you can only see that as a lack, rather than seeing how His love flowed out in nonmarital forms, can you truly see Him as the God Who is love?
If you don’t honor celibacy, do you distort your image of Heaven? We are not married in Heaven, and yet here love is at its height.
If you don’t honor celibacy, do you distort your understanding of prayer? Celibacy recalls us to our ultimate and most intimate union, the union with God. Prayer can be a lot of things: begging, gratitude, penitence, praise. But it’s also intimate union with God. Bernini’s Teresa (here she is again, I’ve been thinking a lot about her lately) is caught in the ecstasy of prayer–the union of her soul with her divine Lover. How can we understand this form of prayer if we don’t see celibate love as real, all-encompassing (not just mental games), and passionate?
<<< Eve Tushnet
speculative thoughts on celibacy:
http://www.patheos.com/blogs/evetushnet/2016/02/if-you-dont-honor-celibacy.html
<<<
"""''Moon in the Window''
//by Dorianne Laux//
I wish I could say I was the kind of child
who watched the moon from her window,
would turn toward it and wonder.
I never wondered. I read. Dark signs
that crawled toward the edge of the page.
It took me years to grow a heart
from paper and glue. All I had
was a flashlight, bright as the moon,
a white hole blazing beneath the sheets.
"""
<<<
<<<
There were so many people who perished. I didn’t. The basic question is: How does one conduct a responsible life that really has been given by an accident of history? It could just as well have been given to somebody else, but you have it, and you better do something.
<<< Ursula Franklin
http://www.theglobeandmail.com/news/national/ursula-franklin-canadian-scientist-and-activist-had-a-passion-for-peace/article31123033/
Aspirationally sentimentalized vision of American life, particularly family life.
Moscow, Idaho is my adopted hometown.
It is the location of what I call the [[Moscow Project]], and at times I've imagined alternate-universe Moscow's, including [[Future Moscow]]
[img[http://i.imgur.com/P2xtOTH.jpg]]
//date unknown, looking north from around the fire department
[img[http://i.imgur.com/YzJIwY9.jpg]]
[img[http://i.imgur.com/MYIu9KA.jpg]]
//1925//
This picture is particularly sad, because a number of these buildings underwent dramatic modernization for the worse.
From left, you can barely see the NSA building, then the Moscow Hotel, then a building that burned down and was rebuilt as the current US Bank building. Across the street is another building that was demolished for the current Wells Fargo building, followed by the intact Gnosh building, Creighton's (now Cactus Computers), and an insurance office.
[img[http://i.imgur.com/STWJbAT.jpg]]
//College of Agriculture parade held on May 2, 1936//
At the far right is the Cafe Artista building
[img[http://i.imgur.com/lmajJsr.jpg]]
//Moscow Homecoming Parade, 1948//
From left, it's the Breakfast Club (former Nobby Inn), La Casa, the Chamber, and NSA. This is taken from the lot of the gas station which is now The Storm Cellar.
[img[http://i.imgur.com/nUgci30.jpg]]
//1952 (year Quo Vadis was released)//
[img[http://i.imgur.com/cNQmMV5.jpg]]
//mid 1960s//
The Nobby Inn location is now the Breakfast Club
//Very much a stub//
//I know, it's a dorky name for it. And technically it started in Pullman, with Jim Wilson at E-Free. But I can't think of anything better.//
Stuff I haven't incorporated, hence //stub//
* Postmillenialism
* chiasmus
* charges of 'gnostic' or 'gnosticism'
* Plundering the Egyptians
* fatheads
* "By what standard?" from presuppositional apologetics
* nepotism, maybe? Yeah, I think it was owned as a good
* seeing yourself as a character in a story
* antithesis
* Literature for a life less petty (other Canon stuff?)
* [[pomosexual]], I guess
* Asserting that there's no such thing as postmodernism(!) how could I forget "Scratch a postmodernist and you will find a confused modernist, which is to say, you will find a postmodernist."
* Rock into a pack of dogs, one who barks is the one who got hit
* Robust Sabbath keeping
* Ugly sister heuristic
!! History
A movement within Reformed Evangelical Christianity, centered around the teaching ministry of [[Doug Wilson]] and his church, [[Christ Church]], located in [[Moscow, Idaho|Moscow]] (hence the Moscow Project).
!! Early Distinctives (Jim Wilson)
One of its earliest distinctive teachings was the danger of [[bitterness]], and the importance of [[strategic evangelism]] and [[saturation love]] (these from Jim Wilson)
!! Education
In education, paideia, lost tools
Emphasis on teaching led to creation of publisher [[Canon Press]], journal [[Credenda/Agenda]]. Lately, mostly blogs.
Classical Christian education movement with [[Logos School]], and [[ACCS]] school association. College [[New Saint Andrews]]
Institutions
!! Theology
Christ Church involved in the creation of its own denomination, the [[CREC]], and local pastoral training program [[Greyfriars Hall]].
Distinctives
Institutions
!! Cultural Criticism
Later a critique of youth ministry, revival of courtship, qualifications of elders all placed an emphasis on the family.
The Moscow Project values [[cultural criticism]], and their willingness to interact with culture is both a major strength and occasional weakness. cf [[skinny jeans]]
[[culture wars]], [[cobelligerents]] the [[vanguard of the reformation]], people who 'get it' and aren't culturally compromised. [[God draws straight with crooked lines]]
Often uses the [[prophetic voice]], strong proclamations. The [[serrated edge]] in an attempt to show that 'the emperor has no clothes'
corollary is the [[fellowship of the grievance]]
!! Recent
Since this involved the creation of many new ventures and new institutions, [[worth doing badly]] invoked
In recent years I've noted a [[loss of cultural imagination]], which is perhaps an overly-negative way of saying a narrowing in the scope of its leadership's interests
Invocation of [[zero-sum thinking]]
<<<
I think it’s very important for people to run away from home… Most artists are runaways. From whatever they had. From their own coordinates, from the main street, from the family, from the culture, from the society that produced them… The moment I have to learn something new, like new habits, new languages, new coordinates, I myself have something like a rebirth. I reduce myself to the lowest common denominator. And this is very healthy for an artist. To start all over again. One gets in touch with the original poetry of his tender times, his beginnings. One becomes again a peasant, a desperado. This is very healthy.
<<< Saul Steinberg
<<<
Most people assume that the groups they don't belong to are more homogeneous than groups they do belong to.
<<< David Brooks
<<<
What is my agenda? What is my predisposition? What are my prejudices? What are my angers? I meet people in high levels of church and society who don’t appear to have asked these questions or undertaken this discipline. […] This process can be brutal, but it is absolutely necessary. Otherwise the “I” that I am cannot separate from its identification with its own thoughts and feelings. Most people *become* their thoughts. They do not *have* thoughts and feelings; the thoughts and feelings have them.
<<< Richard Rohr, Everything Belongs
<<<
This is a guide for instructing posthumans in living a Dada life. It is not advisable, nor was it ever, to lead a Dada life. It is and it was always foolish and self-destructive to lead a Dada life because a Dada life will include by definition pranks, buffoonery, masking, deranged senses, intoxication, sabotage, taboo breaking, playing childish and/or dangerous games, waking up dead gods, and not taking education seriously. On the other hand, the accidental production of novel objects results occasionally from the practice of Dada. During times of crisis like wars and plagues, some of these objects can be truly novel because they sabotage prevailing sentiments. At other times, Dada objects are merely interesting, by virtue of an added layer of irony, an extra punch line, or a new twist to an already-consecrated object. In such times Dada objects amuse everybody, and since these objects are (mostly) made collectively, they are a strong community bond. Amusement (of oneself and others) and the making of art communities are the goals of Dada. Dada is a priori against everything, including goals and itself, but this creative negation is very amusing and is meant to be shared. For one whole century, Dada has delighted in uncovering and using contradictions, paradoxes, and negations, the most important of which are: 1. most people read signs, Dadas make signs, and 2. most people are scared of scary faces, Dada makes scary faces.
<<< Andrei Codrescu, The Posthuman Dada Guide
[img[https://pbs.twimg.com/media/BJefVetCAAE5O27.jpg:large]]
I cried in the following movies:
* Rudy (1993)
* Saving Private Ryan (1998)
* Life is Beautiful (1997)
* The Pianist (2002)
* American Beauty (1999)
* The Shawshank Redemption (1994)
* The Iron Giant (1999)
* Tree of Life (2011)
[img[http://i.imgur.com/dUar5Dj.gif]]
<<<
...in cafes you have to drink the least offensive of the musical comedy drinks that go with them.
<<< James Bond
is trying to kill me - ambivalence to / detente
chameleon, or what being all-american looking gave me
Eyesight, hearing - look pleasantly blank
informs [[my personality]]
<<<
My confidence as an artist is directly correlated to how much art I’m creating.
<<< Branden Harvey
<<<
Created or called, the Biblical narrative has really helped me see who I am. God rarely, if ever, calls the well-behaved and well-adjusted to follow. Again, with David. He was an awful man. A terrible king. He was a murderer, a rebel, a terrorist, a rapist (one reading of the Bathsheba story), and he stole men’s wives (2 Samuel 3:16 has this wonderful tale of Michal’s husband pathetically following her as she makes her way to David). He was as dithering a king as he was decisive before he became king. And yet, this awful man, who in his whole life only repents once of anything he ever did, and then only when Nathan the prophet calls him on it, is so beloved of God that God makes a promise to save Israel, to save the whole world, through David. The Bible is full of misfits, people who don’t belong, bad men and women who God calls to be part of God’s saving acts.
This is why I get so angry when we reduce scripture to simple guidance for good behavior. It isn’t really that at all. And when it becomes that, I’m suddenly left out of the story, because I am not “beyond reproach” and because I have never lived a life “beyond reproach.” It may be words of blessing and comfort to them as are settled and at home, but those words are almost all spoken by people who are not, from Abraham to Paul. People called to leave, to wander, to never find rest except as guests in homes that are not theirs.
That gives me great strength. I am not alone in all this. It hasn’t made the last year easier, but it has made it bearable. I am not wrong because I am a misfit and a malcontent, that I am not flawed or troublesome or “difficult” or “the problem” merely because some people (well, okay, rather a lot) say so. Because God uses people like me — perhaps even needs people like me — to speak the words that must be spoken. I don’t understand it, and I truly wish it were not like this. My home is with Christ, and that will have to suffice in this world.
Maybe this unfilled yearning is like the thorn Paul writes about. He has pleaded with God to remove it, and Jesus tells him: “My grace is sufficient for you, for my power is made perfect in weakness.” Perhaps we must bear this burden of wanting something we cannot have as a witness, to ourselves and to others, of the grace of God. I hate that possibility. Not everyone will listen — it is not a powerful voice. But I’m reminded of something a Lubavitcher Rebbe said, that while the kings had power, no one remembers their words. It is the words of the prophets, who had nothing but what God gave them to say, that we remember.
<<< Charles H. Featherstone, The Love That Matters
My name is Austin Thomas Storm - Austin because my mother was an elementary school teacher and wanted to choose a name that didn't have any prior associations for her because of having a similarly-named student. Thomas after my father.
"""''Austin'' - from Augustine, meaning noble, venerable
''Thomas'' - the Apostle, 'doubting Thomas' - skeptical"""
<iframe width="560" height="315" src="https://www.youtube.com/embed/IH_4-IhEhBA" frameborder="0" allowfullscreen></iframe>
galvanized by crises
Enneagram Five, ENTP
neat (fastidious), not organized or clean
<<<
Technology, which, linked to business interests, is presented as the only way of solving these problems, in fact proves incapable of seeing ''the mysterious network of relations between things'' and so sometimes solves one problem only to create others.
<<< Pope Francis, Laudato Si (pp. 16-17) emphasis mine
An alternative to the technocratic definition of 'network'.
[img[http://2.bp.blogspot.com/-KhyCtiaCKDk/UpJtFk0MsPI/AAAAAAAACk0/PYIBXhX1KZE/s1600/Marooned_(close_up).jpg]]
//naufrague//
n. a shipwrecked person
''neurosis, n.''
<<<
Neurosis is the avoidance of legitimate suffering.
<<< Carl Jung
All life has suffering, and so learning how to suffer well is key to mental health / living a good life.
[img[http://i.imgur.com/fMbmSpU.gif]]
[img[http://i.imgur.com/EQGeMsq.gif]]
<<<
Never trust a corporation to do a library's job.
<<<
from [[this article|https://medium.com/message/never-trust-a-corporation-to-do-a-librarys-job-f58db4673351?repost=HN2]] about Google and the Internet Archive
<<<
!! History of the College
The precursor of New St. Andrews was a [[reading list|New Saint Andrews: reading list]]. In the early 1980s, a few men of Christ Church in Moscow, Idaho, put together a list of classic books which they thought ought to be read by survivors of the government education system. They called this course of readings the "Free Academy of Foundations."
The reading list germinated the idea for a college. The name New St. Andrews was selected after its Scottish namesake, which had been instrumental in the progress of reformation in Scotland. For a number of years no degree program was offered, but in the mid-1980s numerous evening classes were held for adults who were not matriculating. The course offerings included Hebrew, Logic, Greek, and English grammar. In time the college came under the formal oversight of Christ Church.
In the fall of 1994, New St. Andrews opened her doors to four full-time students. The second year the enrollment of the college doubled, and in the third year twenty-six students were enrolled. In 1998, the College graduated its first class of two students. In May of 2002, the College conferred a degree upon its forty-first graduate. More than 121 full- and part-time students were enrolled in the fall of 2002, coming from 29 states and three Canadian provinces.
<<< New Saint Andrews website, June 2003
!! Mission and Objectives
<<<
New St. Andrews College's mission is to provide the highest quality undergraduate education in liberal arts and culture from a biblical worldview.
The College's primary objective for its students is to educate young Christian men and women broadly and deeply in the liberal arts from a distinctively Christian, Reformed perspective, to equip them for lives of faithful service to the Triune God and His kingdom, and to encourage the use of their gifts for the growth of Christian culture. The College expects its students to conduct themselves with all holiness and reverence in word, deed and attitude, to maintain sound doctrine, to nurture a reformational Christian culture, submitting to the Lordship of Christ and His Word in all areas of life, and to practice and preserve the highest standards of academic integrity.
The College's primary objective for its faculty is to provide excellent classroom instruction that broadens and deepens student understanding of the liberal arts, to offer a godly example of spiritual maturity, intellectual rigor, wise judgment, and personal integrity, and to engage in scholarly inquiry and creative activities applicable to the classroom and beyond. The College expects its faculty to teach and to engage in scholarly inquiry and creative work from a Reformed perspective in their respective fields of expertise, submitting all to the lordship of Christ and His Word, to practice and preserve the highest standards of academic integrity, and to disseminate the fruit of their studies and creative work in appropriate scholarly and publicly accessible venues.
The College's primary objective for its administration is to provide academic leadership for the faculty, students and the College as a whole, and to nurture godly personal relationships characterized by mutual submission, respect, and honor with and between the faculty and students. The College expects its administration to encourage an academic culture more familial than institutional, more personal than bureaucratic, more reformational than conformist, and more biblically faithful than submissive to the dominant secular academic paradigms.
<<< New Saint Andrews website, June 2003
!! What distinguishes New St. Andrews?
<<<
New St. Andrews offers a rigorous Christian liberal arts education in the Reformed tradition, but three things distinguish it from other Christian colleges. First, New St. Andrews is a classical Christian college, committed to the curriculum and pedagogy used for hundreds of years by faithful Christian educators—at least until the turn of the 20th century when many began to embrace the secular educational assumptions of Modernism. Second, New St. Andrews is more than an academic institution; it is part of a wider covenantal community that encourages intellectual integrity, independent student living (we’re opposed to dormitories), and personal involvement with and accountability to the local church and Christian community. And third, the College not only teaches students how to think Christianly about the world God made—and how to learn from books—but more importantly, how to live like Christians in a day when the antithesis between the City of Man and the City of God is increasingly blurred. The College isn’t just interested in making students think right thoughts; it seeks the paideia of the Lord (Eph. 6:4), where students can learn to live—body, mind, and soul—through faithful Christian enculturation in truth, beauty, and goodness.
<<< NSA website, June 2003
!!! Snapshot as of June 2003
<<<
Tuition (2003-2004):
$6,000 per year (if tuition agreement and deposit are received before June 1, 2003 and tuition is paid in full by July 1, 2003)
$6,400 per year (if tuition agreement and deposit are received before June 1, 2003 and tuition is paid in quarterly installments of $1,600)
$6,800 per year (if tuition agreement and
deposit are received after June 1, 2003 and tuition is paid in quarterly installments of $1,700)
Tuition rates are fixed for four consecutive years of enrollment from date of first payment.
Books (estimated): $800-1,000 per year
Faculty:
Dr. [[Roy Atwood]], Dean
Mr. [[Chris Schlect]], Registrar
Mr. [[Ben Merkle]], Director of Student Affairs
Dr. [[Peter Leithart]], Librarian
Mr. [[Douglas M. Jones, III|Doug Jones]], Chairman of the Board of Trustees
<<<
!!! Basic Four-Year Summary for Baccalaureate Degree in Liberal Arts and Culture (as of 2003)
[img[http://web.archive.org/web/20031002214406/http://nsa.edu/academics/images/BAschedule.gif]]
!!! Basic Two-Year Summary for Associate of Arts Degree in Liberal Arts and Culture (as of 2003)
[img[http://web.archive.org/web/20031002214406/http://nsa.edu/academics/images/AAschedule.gif]]
<<<
!! Learning wisdom while living in community
New Saint Andrews College encourages students to be active members of the wider local community. The College expects its students to be mature enough to live independently and it refuses to act in loco parentis . Thus, students are responsible for their own housing arrangements. In addition, the College encourages students to live as Christians in genuine community where they routinely encounter people of various ages, callings, and circumstances. This is why the College has no on-campus residence facilities, for such facilities tend to foster academic and youth subcultures segregated from the more balanced and mature local community.
New Saint Andrews rejects, on principle, college dormitory living. Dormitories dominate Christian and non-Christian student housing on virtually every college campus. But dorms, by their very nature, tend to breed immaturity, immorality, and irresponsibility. Despite claims to the contrary, no college can provide adequate supervision or accountability for dozens, sometimes hundreds of 18- to 21-year-olds living in the same space with other 20-somethings typically acting as the "residence advisors." This is consistent with the radically anti-Christian origin of modern college dormitories, dating from the early 20th century when the German Bauhaus movement swept Western architecture. Bauhaus architects quite deliberately applied their modernist-socialist vision to apartment complexes and college dormitories to create "living machines." In fact, Walter Gropius, the founder of the Bauhaus movement, invented the modern university dormitory at Bauhaus as a way of promoting communal living and reinforcing a revolutionary, socialist way of life. Sparing them the indignities of high ceilings and wide hallways and other trappings of the bourgeoisie, Gropius and the Bauhaus-inspired architects provided co-eds with low ceilings, narrow hallways, and the aesthetics of machinery. New Saint Andrews, by contrast, expects its students to live as faithful Christians in a way that recovers the beauty of genuine community.
<<< New Saint Andrews website, June 2003
<<<
New St. Andrews College has adopted the following list of readings as a requirement for the Bachelor of Arts degree in Liberal Arts and Culture. The College is committed to assigning each of these works throughout the various colloquia which are required for graduation. These particular works have been selected because, as a set, they adequately introduce to our students the basic cultural output of the West.
Of course, there are many other great works that are not required reading at New St. Andrews; these we hope our students will pursue after they graduate, for there is no end to a listing of great books, and learning is a lifelong activity. This is not a comprehensive list of all the readings assigned in our colloquia; our instructors assign many readings in addition to these for practical and pedagogical reasons.
<<< statement and list as of 2003
!!! THEOLOGY
* (Lordship) Anselm, selections
* Athanasius, On the Incarnation
* Augustine, City of God
* Augustine, Confessions
* Calvin, Institutes of the Christian Religion
* Irenaeus, Against Heresies
* Luther, Bondage of the Will
* (Principia) Luther, 1520 tracts
* New Testament
* Old Testament
* (History) St. Benedict, Rule
* (Traditio) Anselm, Proslogion and Monologion
* Aquinas, Selections from the Summa
!!! NATURAL SCIENCE
* (Lordship) Darwin, Origin of Species
* (Nat. Phil.) Euclid, Elements
* Newton, Principia (selections)
!!! SOCIAL & POLITICAL SCIENCE
* (Traditio) Adam Smith, Wealth of Nations
* Aristotle, Ethics and Politics
* Federalist and Anti-Federalist Papers
* Hobbes, Leviathan
* John of Salisbury, Policraticus
* Locke, On Civil Government
* Machiavelli, Prince
* Marsiglius de Padua, Defensor Pacis (selections)
* Marx, Das Capital or Communist Manifesto
* Plato, Republic
* Rousseau, Social Contract
* U.S. Constitution and Declaration of Independence
* Weber, Protestant Ethic
!!! HISTORY
* (History) Bede, Ecclesiastical History
* Herodotus, Histories
* Plutarch, select lives
* Thucydides, Peloponnesian War
* William of Malmesbury, Gesta Regum Anglorum or Henry of Huntington, Historia
Anglorum
!!! EPICS
* (Traditio) Beowulf
* Chaucer, Canterbury Tales
* Dante, Divine Comedy
* Homer, Iliad
* Homer, Odyssey
* Milton, Paradise Lost
* Ovid, Metamorphoses
* Spenser, Faerie Queene
* Vergil, Aeneid
!!! DRAMA
* (Traditio) Aeschylus, Oresteia
* Aristophanes, selections
* Euripides, selections
* Shakespeare, selections
* Sophocles, Theban plays
!!! NOVELS
* (Traditio) Austen, representative title
* Bunyan, Pilgrim's Progress
* Cervantes, Don Quixote
* Conrad, Heart of Darkness
* Defoe, Robinson Crusoe
* Dickens, representative title
* Dostoevsky, Brothers Karamazov
* Faulkner, The Sound and The Fury
* Goethe, Faust
* Melville, Moby Dick
!!! LETTERS
* (Rhetoric) Aristotle, On Rhetoric
* Plato, Gorgias or Phaedrus
* Pseudo-Cicero, Rhetorica ad Herennium or * Cicero, De Inventione
* Quintilian, Institutio Oratoria
* (Traditio) Aristotle, Poetics
* Montaigne, selections
* Plutarch, Moralia (selections)
!!! ART & ARCHITECTURE
* (Traditio) Palladio, The Four Books of Architecture
* Ruskin, The Seven Lamps of Architecture
* Suger, Abbot of St. Denis, On the Abbey of the Church of St. Denis and its Art Treasures
* Vitruvius, On Architecture
!!! PHILOSOPHY
* (Traditio) Aquinas, selections from Summa
* Aristotle, selections
* Berkeley, selections
* Boethius, Consolation of Philosophy
* Duns Scotus, selections
* Derrida, selections
* Descartes, Meditations
* Hume, selections
* Kant, selections
* Leibnitz, selections
* Locke, selections
* Nietzsche, Beyond Good and Evil
* Plato, selections
* Russell, selections
* Plotinus, selections
* William of Ockham, selections
* Wittgenstein, selections
<<<
!! Intercollegiate Athletics
Sorry, sports fans. Don't have any. Never will.
The good news is that the College does not engage in the restraint of the athletic trade by limiting how much money student athletes may earn. It also means few of our students get confused with minor league scholars from the NFL, NHL, or NBA (though we do have a bunch of really, really tall guys). It also puts the College ahead of most other schools in complying with the letter and spirit of Title IX by offering just as many intercollegiate sports and scholarships to women as we do to men and beasts. We don't even have annoyingly chirpy cheerleaders. Heck,we don't even have a mascot, politically incorrect or otherwise.
But just because we don't want to confuse NSA with the NCAA doesn't mean we're Gnostics. After all, as someone once said, bodily exercise does profit a little bit. So the College does encourage students to exercise their bodies as well as their little gray cells. Students have organized various exercise regimens, intramural sporting events, and club activities (such as boxing and basketball) that get them out of their chairs, away from their books, and on the road toward a healthier, happier, albeit sweatier future.
<<< New Saint Andrews website, June 2004
<<<
Ben Merkle: If you can think of the flinch of the mind: when you throw a ball at someone, some people jump back and some people reach forward to catch it. We want to shape graduates who's minds flinch in terms of cultural influence. When they hear an argument that needs to be engaged, we want people who jump towards it, who go after it.... and so one of the things we want our students to be able to experience is athletic competition, so we've introduced rugby competition. We want to have our students, especially our young men, be in moments where they have to look somebody in the eye who's opposite them and get ready to get tough with them. Get ready to hit them, get ready to be hit, to take a big hit and get back up without complaining.
<<< New Saint Andrews [[promotional video, Oct 2013|https://www.youtube.com/watch?v=MhmLPYYDye0&sns=tw]]
These quotations are not juxtaposed to show contradiction - this is a consistent evolution. I listened to a conversational 'debate' between N.D. Wilson and Roy Atwood around 2006 wherein Nate advocated for school-sponsored athletic competition and Dr. Atwood argued against.
<<<
The research I found on this topic spurred me to give the nicotine gums a go. I have found a noticeable difference in my level of motivation, attention, processing speed and productivity using nicotine, which has been of use for mentally demanding activities (such as writing this article :p). On the other hand, not everyone will love the feeling of having a wave of adrenaline hit your system; I certainly have found it a bit intense at times when I haven’t got my dose right.
<<< http://www.prymd.com/blog/benefits-of-nicotine/
Amusing from the 'life hacks' POV, article by a self-described "210 pound vegetarian who is all about breaking the mould" which is so life-hacksy I love it.
The National Institute of Standards and Testing - one of my favorite government institutions
[img[http://40.media.tumblr.com/3b12fc26af3b089c86647037d94df566/tumblr_njor887JhK1qz7fado1_1280.jpg]]
<<<
I am almost serious when I argue that a principled conservative is one who happily admits that they do not have any principles. They do not wish to impose a worldview on anyone and are quite happy to take the world as it is. Conservatives know that there can be no consensus in society but merely the accommodation of difference. To impose one view at the expense of all others has little to do with truth, but is rather merely an expression of power. Indeed, it is worse: it is power without authority, which can only come when power has a legitimate basis.
Conservatives are people who wish to protect things. They recognise what is valuable in their culture and their daily lives and work to sustain these. This is not about principles, but is a matter of reaction. It is a disposition based on vigilance and on an awareness of the dangers posed by others who wish to sacrifice the present for a future only they can imagine. When you come across those with such principles, sit them down and buy them a drink. It will keep them off their feet and off our backs.
<<< Peter King, from the book Here and Now
<<<
There is no less holiness at this time—as you are reading this—than there was on the day the Red Sea parted, or that day in the 30th year, in the 4th month, on the 5th day of the month as Ezekiel was a captive by the river Cheban, when the heavens opened and he saw visions of God.
<<< Annie Dillard, //For the Time Being//
<<<
One thing I love about marriage (and I love a lot of things about marriage) is that you can have a bad day or even a bad few years, full of doubt and fights and confusion and storming out of the house. But as long as you don’t get divorced, you are no less married than couples who never have a hint of trouble (I am told such people exist).
You can be bad at a religion and still be 100 percent that religion. Just because you take the Lord’s name in vain doesn’t make you suddenly a non-Christian. You can be a sinner. In fact, I think it’s good theology that no matter how hard you try, you are sure to be a sinner, just as you are sure to be lousy, at least sometimes, at being married. There is perfection only in death.
It is easy for people who have never tried to do anything as strange and difficult as being married to say marriage doesn’t matter, or to condemn those who fail at it, or to mock those who even try. But there is so much beauty in the trying, and in the failing, and in the trying again. Peter renounced Jesus three times before the cock crowed. And yet, he was the rock upon whom Christ built his church.
At weddings, I do not contradict my beaming newlywed friends when they talk about how they will gracefully succeed where nearly everyone in human history has floundered. I only wish I could tell them they will suffer occasionally in this marriage — and not only sitcom-grade squabbles, but possibly even dark-night-of-the-soul despair.
That doesn’t mean they are doomed to divorce, just that it’s unlikely they will be each other’s best friend every single minute forever. And that while it’s good to aim high, it’s quite probable they will let each other down many times in ways both petty and profound that in this blissful moment they can’t even fathom.
But I would go on to say (had I not by that point been thrown out of the banquet hall): Epic failure is part of being human, and it’s definitely part of being married. It’s part of what being alive means, occasionally screwing up in expensive ways. And that’s part of what marriage means, sometimes hating this other person but staying together because you promised you would. And then, days or weeks later, waking up and loving him again, loving him still.
<<< Ada Calhoun, [[The Wedding Toast I'll Never Give|http://www.nytimes.com/2015/07/19/fashion/the-wedding-toast-ill-never-give.html]]
<<<
...there was no sense of diversity or culture [in Moscow, ID].
<<< Solange Knowles
[img[http://www.vogue.com/wp-content/uploads/2014/11/16/solange-knowles-alan-ferguson-wedding-dress-4.jpg]]
http://ourincrediblejourney.tumblr.com/
Never, ever, ever.
Maybe get bought by Wordpress. Maybe.
[[investor syndrome]]
<<<
Christ was crucified because he would have nothing to do with the crowd (even though he addressed himself to all). He did not want to form a party, an interest group, or a mass movement, but wanted to be what he was, the truth, which is related to the single individual. Therefore everyone who will genuinely serve the truth is by that very fact a martyr. To win a crowd is no art; for that only untruth is needed, nonsense, and a little knowledge of human passions. But no witness to the truth dares to get involved with the crowd.
<<< Søren Kierkegaard, Provocations
[img[http://static.messynessychic.com/wp-content/uploads/2015/10/kronental13.jpg]]
Ricardo Bofill's utopian community in France.
He's described it as a failure in later interviews, the hope was socially diverse communities but despite the stark beauty of the pictures locals describe it as a terrifying and inhuman place at night. It's been saved from demolition perhaps solely because of the protestations of its aging residents.
[img[http://static.messynessychic.com/wp-content/uploads/2015/10/kronental3.jpg]]
[img[http://static.messynessychic.com/wp-content/uploads/2015/10/kronental.jpg]]
Adam Savage of Mythbusters:
[img[http://pbs.twimg.com/media/Bwtxh5ECEAENtmM.jpg]]
<<<
Nose piercings are not sinful. They're just pretty decent indicators of a college student's spiritual IQ.
<<< Toby Sumpter, 12/5/2014
I don't entirely know what to do with this. It feels like an instance of pithy cultural criticism overtaking pastoral concern. I asked Toby about this and he [[appealed to the Proverbs|http://www.tobyjsumpter.com/wisdom-folly-piercings-lemmings/]] and the importance of noticing patterns. I'm still stumped, so it goes in the //[[yikes]]// file.
<<<
Too much man, not enough shirt.
<<< Kanaan T.
<<<
“By the will of God some men are born poetical. Of these some make themselves practical poets, others are made poets by lapse of time who were hardly recognised as such. Particularly this has been the case with the translators of the Bible. They translated into the language of their age; then the years began to corrupt that language as spoken, and to add grey lichen to the translation; until the moderns who use the corrupted tongue marvel at the poetry of the old words. When new they were not more than half so poetical. So that Coverdale, Tyndale, and the rest of them are as ghosts what they never were in the flesh.”
<<< Thomas Hardy (via David Mills, via Wes Hill).
<<<
Jesus concerned himself not only with people’s souls but with their bodies as well. He made the blind see, the lame walk, and the deaf hear. And he prophesied a kingdom, a rule of God, that will overturn every unjust condition in the present order of the world, and make it new. To acknowledge this and to live according to it – this is God’s command.
<<< Eberhard Arnold, Salt and Light
This relates to sexuality, as well
<<<
Nothing is so silly as the expression of a man who is being complimented.
<<< André Gide
<<<
I am a Christian; I consider nothing that is Christian to be foreign to me.
<<< Philip Schaff
I did not realize for many years that this is after the playwright Terence, who came to Rome as a slave. In one of his plays a character says this to explain what cosmopolitanism means:
<<<
"Homo sum, humani nihil alienum a me puto."
"I’m a human being, I don’t think anything human is foreign to me."
<<<
[img[http://i.imgur.com/68mw853.jpg]]
<<<
How has she become one of those people who wears yoga pants all day? She used to make fun of those people. With their happiness maps and their gratitude journals and their bags made out of recycled tire treads. But now it seems possible that the truth about getting older is that there are fewer and fewer things to make fun of until finally there is nothing you are sure you will never be.
<<< Jenny Offill, Dept. Of Speculation
[img[http://i.imgur.com/D5AoRNi.jpg]]
By the numinous I'm specifically referring to transcendent experiences that have a particular aesthetic quality.
For instance: Sheldon Vanauken's experiences, which I should find in that book and copy here
<<<
No one actually taught me how to do these things or anything else. Not formally. The chef and commis had me stand and watch as they worked…my education as an apprentice was strictly a process of observation and imitation….Recipes were immaterial and in any case nonexistent; he wanted me to learn how to cook by using my senses rather than by following written or verbal instructions. Sight, feel, hearing, and smell taught me about food.
...
The days of the traditional French apprenticeship were now long gone even in France, but I felt the urge to pass the craft along to a new generation of aspiring professional cooks. I felt I owed a debt to the trade…I don’t want to romanticize my training. It was an artifact of a different era, and although it worked then, it was unacceptable in today’s fast-paced world. But there is something to be said for carefully learning techniques and absorbing long-established culinary traditions. If nothing else, it gives a young cook perspective.
<<< Jacques Pepin, The Apprentice: My Life in the Kitchen
<<<
The architecture of our time is dominated by obsessively self-referential, isolated
projects. Such projects aggrandize the individual interests of their clients. They
highlight the formal language and signature of their authors. They endeavor to
express in stylistic terms the mood of the cultural instant when they were designed
and built...
We are left with a cultural and physical landscape of unprecedented confusion,
monotony, and fragility...
In contrast to an Architecture of Time, New Urbanist architecture is an
Architecture of Place … New Urbanist architecture strives to evolve by exercising
critical design choices across time.
...
A genuine architectural culture can only exist within the accumulated experience afforded by historical continuity. For architecture and urbanism to prosper as
disciplines, they need the wisdom and guidance of enduring values, traditions,
methods, and ideas.
<<< The Charter
at its most gloriously anti-modern grumpiest.
<<<
He has endeavoured to prevent the Population of these States; for that Purpose obstructing the Laws for Naturalization of Foreigners... refusing to pass others to encourage their Migrations hither, and raising the Conditions of new Appropriations of Lands.
<<<
from the Declaration of Independence, our complaint against the King that he was keeping people from coming to the United States and becoming citizens.
[img[http://i.imgur.com/rOEDhYq.gif]]
[img[http://i.imgur.com/kGLgIzk.png]]
<<<
I want to do good in the world not just by sitting at my desk writing…. I devoutly believe old men should be explorers. I want to see different geographies, meet different people and who knows what effect that might have on my own poetry. If I were to stay here in an unchanging lifestyle… I might have nothing to write about.
<<< Sir Andrew Motion, 10-year poet laureate, upon his exit to America
quoting Four Quartets: “Old men ought to be explorers / Here or there does not matter / We must be still and still moving / Into another intensity”
<<<
Omnia Omnibus Ubique—All Things for All People Everywhere
<<< Harrod's of London motto
[img[http://s3-eu-west-1.amazonaws.com/lookandlearn-preview/XJ/XJ142/XJ142256.jpg]]
''On Shaving a Beard''
an essay by [[Phillip Lopate]], from //Against Joie de Vivre//
I have just made a change that feels as dramatic, for the moment,
as switching from Democrat to Republican. I have shaved off my
beard. Actually I clipped it away with scissors first, the I went in for
the kill with a safety razor. The first snip is the most tentative: you
can still allow yourself the fantasy that you are only shaping and trimming,
perhaps a raffish Vandyke will emerge. Then comes the moment
when you make a serious gash in the carpet. You rub the neighboring
whiskers over the patch to see if it can still be covered, but the
die is cast, and with a certain glee the energy turns demolitionary.
As I cut away the clumps of darkness, a moon rises out of my
face. It lights up the old canyon line of the jawbone. I am getting my
face back. I lather up again and again and shave away the bristles until
the skin is smooth as a newborn's-the red irritation spots where the
skin has reacted to the unaccustomed blade seem a sort of diaper rash.
When I am done, I look in the glass and my face itself is like a mirror,
so polished and empty are the cheeks. I feel a little sorry for the tender
boy-man reflected before me, his helpless features open to assault. The
unguarded vacancy of that face! Now I will have to come to terms
again with the weak chin, the domineering nose, the thin, sarcastic-pleading
lips.
I look down at the reddish-gray curls in the sink. The men in my
family have always been proud that our beards grew in red, though the tops of our heads were black. It seems an absurd triviality for Nature
to waste a gene on, but it is one of the most tangible ways that my father
has felt united to his sons and we to him. A momentary regret
passes through me.
Never mind: I have taken an action. I grew the beard originally
because I had been restless and dissatisfied with myself; I shaved it for
the same reason. How few cut-rate stratagems there are to better our
mood; you can take a trip, go shopping, change your hair, see every
movie in town-and the list is exhausted. Now I will have to be contented
for a while. It is summer, the wrong time to start growing a
beard again.
Because of the hot weather, I also have a ready-made excuse for
anyone who might ask why I gave up my beard. I know that the real
reasons are more murky-they go to the heart of my insecurities as a
man and my envy of others of my sex. When I meet a man I admire
and he is wearing a beard, I immediately think about emulating him. The tribe of bearded men have a patriarchal firmness, a rabbinical
kindly wisdom in their faces. They strike me as good providers. They
resemble trees (their beards are nests) or tree cutters. In any case, mentally
I place them in the forest, with flannel shirt and axe.
So I join this fraternity, and start to collect the equivalent of approving winks from other beardies, fellow conspirators in the League
of Hirsutes. It feels good to be taken for an ancestor or pioneer. Then
the novelty begins to wear off, the beard starts to itch, and I realize
that inside I am no more rooted or masculinely capable than before. I
start to envy clean-shaven men-their frank, open, attractively "vulnerable"
faces. Some women will trust you more if you are cleanshaven;
they profess to see beards as Mephistophelian masks, hiding
the emotions. Early in the relationship, this may be a good reason to
keep a beard. At a later point shaving it off becomes tantamount to a
giddy declaration of love.
Other women, on the other hand, will tell you that a kiss without facial hair is like a roast beef sandwich without mustard. They
consider beards a mark of virility, trustworthiness, and bohemian sensitivity. Obviously,
the image systems break down in the face of individual tastes. Nevertheless, it is still possible to say that beards connote
freedom, telling the boss off, an attitude of "gone fishing"; men
often grow them on vacations, or after being booted from the White
House staff, like Ehrlichman. (Even Admiral Poindexter grew a mustache.)
Clean-shavenness, on the other hand, implies a subscription to
the rules of society.
A major division in the bearded kingdom exists between those
who revel in no longer having to bother with maintenance, letting Nature
have its luxuriant bushy way, and those who continue to keep a
razor nearby, prudently pruning or shaving the cheeks every few days. A well-clipped beard on a kindly man looks as proper as a well-kept
lawn on Sunday. On the other hand, there are beards with a glint of
cruelty-beards trimmed to Caligulaesque exactitude. I had thought
to be one of the pruners, but went too far, lacking the razor-sharp
finesse.
Having shaved the beard off, I take my first cautious steps into
society. I am dreading those who will ask why I did it, then settle back
for a long soul-bearing explanation. What will I reply to those who are
quick to say, "I liked you better the other way"? My impulse is to step
on their toes, but we must not punish honesty. Once, when I was
teaching in P.S. 90, I shaved off my beard, and the children, who were
familiar with me as a hairy man, were so outraged that all through the
first day of the new regime, they ran alongside and punched me. Children
are good at expressing a sense of betrayal at change.
Those who are bearded for the long haul either tend to view the
new me with something like a Mennonite's disapproval at backsliding,
or are relieved that one who had appeared a member of the brotherhood
was exposed in the nick of time as turncoat. A few friends,
who pride themselves on their observational powers, make helpful
comments like: You look fatter. You look thinner. You look younger.
You look older. The majority say nothing. At first I think they are being
polite, not meaning to broach a subject that might make me self-conscious.
Then, out of frustration at their not having noticed, I finally
call my naked face to their attention. They say: "I //thought// there
was something different about you but I couldn't put my finger on it.
Besides, you keep going back and forth, Lopate, who can keep up?"
<<<
The best work that anybody ever writes is the work that is on the verge of embarrassing him, always.
<<< Arthur Miller
<<<
Every man gets one good cry in their life. You've chosen wisely.
<<< 30 Rock
I need to find the correct quote.
<<<
But actually, the gender gap in crying seems to be a recent development. Historical and literary evidence suggests that, in the past, not only did men cry in public, but no one saw it as feminine or shameful. In fact, male weeping was regarded as normal in almost every part of the world for most of recorded history.
<<< [[Man, weeping|http://aeon.co/magazine/society/is-there-anything-wrong-with-men-who-cry/]]
<<<
You only have to get one good idea every year or so.
<<< Warren Buffett
A posited one-question interview. I got it from [[Bob Baxley's blog|http://baxleydesign.com/the-one-question-interview/]]
<<<
“Let’s imagine for a moment that you get this job and choose to join us.
The one thing I am absolutely certain you will do is the one thing that everyone in every job eventually does. You will quit.
So now imagine that you and I are back in this very room some three to five years from now only instead of an interview, you’re telling me that you’re leaving. We’ll be sad and we’ll be bummed but we’ll both know it was time and that everything will be okay.
At some point after that, you will sit down to update your ~LinkedIn profile with three to five bullet points encapsulating your experiences and accomplishments here.
What are those bullet points going to say?”
<<<
<<<
Usually an historic theater is still alive because one person fell in love, and tried to transfer that love to an entire community.
<<< Ken Stein, executive director of the League of Historic American Theatres, an advocacy group that provides resources and education to theater operators
<<<
Only the guy who isn't rowing has time to rock the boat.
<<< Jean-Paul Sartre
<<<
Only the obedient believe. If we are to believe, we must obey a concrete command. Without this preliminary step of obedience, our faith will only be pious humbug, and lead us to the grace which is not costly. Everything depends on the first step. It has a unique quality of its own. The first step of obedience makes Peter leave his nets, and later get out of the ship; it calls upon the young man to leave his riches. Only this new existence, created through obedience, can make faith possible.
<<< Dietrich Bonhoeffer, The Cost of Discipleship
I'm trying to dress in a 'haberdashery' style - more tailored clothing, basically. But it's not quite the same as 'business casual' - haberdashery implies that there's still an expression of personality, but it happens within a more structured framework.
This is a very half-baked thesis, but I think it might be possible for greater self-expression if one is operating within a a more highly defined mode of dress. Tailored clothing has hundreds of years of meaning behind it (such that (nearly) all of its functional purpose is completely obscured), which makes small variations more noticable - the difference between a cravat and a tie, for instance. One might wear a cravat solely for fashion, but one could also wear it in a way that has meaning, even if people can't specifically identify what that meaning is.
In any case, I'm trying to post my efforts daily, on Instagram and then later on Pinterest. If you'd like to follow along:
<a data-pin-do="embedBoard" href="https://www.pinterest.com/austinstorm/outfit-o-the-day/"data-pin-scale-width="80" data-pin-scale-height="200" data-pin-board-width="400"> Follow Austin's board Outfit O' the Day on Pinterest.</a><!-- Please call pinit.js only once per page --><script type="text/javascript" async src="//assets.pinterest.com/js/pinit.js"></script>
[[Open Food Facts|http://us.openfoodfacts.org/]]
Project by a food blogger to document food ingredient / nutrition information for search and tracking purposes.
Experimental API, lots of apps. Seems like there are a lot of people in this space, with commercially motivated food databases.
<<<
"""Open the Blind
//by Kenneth Rexroth//
Nests in the eaves stir in the dawn
Ephemeral as our peace
Morning prayer
Grace before food
I understand
The endless sky the small earth
The shadow cone
Your shining
Lips and eyes
Your thighs drenched with the sea
A telescope full of fireflies
Innumerable nebulae all departing
Ten billion years before we ever met
"""
<<<
<<<
It is a profoundly erroneous truism, repeated by all copy-books and by eminent people when they are making speeches, that we should cultivate the habit of thinking of what we are doing. The precise opposite is the case. Civilization advances by extending the number of important operations which we can perform without thinking about them. Operations of thought are like cavalry charges in a battle — they are strictly limited in number, they require fresh horses, and must only be made at decisive moments.
<<< Alfred North Whitehead, on the virtues of not thinking
<<<
There is little we can point to in our lives as deserving anything but God’s wrath. Our best moments have been mostly grotesque parodies. Our best loves have been almost always blurred with selfishness and deceit. But there is something to which we can point. Not anything that we ever did or were, but something that was done for us by another. Not our own lives, but the life of one who died in our behalf and yet is still alive. This is our only glory and our only hope. And the sound that it makes is the sound of excitement and gladness and laughter that floats through the night air from a great banquet.
<<< Frederick Buechner, The Magnificent Defeat
<<<
To recover from our disease of limitlessness, we will have to give up the idea that we have a right to be godlike animals, that we are potentially omniscient and omnipotent, ready to discover ‘the secret of the universe.’ We will have to start over, with a different and much older premise: the naturalness and, for creatures of limited intelligence, the necessity, of limits. We must learn again to ask how we can make the most of what we are, what we have, what we have been given.
<<< Wendell Berry, [[Faustian Economics|http://harpers.org/archive/2008/05/faustian-economics/]]
<<<
"""Our father who art in Heaven
can lick your father
who art in Heaven."""
<<< William Stafford, from "Religion Back Home"
<iframe width="420" height="315" src="https://www.youtube.com/embed/uVfz74FayzM" frameborder="0" allowfullscreen></iframe>
<<<
"""There is no difference in what we're doing in here
That doesn't show up as bigger symptoms out there
So why spend all our time in dressing our bandages
When we've the ultimate key to the cause right here, our underneath"""
<<< Alanis Morissette, Underneath
<<<
If there’s anything I’ve learned from seven years in ecumenism, it’s that our walls are not nearly as impermeable as we think. For good or for ill, we are always interacting with each other and gaging our own beliefs and statements against those of other Christians.
<<< Sarah Hinlicky Wilson
<<<
The message this article, and all others in modern startup media, sends to founders is that unless you’re raising significant stockpiles of cash and giving up ever increasing amounts of your business to be controlled by outside investors, you’re not going big.
This is a dubious narrative and we’re seeing it have an ever increasing negative impact on the startup community and the vast majority of founders in it.
Big rounds of funding make for great headlines and driving clicks. But most of this capital, and these headlines, are having a dangerous effect on founders and the companies they’re building. It would be no understatement to say that the vast majority of the capital being raised today is done so out of vanity or fear, not need.
<<< Bryce Roberts, [[The Biggest Misunderstanding About Indie.vc|http://bryce.vc/post/111385165695/the-biggest-misunderstanding-about-indie-vc]]
http://www.outpan.com/
I haven't tested the site extensively, but UPC databases are notoriously incomplete - there's no central place to pull from, and there are so. many.
<<<
Called outsider art by some, folk art environments by others, self-made worlds are generally the works of individuals not trained in the formal arts (but by no means untrained in their own fields), using nontraditional materials and building methods. "While large-scale public works can take years, even decades, to realize, some selfmade worlds, once started, often demand a lifetime. There is no budget. There is no deadline. The work is seldom viewed as finished by the person wielding the welding wand, and expansion stops only when the maker is unable to continue. Driven by an internal creative force, they aren’t worried about completing something by a certain date; they’re worried about running out of time to do what they want to do. They use every moment to continue, not to complete.
<<< Forecast Public Art
<<<
Preaching the gospel means announcing Jesus as Lord of the world; and, unless we are prepared to contradict ourselves with every breath we take, we cannot make that announcement without seeking to bring that lordship to bear over every aspect of the world.
<<< N.T. Wright, What Saint Paul Really Said
<<<
At base, much of the economic meltdown of 2008 was caused by overconfidence and greed, two key symptoms of narcissism. Lenders, drawn by the lure of high fees, were overconfident and took the risk of writing mortgages too expensive for people to pay, and some homebuyers were overconfident in taking out those mortgages—plus, they really wanted that ~McMansion. Builders borrowed big and constructed acres and acres of subdivisions and condominiums, many of which now sit empty. Investment banks borrowed 30 to 40 times their available capital, using mortgages 10 times the size of homeowners’ incomes as the supposedly reliable collateral. Everyone was on a narcissistic risk-taking binge and failed to anticipate the downside.
<<< [[The Narcissism Epidemic|http://www.amazon.com/dp/B00256Z3AY/ref=r_soa_w_d]]
Take care, always take care.
I must confess, this is a secondary concern of the project. I honestly don't mind centralized web services and the sacrifice (and I recognize that it's a huge sacrifice) of control / agency for convenience.
http://techcrunch.com/2014/05/31/you-have-the-right-to-manage-your-own-online-persona/
Advertisers own so much of my Internet life, and I'm largely OK with that.
But I will always have my personal domain, and as you can see I'm running bleeding edge, esoteric software to power it.
In the context of BAHKP, ownership of one's data (in this case it would be the 'annotations' to commonly stored WEMI nodes) could be more of a strategy. It's an approach that's already launched a thousand mediocre Kickstarter campaigns - social networks and cloud storage &cet.
I think the Wordpress approach is best - [[.org/.com]], you can store your data on your domain or on a hosted service.
<<<
And finally, be weird. That will probably be easy for some of you. But remember each Ascension Day, the anniversary of our Last Day at NSA, that what seems weird is sometimes the most important and necessary and glorious thing of all.
When everyone else is taking the easy road to success or fame, be weird by choosing a more faithful direction.
When everyone else is camping only where it is safe, and comfortable, and smugly self-satisfied, then be weird and pack up your tent and follow the path Abraham took.
Go where there is the greatest need, rather than where you can make the most money.
Go where your gifts and abilities can best serve the least in Christ’s Kingdom, rather than producing one more widget for some godless corporation.
And be shapers, not consumers of culture—for Christ’s sake.
<<< Dr. Roy Atwood, from his [[final address to NSA|https://royatwoodonhighered.wordpress.com/2015/05/16/charge-to-the-nsa-class-of-2015/]]
n. a manuscript on which two or more successive texts have been written, each one being erased to make room for the next
But in common usage, something one can easily bring one's own interpretation to. Something recognizable but easily open to a range of interpretations.
<<<
Paradox has been defined as "Truth standing on her head to get attention."
<<< G.K. Chesterton, 'When Doctors Agree'
The full quotation:
<<<
Paradox has been defined as "Truth standing on her head to get attention." Paradox has been defended; on the ground that so many fashionable fallacies still stand firmly on their feet, because they have no heads to stand on. But it must be admitted that writers, like other mendicants and mountebanks, frequently do try to attract attention. They set out conspicuously, in a single line in a play, or at the head or tail of a paragraph, remarks of this challenging kind; as when Mr. Bernard Shaw wrote: "The Golden Rule is that there is no Golden Rule"; or Oscar Wilde observed: "I can resist everything except temptation"; or a duller scribe (not to be named with these and now doing penance for his earlier vices in the nobler toil of celebrating the virtues of Mr. Pond) said in defence of hobbies and amateurs and general duffers like himself: "If a thing is worth doing, it is [[worth doing badly]]." To these things do writers sink; and then the critics tell them that they "talk for effect"; and then the writers answer: "What the devil else should we talk for? Ineffectualness?"
<<<
<<<
We are all Pascal now. Pascal seems a man moving about town, going out to lunch, noticing the way a man flirts with a woman, noticing the changes in clothing trends, then returning home to jot down his thoughts before hurrying off to some other appointment. Pascal represents a quiet, discerning eye that roves about the city, about the bar, about the nave, looking for discrepancies, idiosyncrasies, gems of despair or joy, then intuiting their place within the whole fabric of the society, the world.
<<< Gibbs describing Pascal
https://www.circeinstitute.org/blog/blaise-pascal-invented-facebook
[img[http://i.imgur.com/bl2Ja1V.jpg]]
<<<
Patriotism is your conviction that this country is superior to all other countries because you were born in it.
<<< George Bernard Shaw
I love collections of patterns.
The original, of course, is [[A Pattern Language|https://www.patternlanguage.com/]], a collection of architectural and urban planning patterns.
[[Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman|http://chimera.labs.oreilly.com/books/1234000001813/index.html]]
[[Wikipatterns|http://stewartmader.com/wikipatterns/]] - cultivating a community around online collaboration tools
This feels like the beginning of an interesting pattern language: [[Deconcentration of Attention: Addressing the Complexity of Software Engineering|http://deconcentration-of-attention.com/]]
I think [[Finite and Infinite Games|https://en.wikipedia.org/wiki/Finite_and_Infinite_Games]] is a kind of metaphysical pattern language.
<<<
You know, when you watch TV shows, it doesn't matter what it is, but people on TV shows, mostly, their jobs really matter to them. It doesn't matter how much they work. There's no complaining to the union rep. They really want to protect the President or go find the serial killer or whatever it is, whereas most people in most jobs at most companies in most places in North America kind of don't give a crap about their job that much. When it's time to go home, they'll go home. I'm not advocating that people should work insane hours, but I do think people should care about what they're doing.
<<< Stewart Butterfield
<<<
By sharing your own stories, you’re essentially performing a kind of activism that’s very important…by sharing things that are close to you, you will connect to other people who feel alone in the world.
<<< Lena Dunham
<<<
We must picture hell as a state where everyone is perpetually concerned about his own dignity and advancement and where everyone has a grievance and where everyone lives with the deadly serious passions of envy, self-importance, and resentment.
<<< C.S. Lewis, Screwtape Letters
<iframe width="420" height="315" src="https://www.youtube.com/embed/2qHv4yh4R9c?rel=0" frameborder="0" allowfullscreen></iframe>
<<<
“Personalize your sympathies; depersonalize your antipathies.”
<<< W.R. Inge
This is William Cohen summarizing Peter Drucker from 'The Practical Drucker':
<<<
Drucker defended perceived high executive salaries in his earlier writings. He knew how hard executives had to work to reach the pinnacle of their careers.
However, skyrocketing executive salaries caused him to drastically alter his opinion. He said executive salaries at the top had clearly become excessive and that the ratios of compensation — top managers in relation to lowest paid workers — were the highest in the world. Moreover this income difference wasn’t slight — it differed by magnitudes.
Drucker felt that this was morally wrong, and that we as a nation would end up paying a tremendous price for this. Indeed, in 2001, the ratio of average US CEO compensation to average pay of a non management employee hit a high of 525 to 1. At that point, Drucker recommended a ratio of no more than 20 to 1.
Interestingly, Drucker drew a parallel between high executive salaries and the demands of unions for more and more benefits without increases in productivity. He predicted we would pay a terrible price for these examples of gluttony from both management and labor. “It is never pleasant to watch hogs gorge,” he said. In fact, we have been paying this price for several years.
<<<
<<<
So Christians who live in subsidized housing are part of the problem. Christians who use federal money to get their free education are part of the problem. Christians who get on Medicare so they can ding the taxpayers if anything goes wrong with their hobby of homebirthing are part of the problem. Christians on food stamps are part of the problem. Christians who use tax money to fund their mercy ministries are part of the problem. Christians who think that their health care would be more affordable for them if I paid for it are part of the problem. And just to anticipate self-serving objections, Christians who drive on roads built by the government are not part of the problem.
Those Christians who are just one more piglet scrapping for a federal teat are not going to be in the [[vanguard of reformation|vanguard of the reformation]].
<<< Doug Wilson, [[Just One More Piglet|http://dougwils.com/s7-engaging-the-culture/just-one-more-piglet.html]]
A term coined by Floyd Allport a century ago to describe what appears to be rapid shifts in public opinion. Basically "everyone wants X but thinks that nobody else does. Then some outside factor makes it possible for people to choose X, and everyone does. Everyone is surprised – “Gee, I thought all you guys wanted Y, not X .” It looks like a rapid change in opinion, but it’s not."
Changes in smoking laws, the NYC pooper-scooper law, and the sudden drop of Confederate battle flags from Wal*Mart, Sears, Target, and NASCAR (!).
Favorite poems and commonplaces about poetry:
//All <$count filter="[tag[poetry]]"></$count> entries, most recent first://
<$list filter="[tag[poetry]] +[!sort[modified]]">
<div class="tc-menu-list-item">
<$link to={{!!title}}><$view field="title"/></$link>
</div>
</$list>
<<<
Josh Duggar grew up in a home that was close to Bill Gothard. Gothard had to resign from his ministry because he fondled at least 32 girls. The Duggars were also connected with Doug Phillips, who was forced from his ministry after being outed as a sexual predator. The pastor of the Duggars' church, the man who gave Mrs. Duggar her Mother of the Year award, resigned after a sex scandal. The highway patrolman, a family friend and an elder in a church connected to the Duggars' religious circles, who was the first law enforcement person Jim Bob Duggar reported Josh's issues to, is now serving a 56 year prison sentence for child porn. Josh Duggar grew up in a home that revered men in leadership who have turned out to be sexual abusers. One way or another, Josh Duggar did to his sisters what he knew (intuitively or directly) to do.
<<<
No interest in reading about the situation, everyone is sharpening their pitchforks. They won't rest until everyone is destroyed, including the victims. But I had never put together all these connections, until this [[link|http://theochlophobist.blogspot.com/2015/05/arkansans-oh-my-poor-people.html]].
[[Doug Wilson]] views sexual issues as the canary in the coalmine of our culture:
<<<
Our culture’s wholesale abandonment of biblical ethics in matters of sexuality — what I have recently called pomosexuality — is the direct and immediate result of a failure of the Church to proclaim and live out life in Christ, life in the gospel, life in the triune God.... if we do not exhibit a fierce and open hostility to every form of pomosexuality, we do not understand the Trinity.
<<< Doug Wilson, [[Why Sexual Issues Are To Be Front and Center|http://dougwils.com/s7-engaging-the-culture/why-sexual-issues-are-to-be-front-and-center.html]]
The term is also the desire to identify as 'pre-modern', rejecting postmodernity AND modernity in a way that feels awfully postmodern to me.
<<<
When you fight porn you fight global capitalism. The venture capitalists, the banks, the credit card companies are all in this feeding chain. This is why you never see anti-porn stories. The media is implicated. It is financially in bed with these companies. Porn is part of this. Porn tells us we have nothing left as human beings—boundaries, integrity, desire, creativity and authenticity. Women are reduced to three orifices and two hands. Porn is woven into the corporate destruction of intimacy and connectedness, and this includes connectedness to the earth. If we were a society where we were whole, connected human beings in real communities, then we would not be able to look at porn. We would not be able to watch another human being tortured.
...
If you are going to give a tiny percent of the world the vast majority of the goodies, you better make sure you have a good ideological system in place that legitimizes why everyone else is suffering economically. This is what porn does. Porn tells you that material inequality between women and men is not the result of an economic system. It is biologically based. And women, being whores and bitches and only good for sex, don’t deserve full equality. Porn is the ideological mouthpiece that legitimizes our material system of inequality. Porn is to patriarchy what the media is to capitalism.
<<< Gail Dines
<<<
Pornography is what the end of the world looks like.
<<< Robert Jensen
Quoted by Chris Hedges as the title of his [[review of Fifty Shades of Grey|http://www.truthdig.com/report/item/pornography_is_what_the_end_of_the_world_looks_like_20150215]]:
<<<
“Fifty Shades of Grey,” the book and the movie, is a celebration of the sadism that dominates nearly every aspect of American culture and lies at the core of pornography and global capitalism. It glorifies our dehumanization of women. It champions a world devoid of compassion, empathy and love. It eroticizes hypermasculine power that carries out the abuse, degradation, humiliation and torture of women whose personalities have been removed, whose only desire is to debase themselves in the service of male lust. The film, like “American Sniper,” unquestioningly accepts a predatory world where the weak and the vulnerable are objects to exploit while the powerful are narcissistic and violent demigods. It blesses this capitalist hell as natural and good...
There are few people on the left who grasp the immense danger of allowing pornography to replace intimacy, sex and love. Much of the left believes that pornography is about free speech, as if it is unacceptable to financially exploit and physically abuse a woman in a sweatshop in China but acceptable to do so on the set of a porn film, as if torture is wrong in Abu Ghraib, where prisoners were sexually humiliated and abused as if they were on a porn set, but permissible on commercial porn sites.
<<< Chris Hedges
<<<
Postmodernism was cute in art, but it's killing us in politics and economics.
<<< Clayton Cubit
Poverty is, in fact, [[relative|relative poverty]] - but not in the way you might think.
Instead of immediately thinking about money, when you think about poverty you should think about [[rules|hidden rules]] and [[resources|types of resources]]
It's helpful to illustrate specific examples of rules in [[middle class vs. poverty]]
Language plays a role - [[registers of language]] and [[discourse patterns]]
<<<
"""
''Prayer at Winter Solstice''
by Dana Gioia
Blessed is the road that keeps us homeless.
Blessed is the mountain that blocks our way.
Blessed are hunger and thirst, loneliness and all forms of desire.
Blessed is the labor that exhausts us without end.
Blessed are the night and the darkness that blinds us.
Blessed is the cold that teaches us to feel.
Blessed are the cat, the child, the cricket, and the crow.
Blessed is the hawk devouring the hare.
Blessed are the saint and the sinner who redeem each other.
Blessed are the dead, calm in their perfection.
Blessed is the pain that humbles us.
Blessed is the distance that bars our joy.
Blessed is this shortest day that makes us long for light.
Blessed is the love that in losing we discover.
"""
<<<
<<<
"""
''Praying''
by Mary Oliver
It doesn’t have to be
the blue iris, it could be
weeds in a vacant lot, or a few
small stones; just
pay attention, then patch
a few words together and don’t try
to make them elaborate, this isn’t
a contest but the doorway
into thanks, and a silence in which
another voice may speak
"""
<<<
<<<
In the next two decades, we will be able to predict huge areas of the future with far greater accuracy than ever before in human history, including events long thought to be beyond the realm of human inference.
<<< journalist Patrick Tucker, The Naked Future
Oook then
<<<
Institutions will try to preserve the problem to which they are the solution.
<<< Clay Shirky
Often called the Clay Shirky Principle
On December 1, 2014 NSA announced Dr. [[Roy Atwood]]'s departure. It came as a great surprise to me.
<<<
Dear students, parents, alumni and members of the NSA family,
When I was a student in college we had an interim president. It didn’t mean much to me because I never really had much interaction with him as a student.
At New Saint Andrews, students interact with their president in the classroom, in the community, and at school events…including events in his own home. So when the first and only president NSA has known announces his resignation, people take notice…this is the case today.
I’m writing to let you know that Dr. Atwood has resigned from his duties as president but will continue with his teaching assignments. You can read the joint statement from him and the Board below.
The Board has asked me, as the senior administrative officer, to act as president until January 1 when Dean Ben Merkle will assume the role as Interim President as per board policy on executive succession.
We will know more in the coming weeks and months about the selection process for the next President of New Saint Andrews College. But in the meantime, please join me in expressing gratitude for Dr. Atwood’s service to the College.
In my years in the senior administration at the University of Idaho, I had a front row seat for two presidential transitions. So I also know there is much to tend to both internally and externally. I want you to feel free to communicate with me about any questions or concerns you may have. You can email me at bobh@nsa.edu.
I’m excited for what the Lord has in store in this coming chapter in the life of the College and for my friend and colleague, Dr. Atwood. I’d look for great things!
Blessings.
Bob Hieronymus
Acting President
<<<
<<<
!!! Joint Public Announcement
The board of New Saint Andrews College regrets to announce that Roy Atwood is stepping down from his role as president of the college, effective immediately. He will continue to work for the College in his role as Senior Fellow, including teaching his scheduled classes and working with students. According to our board policy procedures on executive succession, Executive Vice-president Bob Hieronymus will take over as acting president until December 31st. Since Bob had already informed us that he will be leaving NSA at the end of the year, Academic Dean Ben Merkle, as per policy, will begin serving as interim president January 1st. He will serve as interim president until the president search committee identifies the next president.
The board wants to take this opportunity to honor Roy for his years of faithful service to the College, and to publicly acknowledge how much we owe to him. We know that without him, New Saint Andrews College would not be nearly so successful. Roy was instrumental in procuring our building, our accreditation and our outstanding faculty, and we owe him countless other debts that we could not begin to itemize. We thank the Lord for Roy’s and Bev’s years of service and sacrifice to the College.
At the same time, a resignation mid-year is not a trifle. Because of other recent administrative staff changes, the Board felt it needed to advance its timetable for appointing a new chief executive prior to Roy’s planned retirement at age 67. Unfortunately, because Roy is 62 and not yet in a position financially to retire at this time, he thought it best to resign, allowing the board to seek new leadership while he pursues other employment opportunities.
The members of the board and Roy esteem one another highly as conscientious Christian gentlemen. We trust that God will make fruitful this transition to new leadership in the College and for Roy’s future labors.
Please pray for us all, and we look forward to a bright future as God blesses the work of our hands.
Csaba Leidenfrost
Chairman, NSA Board of Directors
Roy A. Atwood
<<<
On December 5, Dr. Atwood added a personal note:
<<<
As many of you have heard, I decided to step down as president of New Saint Andrews College after ten years in that role.
To put my decision in perspective, I have been the longest serving president of any of our peer member institutions in the Association of Reformed Colleges and Universities (arihe.org). I was also the longest serving president in the state of Idaho. It was time—and I believe it was the right time—to make this change, in God’s providence. It has been a wonderful ride and a tremendous privilege to serve our fine classical Christian college for so long.
I want to thank the board, faculty, staff, students, alumni, the Moscow community, and all our constituents for their support and encouragement over the years. I believe the College is the strongest it has ever been, its reputation for excellence secure, and its future very bright. I pray the Lord will continue to bless NSA in the years ahead, as He has in its first twenty.
Bev and I look forward to seeing how the College moves ahead under its new leadership, and we are excited about the new adventures the Lord has in store for us.
Thank you all for letting me be a small part of it and for making my work such a joy. I shall always be grateful for the great honor of serving the College and its amazing community. Bev and I will always remember with fondness how all of you, students, colleagues, and friends, enriched our lives.
Thank you, and God bless New Saint Andrews.
<<<
A book by [[Jim Wilson]], first published in 1964 and republished in 1983, 1991 and continuously since then. This book developed what came to be distilled as [[strategic evangelism]]
[[Link to the full book|http://mediadownload.radiantwebtools.com/communitychristianministries/Articles/principleofwartextCORRECTED.pdf]]
<<<
To the average man, life presents itself, not as material malleable to his hand, but as a series of PROBLEMS of extreme difficulty, which he has to SOLVE with the means at his disposal. And he is distressed to find that the more means he can dispose of – such as machine power, rapid transport, and general civilized amenities, the more his problems grow in hardness and complexity. This is particularly disconcerting to him, because he has been frequently told that the increase of scientific knowledge would give him mastery over nature – which ought, surely, to imply mastery over life.
<<< Dorothy Sayers, Problem Picture
<<<
Progress might have been all right once, but it’s gone on too long.
<<< Ogden Nash
[img[https://pbs.twimg.com/media/ByU7UdWCYAACdDV.png:large]]
Past projects:
* [[Sky Cow Books]]
* [[The Storm Cellar]]
* [[Hansel & Gretel]]
* [[Brick & Mortar]]
* [[ConsignCloud]]
* [[The Anchor]]
Future:
* [[BAHKP]]
Failure to launch:
* Palouse Film Society
* Hearth
* The Wonderbooth
* Flyover Films
* The Owl Museum
* Palouse Living
* by Storm Clothing
* The Moscow Toolbox
<<<
We all know how insidiously it happens that a pastor begins - perhaps at first unconsciously - to assume an adversary posture toward his people, to speak of 'them' as the enemy. Then it is forgotten that //prophecy is an office of love and not of contempt.// Then it is forgotten that Amos, Hosea, and others spoke so straightforwardly precisely because they loved so recklessly, thinking so much more of the people of God than they thought of themselves. Then it is forgotten that the prophetic and priestly ministries are not antithetical but are forged together by the knowledge that whom we would change we must first love.
<<< Richard John Neuhaus, Freedom for Ministry p 17.
The prophetic voice is used often in the [[Moscow Project]], particularly when addressing cultural concerns inside or outside the community.
<<<
That, I suspect, is what really rankles those who gnash their teeth when someone lectures them about how art is all about borrowing and exchanging freely. That’s exactly what art is, but our whole edifice of intellectual property law is increasingly designed not to facilitate that borrowing and exchange, but to frustrate it, in the service of protecting the value of incumbent cultural products — the ones owned by corporations. The solution, though, isn’t to build more walls, so that everyone sticks to their cultural knitting. That will just exacerbate existing baleful trends. Rather, what’s needed is to restore the artistic commons, before the only culture we know is one we’ll have to pay a fee to join.
<<< Noah Millman
http://theweek.com/articles/649088/whos-kemosabe
The commons, policing speech & writing, etc.
<<<
[David] Noble’s work complicates this picture, to say the least. The Enlightenment did not, as it turns out, vanquish Religion, driving it far from the pure realms of Science and Technology. In fact, to the degree that the radical Enlightenment’s assault on religious faith was successful, it empowered the religion of technology. To put this another way, the Enlightenment–and, yes, we are painting with broad strokes here–did not do away with the notions of Providence, Heaven, and Grace. Rather, the Enlightenment re-named these Progress, Utopia, and Technology respectively. To borrow a phrase, the Enlightenment [[immanentized the eschaton|immanentize the eschaton]]. If heaven had been understood as a transcendent goal achieved with the aid of divine grace within the context of the providentially ordered unfolding of human history, it became a Utopian vision, a heaven on earth, achieved by the ministrations Science and Technology within the context of Progress, an inexorable force driving history toward its Utopian consummation.
<<< Michael Sacasas, [[Algorithms Who Art in Apps, Hallowed Be Thy Code|http://thefrailestthing.com/2015/02/06/algorithms-who-art-in-apps-hallowed-be-thy-code/]]
Specifically in reference to David Noble's //The Religion of Technology//
//noun//
colloq. derogatory.
Intellectual or social pretension or affectation; pseudo-intellectual speech, writing, debate, etc.
<<<
In all cultures, men are brought up to be “masculine” and to disregard and repress those aspects of their temperament that the culture regards as “feminine,” whereas women are expected to do the opposite. Creative individuals to a certain extent escape this rigid gender role stereotyping. When tests of masculinity/femininity are given to young people, over and over one finds that creative and talented girls are more dominant and tough than other girls, and creative boys are more sensitive and less aggressive than their male peers.
<<<
This to be distinguished from homosexuality or sexual constitution in general:
<<<
Psychological androgyny is a much wider concept, referring to a person’s ability to be at the same time aggressive and nurturant, sensitive and rigid, dominant and submissive, regardless of gender. A psychologically androgynous person in effect doubles his or her repertoire of responses and can interact with the world in terms of a much richer and varied spectrum of opportunities. It is not surprising that creative individuals are more likely to have not only the strengths of their own gender but those of the other one, too.
<<< Mihaly Csikszentmihalyi, Creativity: The Psychology of Discovery and Invention
https://www.youtube.com/watch?v=QbVzoV4GgM8
<<<
If you had a magic button in front of you which, if you pressed it, would result in all the poor people in the world being 5X better off than they are now, in real terms, but the price would be that the top 1% would be 100X times better off, would you press the button? Pressing the button would increase the inequality, but it would decrease everyone’s day-to-day income problems. Is the mere fact of the inequality a moral problem? Is the size of the gulf between rich and poor a moral problem?
There is another way of asking the question, only this way highlights the darkness of envy a little bit better. If you had a button in front of you that would cut the standard of living that poor people have by 50%, but would also cut the standard of living that the top 1% had by a much greater amount, thus reducing the inequality, would you press that button?
<<< Doug Wilson, [[Envy Crackles|http://dougwils.com/s22-money-love-desire/envy-crackles.html]]
Expanded version of the button analogy, from 1-20-2015 sermon:
<<<
Here's a good litmus test to see if you're thinking about this biblically. I've seen many people in our circles who ought to know better talk as though the middle class were a problem. They think of life as a [[zero-sum game|zero-sum thinking]]. They think that all the wealth in the world is a pie, and if somebody here is middle-class, if they've got a bigger piece of the pie, they think it's only possible for someone to have a bigger piece of the pie if someone else has a smaller piece of the pie. So if someone is wealthy, if someone is doing well, then they're doing well at the expense of this poor guy over here. So we have to pillage this rich guy over here, and give it to this poor guy, which is not how God said to do it. God said, "grow the pie". God wants us to minister to the poor, he doesn't want us to be piratical.
Here's a simple litmus test, it's a simple thing. Suppose you had a magic button in front of you. You're talking about economics and poverty relief and stuff... if you push that button all the poor people will be twice as better off, in real terms - their station in life will be better. But the downside (for many people) is that the rich people will be ten times as better off. If you push the button, you've made the poor people twice as better off, and the rich people ten times better. Would you push the button?
//If you would hesitate for a moment, you're the problem. If you would hesitate for a second, you are consumed with envy.// You would said, "I would push the button if I could, but not if it would help these schmucks."
Do you see what you're doing? Do you see what you're saying? When we make the rich ten times better off and the poor twice as better off, are we increasing wealthy inequality? Yes. So the problem is not wealth inequality, that's no the problem.
There's a difference between relative poverty and absolute poverty. Absolute poverty is some kid living in a cardboard box at a garbage dump outside Manila, and he's going to die later this week if he doesn't get food or medicine.
In America, relative poverty - the average person who lives below the poverty line owns his own home, it's got three bedrooms, he's got a couple of cars. Relative poverty is a meaningless concept, scripturally speaking...
<<<
This feels like a super awkward thought exercise, similar to the dinner party [[ethical conundra]] Doug described. Maybe there's a corollary conundrum, like: "If it could be conclusively demonstrated that the success of one group led to the poverty of another, would you hit the second button?" But it feels as loaded and inadequate as the button situation.
I am frustrated by [[zero-sum thinking]], not the idea per se, but in the way it's often used. This example also reveals a [[libertarian heuristic]] - coercion versus liberty. This framing makes coercive redistribution always a bad thing, which I don't think we can say.
I have a pet quail named [[Sticks|Sticks the Quail]]
Flannery O'Connor had a pet quail named Amelia Earhart.
<<<
//The world is a hellish place, and bad writing is destroying the quality of our suffering.// It cheapens and degrades the human experience, when it should inspire and elevate.
<<< Tom Waits, emphasis added
<<<
Questions are places in your mind where answers fit. If you haven’t asked the question, the answer has nowhere to go. It hits your mind and bounces right off. You have to ask the question — you have to want to know — in order to open up the space for the answer to fit.
<<< Clayton Christensen
paraphrased by Jason Fried
https://m.signalvnoise.com/what-are-questions-a716aee8e16f
Questions rock star sales reps ask:
* How large is the market, and the “territory” being carved out within that? Who else is there?
* Are there customers you’ve already successfully sold this product to?
* How quickly did the last 3 reps get to quota?
* How many sales reps within the company are on 100% quota?
* How many reps didn’t make it? Why?
* How many of the sales reps hired are still there?
* How are renewals converting in the last 10 deals sold?
* Are the reps selling the same type of product?
* How many price concessions have had to be given to meet quota?
From: http://a16z.com/2015/09/16/the-zero-b-s-method-to-recruiting-a-killer-sales-force/
<<<
"""
''Quid Pro Quo''
//Paul Mariani, 1940//
Just after my wife’s miscarriage (her second
in four months), I was sitting in an empty
classroom exchanging notes with my friend,
a budding Joyce scholar with steelrimmed
glasses, when, lapsed Irish Catholic that he was,
he surprised me by asking what I thought now
of God’s ways toward man. It was spring,
such spring as came to the flintbacked Chenango
Valley thirty years ago, the full force of Siberia
behind each blast of wind. Once more my poor wife
was in the local four-room hospital, recovering.
The sun was going down, the room’s pinewood panels
all but swallowing the gelid light, when, suddenly,
I surprised not only myself but my colleague
by raising my middle finger up to heaven, //quid
pro quo//, the hardly grand defiant gesture a variant
on Vanni Fucci’s figs, shocking not only my friend
but in truth the gesture’s perpetrator too. I was 24,
and, in spite of having pored over the //Confessions//
& that Catholic Tractate called the //Summa//, was sure
I’d seen enough of God’s erstwhile ways toward man.
That summer, under a pulsing midnight sky
shimmering with Van Gogh stars, in a creaking,
cedarscented cabin off Lake George, having lied
to the gentrified owner of the boys’ camp
that indeed I knew wilderness & lakes and could,
if need be, lead a whole fleet of canoes down
the turbulent whitewater passages of the Fulton Chain
(I who had last been in a rowboat with my parents
at the age of six), my wife and I made love, trying
not to disturb whosever headboard & waterglass
lie just beyond the paperthin partition at our feet.
In the great black Adirondack stillness, as we lay
there on our sagging mattress, my wife & I gazed out
through the broken roof into a sky that seemed
somehow to look back down on us, and in that place,
that holy place, she must have conceived again,
for nine months later in a New York hospital she
brought forth a son, a little buddha-bellied
rumplestiltskin runt of a man who burned
to face the sun, the fact of his being there
both terrifying & lifting me at once, this son,
this gift, whom I still look upon with joy & awe. Worst,
best, just last year, this same son, grown
to manhood now, knelt before a marble altar to vow
everything he had to the same God I had had my own
erstwhile dealings with. How does one bargain
with a God like this, who, //quid pro quo//, ups
the ante each time He answers one sign with another?
"""
<<<
|''max''|10|
|''sample''|50|
|''tagged''|systemConfig|
|''exclude''|excludeLists|
|''content''|Source|
|''type''|slice|
|''required''|yes|
|''sort''|modified|
|''dateformat''|DD. MMM, YYYY|
|''saveTo''||
|''saveWithTags''||
!Template
{{{
!!![[%0]] @@color:#333;font-size:0.7em;%3@@
%2
}}}
[img[http://i.imgur.com/ZwSrZoa.jpg]]
<<<
That's how it starts. Before you know it the neighborhood will be crawling with bears. Drains choked with fur. Buns thrown at old ladies. Raucous, all-night picnics.
<<< Millicent, Paddington Bear
<<<
The church fails to carry out the mission of Jesus to the extent that we fail to re-train the world in the art of beauty.
In so far as the church leaves cultural assumptions about beauty unchallenged we deny the lordship of Christ over the arts.
<<< Toby Sumpter
[img[http://i.imgur.com/GZDbnTY.gif]]
<<<
If it’s a frivolous, relaxing book, I read every word. But serious books I read on the right-hand side only because I’ve discovered enormous redundancy in any well-written book, and I find that by reading only the right-hand page this keeps me very wide awake, filling in the other page out of my own noodle.
<<< Marshall ~McLuhan on his reading habits
<<<
Reading maketh a full man; conference a ready man; and writing an exact man.
<<< Francis Bacon
<<<
What God may hereafter require of you, you must not give yourself the least trouble about. Everything he gives you to do, you must do as well as ever you can, and that is the best possible preparation for what he may want you to do next. If people would but do what they have to do, they would always find themselves ready for what comes next.
<<< George ~MacDonald, The Seaboard Parish
<<<
I also think it is important to reason from first principles, rather than, by analogy. So the normal way we conduct our lives is we reason by analogy. We're doing this because it's like something else that was done or like what other people are doing. Iterations on a theme. It's kinda mentally easier to reason by analogy rather than from first principles. First principles is kinda a physics way of looking at the world and what that really means is you kinda boil things down to the most fundamental truths and say okay, what are we sure is true? or sure as possible is true? and then reason up from there. That takes a lot more mental energy.
<<< Elon Musk, [[Founder's Interview|http://shitelonsays.com/transcript/foundation-20-elon-musk-2012-09-07]]
<<<
Though I desire to extend religious freedom, yet I want some recompense for my troubles.
<<< William Penn, Quaker, pacifist, (apparent) capitalist, founder of Pennsylvania
<<<
But only redistributive processes are zero-sum games; protective tariffs, mortgage subsidies, and armed robberies all transfer wealth forcibly from one person to another. Economic transactions are voluntary exchanges, which means that both parties perceive themselves as benefiting. A given economic transaction is zero-sum only if one party has miscalculated or been deceived
<<< Herbert Schlossberg, Idols for Destruction, p. 128
I think this is where [[zero-sum thinking]] comes from
<<<
Half-knowledge is more victorious than whole knowledge: it understands things as being more simple than they are and this renders its opinions more easily intelligible and more convincing.
<<< Nietzsche
<<<
"""Refrigerator, 1957
//by Thomas Lux//
More like a vault -- you pull the handle out
and on the shelves: not a lot,
and what there is (a boiled potato
in a bag, a chicken carcass
under foil) looking dispirited,
drained, mugged. This is not
a place to go in hope or hunger.
But, just to the right of the middle
of the middle door shelf, on fire, a lit-from-within red,
heart red, sexual red, wet neon red,
shining red in their liquid, exotic,
aloof, slumming
in such company: a jar
of maraschino cherries. Three-quarters
full, fiery globes, like strippers
at a church social. Maraschino cherries, maraschino,
the only foreign word I knew. Not once
did I see these cherries employed: not
in a drink, nor on top
of a glob of ice cream,
or just pop one in your mouth. Not once.
The same jar there through an entire
childhood of dull dinners -- bald meat,
pocked peas and, see above,
boiled potatoes. Maybe
they came over from the old country,
family heirlooms, or were status symbols
bought with a piece of the first paycheck
from a sweatshop,
which beat the pig farm in Bohemia,
handed down from my grandparents
to my parents
to be someday mine,
then my child's?
They were beautiful
and, if I never ate one,
it was because I knew it might be missed
or because I knew it would not be replaced
and because you do not eat
that which rips your heart with joy.
"""
<<<
|!Register |! Examples |
| Static |Always the same - Pledge of Allegiance, the Lord's Prayer |
| Formal |One-way, standardized syntax; presentations and introductions between strangers |
| Consultative |Two-way participation, background information is provided; teacher/student, doctor/patient, etc. |
| Casual |In-group friends, no background information provided, ellipsis and slang; friends in a social setting |
| Intimate |Non-public, intonation more important than wording or exacting grammar; family members, lovers, close friends. |
//Source: Joos, 1967.//
Joos found that you can go one register down in the same conversation, but dropping two or more registers is socially jarring.
Many poor people don't have access to the formal register. Like language learning, it is best learned by immersion (acquisition) vs. learning. This is the difference between learning Chinese from a book, or learning it with a fluent speaker.
The idea of relative poverty seems straightforward - you can only be wealthy or poor in relationship to some standard.
But when conservatives invoke 'relative poverty', it's typically to minimize or even deny that poverty exists near to us. If the person who uses the term talks about how many TVs the relatively poor person has, in my experience they're about to hand-wave poverty away so that their audience doesn't have to think about it.
Think of poverty in terms of [[rules|hidden rules]] and [[resources|types of resources]]
<<<
"Tyranny is the deliberate removal of nuance."
<<< Albert Maysles
|!Search tag: | <$edit-text tiddler="$:/temp/RenameTags/search" tag="input" type="text"/> |
|!Replace by: | <$edit-text tiddler="$:/temp/RenameTags/replace" tag="input" type="text"/> |
---
!First step
!!//Apply the new tag to the following tiddlers//
<$list filter="[!has[draft.of]tag{$:/temp/RenameTags/search}!tag{$:/temp/RenameTags/replace}sort[created]]">
<$checkbox tag={{$:/temp/RenameTags/replace}}><$link to={{!!title}}><$view field="title"/></$link></$checkbox>
</$list>
!Second step
!!//Remove the old tag from the following tiddlers//
<$list filter="[!has[draft.of]tag{$:/temp/RenameTags/search}tag{$:/temp/RenameTags/replace}sort[created]]">
<$checkbox tag={{$:/temp/RenameTags/search}}> ~~<$link to={{!!title}}><$view field="title"/></$link>~~</$checkbox>
</$list>
The level of responsibility for one's online persona. I remember after years of defending, going home and talking to someone who sat under leading staunch dogmatic reformed theologian MH. They said that although he seemed like an ass online he was really quite a gentle and thoughtful teacher.
That's when it suddenly hit me - I knew people who seemed like nice people online, and maybe people were to a certain extent, extent TBD, responsible for their online personas.
<<<
“Direct, straight-line, intervening power does, of course, have many uses. With it, you can lift the spaghetti from the plate to your mouth, wipe the sauce off your slacks, carry them to the dry cleaners, and perhaps even make enough money to ransom them back. Indeed, straight-line power (“use the force you need to get the result you want”) is responsible for almost everything that happens in the world. And the beauty of it is, it works. From removing the dust with a cloth to removing your enemy with a .45, it achieves its ends in sensible, effective, easily understood ways.
Unfortunately, it has a whopping limitation. If you take the view that one of the chief objects in life is to remain in loving relationships with other people, straight-line power becomes useless. Oh, admittedly, you can snatch your baby boy away from the edge of a cliff and not have a broken relationship on your hands. But just try interfering with his plans for the season when he is twenty, and see what happens, especially if his chosen plans play havoc with your own. Suppose he makes unauthorized use of your car, and you use a little straight-line verbal power to scare him out of doing it again. Well and good. But suppose further that he does it again anyway — and again and again and again. What do you do next if you are committed to straight-line power? You raise your voice a little more nastily each time till you can’t shout any louder. And then you beat him (if you are stronger than he is) until you can’t beat any harder. Then you chain him to a radiator till….But you see the point. At some very early crux in that difficult, personal relationship, the whole thing will be destroyed unless you — who, on any reasonable view, should be allowed to use straight-line power — simply refuse to use it; unless, in other words, you decide that instead of dishing out justifiable pain and punishment, you are willing, quite foolishly, to take a beating yourself.
“But such a paradoxical exercise of power, please note, is a hundred and eighty degrees away from the straight-line variety. It is, to introduce a phrase from Luther, left-handed power… Left-handed power is precisely paradoxical power: power that looks for all the world like weakness, intervention that seems indistinguishable from nonintervention.” (pg. 18-19)
“The work of Jesus in his incarnation, life, passion, death, resurrection, and ascension makes no worldly sense at all. The portrait the Gospels paint is that of a lifeguard who leaps into the surf, swims to the drowning girl, and then, instead of doing a cross-chest carry, drowns with her, revives three days later, and walks off the beach with assurances that everything, including the apparently still-dead girl, is hunky-dory. You do not like that? Neither do I.”
——————–
“Let me refine that a little. I said grace cannot prevail until law is dead, until moralizing is out of the game. The precise phrase should be, until our fatal love affair with the law is over — until, finally and for good, our lifelong certainty that someone is keeping score has run out of steam and collapsed. As long as we leave, in our dramatizations of grace, one single hope of a moral reckoning, one possible recourse to salvation by bookkeeping, our freedom-dreading hearts will clutch it to themselves. And even if we leave none at all, we will grub for ethics that are not there rather than face the liberty to which grace calls us.”
“Morality helps most when it has the least to object to. If it is a guide at all, it is a guide to perfecting one’s virtues, not the reform of one’s vices. It keeps non-gamblers from being foolish at the racetrack. It does not keep child abusers from beating children, compulsive liars from lying, or lechers from leching. For those in the front lines of their faults, it is just a lovely, cruel vision of a home they cannot get to. The law only makes sin exceedingly sinful; it never saved anyone who really needed help.”
<<< Robert Farrar Capon, [[Kingdom, Grace, Judgement: Paradox, Outrage, and Vindication in the Parables of Jesus]]
<<<
Marriage, in what is evidently its most popular version, is now on the one hand an intimate 'relationship' involving (ideally) two successful careerists in the same bed, and on the other hand a sort of private political system in which rights and interests must be constantly asserted and defended. Marriage, in other words, has now taken the form of divorce: a prolonged and impassioned negotiation as to how things shall be divided. During their understandably temporary association, the 'married' couple will typically consume a large quantity of merchandise and a large portion of each other.
The modern household is the place where the consumptive couple do their consuming. Nothing productive is done there. Such work as is done there is done at the expense of the resident couple or family, and to the profit of suppliers of energy and household technology. For entertainment, the inmates consume television or purchase other consumable diversion elsewhere.
There are, however, still some married couples who understand themselves as belonging to their marriage, to each other, and to their children. What they have they have in common, and so, to them, helping each other does not seem merely to damage their ability to compete against each other. To them, 'mine' is not so powerful or necessary a pronoun as 'ours.'
This sort of marriage usually has at its heart a household that is to some extent productive. The couple, that is, makes around itself a household economy that involves the work of both wife and husband, that gives them a measure of economic independence and self-employment, a measure of freedom, as well as a common ground and a common satisfaction.
<<< Wendell Berry from "Feminism, the Body, and the Machine"
[img[http://i.imgur.com/JwwaOs0.jpg]]
'Rediscovery'
<<<
Stephen: We’re constantly rediscovering things that have already been discovered. There’s something there to discover still—there’s something within that. For example, you could be making a pair of shoes: They don’t need to be flying shoes or rocket shoes that have never been seen before. You could actually try to make a pair of leather boots, and, even though they’ve been made a million times you’re still going to learn so much in the process in making a mundane, simple pair of boots.
...
We’re making antiques for the future—I love the idea of premeditating what people are going to find in a flea market in 40 years. We have this anxiety that there’s nothing new being made that’s going to survive….
<<<
Nostalgia and the modern:
<<<
Stephen: Make it present. You’ve digested it, put it into your mind, thought about it, dreamt about it, and all of a sudden it’s contemporary again. It’s something I think a lot of people don’t understand about nostalgia and time: It’s a misunderstanding. They see it as time travel rather than a continuation.
<<<
An appreciation for beauty:
<<<
Robin: Stephen and I really love to embrace beauty. And again, in our industry right now, there’s something kind of marginal about that. Theory and cool come up more than beautiful.
Stephen: Cool, clean, smart… They’re nice terms but we kind of try to throw out of our head a little bit.
Robin: Right and beauty doesn’t come up that often. We want beauty to be cool.
Stephen: Beauty shows attachment and maybe vulnerability. It’s kind of been pushed out of the American culture as dangerous, and also as a sign of wealth.
Robin: And we like the egalitarian idea that things can be wonderful, beautiful, and well-made for everybody. And that’s important to us. I think Ace represented that. We want to look at that whole range. Beauty doesn’t have to be elitist.
<<<
The importance of their 3-hour drives on Friday and Monday nights (to their second home):
<<<
Stephen: We work out a lot of stuff on our drives. It’s interesting because it’s a shoulder-to-shoulder conversation, like a park bench conversation: Just two people talking, looking at the birds. You’re hearing each other but your mind gets to wander because your sightline is broad. It’s an effective way of coming up with ideas together.
Robin: Face to face conversations can be so reactive, because you’re looking at each other and adjusting what you’re saying based on the reactions. But when you’re shoulder-to-shoulder, you’re just talking and listening.
<<<
sadcom, n.
Sad sitcom
Term coined in 2015? Maybe by Jenny Jaffe at the Vulture.
The progeny of MASH, cynical but sincere shows. Louie, ~BoJack Horseman, Rick and Morty, Broad City.
Maybe Girls?
Not to be confused with Always Sunny, Arrested Development, or Seinfeld, where the characters foibles are their undoing.
Sadcoms have that deficiency and moral bankruptcy, but have more to do with the limits of human understanding and ability, and unjustifiable optimism in the face of it.
[img[http://i.imgur.com/geXRQx5.jpg]]
Such an epic concept, and infinitely challenging.
The entire original essay, lest it disappear from the Internets:
<<<
Saturation Love
By Jim Wilson
There are commands from God to love. These commands are to be applied to wives, brothers, neighbors, aliens and enemies. This love is that love that God had for us when Jesus Christ died for us. It is sacrificial; it is made up of its primary expression, giving. It is designed to be effective. It worked for our salvation. Love requires an object and love requires expression. "For God so loved the world that he gave..." (John 3:16). The world was love's object and giving was love's expression. This love was not half hearted or reluctant or "almost enough." It was complete and more than adequate for all of the sins and sinners in this world. "But where sin increased, grace increased all the more..." (Romans 5: 20).
In obeying these commands to love we are to love as God loved. That is unconditional and without reserve or reluctance. We should have and give more love to the person needing love so that his need for love is satisfied. You may think that that is impossible. This person is so starved for love that to love him is like pouring water down a rat hole; you think that you will run out of water before you run out of rat hole. In the meantime he is hanging on to you for more love. You are convinced that you will run out of love before this love starved person is satiated with it. This might be true if you are counting on his returning love to meet your needs. But if you get refilled by the Holy Spirit, you are never going to run out. Now let us apply this principle to raising children.
There are many different problems in raising children that require understanding and applying biblical principles. First, here are a few of these problems.
Lack of obedience
Effective discipline for disobedience
Effective training and teaching
Sibling rivalry and jealousy
Attention getting devices such as whining, crying and tantrums
Signs of insecurity such as speaking loudly, warts, overweight, scratching, hitting, biting, picking at the body and hand mannerisms.
Each of these subjects requires a book; in fact books have been written on each of these subjects. You have probably read some of them and implemented what you learned from the book and, with some of you, what you applied did not work. It is easy to draw the conclusion that the book is wrong. The book may have been right and your application may have been right. What event went wrong?
Here is the principle mentioned earlier. I will call it saturation love. Saturation means that the maximum has been reached. A saturated solution means that the solvent cannot dissolve anymore solute. For example, if you continue to add and stir sugar into a glass of water, the water will eventually become saturated with sugar, meaning no more sugar will dissolve in the water. After the saturation point, any additional sugar will fall to the bottom of the glass - the water cannot dissolve anymore.
Therefore, saturation love is quality time in great quantity with undivided attention, until the individual cannot take any more. It is possible to saturate someone with love so that any additional love is not received. It is not rejected, it is just not needed.
Over the years I have asked audiences for a show of hands if they thought their parents loved them. Over 95% of the hands went up. It was never 100% but it was always a high percentage. Then I asked this question of those who had raised their hands - "Do you think that your parents expressed this love to you adequately?" Only half of the hands remained up. The third question was: "Of those of you who think your parents expressed their love for you adequately, could you have used an even greater expression of love?" All of the hands remained up.
1. No love
2. Some love
3. Adequate love
4. Even more love is wanted
No one ever thought he received enough love from his parents. Their children will, if asked, say the same thing about them.
What are the results of not getting enough love? Disobedience is directly proportional to the shortfall in love.* Discipline for the disobedience, even if administered correctly, is not effective if the child is not loved enough. He thinks, "The last time I got any attention around here was the last time I got spanked." His disobedience becomes his means for getting attention. Therefore your training and teaching is ineffective if you are not giving your child enough love.
(* We know that the child is born with, and later practices a sinful nature. This sinful nature is the primary reason for his disobedience. This changes when he comes to faith in Jesus Christ. Both before and after conversion his disobedience is affected by lack of love.)
Sibling rivalry, competition, selfishness and jealousy are inversely proportional to love toward your children. So when all of the kids are saturated with love, there is little or no rivalry, squabbles, and fights. The more love, the less whining, disobedience, jealousy and the less crying and tantrums. Also the more love, the sooner the child will become a Christian.
"Or do you show contempt for the riches of his kindness, tolerance and patience, not realizing that God's kindness leads you toward repentance?" (Romans 2:14)
God's means for leading us to repentance was to pour on the kindness and show us tolerance and patience even when we were sinners. How much more should we do this for our children.
What are our problems? We do not want to give hugs and attention to a whiner. We do not want to endorse bad behavior. That is true, but we are not endorsing bad behavior. We are curing it. This giving is not giving in to the child's dictations but to his real need. His perception is more true than your perception. The "whiner" is asking for attention - loving attention. We will give a small baby attention when it cries. There may be nothing wrong; he is not hungry, wet, dirty or sick; he just wants some loving. When the child is two or three or nine or ten and asks for attention we do not want to give it. We do not think the child needs it. Believe me, if he asks for it, he needs ii. When he is saturated he will quit asking.
[On the other hand there are some children who need the attention but will not demand it. They need and receive even less than the demander. Because they are not demanding, you may think they are satisfied.]
Our problem is we run out of "give" before the child runs out of demand. We think he will never quit demanding our attention, so we quit giving it before we should quit. And if we kept on giving the attention, we'd find our child would get satisfied. The child will get full and consequently be very secure and ask for very little in the years to come. This security is of major importance in your child's obedience to you.
Many years ago there was a little boy who had warts on his left hand and arm. I think there were eighteen of them. He had had them for many months. One day his father asked him, "Johnny would you like me to pray to God to take away your warts?" Johnny replied, "No, they are my friends, I play with them." His father knew that these warts were evidence of the boy's insecurity and this insecurity was the result of the father himself not giving his son enough loving attention. The father made a decision and followed through with much loving attention. The warts disappeared in a very short time.
Many years ago I was close to a young family who had four preschool children, boys, ages one, two, three and four. One day the parents came to see me about their oldest son. This son was hitting each of his little brothers all day long. He was corrected on each occurrence, either shouted at or spanked or both. Also he had picked the skin off of his face in many places so that he had small red scabs all over his face. He looked like he had the measles. The spankings did not seem to work. Their question was obvious, "What do we do?"
"The next time the oldest hits a little brother, pick up the oldest and hug him." Her answer, "I don't want to reinforce that kind of conduct." "Don't worry, he already has gotten the message. Not only should you hug him the next time he hits his brother, I want you to hug him all day long. He hasn't gotten enough love since the second son was born and now there are number three and number four. The only time he gets attention is when he is bad. So he hits little brother in order to get attention. He picks his face because he is insecure. I will guarantee that if you pour loving attention on him with overkill, his face will clear up and he will quit hitting his little brothers within two weeks." She said, "I don't think I can do that." "Why not?" "I d6n't even like him anymore."
The parents confessed their sin and put this into effect. The predicted results came true.
A father with a very active 12-year old son came for help. The son had had extensive discipline for misbehaving on small things and did not seem to learn from the discipline. Also the son had a difficult time getting along with his peers.
The parents were giving a fair amount of love, attention and time to the boy, but he still would not receive correction or be repentant when spanked repeatedly. I told the father that he could not pour on too much love. The father, in desperation to see improvement, poured on the physical affection and reduced the constant verbal correction of minor things. The father then took the boy to a men's retreat where he held the son in his arms for the two hour van ride there and back, plus holding the son during the speaking sessions. Upon returning home the mother immediately recognized a change in the boy's attitude and his willingness to receive correction without pouting, as well as his desire to get along better with other children.
In years of asking questions and listening to answers, there is one answer that stands out. "I never heard my father admit that he was wrong about anything. In the meantime Mom knew he was wrong; we kids knew he was wrong; God knew he was wrong and he himself knew it, but he would not admit it." This same statement may be true of some of you fathers whose children are grown and gone. You may be reading this and realize that you did not practice saturation love when they were growing up. In the meantime they have had all kinds of problems. Others of you have children who are teenagers, not away from home and not little "lovable" kids.
What can you do about it now? You can first confess to God all of your wrong actions such as over-discipline, put downs, ridicule, ignoring, yelling, anger, favoritism, lack of expressed love, etc. After this you can write to each of your children expressing to them that which you have confessed to God You can tell them you have confessed your actions and attitudes to God. You can also admit specific things that you remember. You can ask the children to bring to your attention things that they are still hurting about, just as you may still be hurting about how your father treated you. When they tell you, do not be defensive, just be sorry with a godly sorrow. "Godly sorrow brings repentance that leads to salvation and leaves no regret, but worldly sorrow brings death" (2 Corinthians 7:10). Then express love to your children in many ways.
If your children are still with you, do the same except it should be personal in addition to the letter. The letter is important because 1) you can get it all said without interruptions, 2) the letter will get read many times, and 3) the letter will be kept.
Remember both sexes of children reed much love from both sexes of parents. If you are divorced then saturation love is more difficult but still necessary. If you are competing for the love and loyalty of your children by putting down your former spouse or by buying your children's love, this is counterproductive. It is not only less than saturation love, it is not love at all.
One of the best means of expressing love to your children is by not fighting with your spouse. It is a major cause of insecurity. If you do disagree, the children should never hear it. Suppose you already have a history of fighting or disagreeing with your spouse in front of the children. Confess your history to God, then to your spouse and your children, and then forsake the fighting.
<<<
<<<
[Fr. Schmemann considers what instructions he would give someone eager to be part of a monastic revival. He lays out a rule of daily living]:
* always go to the same church, and try to be a real helper, not by lecturing about spiritual life or icons, not by teaching but with a “dust rag” (cf. St. Seraphim of Sarov). Keep at that kind of service and be — in church matters — totally obedient to the parish priest;
* do not thrust yourself and your service on anyone; do not be sad that your talents are not being used; be helpful; serve where you are needed and not where you think you are needed;
* if friends and acquaintances invite you because they are close to you, go, but not too often and within reason. Never stay more than one and a half or two hours. After that the friendliest atmosphere becomes harmful;
* be always simple, light, joyous. Do not teach. Avoid like the plague any “spiritual” conversations and any religious or churchly idle talk. If you act that way, everything will be to your benefit.
<<< The Journals of Father Alexander Schmemann, 1973-1983. In an entry dated Tuesday, Jan. 20, 1981
quoted here http://aleteia.org/2016/02/18/adjusting-to-the-passno-fail-of-lent-when-im-used-to-all-as/#sthash.TYeJnKy5.dpuf
https://twitter.com/JohnCleese/status/683681888687538177
<<<
I would like 2016 to be the year when people remembered that science is a method of investigation,and NOT a belief system
<<< John Cleese
I think he means this as a jab to religious folks, but it works in lots of directions. Bill Nye, Neil deGrasse Tyson, the rest of the priesthood...
<<<
We know screwups are an essential part of making something good... our goal is to screw up as fast as possible.
<<< Lee Unkrich of Pixar
Opposition to abortion, capital punishment, assisted suicide, and euthanasia.
Some adherents also profess pacifism.
Often called the 'consistent life ethic'
<<<
It is our humble conviction that the divine and the human meet in the slightest detail in the seamless garment of God's creation, in the last speck of dust of our planet.
<<< Patriarch Bartholomew
<<<
The inability of evangelicals to agree on how slavery should be construed according to Scripture, which all treated as their ultimate religious norm, was in fact connected to the economic individualism of American society. The recourse to arms for civil war did reflect, at the very least, a glaring weakness in republican and democratic polity. From the outside [i.e. in Europe] it was clear that American material interests exerted a strong influence on American theological conclusions. … Foreign commentary makes clear how tightly American religious convictions were bound to general patterns of American life. Only because religious belief and practice had grown so strong before the [Civil War and Slavery] conflict, only because they had done so much to create the nation that went to war, did that conflict result in such a great challenge to religious belief and practice after the war. The theological crisis of the Civil War was that while voluntary reliance on the Bible had contributed greatly to the creation of American national culture, that same voluntary reliance on Scripture led only to deadlock over what should be done about slavery. … The issue for American history was that only two courses of action seemed open when confronting such a deadlock. The first was the course taken in the Civil war, which effectively handed the business of the theologians over to the generals to decide by ordeal what the Bible meant. … The second [course of action] though never self-consciously adopted by all Americans in all circumstances, has been followed since the Civil War. That course is an implicit national agreement not to base public policy of any consequence on interpretations of scripture. The result of following that second course since the Civil War has been ambiguous. In helping to provoke the war and greatly increase its intensity, the serious commitment to Scripture rendered itself ineffective for shaping broad policy in the public arena. In other words, even before there existed a secularization in the United States brought on by new immigrants, scientific acceptance of evolution, the higher criticism of scripture, and urban industrialization, Protestants during the Civil War had marginalized themselves as bearers of religious perspective in the body politic.
<<< Mark Noll, The Civil War as a Theological Crisis
Jeremiah 17.9
The heart is deceitful above all things and beyond cure. Who can understand it?
Obadiah 1.3
The pride of your heart has deceived you, you who live in the clefts of the rocks and make your home on the heights, you who say to yourself, 'Who can bring me down to the ground?'
Galatians 6.3
If anyone thinks he is something when he is nothing, he deceives himself.
We rarely talk about self-deception... why? Ten Elshof suggests:
<<<
...beginning with Kierkegaard, the existentialists (including Sartre, Schopenhauer, Nietzsche, and others) elevated authenticity to a place of primary importance in their understanding of the virtues. Due to the writings of the existentialists and other cultural trends, the "Good Person" was increasingly understood to be the "Authentic Person." Being true to oneself became a--or, in some cases, the--chief good. Self-deception, then, was given a promotion in the ranking of vices. What was once a derivative vice--one whose primary importance was found in its ability to facilitate other, more serious, vices--became itself the most egregious of all sins.
<<< Gregg A. Ten Elshof, I Told Me So
I don't think the existentialists can bear this blame, particularly Kierkegaard and Heidegger. But Pelagianism vs. Augustinianism perhaps.
<<<
Now, for something a bit more serious: I am starting a new religion. Care to join? As with the Catholic religion, my religion has an index of forbidden books. There is only one book that the index forbids. Can you guess which? You probably have! It is the index itself!
<<< Raymond Smullyan, “Self-Reference in All Its Glory!”, conference “Self-Reference,” Copenhagen, Oct. 31-Nov. 2, 2002
<<<
Indeed, one could look at our present-day political landscape and argue that a relentless addiction to indignation may be one of the chief drivers of obstinate dogmatism and an inability to negotiate pragmatic solutions to a myriad modern problems. It may be the ultimate propellant behind the current ‘culture war.’
<<< Dr. David Brin
The general idea is that sanctimony is an emotional and psychological pathology, an addiction. Obviously, I think he's onto something: http://www.davidbrin.com/addiction.html
For those with a religious bent, this is similar to John Calvin's "heart is an idol factory". It's also in line with Girard's scapegoating.
<<<
Much of the proposed value of the Semantic Web is coming, but it is not coming because of the Semantic Web. The amount of meta-data we generate is increasing dramatically, and it is being exposed for consumption by machines as well as, or instead of, people. But it is being designed a bit at a time, out of self-interest and without regard for global ontology. It is also being adopted piecemeal, and it will bring with it with all the incompatibilities and complexities that implies. There are significant disadvantages to this process relative to the shining vision of the Semantic Web, but the big advantage of this bottom-up design and adoption is that it is actually working now.
<<< Clay Shirky, [[The Semantic Web, Syllogism, and Worldview|http://www.shirky.com/writings/herecomeseverybody/semantic_syllogism.html]]
Shirky was alarmingly prescient. After a huge push into a more semantic web by Google and Facebook, both have abandoned their public semantic web projects and rolled whatever they were doing into the [[big data]] soup. All the machine reasoning happens in the background and is guarded over by a new priesthood of data wranglers.
http://www.openresource.com/MBD/mbd_sem_wiki.php
Semantic wikis have failed because they're better for machines than they are for humans. But keep the iceberg principle in mind and they bring some great things to the table - user editability, rollbacks, graph-like structure...
https://www.semantics3.com/
Absolutely on the right track, a phenomenal company. Product, UPC, historical pricing.
Data science / big data focus, completeness, firehose. Analysis services.
<<<
Sentimentality, the ostentatious parading of excessive and spurious emotion, is the mark of dishonesty, the inability to feel. The wet eyes of the sentimentalist betray his aversion to experience, his fear of life, his arid heart; and it is always, therefore, the signal of secret and violent inhumanity, the mask of cruelty.
<<< James Baldwin
Opposite sides of the same coin - I would express it as sentimentality and cynicism. The more cynical I become, the more prone to sentimentality I am.
In my PCA church growing up there was a pre-sermon "children's sermon". One day the pastor got up with a bunch of glass Christmas ornaments, and started smashing them with a hammer one by one. I don't quite remember what the illustration was about - lost trust, or breaking the ten commandments? But I'll remember the illustration until I die.
An aspect of the [[prophetic voice]], a reaction to perceived anemia within [[evangelical discourse]] - using pointed [[satire]] to expose cultural folly. A distinctive element of the [[Moscow Project]]
articulated in the book [[A Serrated Edge]] in 2003
I love shape-note singing. It's soulful and even though it's long-dead it still somehow feels like vernacular American spiritual music - it gives me chills.
[img[http://i.imgur.com/vKvgNoZ.jpg]]
<<<
"""
''Short-order Cook''
//by Jim Daniels//
An average joe comes in
and orders thirty cheeseburgers and thirty fries.
I wait for him to pay before I start cooking.
He pays.
He ain’t no average joe.
The grill is just big enough for ten rows of three.
I slap the burgers down
throw two buckets of fries in the deep frier
and they pop pop spit spit…
psss…
The counter girls laugh.
I concentrate.
It is the crucial point—
They are ready for the cheese:
my fingers shake as I tear off slices
toss them on the burgers/fries done/dump/
refill buckets/burgers ready/flip into buns/
beat that melting cheese/wrap burgers in plastic/
into paper bags/fries done/dump/fill thirty bags/
bring them to the counter/wipe sweat on sleeve
and smile at the counter girls.
I puff my chest out and bellow:
“Thirty cheeseburgers, thirty fries!”
They look at me funny.
I grab a handful of ice, toss it in my mouth
do a little dance and walk back to the grill.
Pressure, responsibility, success,
thirty cheeseburgers, thirty fries.
"""
<<<
<<<
All my life I wanted to be somebody, but now I see I should have been more specific.
<<< Lily Tomlin
//This maybe, maybe could be considered an aspect of the [[Moscow Project]], but I think it's a function of [[Doug's|Doug Wilson]] personality which is oft-imitated but never duplicated.//
The side eyeball is being reserved or withdrawn in conversation, letting the other person talk while withholding response.
This is in contrast to people who adopt an affirming posture while other people are talking - through little nods or what have you.
It may be for fear that a person will say something foolish - you don't want to be generally affirming if someone is going to relate something dumb they did, or say something you disagree with.
It can be an expression of personality, but in some it becomes a rhetorical power move, equivalent to goofy things guys do when shaking hands to express dominance.
<<<
Disneyland is presented as imaginary in order to make us believe that the rest is real, whereas all of Los Angeles and the America that surrounds it are no longer real, but belong to the hyperreal order and to the order of simulation. It is no longer a question of a false representation of reality (ideology) but of concealing the fact that the real is no longer real, and thus of saving the reality principle.
<<< Jean Baudrillard’s Simulacra and Simulation
<<<
Turning to drugs to help you sleep / Will only lead to sleep / And sleeping is a gateway drug / To being awake
<<< They Might Be Giants
[img[http://i.imgur.com/ORprXw0.gif]]
[img[http://i.imgur.com/jfejRQP.gif]]
[img[http://i.imgur.com/F3VrKvO.gif]]
<<<
The man who lives in a small community lives in a much larger world… The reason is obvious. In a large community we can choose our companions. In a small community our companions are chosen for us.
<<< G.K. Chesterton
<<<
“There is dumb dumb and there is smart dumb. There is also smart smart. Dumb dumb is plain dumb and smart smart is plain smart. Smart dumb rejects both smart smart and dumb dumb, choosing instead to walk a tightrope between the two. Smart dumb is incisive and precise. In order to be smart dumb, you have to be really smart, but not in the smart smart way.
“Dumb dumb is rednecks and racists, football hooligans, gum-snapping marketing girls, and thick-necked office boys. Dumb dumb is Microsoft, Disney, and Spielberg. Smart smart is TED talks, think tanks, NPR news, Ivy League universities, The New Yorker, and expensive five-star restaurants. By trying so hard, smart smart really misses the point. Smart dumb is The Fugs, punk rock, art schools, Gertrude Stein, Vito Acconci, Marcel Duchamp, Samuel Beckett, Seth Price, Tao Lin, Martin Margiela, Mike Kelley, and Sofia Coppola. Smart dumb plays at being dumb dumb but knows better.
“Variants of smart dumb also miss the point but in a different way. Twee (~McSweeney’s, Miranda July, Ira Glass, David Byrne) feigns dumb but won’t allow itself to be dumb, for fear that someone might actually think it’s dumb, god forbid. Hipster appropriates chunks of dumb (trucker hats, facial hair, tattoos) but as a fashion trend, refuses to theorize its dumbness, thereby falling squarely into dumb dumb. Smart dumb refuses to commit to either one state or the other. Smart dumb, for instance, incorporates elements of camp but refuses to be camp enough to actually be camp. Dumb vs. smart is not a rehash of hip vs. square. Dumb is both hip and square. Smart dumb has its theorists—de Certeau, Goffman, Debord—those who articulate the mysteries of the mundane and the extraordinariness of the everyday.”
Dumb is preferable because dumb is perennial: “Dumb doesn’t go out of fashion because it is never in fashion. Dumb is stalled and irredeemable. It’s too twisted, too weird, too contradictory and takes too many turns of thought to be reduced to a slogan or ad campaign. No matter how dumb they may appear, ad campaigns are invested in being smart; at the end of the day, you need to communicate smartly in order to get someone to buy something. Dumb muddies the waters. Likewise, juries and prizes don’t recognize dumb. Juries and prizes were invented to award smart.”
Dumb is also preferable because it’s possible to be dumb all your life: “You get to dumb after going through smart. Smart is stupid because it stops at smart. Smart is a phase. Dumb is post-smart. Smart is finite, well-trod, formulaic, known. The world runs on smart. It’s clearly not working. I want to live in a world where the smartest thing you can do is the dumbest. I want to live in a world where a fluorescent tube leaned up against a wall is worth a million dollars. Or where a plumbing fixture on a pedestal is considered the most important art work of the century. Or where building an eternally locked Prada store in a vast expanse of empty Texas desert is considered a stroke of genius. Or where all of the numbers from one to a thousand can simply be classified by alphabetical order and published as a poem. Effortless and easy, dumb is free of failure, an infallible world where the best result is the one you happen to get.”
<<< Kenneth Goldsmith, excerpts from [[Being Dumb|http://www.theawl.com/2013/07/being-dumb]]
[img[http://i.imgur.com/urUPEz7.jpg]]
<<<
First, it must be recognized that for better or worse the symbol of smoking cigarettes has become a fairly universal symbol in North America of rebellion. This does not mean that everyone who smokes cigarettes is in rebellion, but it is a fairly wide spread symbol of rebellion. From the hippies to the rock stars to the frat boys, the symbol is a slightly more subtle version of the middle finger to authority.
Now there was a time when smoking cigarettes was far more culturally acceptable. And I can imagine a time in which Christian families gathered around after dinner for post meal smokes somewhat like how many of us will have coffee or tea after dinner today. Maybe my perception of that era is distorted, but the point still stands. I can imagine a Christian culture where smoking (in moderation) is an acceptable social pastime. In such a culture, kids could grow up and share an occasional smoke with their parents and grandparents and neighbors and everyone was in fellowship and could do it all to the glory of God.
<<< Toby Sumpter, [['Cigarettes'|http://havingtwolegs.blogspot.com/2010/05/cigarettes.html]]
Toby's call to charity and discernment is good, but I have difficulties with a major aspect of his [[cultural criticism]].
The [[cultural meaning]] of cigarettes is most helpfully read with a classist interpretation. Poor people smoke, middle-class people do not. Cigarettes may be a 'universal symbol of rebellion' among the middle-class, but among the poor it doesn't have that association.
A lot of the [[Moscow Project]]'s cultural criticism only applies to high-minded 'fatheads', hypothetical college students who make very heady defenses of outre choices. But this is unclear, which leaves people who did not arrive at the behavior in question in that way caught in the crossfire. Needless to say, I don't think it's healthy when you find out someone smokes to assume that they are primarily making a rebellious statement.
It is strange to invoke 'meat served to idols', after suggesting that the smoker is the weaker brother (unless Toby is saying that the smoker //imagines himself// to be the stronger brother). If smoking is a cultural vice, deference and forbearance should flow in the direction of the smoker.
I also urge caution when declaring something a 'universal symbol' for something. Cultural analysis can be fun and profitable, but care should be taken to avoid simplistic reads. This sort of facile analysis that leads to critiques of [[skinny jeans]].
<<<
“We have learned from so many mistakes in the past that women are at a greater risk for sexual assault and violence if they don’t have separate bathrooms,” says Gauri van Gulik, Amnesty International’s deputy director for Europe and Central Asia. And yet in Europe, where the humanitarian handbooks are often written, the standards are not being met.
<<<
awkward because it's from Quartz: http://qz.com/692711/the-radically-simple-way-to-make-female-refugees-safer-from-sexual-assault-decent-bathrooms/
<<<
Some have exalted religious fasting beyond all Scripture and reason, and others have utterly disregarded it.
<<< John Wesley
I suppose this is an example of the [[Ditch on either side of the road]]. The [[Moscow Project]] seems to have disregarded fasting altogether.
<<<
It’s funny: I always imagined when I was a kid that adults had some kind of inner toolbox full of shiny tools: the saw of discernment, the hammer of wisdom, the sandpaper of patience. But then when I grew up I found that life handed you these rusty bent old tools – friendships, prayer, conscience, honesty – and said 'do the best you can with these, they will have to do'. And mostly, against all odds, they do.
<<< Anne Lamott
<<<
The source of the word 'humorist' is one who regards human beings in terms of their humors — you know, whether they're sanguine or full of yellow bile, or whatever the four classical humors are. You stand back from people and regard them as types. And one finds, especially by the time one reaches one's fifties, that there are a limited number of types of people in the world, and you went to high school with every single one of them. You can visit the Eskimos, you can visit the Bushmen in the Kalahari, you can go to Israel, you can go to Egypt, but everybody you meet is going to be somebody you went to high school with.
<<< P.J. O'Rourke
[img[http://i.imgur.com/CWJ0Vrd.jpg]]
[img[http://i.imgur.com/evbKBfP.gif]]
<<<
Sometimes I go about in pity for myself, and all the while, a great wind carries me across the sky.
<<< Ojibwe saying
<<<
Somewhere is better than anywhere.
<<< Flannery O'Connor
<<<
Sorrow is knowledge: they who know the most /
Must mourn the deepest o’er the fatal truth, /
The Tree of Knowledge is not that of Life.
<<< Lord Byron
[img[http://i.imgur.com/J1plrEs.png]]
<<<
A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects.
<<< Robert Heinlein, Time Enough for Love
//See also://
* [[Friendly Advice to a Lot of Young Men|don't write poetry]]
<<<
St. Bonaventure “teaches us that each creature bears in itself a specifically Trinitarian structure, so real that it could be readily contemplated if only the human gaze were not so partial, dark and fragile”
<<< Pope Francis, Laudato Si (p. 174)
This guide is specifically geared toward out-of-the-way places and day trips. Comments are the impressions of Austin & Laura.
//Updated Jan 2014//
! Eating
!! Breakfast
* ''Donut Parade'' / 2152 N. Hamilton / 509-487-9003: Great little hole in the wall, awesome donuts and staff. We go here almost every visit to Spokane. Go around 9-9:30 for the best selection.
* ''Frank’s Diner'' / 1516 W. 2nd Ave / 509-747-8798: Cozy, old-timey train car (also good for lunch).
* ''Knight’s Diner'' / 2909 N Market St / 509-484-0015: The other train car diner! We prefer Frank’s (it has booths), but this one has just slightly better food.
* ''Central Food'' / 1335 W Summit Parkway / 509-315-8036: breakfast place that reminds us of Bloom here in Moscow. Best place if you want to get a late breakfast or breakfast cocktails.
* ''Chaps Coffee Co'' / 4237 S. Cheney-Spokane Rd: serves breakfast (Fri-Sun), lunch (Tues-Sat), and dinner (Wed-Sat). Great decor, decent food (sometimes the baked goods are a bit dry), odd location. Grab a menu and get in line — someone will assign you to a table while you wait.
Side note: we often visit Frank’s or Chaps when taking people to and from the airport. While they sometimes have a wait, the service times are very fast in both places. We’ve never been to the second Frank’s north of Spokane (near Target) in Mead.
!! Lunch
* ''Stella’s'' / 917 W Broadway Ave / www.stellacafe1.com: Watch for the sidewalk sign (and in good weather, the roll-up door). Simple menu (sandwich + chips), comfortable, open atmosphere. Price range $7-10
* ''Queen of Sheba'' / in the Flour Mill: great Ethiopian food
* ''Mary Lou’s Milk Bottle'' / 802 W. Garland Ave / 509-325-1772: Old-time cafe, shaped like a huge milk bottle (can’t miss it). They make their own patties and their own kaiser rolls on site. Seat yourself, cash only.
* ''Gordy’s Sichuan Cafe'' / 501 E. 30th Ave / 509-747-1170: Our local New Yorker swears this is some of the best Chinese he’s had, anywhere. We agree with him.
* ''Wolffy’s Hamburgers'' / 1229 N. Hamilton / 509-487-1587: 1950’s style diner, friendly staff, great burgers.
* ~~''Five Guys Burgers & Fries'' / 2525 E. 29th Ave: The classic D.C. chain, and just as good as the ones out East.~~ Now closed.
* ''Manito Tap House'' / 3011 S Grand Blvd / 509-279-2671: great bear list and good food. A nice companion to a Trader Joe’s trip or if you’re visiting Manito Park.
//Not Yet Been//
* ''Perry Street Cafe'' / 1002 S Perry St: Everything from cinnamon rolls to pizza to sandwiches.
* ''Picabu Bistro'' / 901 W. 14th / M-Sat, 11-9: recommended by L; featured on Diners, Drive-Ins, & Dives
* ''Latah Bistro'' / 4241 Cheney Spk Blvd: we’ve never been because of the unassuming location, but reviews are great.
* ''Taste of India'' – the buffet
* ''The White House'' – greek
* ''The Flying Goat'' – pizza and beer
!! Dinner
* ''Zola'' / 22 W. Main Ave / 509-624-2416: One of our very favs. Gracious staff, fantastic atmosphere, live music in evenings. Happy hour is the sweet spot (M-Sat: 4-7pm, all day Sun): Appetizers are ~~$5/ea and all amazing; beers start at $1/ea.~~ Jan 2014 Update: they’re raised their prices to $2 PBR and apps now have varying prices. Still a good deal, if not as insane as it used to be.
* ''Milford’s Fish House'' / 719 N. Monroe / 509-326-7251: Great “British gentlemen’s club” feel (dark wood, moose head, palms). $16 per plate and up, always worth it. Reserve a booth.
* ~~''The Catacombs'' / 110 S. Monroe / 509-838-4610: This one appears on a lot of Spokane to-do lists we’ve seen, and for good reason. Underground with a bit of an ancient flare (but not cheesy), great atmosphere, great beers, great food.~~ Jan 2014 Update: Catacombs is closed because of the Montvale’s bankruptcy. Hopefully someone will come along and reopen this cool restaurant.
* ''Sante Restaurant & Charcuterie'' / 404 W. Main Ave (next to Auntie’s Books): Consistently on Best of Spokane lists; pricing $25 and up; wonderful atmosphere, service, food. I’d like to try breakfast here.
//Never been//
* ''Elk Public House'' /
!! Dessert
* ''~FroYo Earth'' / 172 S. Division St, Suite B / Right downtown, froyo flavors and toppings — exactly what you’d expect. (Also see Satellite Diner, below, for pie.)
!! Late
* ''Top Notch Cafe'' / 210 N Main St (Colfax!) / (509) 397-4569: If you’re heading up to Spokane late, for a concert or the like, the Top Notch is a great place to get a burger for the way up. Call ahead (while in Pullman) and they’ll have it ready just in time as you swing through Colfax.
* ''Satellite Diner'' / 425 W. Sprague Ave / 509-624-3952: Total greasy spoon with great service. Home of the infamous Billy Breen Burger (bacon cheeseburger between two grilled cheese sandwiches). Also has pie slices!
!! Coffee
* ''Atticus'' / 222 N. Howard / 509-747-0336: My new favorite coffee spot in Spokane
* ''Rocket Bakery'' / 7 locations in Spokane, but the most loveable is probably the gas station one on South Hill (726 E. 43rd St).
* ''Coeur Coffee'' / 701 N. Monroe, near the County Courthouse. Intelligentsia, Stumptown, and Manners beans in nearly any method you can think of. I’ve been here twice and had two mediocre experiences, but I’m going to give them another try.
!! Lodging
* ''The Montvale'' / 1005 W 1st: our favorite place to stay, we’ve had some success getting good prices through Priceline’s bidding thing – use 3.5 stars for best results. The upkeep seems to have declined slightly because of their recent bankruptcy.
!! Outside
* ''Riverfront Park'' / downtown, next to mall: We can’t walk here enough. Two suspension bridges, mini-donuts, Loof carousel, IMAX, ferris wheel, feed the ducks, $7.50 to ride the gondola over the falls!
* ''Spokane Falls'' (by foot) / The old Washington Water Power building is right next to Riverfront Park. If you walk behind it (cut thru the parking lot), you’ll find a trail and sets of stairs leading down to the bottom of the falls. A definite must during the spring/early summer when the falls are at their grandest.
* ''Manito Park'' / South Hill, on Grand: Acres and acres of incredible gardening. Parking at all entrances. Highlights: Nishinomiya Japanese Garden, Duncan Formal Garden, duck pond, and exotic plant conservatory.
//Not Yet Been//
* ''Cat Tales'' / N. 17020 Newport Hwy, Mead, WA / 509-238-4126 / Tues-Sun: A “big cat” zoo full of tigers, lions, panthers, leopards. About 15 mins north of Spokane.
!! Firsthand Shopping
* ''Atticus Coffee & Gifts'' / 222 N. Howard / 509-747-0336: Great gift shop, the sophisticated companion to Boo Radley’s.
* ''Boo Radley’s'' / 232 N. Howard St / 509-456-7479: Funky toy store for grownups
* ''Auntie’s Bookstore'' / 402 W. Main / 509-838-0206: Auntie’s has sadly been shrinking over the years, from three floors of the building down to just one. But they still have an impressive collection of new and used books
* ''Artemis'' / 3109 N Monroe: Like Spokane’s own independent Anthropologie. Well curated.
!! Secondhand Shopping
* ''Fringe & Fray'' / 1325 W. First Ave, Ste. 102 / 509-720-7116: Tiny but incredibly well-edited. Super-affordable, men’s & women’s and some decor. Jan 2014: they just doubled in size – we’re excited to check out their new offerings
* ''Carousel Vintage'' / 110 S. Cedar: Just around the corner from Fringe & Fray. Boutique prices, but worth a visit just to see. Women’s only, sorted by decade.
* ''Roost'' / 7 W. Main Ave: Cute shabby chic decor at attainable prices
* ''DYD (Drop Your Drawers)'' / 719 W. Garland Ave: Old hippie owner, good prices, lots of vintage stuff, men’s & women’s. A fun dive.
* ''Tossed & Found'' / 2607 N Monroe St: Very best antique mall in Spokane
* ''Metro Furniture Consignment'' / Monroe: usually some great mid-century modern pieces
* ''Hillyard District Antiques'' / 4912 N. Market St & surrounding: Lots of quaint little shops along Market, mainly antiques, mostly overpriced, but still fun to look.
//Not Yet Been//
* ''Pilot Books'' / 3108 E. Olympic Ave / (509) 487-1548 (Apparently looks like an old laundromat from the outside?)
!! Movies
* ''Garland Theater'' / 924 W Garland Ave / 509-327-1050: Vintage theater showing second-run movies for $4.50/ea (bottomless popcorn for $5).
* ''The Magic Lantern'' / 25 W Main Ave, Ste 150 / 509-209-2211: Teeny-tiny independent theater ($7.00/ea), French-press coffee and bakery item concessions. Somewhat unclear street entry; shares entrance with Sazerac. Enter and walk straight back.
!! Other
* ''Dryfly Distillery'' / 1003 East Trent Ave / 509-489-2112: First grain distillery in Washington since the Prohibition! Super-friendly staff. The flat-out best gin and vodka ever. Buzz in at front door.
* ''Habitat for Humanity Surplus'' / 732 North Napa St (new location?) / 509-534-2552: No heating/cooling, but great finds and inspiration. Spotted: claw-foot bathtub.
* ''Tin Man Art Gallery'' / 811 West Garland Ave / 509-325-1500: Unique, local art. Smaller pieces feel attainable.
!! Not Yet Been
* ''Northwest Museum of Arts & Culture (MAC)''
* ''Carr’s One-of-a-Kind Museum'' (sadly closed before we were ever able to visit - Carr passed away and the museum was auctioned off) / 5225 N. Freya / Open Sat-Sun, 1-4pm
<<<
Sprezzatura? Of course, in this advanced age of the handheld vocabulary, everyone on earth knows what sprezzatura means, but in 2000 I had no idea, and I reached for an Italian dictionary. Nothing. I looked in another Italian dictionary. Nothing. I looked in Web II—Webster’s unabridged New International Dictionary, Second Edition. Niente. I picked up the phone and called my daughter Martha, who has lived in Italy and co-translated John Paul II’s “Crossing the Threshold of Hope” into English from the Vatican’s Italian.
Her credentials notwithstanding, Martha was no help.
I tried my daughter Sarah, a professor of art and architectural history at Emory, whose specialty is Baroque Rome. Her answering machine was as helpful as Martha.
That evening, I happened to attend a crowded reception at the New York Public Library with my daughter Jenny, the other translator of the Pope’s book, and her husband, Luca Passaleva, who was born, raised, and educated in Florence. “Hey, Luc. What is the meaning of ‘sprezzatura’?”
Luca: “I don’t know. Ask Jenny.”
Jenny: “I don’t know, but that couple over there might know. He’s in the Italian consulate.”
Consul: “Ask my wife. She is literary, I am not.”
Signora: “I’m very sorry. I have no idea.”
Back in Princeton the next day, I had a scheduled story conference with Abe Crystal, his profile of Grainger David on the desk in front of us. With my index finger touching “sprezzatura,” I said, “Abe, what the hell is this?”
Abe said he had picked up the word in Castiglione’s “The Courtier,” from 1528. “It means effortless grace, all easy, doing something cool without apparent effort.”
Soon after he left, I called Sarah again, and she picked up. She said Abe had it right, but the word “nonchalance” should be added to his definition. She said that Raphael carried the ideal of sprezzatura into painting. “He painted his friend Baldassare Castiglione as the ideal courtier, the embodiment of sprezzatura. It’s now in the Louvre.”
<<< John ~McPhee, [[Frame of Reference|http://www.newyorker.com/magazine/2015/03/09/frame-of-reference-john-mcphee]]
[img[http://38.media.tumblr.com/tumblr_lxq3a06hEf1r8nzi2o1_500.gif]]
<<<
We do not need definite beliefs because their objects are necessarily true. We need them because they enable us to stand on steady spots from which the truth may be glimpsed. And not simply glimpsed—because certainly revelation is available outside of dogma; indeed all dogma, if it’s alive at all, is the result of revelation at one time or another—but gathered in. Definite beliefs are what make the radical mystery—those moments when we suddenly know there is a God, about whom we “know” absolutely nothing—accessible to us and our ordinary, unmysterious lives. And more crucially: definite beliefs enable us to withstand the storms of suffering that come into every life, and that tend to destroy any spiritual disposition that does not have deep roots.
<<< Christian Wiman, My Bright Abyss
[img[https://scontent-b-sea.xx.fbcdn.net/hphotos-xpa1/v/t1.0-9/s720x720/384271_10150384832182361_1494975064_n.jpg?oh=d33d95aa74981a5660ed7c22ca5514cf&oe=556EDA31]]
<<<
Bryne: Suppose it's all true, and you walk up to the pearly gates, and are confronted by God. What will Stephen Fry say to him, her, or it?
Fry: I'd say, bone cancer in children? What's that about? How dare you? How dare you create a world to which there is such misery that is not our fault. It's not right, it's utterly, utterly evil. Why should I respect a capricious, mean-minded, stupid God who creates a world that is so full of injustice and pain. That's what I would say.
Byrne: And you think you are going to get in, like that?
Fry: But I wouldn't want to. I wouldn't want to get in on his terms. They are wrong.
<<<
Interviewed by Gay Byrne for a program called The Meaning of Life, Stephen Fry shared what he would say to God if Fry met him at the gates of heaven.
[img[http://i.imgur.com/Bic0Wi0.jpg]]
"""
''Opening sentence''
O Lord, how manifold are your works! In wisdom have you made them all; the earth is full of your creatures. - Ps 104:24
''Confession''
//As children of a loving heavenly Father,
let us ask his forgiveness,
for he is gentle and full of compassion.//
''Silence kept.''
''Assurance''
//May God our Father forgive us our sins
and bring us to the eternal joy of his kingdom,
where dust and ashes have no dominion.//
''Amen.''
''Collect''
O Lord, give us humility to thank You for the creation of animals, who can show affection which sometimes puts us to shame. Enlarge our respect for these your creatures, of whom we are the guardians. And give us a sense of responsibility towards all your creation, for Jesus Christ’s sake, Amen. ''-A Prayer from Robert Runcie, 102nd Archbishop of Canterbury''
''First Lesson: Genesis 9:8-17''
Then God said to Noah and to his sons with him, “Behold, I establish my covenant with you and your offspring after you, and with every living creature that is with you, the birds, the livestock, and every beast of the earth with you, as many as came out of the ark; it is for every beast of the earth. I establish my covenant with you, that never again shall all flesh be cut off by the waters of the flood, and never again shall there be a flood to destroy the earth.” And God said, “This is the sign of the covenant that I make between me and you and every living creature that is with you, for all future generations: I have set my bow in the cloud, and it shall be a sign of the covenant between me and the earth.When I bring clouds over the earth and the bow is seen in the clouds, I will remember my covenant that is between me and you and every living creature of all flesh. And the waters shall never again become a flood to destroy all flesh. When the bow is in the clouds, I will see it and remember the everlasting covenant between God and every living creature of all flesh that is on the earth.” God said to Noah, “This is the sign of the covenant that I have established between me and all flesh that is on the earth.”
//The Word of the Lord.//
''Thanks be to God.''
''Psalm - 104:1, 10-15, 25''
1 Bless the Lord, O my soul; *
O Lord my God, how excellent is your greatness!
you are clothed with majesty and splendor.
10 You send the springs into the valleys; *
they flow between the mountains.
11 All the beasts of the field drink their fill from them, *
and the wild asses quench their thirst.
12 Beside them the birds of the air make their nests *
and sing among the branches.
13 You water the mountains from your dwelling on high; *
the earth is fully satisfied by the fruit of your works.
14 You make grass grow for flocks and herds *
and plants to serve mankind;
15 That they may bring forth food from the earth, *
and wine to gladden our hearts,
25 O Lord, how manifold are your works! *
in wisdom you have made them all;
the earth is full of your creatures.
''Second Lesson: Romans 8:18-25''
For I consider that the sufferings of this present time are not worth comparing with the glory that is to be revealed to us. For the creation waits with eager longing for the revealing of the sons of God. For the creation was subjected to futility, not willingly, but because of him who subjected it, in hope that the creation itself will be set free from its bondage to corruption and obtain the freedom of the glory of the children of God.
For we know that the whole creation has been groaning together in the pains of childbirth until now. And not only the creation, but we ourselves, who have the firstfruits of the Spirit, groan inwardly as we wait eagerly for adoption as sons, the redemption of our bodies. For in this hope we were saved. Now hope that is seen is not hope. For who hopes for what he sees? But if we hope for what we do not see, we wait for it with patience.
//The Word of the Lord//
''Thanks Be to God.''
''Hymn''
“All Creatures of Our God and King” (first & last verses)
''Prayers''
God of mercy,
you are tender towards your children,
and your mercy is over all your works.
You will not allow the love which exists between your creatures to perish:
We pray for Sticks, your own creature,
thank you for her, for saving her as a baby and entrusting her to us,
heal our memories of her pain and suffering,
give us patience as we grieve, comforting us with memories of her life.
Give us wisdom and grace to turn to Christ
and follow in his steps in the way that leads to everlasting life.
Silence observed
//Lord, in your mercy//
''hear our prayer.''
''Committal''
Everything living is yours and returns to you. This is a mystery, and we give you thanks for the life of Sticks and we now commit her into your loving hands. God: fragile is your world, delicate are your creatures, and costly is your love which bears and redeems us. Give us a spirit of gratitude for the life of Sticks who has lived among us and given us of her love. Even in our sorrow we have cause for joy for we know that all creatures who died on earth shall live again in your new creation. ''Amen.''
''Dismissal''
May God, the Creator of all that is, God the Redeemer of all Creation, and God the life giving Spirit, bless you and keep you, now and forever. ''Amen.''
[img[https://scontent-a-sea.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/p720x720/1098271_10151642346917361_925596341_n.jpg?oh=5ca905bf0c5984f11e5777de3c92b082&oe=5522460C]]
<<<
Here I want only to say that when engaging the culture, our default position should be: Stop talking. The world will not be harmed if you do not speak about 50 Shades of Grey. It is not waiting to hear your opinion on the effects of movies that glamorize rich guys dominating submissive young women.
It may be waiting to hear you say something about the Mass, or confession, or the Rosary, or holy cards, or the Miraculous Medal. It’s waiting to hear from someone about Jesus and his Church. Even your simple testimony that “Jesus loves me, this I know,” will likely have more effect than your best cultural analysis of 50 Shades of Grey.
This isn’t to leave the public square. It’s to live in it without getting caught up in its ceaseless movement, and in its frequent excitements and its occasional riots. It’s to know when to address the crowd from a box in the square and when to walk through the crowd talking to a few people or stand off to the side and watch. It’s to know when to go home, and how you might bring others home with you.
<<< David Mills, [["50 Shades of Grey" and the World's Script|http://www.aleteia.org/en/society/article/50-shades-of-grey-and-the-worlds-script-5831070259871744]]
'strategic and feasible' is another way of putting this. A metaphor to explain why Moscow is a good location for evangelistic ministry.
I think this is a distillation of the ideas in [[Jim Wilson]]'s [[Principles of War]]
A summary of this from a newspaper article, replete with lots of scare quotes:
<<<
The military significance of what he called a “decisive point” in an enemy’s defenses. A decisive point, he said, was a military target that was both “strategic,” meaning that it would be a debilitating “loss to the enemy if taken,” and one that was also “feasible.” Boville, he argued, was a “feasible” target but not “strategic.” New York City, on the other hand, was “strategic” but not “feasible.” “Small college towns with major research universities,” he continued, such as “ Moscow and Pullman . . . are both strategic and feasible.”
<<< from a sermon delivered by Douglas Wilson on December 28, 2003
<<<
But the reason 21st century street style was such a telling capsule moment for fashion history is because it was, I think, a time when the fashion industry became the snake eating its own tail. Even they couldn’t sell their way out of the problem they’d created. You can’t, as a fashion editor, embody complete power and certainty in your professional aesthetic choices while also offering up your own aesthetic choices for mass consumption; embodying trends is the fastest way to get yourself knocked off that fashion shelf. Otherwise, people might start to clue in to the fallible nature of our trusted representatives in the field of fashion journalism—that they are not objective arbiters of creative expression, but instead just people directing the billion-dollar flow of the fashion economy based on, as Menkes says, the justification of their own taste and priorities. Street style was good when fashion editors liked it, and then it was bad when they grew bored with it, and that was that!
<<< Haley Mlotek, [[What Was Street Style? Pt. 2|http://thehairpin.com/2015/09/what-was-street-style-pt-2/]]
This article is very good.
<<<
While it is true that only the sufferings of Christ are a means of atonement, yet since he has suffered for and borne the sins of the whole world and shares with his disciples the fruits of his passion, the Christian . . . too has to bear the sins of others. . . . But he would certainly break down under this burden, but for him who bore the sins of all. The passion of Christ strengthens him to overcome the sins of others by forgiving them.
<<< Dietrich Bonhoeffer, The Cost of Discipleship
<<<
...grown-up people are not strong enough to exult in monotony. But perhaps God is strong enough to exult in monotony. It is possible that God says every morning, ‘Do it again’ to the sun; and every evening, ‘Do it again’ to the moon. It may not be automatic necessity that makes all daisies alike; it may be that God makes every daisy separately, but has never got tired of making them.
<<< G.K. Chesterton
<<<
The author who benefits you most is not the one who tells you something you did not know before, but the one who gives expression to the truth that has been dumbly struggling in you for utterance.
<<< Oswald Chambers, My Utmost for His Highest
Stubs are articles that I would like to go back and expand. The 'stub' tag reminds me of that and makes them easier to find.
Technically it's all [[under construction|web 1.0]], but these I have particular designs to improve.
A multitude of stubs are what you get when you don't have a unified place for your commonplace book, or (worse!) if you switch the form of your [[commonplace book|commonplace]] every few years for your entire life.
<<<
Job's greatest virtue was his stubborn refusal to apologize. In our day, men cave in to pressures & apologize & everyone calls them a hero.
If Jesus had just apologized for using such harsh language & offending & hurting so many people, then we wouldn't need this church thing.
<<< Toby Sumpter, 7/25/2012
I don't have an opinion over whether this is the most accurate portrayal of Job or Jesus's rhetorical posture, but this is illustrative of how the prophetic is understood in the [[Moscow Project]] - apologizing is seen as very destructive.
<<<
If Stupidity got us into this mess, then why can’t it get us out?
<<< Will Rogers
<<<
Style is like a frog; you can dissect the thing, but it dies in the process.
<<< Roy Williams
<<<
The point about every single book that I re-read in order to laugh is that every one is so much more than funny because the authors write so well. Wodehouse uses the English language to perfection, Durrell evokes scenes so wonderfully, Nancy Mitford’s prose is so elegant, so arch. One could learn to write from any of them and I wish more people would. No matter what the genre, good writing always tells. Crime novels? Look at Raymond Chandler, master of style. Spy novels? How many do you know who write as well as le Carre? Style wins every, every time.
<<< Susan Hill, Howard’s End Is on the Landing.
<<<
Just as God's love entered the world, thereby submitting to the misunderstanding and ambiguity that characterize everything worldly, so also Christian love does not exist anywhere but in the worldly, in an infinite variety of concrete worldly action, and subject to misunderstanding and condemnation. Every attempt to portray a Christianity of "pure" love purged of worldly "impurities" is a false purism and perfectionism that scorns God's becoming human and falls prey to the fate of all ideologies. God was not too pure to enter the world.
<<< Dietrich Bonhoeffer
<<<
"""Fred: And one of the things that keeps popping up is this about "subtext." Plays, novels, songs - they all have a "subtext," which I take to mean a hidden message or import of some kind. So subtext we know. But what do you call the message or meaning that's right there on the surface, completely open and obvious? They never talk about that. What do you call what's above the subtext?
Ted: The text.
Fred: OK, that's right, but they never talk about that."""
<<< Whit Stillman, from 'Barcelona'
https://www.youtube.com/watch?v=kIbg7oiXECE
<<<
I want to create something out of nothing but nothing isn’t a great place to draw from.
<<< Mitch Hedberg
When I was young (17 or 18, before I left home) I was [[depressed|depression]] to the point of contemplating suicide.
I thought my suicide would be a great occasion for reflection. That my family, friends, entire milieu, maybe even society as a whole would have to consider all the things that led to this sad outcome. They would understand my situation in ways that I was unable to, and maybe even make some positive changes.
Thank God I've arrived at a much better place, and although I still struggle with [[depression]] my life is better in every possible way.
Over the years I've had a [[friend|Alicea Zickert]] and a few acquaintances commit suicide, and I've slowly realized that what I hoped would come out of my suicide never happens, with anyone's suicide, ever. As soon as someone actually commits, everyone around them considers the situation just long enough to invoke the disease model and determine that they were out of their minds, irrational. None of their obituaries mentions how they died.
It makes sense. Only a crazy person would kill themself, so if you kill yourself you must be crazy. They do not consider that the person was living in a hell that was only partly made by them, and partly made by the people around them. But I do not begrudge anyone for overlooking this- grief is for the living.
If I could address my high-school self, after-school special style, that's what I'd tell them: people will be sad, but no one's going to get all 'Man in the Mirror' and make a change. Abusive people will keep being abusive, absent people will keep being absent.
It's bleak, but it would've made a difference. I didn't merely want to end my suffering, I wanted to affect positive change. I knew I would hurt people in the short term, but I hoped in the long term that people (and society, how grandiose!) would be better.
I didn't realize that [[suffering isn't enough|to have merely suffered isn't enough]]. If you want to change things you have to be around to change things. Of course there are situations you cannot change on your own. I needed help with depression and a great many other circumstantial things. But if you hope that your suicide will make the world better, I guarantee it won't.
<<<
[Prophecy is] a narrative that summons alternative ways of life.
<<< Walter Breuggemann
<<<
I was surprised as anyone when T-shirts, jeans and leather jackets suddenly became symbols of rebellion.
<<< Marlon Brando
<<<
"""
IT is morning, Senlin says, and in the morning
When the light drips through the shutters like the dew,
I arise, I face the sunrise,
And do the things my fathers learned to do.
Stars in the purple dusk above the rooftops
Pale in a saffron mist and seem to die,
And I myself on a swiftly tilting planet
Stand before a glass and tie my tie.
...
"""
<<< Morning Song of Senlin, Conrad Aiken
<<<
!!! Taking Down That Flag
by Douglas Jones
The railing against flying the Confederate flag anywhere won’t die down even with recent turns. And Southern-heritage sorts have called for more counter-boycotts and marches.
Pretend for a moment that issues of race aren't at play here. A question that no one seems to be asking is whether the defenders of the Confederate flag are worthy of what they see as its symbolism? Or aren't they more like modernist churches with crosses?
After the disaster at Gettysburg, Robert E. Lee declared to his men: “Soldiers! We have sinned against Almighty God. We have forgotten His signal mercies and have cultivated a revengeful, haughty, and boastful spirit.... We have relied too much on our own arms.”
No southern state cares about purity in this way. True followers of Lee should be appalled at the thought of seeing secular conservatives give hypocritical lipservice to some “biblical heritage.”
The fact is that God brought judgment on the South for a reason. But repentance is never the lead cry of the loudest Southern patriot sorts (with some exceptions). Instead they boast of the rights of their “proud legacy” and dwell on the sins of their accusers.
They refuse to acknowledge that the biggest scar on this legacy is God’s own judgment. The Confederate flag may not be a symbol of slavery, but it’s certainly a symbol of divine wrath. To wave it should be a call to remember that judgment and repent. To wave it in pride or as some cute rebellion would be like Judah thumbing its nose at the exile. One doesn’t lift divine judgment by Pelagian politics. One lifts it by bowing the head and doing the works of repentance—“relieve the oppressed, judge the fatherless, plead for the widow” (Is. 1:17).
Moses’ bronze serpent ceased being a godly symbol when the people trusted in their own heritage. Hezekiah was righteous in smashing it, though it surely upset the Bronze Serpent Heritage Society. Instead of taking pride in God’s disfavor, perhaps it’s time for faithful southerners to burn their serpent and wear the ashes.
<<< Credenda 12.1, 2000ish
[img[http://i.imgur.com/3lZPq7e.jpg]]
i.e. Nationalism, Idolatry, and the American Civil Religion
<<<
I have never encountered an executive who remains effective while tackling more than two tasks at a time.
<<< Peter Drucker
<<<
It seems not inappropriate that I take my inner atheist with me to church every Sunday. The atheist within me is as noisy as my stomach, even when I am standing in the Communion line.
I believe in Jesus Christ, the Christ who was a loser in human history—destroyed by this world—whose life reveals in its generosity and tragedy the most complete and challenging version of theism I know. What the New Atheists do not comprehend is that the crucifix cannot be mocked. It is itself mockery.
<<< Richard Rodriguez, [[Atheism is Wasted On the Nonbeliever|http://thevalueofsparrows.com/2012/08/23/faith-atheism-is-wasted-on-the-nonbeliever-by-richard-rodriguez/]]
[img[http://i.imgur.com/Iq91syt.jpg]]
<<<
Taste begins when the appetite is satisfied.
<<< Bernard Berenson
<<<
What enriches a language is its being handled and exploited by beautiful minds - not so much by making innovations as by expanding it through more vigorous and varied applications, by extending it and deploying it. It is not words that they contribute: what they do is enrich their words, deepen their meanings and tie down their usage; they teach it unaccustomed rhythms, prudently though and with ingenuity.
<<< Michel de Montaigne
<<<
Teach us to care and not to care /
Teach us to sit still.
<<< T.S. Eliot, from Ash Wednesday
<<<
"""''Ash Wednesday''
//by T.S. Eliot//
Because I do not hope to turn again
Because I do not hope
Because I do not hope to turn
Desiring this man's gift and that man's scope
I no longer strive to strive towards such things
(Why should the aged eagle stretch its wings?)
Why should I mourn
The vanished power of the usual reign?
Because I do not hope to know again
The infirm glory of the positive hour
Because I do not think
Because I know I shall not know
The one veritable transitory power
Because I cannot drink
There, where trees flower, and springs flow, for there is nothing again
Because I know that time is always time
And place is always and only place
And what is actual is actual only for one time
And only for one place
I rejoice that things are as they are and
I renounce the blessed face
And renounce the voice
Because I cannot hope to turn again
Consequently I rejoice, having to construct something
Upon which to rejoice
And pray to God to have mercy upon us
And pray that I may forget
These matters that with myself I too much discuss
Too much explain
Because I do not hope to turn again
Let these words answer
For what is done, not to be done again
May the judgement not be too heavy upon us
Because these wings are no longer wings to fly
But merely vans to beat the air
The air which is now thoroughly small and dry
Smaller and dryer than the will
Teach us to care and not to care
Teach us to sit still.
Pray for us sinners now and at the hour of our death
Pray for us now and at the hour of our death.
II
Lady, three white leopards sat under a juniper-tree
In the cool of the day, having fed to satiety
On my legs my heart my liver and that which had been contained
In the hollow round of my skull. And God said
Shall these bones live? shall these
Bones live? And that which had been contained
In the bones (which were already dry) said chirping:
Because of the goodness of this Lady
And because of her loveliness, and because
She honours the Virgin in meditation,
We shine with brightness. And I who am here dissembled
Proffer my deeds to oblivion, and my love
To the posterity of the desert and the fruit of the gourd.
It is this which recovers
My guts the strings of my eyes and the indigestible portions
Which the leopards reject. The Lady is withdrawn
In a white gown, to contemplation, in a white gown.
Let the whiteness of bones atone to forgetfulness.
There is no life in them. As I am forgotten
And would be forgotten, so I would forget
Thus devoted, concentrated in purpose. And God said
Prophesy to the wind, to the wind only for only
The wind will listen. And the bones sang chirping
With the burden of the grasshopper, saying
Lady of silences
Calm and distressed
Torn and most whole
Rose of memory
Rose of forgetfulness
Exhausted and life-giving
Worried reposeful
The single Rose
Is now the Garden
Where all loves end
Terminate torment
Of love unsatisfied
The greater torment
Of love satisfied
End of the endless
Journey to no end
Conclusion of all that
Is inconclusible
Speech without word and
Word of no speech
Grace to the Mother
For the Garden
Where all love ends.
Under a juniper-tree the bones sang, scattered and shining
We are glad to be scattered, we did little good to each other,
Under a tree in the cool of the day, with the blessing of sand,
Forgetting themselves and each other, united
In the quiet of the desert. This is the land which ye
Shall divide by lot. And neither division nor unity
Matters. This is the land. We have our inheritance.
III
At the first turning of the second stair
I turned and saw below
The same shape twisted on the banister
Under the vapour in the fetid air
Struggling with the devil of the stairs who wears
The deceitul face of hope and of despair.
At the second turning of the second stair
I left them twisting, turning below;
There were no more faces and the stair was dark,
Damp, jagged, like an old man's mouth drivelling, beyond repair,
Or the toothed gullet of an aged shark.
At the first turning of the third stair
Was a slotted window bellied like the figs's fruit
And beyond the hawthorn blossom and a pasture scene
The broadbacked figure drest in blue and green
Enchanted the maytime with an antique flute.
Blown hair is sweet, brown hair over the mouth blown,
Lilac and brown hair;
Distraction, music of the flute, stops and steps of the mind over the third stair,
Fading, fading; strength beyond hope and despair
Climbing the third stair.
Lord, I am not worthy
Lord, I am not worthy
but speak the word only.
IV
Who walked between the violet and the violet
Who walked between
The various ranks of varied green
Going in white and blue, in Mary's colour,
Talking of trivial things
In ignorance and knowledge of eternal dolour
Who moved among the others as they walked,
Who then made strong the fountains and made fresh the springs
Made cool the dry rock and made firm the sand
In blue of larkspur, blue of Mary's colour,
Sovegna vos
Here are the years that walk between, bearing
Away the fiddles and the flutes, restoring
One who moves in the time between sleep and waking, wearing
White light folded, sheathing about her, folded.
The new years walk, restoring
Through a bright cloud of tears, the years, restoring
With a new verse the ancient rhyme. Redeem
The time. Redeem
The unread vision in the higher dream
While jewelled unicorns draw by the gilded hearse.
The silent sister veiled in white and blue
Between the yews, behind the garden god,
Whose flute is breathless, bent her head and signed but spoke no word
But the fountain sprang up and the bird sang down
Redeem the time, redeem the dream
The token of the word unheard, unspoken
Till the wind shake a thousand whispers from the yew
And after this our exile
V
If the lost word is lost, if the spent word is spent
If the unheard, unspoken
Word is unspoken, unheard;
Still is the unspoken word, the Word unheard,
The Word without a word, the Word within
The world and for the world;
And the light shone in darkness and
Against the Word the unstilled world still whirled
About the centre of the silent Word.
O my people, what have I done unto thee.
Where shall the word be found, where will the word
Resound? Not here, there is not enough silence
Not on the sea or on the islands, not
On the mainland, in the desert or the rain land,
For those who walk in darkness
Both in the day time and in the night time
The right time and the right place are not here
No place of grace for those who avoid the face
No time to rejoice for those who walk among noise and deny the voice
Will the veiled sister pray for
Those who walk in darkness, who chose thee and oppose thee,
Those who are torn on the horn between season and season, time and time, between
Hour and hour, word and word, power and power, those who wait
In darkness? Will the veiled sister pray
For children at the gate
Who will not go away and cannot pray:
Pray for those who chose and oppose
O my people, what have I done unto thee.
Will the veiled sister between the slender
Yew trees pray for those who offend her
And are terrified and cannot surrender
And affirm before the world and deny between the rocks
In the last desert before the last blue rocks
The desert in the garden the garden in the desert
Of drouth, spitting from the mouth the withered apple-seed.
O my people.
VI
Although I do not hope to turn again
Although I do not hope
Although I do not hope to turn
Wavering between the profit and the loss
In this brief transit where the dreams cross
The dreamcrossed twilight between birth and dying
(Bless me father) though I do not wish to wish these things
From the wide window towards the granite shore
The white sails still fly seaward, seaward flying
Unbroken wings
And the lost heart stiffens and rejoices
In the lost lilac and the lost sea voices
And the weak spirit quickens to rebel
For the bent golden-rod and the lost sea smell
Quickens to recover
The cry of quail and the whirling plover
And the blind eye creates
The empty forms between the ivory gates
And smell renews the salt savour of the sandy earth This is the time of tension between dying and birth The place of solitude where three dreams cross Between blue rocks But when the voices shaken from the yew-tree drift away Let the other yew be shaken and reply.
Blessed sister, holy mother, spirit of the fountain, spirit of the garden,
Suffer us not to mock ourselves with falsehood
Teach us to care and not to care
Teach us to sit still
Even among these rocks,
Our peace in His will
And even among these rocks
Sister, mother
And spirit of the river, spirit of the sea,
Suffer me not to be separated
And let my cry come unto Thee.
"""
<<<
<<<
You should run your startup like a cult... Taking a merely professional view of the workplace, in which free agents check in and out on a transactional basis, is worse than cold: It’s not even rational.
<<< Peter Thiel, //Zero to One//
Definitely a 'ditch on either side' for this one. Ultimately harmful, especially in the hyperreal VC-funded startup world. Relates to [[corporate paternalism]]
<<<
In the absence of land or seas to ‘explore’, the startup business becomes the insular, pioneering social organization through which the new can be discovered and built. Because if startups are a way of making something out of nothing—going from zero to one, in Silicon Valley parlance—an organization that operates on cultish principles can be a way of making more with less: more employee allegiance, more efficiency, more passion, more dedication, more labor. Why offer mere jobs when you can offer an all-consuming, never-ending mission? Why simply ask employees to work when they can yearn to meet some shared, transcendent company goal?
<<< Kate Losse, [[Cults at Scale|http://dismagazine.com/issues/72970/kate-losse-cults-at-scale/]]
<<<
Do more cool stuff. Tell less people.
<<< Branden Harvey
This is Ev Williams of Blogger / Odeo / Twitter fame.
Posted on [[his blog|http://evhead.com/2005/11/ten-rules-for-web-startups.asp]] in 2005, I keep worrying he'll take it down:
<<<
"""
Ten Rules for Web Startups
''#1: Be Narrow''
Focus on the smallest possible problem you could solve that would potentially be useful. Most companies start out trying to do too many things, which makes life difficult and turns you into a me-too. Focusing on a small niche has so many advantages: With much less work, you can be the best at what you do. Small things, like a microscopic world, almost always turn out to be bigger than you think when you zoom in. You can much more easily position and market yourself when more focused. And when it comes to partnering, or being acquired, there's less chance for conflict. This is all so logical and, yet, there's a resistance to focusing. I think it comes from a fear of being trivial. Just remember: If you get to be #1 in your category, but your category is too small, then you can broaden your scope—and you can do so with leverage.
''#2: Be Different''
Ideas are in the air. There are lots of people thinking about—and probably working on—the same thing you are. And one of them is Google. Deal with it. How? First of all, realize that no sufficiently interesting space will be limited to one player. In a sense, competition actually is good—especially to legitimize new markets. Second, see #1—the specialist will almost always kick the generalist's ass. Third, consider doing something that's not so cutting edge. Many highly successful companies—the aforementioned big G being one—have thrived by taking on areas that everyone thought were done and redoing them right. Also? Get a good, non-generic name. Easier said than done, granted. But the most common mistake in naming is trying to be too descriptive, which leads to lots of hard-to-distinguish names. How many blogging companies have "blog" in their name, RSS companies "feed," or podcasting companies "pod" or "cast"? Rarely are they the ones that stand out.
''#3: Be Casual''
We're moving into what I call the era of the "Casual Web" (and casual content creation). This is much bigger than the hobbyist web or the professional web. Why? Because people have lives. And now, people with lives also have broadband. If you want to hit the really big home runs, create services that fit in with—and, indeed, help—people's everyday lives without requiring lots of commitment or identity change. Flickr enables personal publishing among millions of folks who would never consider themselves personal publishers—they're just sharing pictures with friends and family, a casual activity. Casual games are huge. Skype enables casual conversations.
''#4: Be Picky''
Another perennial business rule, and it applies to everything you do: features, employees, investors, partners, press opportunities. Startups are often too eager to accept people or ideas into their world. You can almost always afford to wait if something doesn't feel just right, and false negatives are usually better than false positives. One of Google's biggest strengths—and sources of frustration for outsiders—was their willingness to say no to opportunities, easy money, potential employees, and deals.
''#5: Be User-Centric''
User experience is everything. It always has been, but it's still undervalued and under-invested in. If you don't know user-centered design, study it. Hire people who know it. Obsess over it. Live and breathe it. Get your whole company on board. Better to iterate a hundred times to get the right feature right than to add a hundred more. The point of Ajax is that it can make a site more responsive, not that it's sexy. Tags can make things easier to find and classify, but maybe not in your application. The point of an API is so developers can add value for users, not to impress the geeks. Don't get sidetracked by technologies or the blog-worthiness of your next feature. Always focus on the user and all will be well.
''#6: Be Self-Centered''
Great products almost always come from someone scratching their own itch. Create something you want to exist in the world. Be a user of your own product. Hire people who are users of your product. Make it better based on your own desires. (But don't trick yourself into thinking you are your user, when it comes to usability.) Another aspect of this is to not get seduced into doing deals with big companies at the expense or your users or at the expense of making your product better. When you're small and they're big, it's hard to say no, but see #4.
''#7: Be Greedy''
It's always good to have options. One of the best ways to do that is to have income. While it's true that traffic is now again actually worth something, the give-everything-away-and-make-it-up-on-volume strategy stamps an expiration date on your company's ass. In other words, design something to charge for into your product and start taking money within 6 months (and do it with ~PayPal). Done right, charging money can actually accelerate growth, not impede it, because then you have something to fuel marketing costs with. More importantly, having money coming in the door puts you in a much more powerful position when it comes to your next round of funding or acquisition talks. In fact, consider whether you need to have a free version at all. The ~TypePad approach—taking the high-end position in the market—makes for a great business model in the right market. Less support. Less scalability concerns. Less abuse. And much higher margins.
''#8: Be Tiny''
It's standard web startup wisdom by now that with the substantially lower costs to starting something on the web, the difficulty of IPOs, and the willingness of the big guys to shell out for small teams doing innovative stuff, the most likely end game if you're successful is acquisition. Acquisitions are much easier if they're small. And small acquisitions are possible if valuations are kept low from the get go. And keeping valuations low is possible because it doesn't cost much to start something anymore (especially if you keep the scope narrow). Besides the obvious techniques, one way to do this is to use turnkey services to lower your overhead—Administaff, ServerBeach, web apps, maybe even Elance.
''#9: Be Agile''
You know that old saw about a plane flying from California to Hawaii being off course 99% of the time—but constantly correcting? The same is true of successful startups—except they may start out heading toward Alaska. Many dot-com bubble companies that died could have eventually been successful had they been able to adjust and change their plans instead of running as fast as they could until they burned out, based on their initial assumptions. Pyra was started to build a project-management app, not Blogger. Flickr's company was building a game. Ebay was going to sell auction software. Initial assumptions are almost always wrong. That's why the waterfall approach to building software is obsolete in favor agile techniques. The same philosophy should be applied to building a company.
''#10: Be Balanced''
What is a startup without bleary-eyed, junk-food-fueled, balls-to-the-wall days and sleepless, caffeine-fueled, relationship-stressing nights? Answer?: A lot more enjoyable place to work. Yes, high levels of commitment are crucial. And yes, crunch times come and sometimes require an inordinate, painful, apologies-to-the-SO amount of work. But it can't be all the time. Nature requires balance for health—as do the bodies and minds who work for you and, without which, your company will be worthless. There is no better way to maintain balance and lower your stress that I've found than David Allen's GTD process. Learn it. Live it. Make it a part of your company, and you'll have a secret weapon.
''#11 (bonus!): Be Wary''
Overgeneralized lists of business "rules" are not to be taken too literally. There are exceptions to everything."""
<<<
<<<
Terms that have histories cannot be defined.
<<< Friedrich Nietzsche
<iframe width="560" height="315" src="https://www.youtube.com/embed/fAdm1WoIyd0" frameborder="0" allowfullscreen></iframe>
<<<
I’m sure you look back at stuff you made or wrote a few months ago and are like, Oh god. I have that kind of constantly. But I think if you didn’t have that, then you would stop creating, because the cool thing about being a creative person is that you try to get to some unattainable goal in your head. I try and write the song that I dream of writing, and I think I’ve gotten there, and then six hours later I’m like, “No, no, this is how it needs to go.” That endless pursuit keeps us going.
<<< Lorde
[[Super Heroine: An Interview With Lorde|http://www.rookiemag.com/2014/01/lorde-interview/]]
<<<
When I attempted a few minutes ago, to describe our spiritual longings, I was omitting one of their most curious characteristics. We usually notice it just as the moment of vision dies away, as the music ends, or as the landscape loses the celestial light… For a few minutes we have had the illusion of belonging to that world. Now we wake to find that it is no such thing. We have been mere spectators. Beauty has smiled, but not to welcome us; her face turned in our direction, but not to see us. We have not been accepted, welcomed, or taken into the dance. We may go when we please, we may stay if we can, no one cares. Now, a scientist may reply that since most of the things we call beautiful are inanimate it is not very surprising that they take no notice of us. That, of course, is true. It is not the physical objects that I am speaking of, but that indescribable Something of which they become for a moment the messengers. And part of the bitterness which mixes with the sweetness of that message is due to the fact that it so seldom seems to be a message intended for us, but rather something we have overheard. By bitterness I mean pain, not resentment. We should hardly dare to ask that any notice be taken of ourselves. But we pine. The sense that in the universe we are treated as strangers, the longing to be acknowledged, to meet with some response, the bridge some chasm that yawns between us and reality, is part of our inconsolable secret.
<<< C.S. Lewis, The Weight of Glory
He's referring to [[Sehnsucht|false nostalgia]]
Near misses
[img[http://i.imgur.com/U3immcL.gif]]
(Buster Keaton)
"Your presentation seems so BINARY. Why is it so either/or? Why can't it be both/and?"
<<<
Them: “If this cannot solve all problems, then how can we be excited about it?”
Me: “But I didn’t say it solved all problems!”
Them: “Aha! So you admit it doesn’t solve anything!”
Me: “Um, which one of us is utopian again?”
<<< [[The Banal Uselessness of the Utopian Binary Critique|http://hapgood.us/2015/10/24/the-banal-uselessness-of-the-utopian-binary-critique/]]
<<<
You must find out why [a belief held commonly in the past] went out of date. Was it ever refuted (and if so by whom, where, and how conclusively) or did it merely die away as fashions do? If the latter, this tells us nothing about its truth or falsehood.
<<< Barfield quoted by C.S. Lewis from Alan Jacob's The Narnian
Arguably the most important 6 seconds of music ever recorded. A 4-bar drum solo from The Winstons' 1969 track, "Amen, Brother" has been sampled and reused endlessly. A musical [[palimpsest]]
<iframe width="420" height="315" src="https://www.youtube.com/embed/onKMhkkGOi0" frameborder="0" allowfullscreen></iframe>
<<<
I don’t like when precious things slip through people’s fingers—especially things that seem defenseless or undercelebrated, like old newspapers, but also unheralded people who may have said sensible things at a certain time in history, but who were completely drowned out by other people... Sometimes I’m astounded by the absence of sentimentality in other people. How can you not become attached to the poignant scraps that flow through life?
<<<
http://www.theparisreview.org/interviews/6097/the-art-of-fiction-no-212-nicholson-baker
<<<
This brings us full circle. When making art or writing about it, the aesthete tries never to moralize. Nor will he look with favor upon artists who do so, no matter whether their particular brand of moralizing is religious or secular. But he can and must be fully, intensely alive to the moral force of art whose creators aspire merely to make the world around us more beautiful, and in so doing to pierce the veil of the visible and give us a glimpse of the permanently true. That is his job: to help make sense of the pandemonium amid which we live.
<<< Terry Teachout, [[Confessions of an Aesthete|https://www.commentarymagazine.com/article/confessions-of-an-aesthete/]]
<<<
The way of Jesus is the way of self-expenditure.
<<< Arthur ~McGill
<<<
Love is the allocation of our dying.
Life is a finite resource always slipping away. Every minute that passes is a passing of life, a movement toward death. Every moment we are being expended and used up.
But we have some choices in how we are expended. We can allocate our dying. We can specify the times and places of our dying.
My point here is that, because life is a finite resource, giving ourselves to others is a very real sort of sacrifice. It's not suicidal or dysfunctional, but it is sort of martyrological in that I am literally dying the minutes I spend with you. To be with you--to love you--is to die a little bit. A sacrificial giving of my life to you.
<<< Richard Beck, [[link|http://experimentaltheology.blogspot.com/2015/09/love-is-allocation-of-our-dying.html]]
<<<
Beware the temptation of moralism, which has reached epidemic proportions in our culture, both within religious communities and outside of them. Righteousness so easily becomes self-righteousness. To my way of thinking, moralism is the opposite of true religion. The antidote to moralism is presence: not “do this,” but “I’m here.”
<<< Gregory Wolfe
[img[http://i.imgur.com/fnDhIUj.jpg]]
<<<
The art of //not// reading is a very important one. It consists in not taking an interest in whatever may be engaging the attention of the general public at any particular time. When some political or ecclesiastical pamphlet, or novel, or poem is making a great commotion, you should remember that he who writes for fools always finds a large public. -- A precondition for reading good books is not reading bad ones: for life is short.
<<< Schopenhauer, from his //Essays and Aphorisms//
<<<
The artistic temperament is a disease which afflicts amateurs.
<<< G.K. Chesterton
http://www.wired.com/2014/06/forty-years-on-the-humble-barcode-has-turned-everything-into-information/
The fulfillment of that incredible and perhaps dystopic taxonomic vision.
<<<
Truth is the truth of Being. Beauty does not occur alongside and apart from this truth. When truth sets itself into the work, it appears. Appearance—as this being of truth in the work and as work—is beauty. Thus the beautiful belongs to the advent of truth, truth’s taking of its place. It does not exist merely relative to pleasure and purely as its object.
<<< Martin Heidegger, “The Origin of the Work of Art."
<<<
The best cure for depression: getting bored with depression. Then you can move on to anxiety.
<<< Eric Jarosinki (I believe - quoted without source by @~NeinQuarterly)
<<<
The best way to complain is to make things.
<<< James Murphy (of LCD Soundsystem)
<<<
All the periodicals, all the newspapers are saturated with politics, although many of the objects they are discussing are very transient and short term.…In truth, questions of higher spirit cannot even be compared to the sort of blinking frivolity of politics. The ultimate problems of life and death show the colossal nature of this difference even more. Modern humanity is characterized precisely by the loss of the ability to answer the principal problems of life and death. People are prepared to stuff their heads with anything and to talk of any subject, but only to block off contemplation of this subject. This is the reason for the increasing pettiness of our society, the concentration on the small and irrelevant.
<<< Alexander Solzhenitsyn, A Soul in Exile
<<<
"""
''The Blue Robe''
//by Wendell Berry//
How joyful to be together, alone
as when we first were joined
in our little house by the river
long ago, except that now we know
each other, as we did not then;
and now instead of two stories fumbling
to meet, we belong to one story
that the two, joining, made. And now
we touch each other with the tenderness
of mortals, who know themselves:
how joyful to feel the heart quake
at the sight of a grandmother,
old friend in the morning light,
beautiful in her blue robe!
"""
<<<
<<<
The business of the church is poetry... People on the inside write memos. People on the outside write poetry.
<<< Walter Brueggemann
<<<
"""The Bustle in a House (1108)
//by Emily Dickinson//
The Bustle in a House
The Morning after Death
Is solemnest of industries
Enacted opon Earth –
The Sweeping up the Heart
And putting Love away
We shall not want to use again
Until Eternity –
"""
<<<
[img[http://i.imgur.com/IlzEPC6.jpg]]
<<<
"""
''The Camel''
//by James Tate//
I received the strangest thing in the mail
today. It's a photograph of me riding a camel
in the desert. And yet I have never ridden a
camel, or even been in a desert. I am wearing
a jellaba and a keffiyeh and I'm waving a rifle.
I have examined the photo with a magnifying
glass and it is definitely of me. I can't stop
looking at the photo. I have never even dreamed
of riding a camel in the desert. The ferocity
in my eyes suggests I am fighting some kind of
holy war, that I have no fear of death. I must
hide this photo from my wife and children. They
must not know who I really am. I must not know.
"""
<<<
<<<
First of all, I enjoy photography more than being a photographer by an order of magnitude. I love photographs. I never wanted to be a photographer, professionally. I just fell into it (couldn’t get out of it for a long time), and I found that I was very good at it. People paid me lots of money to do it, so I did it. What I enjoyed most — and the reason I photographed people — was I enjoy people. I enjoy meeting people and being friends for an hour, a week, three days, three months, a year, years with some people I’ve had the privilege to meet that I might not, or probably would never have met, had it not been for the camera. The camera was a license — a ticket — to adventure.
<<< Tom Zimberoff, from [[this interview|https://medium.com/@polarrist/cameras-were-invented-for-inarticulate-photographers-like-me-960e16e9e0cd]]
<<<
The celebration of Advent is possible only to those who are troubled in soul, who know themselves to be poor and imperfect, and who look forward to something greater to come.
<<< Dietrich Bonhoeffer
<<<
Far and away the best prize that life offers is the chance to work hard at work worth doing.
<<< Theodore Roosevelt
<<<
The commonest ivory tower is that of the average man, the state of passivity towards experience.
<<< W.H. Auden
<<<
I want to make the argument that the counterculture is actually better in the suburbs. The scarcity of artistic and eccentric thought forces people to create their own civilizations. It fosters an intense unity between people who do not fit into the mainstream and creates extreme connections among those on the edge.
In contrast, larger cities force marketers to be “on the edge” so they can appeal to the counterculture demographic. You cannot walk down the street without seeing punks, ravers, goths, or at the very least hipsters. There is an over-the-counterculture element of commercialization that makes being a freethinking mutant another fad. The anti-sheep-sheep run prominent.
<<< Rachel Haywire, [[The Counterculture is Better in the Suburbs|http://www.triggerwarning.us/the-counterculture-is-better-in-the-suburbs/]]
<<<
To arrive at the simplest truth, as Newton knew and practiced, requires years of contemplation. Not activity. Not reasoning. Not calculating. Not busy behavior of any kind. Not reading. Not talking. Not making an effort. Not thinking. Simply bearing in mind what it is one needs to know. And yet those with the courage to tread this path to real discovery are not only offered practically no guidance on how to do so, they are actively discouraged and have to set about it in secret, pretending meanwhile to be diligently engaged in the frantic diversions and to conform with the deadening personal opinions which are continually being thrust upon them.
<<< George Spencer Brown in The Laws of Form, 1969
[img[http://i.imgur.com/Iob1APJ.jpg]]
<<<
It is not the critic of skinny jeans who counts; not the man who points out how the person in tight pants ought not to have skipped leg day, or says pointedly 'Aren't you all dressed up today?' in a way that implies that they think of you as a schlub and you should retreat back into the schlubby hole you came from. The credit belongs to the man who is actually in them jeans; who strives valiantly; who errs in coordinating his tie with his pocket square, who is shown up by the NSA freshmen again and again, because there is no effort without error and shortcoming; but who does actually strive to do the sartorial deeds; who knows great clothing-type enthusiasms; who spends himself in the worthy cause of sniping ties on eBay; who at the best knows in the end the triumph of high praise from supermarket cashiers, and who at the worst, if he fails, at least fails while daring greatly, sometimes wearing a kilt, so that his place shall never be with those cold and timid souls who neither know victory nor defeat.
<<< Theodore Roosevelt, pictured in pinstripe pants and a polka-dotted vest
<<<
I must introduce a parenthetical protest against the abuse of the current term ‘social justice.’ From meaning 'justice in relations between groups or classes’ it may slip into meaning a particular assumption as to what these relations should be; and a course of action might be supported because it represented the aim of 'social justice,’ which from the point of view of 'justice’ was not just. The term 'social justice’ is in danger of losing its rational content — which would be replaced by a powerful emotional charge. I believe that I have used the term myself: it should never be employed unless the user is prepared to define dearly what social justice means to him, and why he thinks it just.
<<< T. S. Eliot, Notes toward the Definition of Culture (1948)
<<<
Such is one of the rare benefits of age: maybe you can start, at last, to tell the difference between a life style and a life.
<<< Anthony Lane, from his review of Noah Baumbach's While We're Young
//Apocryphal anecdote, email forwardy://
<<<
Recently, I saw a TV show about the Amish. At one point in the show, a tour bus pulled up to the home of an Amish farmer.
The tourists got off the bus, and a woman in the group asked the Amish farmer, “What’s the difference between you Amish, and the rest of us Christians?”
The Amish man replied, “How many of you have a television at home?” Everyone in the group raised their hands.
Then the farmer said, “How many of you think that your family life would be better if you didn't have a TV?” Again, everyone in the tour group raised their hand.
Then the Amish farmer asked, “Now, having just told me that your family life would be better, how many of you will go home tonight and get rid of your televisions?” No one raised their hands.
And the Amish farmed said, “THAT is the difference between you and the Amish.”
<<<
<<<
God assigns as a duty to every man the dignity of every woman.
<<< John Paul II
[img[http://i.imgur.com/i7HAXnG.jpg]]
From Ann Friedman, after the 'Approval Matrix' in New York Magazine. Her explanation:
<<<
The general rule of thumb? When you receive negative feedback that falls into one of the top two quadrants—from experts or people who care about you who are engaging with and rationally critiquing your work—you should probably take their comments to heart. When you receive negative feedback that falls into the bottom two quadrants, you should just let it roll off your back and just keep doin’ you.
<<<
<<<
Only to the degree that our own power is dismantled will God give us his Spirit. If a little power of our own rises up amongst us, the Spirit and authority of God retreats in the same moment and to the corresponding degree. This is the single most important insight regarding the kingdom of God. The Holy Spirit produces effects that are deadly for the old life and that at the same time have a wakening and rousing power for the new. So let us use this day to give glory to God. Let us pledge to him the dismantling of our own power.
<<< Eberhard Arnold, from his //Selected Writings//
<<<
What is the nature of a being that is able to produce art? Man is finite. He is, as one could say, mixed of being and nonbeing. Once he was not. Now he is and some time he will not be. He is not by himself, but thrown into existence and he will be thrown out of existence and cease to be for himself. He is delivered to the flux of time which runs from the past to the future through the ever-moving point which is called the present. He is aware of the infinite. He is aware that he belongs to it. But he is also aware that he is excluded from it… Out of the anxiety, and the double awareness that we are finite and that we belong to infinity from which we are excluded, the urge arises to express the essential unity of that which we are in symbols which are religious and artistic.
<<< Paul Tillich, On Art and Architecture
<<<
"""THE ELDER SISTER
//Sharon Olds//
When I look at my elder sister now
I think how she had to go first, down through the
birth canal, to force her way
head-first through the tiny channel,
the pressure of Mother's muscles on her brain,
the tight walls scraping her skin.
Her face is still narrow from it, the long
hollow cheeks of a Crusader on a tomb,
and her inky eyes have the look of someone who has
been in prison a long time and
knows they can send her back. I look at her
body and think how her breasts were the first to
rise, slowly, like swans on a pond.
By the time mine came along, they were just
two more birds on the flock, and when the hair
rose on the white mound of her flesh, like
threads of water out of the ground, it was the
first time, but when mine came
they new about it. I used to think
only in terms of her harshness, sitting and
pissing on me in bed, but now I
see I had her before me always
like a shield. I look at her wrinkles, her clenched
jaws, her frown-lines--I see they are
the dents on my shield, the blows that did not reach me.
She protected me, not as a mother
protects a child, with love, but as
a hostage protects the one who makes her
escape as I made my escape, with my sister's
body held in front of me."""
<<<
<<<
We live in a world in which Freud and his intellectual progeny have led us to believe that all close relationships are at bottom sexual ones. Equality between men and women has helped to sexualize the whole concept of friendship, and everyone must now be assigned a sexual identity or “orientation.” Unburdened expressions of affection—even physical embraces and kisses—weren’t uncommon between men in the 17th century and, indeed, at most times before the 20th. But today a host of post-Freud, post-Kinsey assumptions muddle any attempt to such intimacy and loyalty between men. Twenty-first-century readers, this reviewer included, are probably no longer capable of understanding the poems’ principal subject—the eros of souls—in the way their author and his contemporaries did.
<<< Barton Swaim, [[“Love Eternal, 14 Lines at a Time”|http://www.wsj.com/articles/book-review-ideas-of-order-by-neil-l-rudenstine-1421461295]]
<<<
The ambiguity of their offenses and the near-anonymity of the offenders (Sacco had fewer than 200 Twitter followers, most of them old friends) gave their accusers a power to define these women, and they lacked the power to fight back. Their weakness was irremediable, and thus irresistible.
The eros of weakness and power that fuels public shaming shows up in one last uncanny and sickening detail of Sacco’s case: the delight her shamers took in the fact that, for 11 hours after she’d sent her fateful tweet, Justine Sacco was in the air, off Twitter, devoid of agency, both deaf and mute, basically unconscious. She was the very image of passivity and proneness and ruin. Her shame-mob, which convened and grew around this image in the hours before she woke to take it in herself, found it highly arousing.
<<< [[The Power of Public Shaming|http://www.psmag.com/books-and-culture/the-power-of-public-shaming-cant-be-controlled-can-it-save-the-planet]]
<<<
The errors of a theory are rarely to be found in what it asserts explicitly; they hide in what it ignores or tacitly assumes.
<<< Daniel Kahneman
<<<
The exciting paradox of literature is that it is in one’s own unique individuality that one is most human.
<<< Walker Percy
<<<
God has lent us the earth for our life; it is a great entail. It belongs as much to those who are to come after us, and whose names are already written in the book of creation, as to us; and we have no right, by anything that we do or neglect, to involve them in unnecessary penalties, or deprive them of benefits which it was in our power to bequeath. And this the more, because it is one of the appointed conditions of the labor of men that, in proportion to the time between the seed-sowing and the harvest, is the fulness of the fruit; and that generally, therefore, the farther off we place our aim, and the less we desire to be ourselves the witnesses of what we have labored for, the more wide and rich will be the measure of our success. Men cannot benefit those that are with them as they can benefit those who come after them; and of all the pulpits from which human voice is ever sent forth, there is none from which it reaches so far as from the grave.
<<< John Ruskin
Seven Lamps, of course.
<<<
No matter how far you take graphics, eventually the farthest you can get is text.
<<< Richard Bartle
Co-creator of the first MUD, MUD1
<<<
Be aware of the fear of losing prestige.
Employees are afraid to quit their jobs — not because they’re scared of failing — but because they’re afraid of losing prestige from friends, family, and employers.
In the corporate world, losing prestige means quitting your job and failing at getting a successful business going.
In the entrepreneurial world, it’s quitting your business and getting a job, even if it’s the right decision for you at the moment.
Either way, it’s the fear of the loss of prestige. You should find a way to get over it.
<<< Chiara Cokieng
[img[http://i.imgur.com/Zh2gmyB.jpg]]
And also this variation, from his //Memoirs//:
<<<
I don’t believe in originality. It is just one more fetish made up in our time, which is speeding dizzily to its collapse. I believe in personality reached through any language, any form, any creative means used by the artist. But out-and-out originality is a modern invention and an electoral fraud.
<<< Pablo Neruda
<<<
The first obligation of a writer is to tell the truth--or to come as near to telling it as is humanly possible.
<<< Wendell Berry
//The full letter://
<<<
Dear Friends,
Your teacher, Ms. Linsley, has written to tell me about your writing class, and to ask if I might have something encouraging to say to you. This is an assignment that I take seriously, and I have been asking myself what you should hear, at this time in your lives, from an older writer.
The thought that I keep returning to is this: By taking up the study of writing now, you are assuming consciously, probably for the first time in your lives, a responsibility for our language. What is that responsibility? I think it is to make words mean what they say. It is to keep our language capable of telling the truth. We live in a time when we are surrounded by language that is glib, thoughtless, pointless, or deliberately false. If you learn to pay critical attention to what you hear on radio or television or read in the newspapers, you will see what I mean.
The first obligation of a writer is to tell the truth--or to come as near to telling it as is humanly possible. To do that, it is necessary to learn to write well. And to learn to write well, it is necessary to learn to read well. Reading will make you a better writer, provided you will read ever more attentively and critically. You will probably read a lot of contemporary writing in your textbooks, in magazines and newspapers, in popular novels, etc. The contemporary is inescapable. You may more easily escape the writing that is most necessary to you. I mean the books we know as "classics," books that have been read for generations or for centuries and so have proved their excellence.
As you learn to judge what you read, you will learn also to judge, and so improve, what you write. Reading, I think, is half of your responsibility as students of writing. The other half of your responsibility, of course, is to write, and your effort to write well, as I hope you already know, will make you better readers.
But you must never forget that the purpose of all this effort is to become capable of knowing and telling the truth.
Yours sincerely,
Wendell Berry
<<<
<<<
When we honestly ask ourselves which persons in our lives mean the most to us, we often find that it is those who, instead of giving advice, solutions, or cures, have chosen rather to share our pain and touch our wounds with a warm and tender hand. The friend who can be silent with us in a moment of despair or confusion, who can stay with us in an hour of grief and bereavement, who can tolerate not knowing, not curing, not healing and face with us the reality of our powerlessness, that is a friend who cares.
<<< Henri Nouwen
<<<
The function of science fiction is not only to predict the future, but to prevent it.
<<< Ray Bradbury
<<<
"I don't like to talk about the future much because it doesn't exist and we don't know anything about it."
<<< Wendell Berry
from this interview: http://billmoyers.com/episode/wendell-berry-poet-prophet/
<<<
The goal for New Saint Andrews College as it trains its students is not to make people who will be able to go out and get jobs, people who will just be 'bricks' in the wall of our society. The goal for New Saint Andrews College is to make students into men and women who will really impact culture.
<<< N.D. Wilson, Oct 2013 video
<<<
The good is not the enemy of the great. The mediocre is the enemy of the truly execrable.
<<< Errol Morris
[img[http://i.imgur.com/ZUWQH3w.jpg]]
1885, by Swiss painter Ferdinand Hodler
<<<
To live, we must daily break the body and shed the blood of Creation. When we do this knowingly, lovingly, skillfully, reverently, it is a sacrament. When we do it ignorantly, greedily, clumsily, destructively, it is a desecration. In such desecration we condemn ourselves to spiritual and moral loneliness, and others to want.
<<< Wendell Berry, The Gift of Good Land
Most people who exploit the world are not vicious, but careless. Berry is concerned with "how we become the sort of people who are capable of breaking creation reverently."
<<<
"""
THE HABIT OF PERFECTION
//Gerard Manley Hopkins//
ELECTED Silence, sing to me
And beat upon my whorlèd ear,
Pipe me to pastures still and be
The music that I care to hear.
Shape nothing, lips; be lovely-dumb:
It is the shut, the curfew sent
From there where all surrenders come
Which only makes you eloquent.
Be shellèd, eyes, with double dark
And find the uncreated light:
This ruck and reel which you remark
Coils, keeps, and teases simple sight.
Palate, the hutch of tasty lust,
Desire not to be rinsed with wine:
The can must be so sweet, the crust
So fresh that come in fasts divine!
Nostrils, your careless breath that spend
Upon the stir and keep of pride,
What relish shall the censers send
Along the sanctuary side!
O feel-of-primrose hands, O feet
That want the yield of plushy sward,
But you shall walk the golden street
And you unhouse and house the Lord.
And, Poverty, be thou the bride
And now the marriage feast begun,
And lily-coloured clothes provide
Your spouse not laboured-at nor spun."""
<<<
<<<
Self-sufficiency, when it is spoken of as a good thing in conservative circles, would be better described as the habit of self-sacrifice.
<<< Toby Sumpter, [[11/15/2011|https://twitter.com/TJSumpter/status/114370830665912321]]
I don't think the conservative idea of self-sufficiency is so easily salvaged. I believe Toby's thinking of the idea common among conservatives that in order to give to others you have to first be self-sufficient. I don't think Christian life calls us to be self-reliant so that we can help other dependents. Instead it calls us all to a life of mutual dependence upon one another.
<<<
The hidden cost of pride is isolation; humility and joy's payoff is community.
<<< Bob Goff
<<<
If we want to support each other’s inner lives, we must remember a simple truth: the human soul does not want to be fixed, it wants simply to be seen and heard. If we want to see and hear a person’s soul, there is another truth we must remember: the soul is like a wild animal – tough, resilient, and yet shy. When we go crashing through the woods shouting for it to come out so we can help it, the soul will stay in hiding. But if we are willing to sit quietly and wait for a while, the soul may show itself.
<<< Parker J. Palmer, The Courage to Teach
<<<
“The whole concept of avant-garde in art is meaningless. I can see what it means as applied to sport, for instance. But to apply it to art would be to accept the idea of progress in art; and though progress has an obvious place in technology -more perfect machines, capable of carrying out their functions better and more accurately- how can anyone be more advance in art?”
<<< Andrei Tarkovsky
By phrase:
* Turn of the Century
* Primitive
* Vintage Industrial
* Art Deco
* Post Modern
* Mid-Century Modern
* Reclaimed/Repurposed
* Salvage
* Contemporary Design
<<<
...free markets — the kind of markets the Holy Spirit loves to create. He wants to substitute coercive markets for free markets, and he wants worship services that will form the kind of people who would go for that.
<<< Doug Wilson on [[James K.A. Smith's book|http://dougwils.com/s7-engaging-the-culture/breasts-and-wombs-matter.html]]
I guess it depends on what you mean by freedom?
<<<
The Kingdom offends our propriety because it's filled with inappropriate people. But, that is its greatest Gospel glory.
<<< Thomas Chalmers
<<<
If you remember continually & know exactly that you are weak, you will never overstep the limits of vigilance.
<<< St. Isaac of Ninevah
<<<
The NBC series, smart as it is, has to heave most of Lecter’s high-culture references and classical allusions overboard because it’s trying to do a multi-threaded, emotionally complex drama for a network audience. Still, the show gives us the look of taste, and does so with such visual intelligence that you find yourself scouring the credits for Umberto Eco’s name, under “semiotics consultant.”
<<< Mark Dery, [[Eat the Rude|http://boingboing.net/2015/02/17/eat-the-rude-hannibal-lecter.html]]
This is a class-based take on Hannibal, but I like his observations about the aesthetic lushness of the show. Everything appears to be chosen, which is a remarkable achievement.
<<<
The hard part is building the machine that builds the product.
<<< Dennis Crowley
Referring to SaaS, but it applies elsewhere
<<<
The main obstacle to problem solving, in my experience, is an entrenched ideology.
<<< Steven Soderbergh
<<<
It is not the critic who counts; not the man who points out how the strong man stumbles, or where the doer of deeds could have done them better. The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood; who strives valiantly; who errs, who comes short again and again, because there is no effort without error and shortcoming; but who does actually strive to do the deeds; who knows great enthusiasms, the great devotions; who spends himself in a worthy cause; who at the best knows in the end the triumph of high achievement, and who at the worst, if he fails, at least fails while daring greatly, so that his place shall never be with those cold and timid souls who neither know victory nor defeat.
<<< Theodore Roosevelt, //Citizenship in a Republic//
<<<
I live in the Managerial Age, in a world of “Admin.” The greatest evil is not now done in those sordid “dens of crime” that Dickens loved to paint. It is not done even in concentration camps and labor camps. In those we see its final result. But it is conceived and ordered (moved, seconded, carried, and minuted) in clean, carpeted, warmed and well-lighted offices, by quiet men with white collars and cut fingernails and smooth-shaven cheeks who do not need to raise their voices.
<<< C.S. Lewis, The Screwtape Letters
<<<
"...the mere brute pleasure of reading - the sort of pleasure a cow must have in grazing."
<<< G. K. Chesterton
<<<
In the morality of my station and duties (i.e., of the moral code) the station presents us with the duty, and we say yes or no, “I will” or “I will not.” We choose between obeying or disobeying a given command. In the morality of challenge or grace, the situation says, “Here is a mess, a crying evil, a need! What can you do about it?” We are asked not to say “Yes” or “No” or “I will” or “I will not,” but to be inventive, to create, to discover something new. The difference between ordinary people and saints is not that saints fulfill the plain duties that ordinary men neglect. The things saints do have not usually occurred to ordinary people at all… “Gracious” conduct is somehow like the work of an artist. It needs imagination and spontaneity. It is not a choice between presented alternatives but the creation of something new.
<<< A.D. Lindsay quoted by Dorothy Sayers, from the essay Problem Picture
<<<
The more original a discovery, the more obvious it seems afterward.
<<< Arthur Koestler
<<<
The most daring thing to do with your life is to create stable communities in which the terrible disease of loneliness can be cured.
<<< Kurt Vonnegut
<<<
The most expressive form of art today in connection with religion might be sacred emptiness....
<<< Paul Tillich
<<<
The movies are so rarely great art that if we cannot appreciate great trash, we shouldn't go at all.
<<< Pauline Kael
[img[http://i.imgur.com/nHsQOM8.png]]
<<<
What came first, the music or the misery? People worry about kids playing with guns, or watching violent videos; that some sort of culture of violence will take them over. Nobody worries about kids listening to thousands, literally thousands of songs about heartbreak, rejection, pain, misery and loss. Did I listen to pop music because I was miserable? Or was I miserable because I listened to pop music?
<<< Rob (John Cusack) in High Fidelity
<<<
“Another good thing that happens [when you allow yourself to stop writing in the middle and pick up the next day] is that the next day you’re another person… and so you may have come up against a brick wall the day before but the next day you go there and you look at that and you go, no, no, no, I want to go this direction. And you start taking in it a slightly different direction than you thought you were going. And that frees you up quite often and gets you into a new territory… You’ve had experiences, you’ve had dreams, you’ve had idle thoughts, you know. So that’s what I meant by being a new person. You look at the fifteen lines you wrote the day before and you have a different idea. Whereas when you quit the day before you thought you were out of ideas.”
<<< James Tate
<<<
Modern nostalgia is a mourning for the impossibility of mythical return, for the loss of an enchanted world with clear borders and values; it could be a secular expression of a spiritual longing, a nostalgia for an absolute, a home that is both physical and spiritual, the edenic unity of time and space before entry into history. The nostalgic is looking for a spiritual addressee.
<<< Svetlana Boym's The Future of Nostalgia
<<<
Suspending moral judgment is not the immorality of the novel; it is its morality. The morality that stands against the ineradicable human habit of judging instantly, ceaselessly, and everyone; of judging before, and in the absence of, understanding. From the viewpoint of the novel’s wisdom, that fervid readiness to judge is the most detestable stupidity, the most pernicious evil.
<<< Milan Kundera
Lewis, speaking of a sort of boys' boarding school homosexuality he witnessed:
<<<
People commonly talk as if every other evil were more tolerable than this. But why? … If those of us who have known a school like Wyvern dared to speak the truth, we should have to say that [homosexuality] was, in that time and place, the only foothold or cranny left for certain good things. It was the only counterpoise to the social struggle; the one oasis… in the burning desert of competitive ambition. In his unnatural love-affairs, and perhaps only there, the Blood went a little out of himself, forgot for a few hours that he was One of the Most Important People There Are. It softens the picture.
<<< C.S. Lewis, Surprised by Joy
<<<
The only true death of dandyism is fatherhood.
<<< Charles Baudelaire
<<<
The opposite of love is not hate, it's indifference. The opposite of beauty is not ugliness, it's indifference. The opposite of faith is not heresy, it's indifference. And the opposite of life is not death, but indifference between life and death.
<<< Elie Wiesel
https://www.youtube.com/watch?v=fLi0lQcHxgw
<<<
"""The Our Father
by Franz Wright
I am holding cirrhosis
with one hand and AIDS
with the other, in a circle
to recite the august simple prayer
you briefly took on tortured
human form to teach
us, here, below —
Utterer of leaves, most mysterious
author of water and light;
taker and restorer of oblivion, what will it be?
What final catastrophe sent
to wean me from this world.
"""
<<<
<<<
With the Oven Mitts of Science Fiction we can grasp the Red Hot Casserole of the Now
<<< William Gibson
<<<
One of the paradoxes of creativity… in order to think originally, we must familiarize ourselves with the ideas of others.
<<< George Kneller
<<<
It is part of pastoral ministry even in a school that you inevitably know something of the particular dying each person brings. Each one brings perhaps a long struggle with a chronic illness, a losing battle with persistent depression, a sick child, the recent loss of a parent, the shame of constant defeat in the battle with a besetting sin. I don’t know the whole story but enough of each one that my heart is pierced through with the beauty of their faithful burden-bearing and their hope that Christ will touch, forgive and heal. I have much the same perception and the same feeling each time I administer the bread and wine at Holy Communion.
I have become more and more suspicious of the concept of the nominal Christian. Our parish churches are supposed to be full of nominal Christians who are just going through the motions, of half-believers who are relying on their good works and who have not really surrendered to Christ and accepted the Gospel. In any parish church there are a few real apostates, and a few real scoffers and perhaps a few who genuinely hate God. Their numbers are routinely exaggerated. Most of the people who come to the church Sunday by Sunday know they are dying and are placing their hope in Christ. It may be an inarticulate hope, it may be a confused hope. Often there are huge brambles of misunderstanding that must be cleared away before the whole power of the good news can come in upon them. Often there is real darkness into which the light of Christ has not yet come and which cries out for a light-bearer. Yet, they come. When Jesus saw such as these gathered in their multitudes on the hill side, the sight provoked in him not contempt for the nominal but compassion, “for they were like sheep without a shepherd.”
<<< Rev’d Dr. Leander Harding, [[link|http://www.leanderharding.com/blog/2009/02/25/thoughts-on-ash-wednesday/]]
<<<
I think we all agree, the past is over.
<<< George Bush
[img[http://i.imgur.com/0aoVtae.jpg]]
EDWARD HICKS
American, 1780-1849
The Peaceable Kingdom, about 1833
Trained as an trade painter, Hicks painted hundreds of these. He was a Quaker preacher in Bucks County, PA.
George Eliot's [villainous] character, Grandcourt,
<<<
"did not care a languid curse for anyone's admiration; but this state of non-caring, just as much as desire, required its related object--namely, a world of admiring and envying spectators: for if you are fond of looking stonily at smiling persons, the persons must be there and they must smile."
<<<
<<<
The phone gives us a lot but it takes away three key elements of discovery: loneliness, uncertainty and boredom. Those have always been where creative ideas come from.
<<< Lynda Barry
https://wid.wisc.edu/wid-culture/lynda-barry-at-nasa/
<<<
Like a piece of ice on a hot stove the poem must ride on its own melting.
<<< Robert Frost
<<<
"""
The Poet as Husband
by David Whyte
I write in a small shadowed corner
in order to bear light into the world,
though the light is not my own.
My darkness is no darkness to you
and nothing you should wish upon yourself,
but my light shall also be your light,
in which we shall see differently
but gloriously. I am not lame inside me,
no matter that I drag my foot, I have run here
through all my infirmities to bring you news
of a battle already won. Let my last breath
speak victory into the world. The race is run
and shall be run again, joyfully, and you shall
run with me, the territory opened
to us like returned laughter
or remembered childhood. Remember,
I was here, and you were here,
and together we made a world.
"""
<<<
From Everything is Waiting for You
<<<
There is nothing in the world as delightful as a continual walk with God. Only those who have experienced it can comprehend it. And yet I do not recommend that you seek it solely because it is so enjoyable. Do it because of love, and because it is what God wants. If I were a preacher, the one thing that I would preach about more than anything else is the practice of the presence of God.
<<< Brother Lawrence, The Practice of the Presence of God
<<<
I know from experience that when I allow busy little doings to fill the precious time of early morning, when contemplation might flourish, I open the doors to the demon of acedia. Noon becomes a blur – no time, no time – the wolfing down of a sandwich as I listen to the morning’s phone messages and plan the afternoon’s errands. When evening comes, I am so exhausted that vespers has become impossible. It is as if I have taken the world’s weight on my shoulders and am too greedy, and too foolish, to surrender it to God.
<<< Kathleen Noris, The Quotidian Mysteries
<<<
Those who defend BDSM, like those who defend the campus hook-up scene, usually rest their case on one element and one element alone. That element is not love. That element is not fidelity. That element is not commitment. It’s not even pleasure.
That element is consent.
This one feature is seen as all-important and decisive. On this social contract model, as long as both partners consent, then everything is okay. As long as both partners consent, no one is harmed in the process. In Fifty Shades, although Ana is ambivalent and reluctant—it takes her a while to warm up to the BDSM arrangement—she eventually consents to the masochistic/submissive role. Well, then, no harm, no foul. Right?
Wrong.
First, people often consent to things that they are not really comfortable with; they do so for many different reasons and under many different social pressures. We see this clearly in Ana’s reluctance to sign Christian’s contract. Second, people often consent to things that turn out to be quite harmful to them. For consent to be authentic consent, it must be truly informed. To consent, people must understand the risks of what they are agreeing to do. This is a basic tenet of medical ethics, and it applies here as well.
<<< Aaron Kheriaty, [[Hooked Up and Tied Down|http://www.thepublicdiscourse.com/2015/02/14470/]]
<<<
Peter Yates, the music critic, said that the proper work of the critic is praise, and that that which cannot be praised should be surrounded with a tasteful, well-thought-out silence. I like that.
<<< Donald Barthelme's paraphrase
<<<
Perhaps it is nothing new, but it certainly feels like there is currently a steady wave of Christian objections to the prophetic. //The prophetic tone is offensive. It seems extreme, over the top, and unnecessarily combative.// What we need, we are told again and again, is an irenic tone, words seasoned with grace. We need conversations and dialogue and round table discussions.
...the Truth comes at us like a freight train, like a tidal wave, like a fierce, fiery Love — like a friendship with the most intense Person in the universe. And the challenge is that somehow artists and theologians alike must reckon with the reality of that.
<<< Toby Sumpter (emphasis mine), [[The Aesthetics of Prophecy|http://www.desiringgod.org/blog/posts/the-aesthetics-of-prophecy]]
This article has agreeably lofty ambitions. Aesthetics and prophecy //are// inextricably tied, but the exposition of this connection ends up quite tame and he sees the decline of the prophetic in the rise of the aesthetic. Both are concerned with unsettling ambiguity, with undermining in that way Richard Rohr often talks about.
Most of the time when the [[prophetic voice]] is invoked it ends up being a defense of offense.
<<<
And now, from beneath the audible, came a low reverberation. It came up through the soles of my feet. I stood still while it hummed upward bone by bone. There is no adequate simile. The pulse of the country worked through my body until I recognized it as music. As language. And the language ran everywhere inside me, like blood; and for feeling, it was as if through time I had been made of earth or mud or other insensate matter. Like a rhyme learned in antiquity a verse blazed to mind: O be quick, my soul, to answer Him; be jubilant, my feet! And sure enough my soul leapt dancing inside my chest, and my feet sprang up and sped me forward, and the sense came to me of undergoing creation, as the land and the trees and the beasts of the orchard had done some long time before. And the pulse of the country came around me, as of voices lifted at great distance, and moved through me as I ran until the words came clear, and I sang with them a beautiful and curious chant.
<<< Leif Enger, Peace Like a River
<<<
As long as you are governed by that desire [to be part of the inner circle] you will never get what you want. You are trying to peel an onion; if you succeed there will be nothing left. Until you conquer the fear of being an outsider, an outsider you will remain...The quest of the Inner Ring will break your hearts unless you break it.
<<< C.S. Lewis
One of the delightfully twee-est poems of all time.
<<<
"""
''The Quiet World''
Jeffrey ~McDaniel
In an effort to get people to look
into each other’s eyes more,
and also to appease the mutes,
the government has decided
to allot each person exactly one hundred
and sixty-seven words, per day.
When the phone rings, I put it to my ear
without saying hello. In the restaurant
I point at chicken noodle soup.
I am adjusting well to the new way.
Late at night, I call my long distance lover,
proudly say I only used fifty-nine today.
I saved the rest for you.
When she doesn’t respond,
I know she’s used up all her words,
so I slowly whisper I love you
thirty-two and a third times.
After that, we just sit on the line
and listen to each other breathe.
"""
<>>
<<<
Modernity has long been obsessed with, perhaps even defined by, its epistemic insecurity, its grasping toward big truths that ultimately disappoint as our world grows only less knowable. New knowledge and new ways of understanding simultaneously produce new forms of nonknowledge, new uncertainties and mysteries. The scientific method, based in deduction and falsifiability, is better at proliferating questions than it is at answering them. For instance, Einstein’s theories about the curvature of space and motion at the quantum level provide new knowledge and generates new unknowns that previously could not be pondered.
Since every theory destabilizes as much as it solidifies in our view of the world, the collective frenzy to generate knowledge creates at the same time a mounting sense of futility, a tension looking for catharsis — a moment in which we could feel, if only for an instant, that we know something for sure. In contemporary culture, Big Data promises this relief...
<<<
<<<
The rationalist fantasy that enough data can be collected with the “right” methodology to provide an objective and disinterested picture of reality is an old and familiar one: positivism. This is the understanding that the social world can be known and explained from a value-neutral, transcendent view from nowhere in particular.
<<< Nathan Jurgenson, [[View From Nowhere|http://thenewinquiry.com/essays/view-from-nowhere/]]
[img[http://i.imgur.com/JCugzc4.jpg]]
<<<
The really important kind of freedom involves attention, and awareness, and discipline, and effort, and being able to truly care about other people and to sacrifice for them, over and over, in myriad petty little unsexy ways, every day.
<<< David Foster Wallace, from the 'This is Water' commencement speech
<<<
Unfortunately, in seeing ourselves as we truly are, not all that we see is beautiful and attractive. This is undoubtedly part of the reason we flee silence. We do not want to be confronted with our hypocrisy, our phoniness. We see how false and fragile is the false self we project. We have to go through this painful experience to come to our true self. It is a harrowing journey, a death to self – the false self – and no one wants to die. But it is the only path to life, to freedom, to peace, to true love. And it begins with silence. We cannot give ourselves in love if we do not know and possess ourselves. This is the great value of silence. It is the pathway to all we truly want.
<<< M. Basil Pennington, A Place Apart: Monastic Prayer and Practice
<<<
We all came into this world naked. The rest is all drag.
<<< ~RuPaul
This gets at the semiotic / structured nature of dress.
<<<
The rich exist for the sake of the poor. The poor exist for the salvation of the rich.
<<< St. John Chrysostom (c. 347–407)
<<<
The poor object to being governed badly. The rich object to being governed at all.
<<< G.K. Chesterton
<<<
...the right to vote has killed a lot of people. Don't support such a violent abstraction.
<<< Nate Wolff
<<<
The sacred exists and is stronger than all our rebellions.
<<< Czeslaw Milosz
<<<
I am not afraid to say that a devout and God-fearing man is superior as a human specimen to a restless mocker who is glad to style himself an ‘intellectual,’ proud of his cleverness in using ideas which he claims as his own though he acquired them in a pawnshop in exchange for simplicity of heart . . . . The sacred exists and is stronger than all our rebellions.
<<< Czeslaw Milosz
<<<
The scope for practicing gratitude is as broad as life itself.
<<< Seneca
<<<
The search is what anyone would undertake if he were not sunk in the everydayness of his own life…. To become aware of the possibility of the search is to be onto something. Not to be onto something is to be in despair.
<<< Walker Percy, 'The Moviegoer'
<<<
"""''The Secret''
//by Christian Wiman//
Daily higher the ivy dies,
Leaf by leaf subsiding white
Like a secret that seems to rise
Through vein and vine up to his eyes
And the green of what remains.
In spite of books and better light,
In spite of air and what friends say,
A rare arrested day, brief shoots,
In spite of all he cuts away:
From the ground up to the shelf,
From the leaves into the roots,
In spite of everything he tries,
Utterly the ivy tells itself.
"""
<<< from his new collection Once in the West
<<<
A community is only being created when its members accept that they are not going to achieve great things, that they are not going to be heroes, but simply live each day with new hope, like children, in wonderment as the sun rises and in thanksgiving as it sets. Community is only being created when they have recognized that greatness is to accept our insignificance, our human condition, and our earth, and to thank God for having put in a finite body the seeds of eternity which are visible in small and daily gestures of love and forgiveness.
<<< Jean Vanier, founder of L'Arche
<<<
About the only law that I think relates to the [horror] genre is that you should not try to explain, to find neat explanations for what happens, and that the object of the thing is to produce a sense of the uncanny. Freud in his essay on the uncanny wrote that the sense of the uncanny is the only emotion which is more powerfully expressed in art than in life, which I found very illuminating; it didn’t help writing the screen-play, but I think it’s an interesting insight into the genre. And I read an essay by the great master H.P. Lovecraft where he said that you should never attempt to explain what happens, as long as what happens stimulates people’s imagination, their sense of the uncanny, their sense of anxiety and fear. And as long as it doesn’t, within itself, have any obvious inner contradictions, it is just a matter of, as it were, building on the imagination (imaginary ideas, surprises, etc.), working in this area of feeling. I think also that the ingeniousness of a story like this is something which the audience ultimately enjoys; they obviously wonder as the story goes on what’s going to happen, and there’s a great satisfaction when it’s all over not having been able to have anticipated the major development of the story, and yet at the end not to feel that you have been fooled or swindled.
<<< Stanley Kubrick's [[Treatment for The Shining|http://www.cinephiliabeyond.org/stanley-kubricks-treatment-of-the-shining/]]
<<<
While working on sitcoms, [“Six Feet Under” creator Alan] Ball had compiled a list of things that would be different once he had control over his own show, and for the most part, he stuck to it. He exhibited few of the autocratic impulses of other showrunners. “He had a very different style from some of these other guys,” Soloway said. “He didn’t wield the big bat. Alan once described the masculine style of showrunning as standing in front of your troops, saying, ‘Come on! This is where we’re going.’ The feminine style is standing behind your troops, pushing them forward so they lead you. Alan did the feminine style. The show exists in the center of the room, and we all come to it with our minds and let it rise up, and it belongs to nobody.
<<< Brett Martin, [[Difficult Men: Behind the Scenes of a Creative Revolution: From The Sopranos and The Wire to Mad Men and Breaking Bad|https://kindle.amazon.com/work/difficult-men-creative-revolution-sopranos-ebook/B00CQAEV34/B00AEDDPFA]]
<<<
The problem is that I no longer wish to be a subject of the social justice ideology. I like Plato, I like Shakespeare, and I am interested in John Milton. I think reason and logic are still valid. I don’t think my ancestors were purely evil patriarchs, and if they were, I still love the ideas and culture they left me. In the humanities and academy at large, I find that the very things I love and cherish as part of my tradition and culture are under attack.
<<< Anon liberal, from [[this|http://www.theamericanconservative.com/dreher/sjws-drive-man-from-the-left/]]
The line between heightened rhetoric and reductive thought-policing. He calls it the "critical theorist/social justice narrative", which I think is a good way to describe what he's talking about.
<<<
...the specious nature of moral arguments built on the principle of consent. These assume that the nature of consent is constant, absolute, and easily established. As Kheriaty points out, it is none of these. Consent is always complicated by specific context. Furthermore, the principle of consent assumes at a minimum that individuals have sovereign rights over the range of purposes and uses to which their own bodies can be put. Yet the evidence of the impact of pornography on the brain indicates that the individual is not consciously in control of determining the nature of that range. Pornography alters the sexual desires and transforms the understanding of the body’s purpose not by ethical or even aesthetic persuasion. Rather it does so by altering the physiology of the brain itself, a process beyond the conscious control of the consumer of pornography, and which thus subverts the assumptions of the principle of consent.
<<< Carl R. Trueman, [[Morailty: A Supply-Side Economy|https://www.firstthings.com/blogs/firstthoughts/2015/02/morality-a-supply-side-economy]]
[img[http://i.imgur.com/a92VWoV.jpg]]
Vaudeville team the Athols perform their “spider and the fly” routine.
[img[The Storm Cellar's First Location|https://scontent-a-sea.xx.fbcdn.net/hphotos-ash2/v/t1.0-9/1234818_10151664844392361_1940340382_n.jpg?oh=3acd39807b1062958d9a0d98374afac1&oe=552A1200]]
//Independent Consignment & Local Goods//
It was known internally as //Idaho’s Second Most Interesting Store// while we were planning it. Now known internally as //Hidden Treasures [pronounced: TRAY-zures]//, after the headline of our first newspaper article.
<a href="https://www.facebook.com/moscowstormcellar">The Storm Cellar</a> is a clothing consignment store. Bring in your unwanted clothes and when they sell we give you 50% of the sale.
We opened in November of 2009 at 212 S Main, and moved to a bigger location at 504 S Main in October of 2010.
When we originally started we took craft items and household goods, but the clothes are the only thing that really stuck. I hope to return to locally made items when I figure out how to do it well.
We intend the aesthetic of the store to be clean and inviting, in contrast to the “antique store” clutter of most consignment or thrift stores. The store is for customers looking for:
economical buys
eco-conscious recycled items and local shopping
unique items
<iframe width="560" height="315" src="https://www.youtube.com/embed/m_CrIu01SnM" frameborder="0" allowfullscreen></iframe>
<<<
One reason for a surge in memoir is the gradual erosion of objective notions of truth, which makes stuff like assembled dialogue seem more acceptable. We mistrust the old forms of authority—the church and politicians, even science. The subjective has power now. You read how Robert ~McNamara fabricated body counts in Vietnam, how Nixon lied, then suddenly //Full Metal Jacket// or //Apocalypse Now// or Michael Herr’s psychedelic experience in //Dispatches// has new authority. Not because it’s not corrupt, but because it admits its corruption.
<<< Mary Karr
always from this [[2009 Paris Review interview|http://www.theparisreview.org/interviews/5992/the-art-of-memoir-no-1-mary-karr]]
<<<
The success of most things depends upon knowing how long it will take to succeed.
<<< Montesquieu
<<<
Lent is the season of blood and guts and flesh. It is the supremely anti -Gnostic season.
<<< Peter Leithart, 40+ Reasons for Lent
The full series:
<<<
//An exaltation of tweets.//
To observe Lent rightly, we have to be persuaded that we already stand in God’s favor.
Ash Wednesday reminds us to number our days. It helps us gain a heart of wisdom (Psalm 90:12).
We keep Easter to manifest and deepen our prior share in resurrection. We observe Lent to manifest and deepen our share in the cross.
As a focused pursuit of the fruits of holiness, Lent is rooted in union with Christ, who is our sanctification.
Lent is the season of blood and guts and flesh. It is the supremely //anti//-Gnostic season.
Some say Lent inhibits the church’s cultural impact. To that, there are three answers: Christendom, Byzantium, & Bach.
Lent is a pursuit of glory, because the Lord exalts those who humble themselves.
To observe Lent rightly, we need to be confident that the power to obey God is a gift from God.
Israel sought out and purged old leaven once a year. Lent is the Christian feast of unleavened bread.
For Christians, death is not end but beginning. Lent is an extended meditation on that good news.
Life is a Lenten journey through death toward resurrection.
Lent is boot camp for spiritual warriors.
Without Lent or something like it, the church risks falling into a victoryism without the cross, which is the weapon of victory.
Lent didn’t keep Christians from converting Europe, forming Christendom, building cathedrals, celebrating carnivale.
Lent is training in the fundamental Christian discipline of waiting.
Lent is preparation for martyrdom. Nothing is more politically potent than a martyr.
Like the whole church calendar, Lent inserts “the fact of Christ into the rhythm of seasons, weeks, days and hours.” –Congar
We’re hungry for all the wrong things. We need Lent to develop a taste for the fruit of the tree of life – that is, the fruit of the cross.
Purple is the liturgical color of Lent, a deep color of penitence, a lush color of royalty. Lent is for training kings.
The church year is an extended commemoration of the gospel story. Lent is long because the Passion is the biggest episode in the story.
An exercise in delayed gratification, Lent is profoundly counter-cultural.
Lent is catholic because it signifies our inclusion in the one, holy, catholic, and apostolic church.
Lent reminds us that the only God that is is the God of the cross. Lent is a prophylactic against generic monotheism.
Lent is not a withdrawal from history. The God of Lent is the God who enters time, the God with blood to shed for us.
Lent gives the only answer there is to the problem of evil: A cross that triumphs over evil, a death that tramples death.
Some demons come out only by prayer and fasting. Seems a good reason to fast and pray.
The Christian year has a rhythm, each season its own tonality and coloration. Without Lent, the year is bland.
Without Lent, how many paintings would have gone unpainted? How many cantatas left unwritten and unsung?
Lent tells us what time it is - the time between resurrection and resurrection.
Lent reminds us that Jesus didn’t go to the cross so we can escape the cross; He went to the cross to enable us to bear it after Him.
Lent gives us 40 days to contemplate the glory of the Crucified, which saves the world.
Lent is a focused effort to identify and smash idols. Lent is boot camp for Josiahs.
Lent teaches us that the Name we bear has the weight of a cross.
During Lent, we contemplate the obedience of the Son so as the become sons who honor our Father and fathers.
Lent rebuilds marriages, as we commune with the Perfect Husband who gave Himself wholly for His Bride.
Lent is a minor movement in the symphony of the church year, the dissonance that opens into the resolution of Easter.
Lent inoculates against sentimentalism.
Lent tunes us to the broken beauty of the world.
Lent strips off layers of self-deception and self-defense that screen us from the Risen Christ.
Lent is not for doing things we never do otherwise. Like Sunday, Lent is for intensifying things we do all the time.
The church year is painted in chiaroscuro. Without the darker hues of Lent, Easter is two-dimensional.
Lent teaches us to cross our eyes: “For if the eye seek good objects, and will take / No cross from bad, we cannot ‘scape a snake.” -Donne
<<<
<<<
The telephone was an aberration in human development. It was a 70 year or so period where for some reason humans decided it was socially acceptable to ring a loud bell in someone else’s life and they were expected to come running, like dogs. This was the equivalent of thinking it was okay to walk into someone’s living room and start shouting. It was never okay.
<<< Rick Webb, writing about [[texting|http://rickwebb.tumblr.com/post/556400952/the-never-call-there-are-some-people-who-love-to]]
It's the urgency and lack of asynchronicity that bothers me. But worse than the telephone itself is voicemail, which is intolerable. Texting fixes some of these problems.
<<<
[David] Fincher: Scorsese once told me, “The things you do poorly are as much a part of your style as the things you do well…” Which was totally true, and oddly reassuring.
<<<
From Empire's great [[Sam Mendes interviews everybody|http://www.empireonline.com/features/sam-mendes-director-interviews]] thing
<<<
The three most harmful addictions are heroin, carbohydrates, and a monthly salary.
<<< Nassim Taleb
<<<
The truth does not change based on your ability to stomach it.
<<< Flannery O'Connor
<<<
I mean by the phrase ‘the unbought grace of life’ those intricate and subtle and delicate elements in the culture of the mind and in the constitution of society which are produced by a continuing tradition of prescriptive establishments, reflective leisure, and political order.
<<< Russell Kirk, riffing on Edmund Burke
<<<
The uniform fantasy has been with me for a long time, although the uniform type changes. I’ve never taken the leap into wearing a uniform, though, for two reasons. The first is simply that I’ve been too lazy to construct a uniform. The second is that it is a rather eccentric move– adopt a uniform, and you become known for wearing that uniform more than anything else.
I suppose that if you’re super famous, like Tom Wolfe (white suit) or Erik Satie (identical velvet suits) you can wear the same thing every day and nonetheless your work and your personality will rise above that eccentricity. But I’ve feared that if I wore a uniform I’d become one of those strange local characters, like “the kilt guy” or “the bathrobe lady.”
Still, I do like the idea of fashioning a garment which suits all of my needs (fit, comfort, pockets, good fabric etc.) and making it my very own.
<<< Kelly Coyne, [[Root Simple|http://www.rootsimple.com/2014/07/have-you-ever-wanted-a-uniform/]]
This relates to Steve Jobs's attempts to give Apple employees an Issey Miyake designed uniform, and Barack Obama's comments that he largely wears the same thing because you have to eliminate some decisions from your daily life in order to avoid 'decision fatigue'.
I would never want to limit peoples' fashion options, but having the option of a uniform (which would be very odd / countercultural at this juncture) would be liberating to me.
<<<
...the university will turn into a luxury brand, its image unmoored from its educational mission—a campus that could be anywhere and nowhere.
<<< Nikil Saval
http://www.nytimes.com/2015/09/13/magazine/if-you-build-it-they-will-come-wont-they.html
<<<
''The Unknown Citizen''
"""
W. H. Auden, 1907 - 1973
//(To JS/07 M 378
This Marble Monument
Is Erected by the State)//
He was found by the Bureau of Statistics to be
One against whom there was no official complaint,
And all the reports on his conduct agree
That, in the modern sense of an old-fashioned word, he was a
saint,
For in everything he did he served the Greater Community.
Except for the War till the day he retired
He worked in a factory and never got fired,
But satisfied his employers, Fudge Motors Inc.
Yet he wasn’t a scab or odd in his views,
For his Union reports that he paid his dues,
(Our report on his Union shows it was sound)
And our Social Psychology workers found
That he was popular with his mates and liked a drink.
The Press are convinced that he bought a paper every day
And that his reactions to advertisements were normal in every way.
Policies taken out in his name prove that he was fully insured,
And his Health-card shows he was once in hospital but left it cured.
Both Producers Research and High-Grade Living declare
He was fully sensible to the advantages of the Instalment Plan
And had everything necessary to the Modern Man,
A phonograph, a radio, a car and a frigidaire.
Our researchers into Public Opinion are content
That he held the proper opinions for the time of year;
When there was peace, he was for peace: when there was war, he went.
He was married and added five children to the population,
Which our Eugenist says was the right number for a parent of his
generation.
And our teachers report that he never interfered with their
education.
Was he free? Was he happy? The question is absurd:
Had anything been wrong, we should certainly have heard.
"""
<<<
<<<
Project Cybersyn can also be viewed as a dispatch from the future. These days, business publications and technology conferences endlessly celebrate real-time dynamic planning, the widespread deployment of tiny but powerful sensors, and, above all, Big Data—an infinitely elastic concept that, according to some inexorable but yet unnamed law of technological progress, packs twice as much ambiguity in the same two words as it did the year before. In many respects, Beer’s cybernetic dream has finally come true: the virtue of collecting and analyzing information in real time is an article of faith shared by corporations and governments alike.
<<< [[Planning Machine|http://www.newyorker.com/magazine/2014/10/13/planning-machine]]
<<<
After the final no there comes a yes /
And on that yes the future world depends.
<<<
//The full poem://
<<<
"""''The Well Dressed Man With A Beard''
by //Wallace Stevens//
After the final no there comes a yes
And on that yes the future world depends.
No was the night. Yes is this present sun.
If the rejected things, the things denied,
Slid over the western cataract, yet one,
One only, one thing that was firm, even
No greater than a cricket’s horn, no more
Than a thought to be rehearsed all day, a speech
Of the self that must sustain itself on speech,
One thing remaining, infallible, would be
Enough. Ah! douce campagna of that thing!
Ah! douce campagna, honey in the heart,
Green in the body, out of a petty phrase,
Out of a thing believed, a thing affirmed:
The form on the pillow humming while one sleeps,
The aureole above the humming house…
It can never be satisfied, the mind, never."""
<<<
<<<
[Planned Parenthood head Cecile] Richards said, “The depravity of these tactics and the invasion — the willingness of this group to invade the most personal, private space and to violate the medical relationships — I’ve never seen anything as low.”
<<<
Planned Parenthood kills unborn human beings, dissects their bodies, and sells the parts. She's never seen anything lower than undercover investigators filming what goes on inside the clinics she runs, showing others how they dissect and pick through the bodies of unborn children, and negotiate their sale.
<<<
I have found the words masculine and feminine indispensable for my notations of appearance and behavior, but I apply them freely to both sexes, according to mood and situation. Here are my conclusions, after a lifetime of observation and reflection. Maleness at its hormonal extreme is an angry, ruthless density of self, motivated by a principle of ‘attack.’ Femaleness at its hormonal extreme is first an acute sensitivity of response, literally thin-skinned (a hormonal effect in women), and secondly a stability, composure, and self-containment, a slowness approaching the sultry. Biologically, the male is impelled toward restless movement; his moral danger is brutishness. Biologically, the female is impelled toward waiting, expectancy; her moral danger is stasis. Androgen agitates; estrogen tranquilizes—hence the drowsiness and ‘glow’ of pregnancy. Most of us inhabit not polar extremes but a constantly shifting great middle. However, a preponderance of gray does not disprove the existence of black and white. Sexual geography, our body image, alters our perception of the world. Man is contoured for invasion, while woman remains the hidden, a cave of archaic darkness. No legislation or grievance committee can change these eternal facts.
<<< Camille Paglia, source unknown (Sexual Personae?)
<<<
It isn't necessary to imagine the world ending in fire or ice. There are two other possibilities: paperwork, and nostalgia.
<<< Frank Zappa
<<<
Every action has its consequence. If you perform undisturbed at the same time every day the same ritual, the world will change irrevocably.
<<< Andrei Tarkovsky
A more cheery way of saying 'ideas have consequences', echoing [[C.S. Lewis]] in //The Abolition of Man//.
//See also://
* [[our underneath]]
<<<
“I’ve known writers — I think it’s true also of other artists — who thought that you had to put your art before everything. But if you have a marriage and a family and a farm, you’re just going to find that you can’t always put your art first, and moreover that you shouldn’t. There are a number of things more important than your art. It’s wrong to favor it over your family, or over your place, or over your animals.”
<<< Wendell Berry
http://e360.yale.edu/feature/interview_wendell_berry_a_strong_voice_for_local_farming_and_the_land/2739/
<<<
There are years that ask questions and years that answer
<<< Zora Neale Hurston
<<<
We must guard against the false notion that God is a purely transcendental power, removed from matter and the stuff of this earth. The coming community of life will be a kingdom of work on this earth. Work will be the binding factor in the cells of human community. The only work a man can do with his whole soul, work full of spirit and pulsing life, comes from love. And there is no love that does not get to work.
<<< Eberhard Arnold
<<<
What happens to all my prayers – those that are not answered, and those that seem to make things worse than anyone ever anticipated? Surely they are still sustaining me. Perhaps there will be unexpected answers to them, answers I may not even be aware of for years. I cannot believe they are wasted or lost. I do not know where they have gone, but I believe God holds them, hand outstretched to receive them like precious pearls.
<<< Madeleine L'Engle
<<<
You know when you make popcorn there are always those fluffy white kernels that are fun and good to eat but there are also always those burnt, black kernels that don’t pop? You know why they don’t pop? Because they have integrity.
<<< Marc Maron
<<<
When men have become wage slaves they think in terms of income. When they are economically free they think in terms of property. Most modern men living under industrial conditions regard economic reform as essentially a redistribution of income; property is for them an illusion; the reality behind it is income...
<<< Hilaire Belloc
<<<
I really believe that there are things nobody would see unless I photographed them.
<<< Diane Arbus
<<<
“Things reveal themselves passing away,” someone remarked to William Butler Yeats, and it is an historical fact that every established order writes its great apologia only after it has been fatally stricken.
<<< Richard M. Weaver
"""
''Things to Do in the Belly of the Whale''
by Dan Albergotti
Measure the walls. Count the ribs. Notch the long days.
Look up for blue sky through the spout. Make small fires
with the broken hulls of fishing boats. Practice smoke signals.
Call old friends, and listen for echoes of distant voices.
Organize your calendar. Dream of the beach. Look each way
for the dim glow of light. Work on your reports. Review
each of your life’s ten million choices. Endure moments
of self-loathing. Find the evidence of those before you.
Destroy it. Try to be very quiet, and listen for the sound
of gears and moving water. Listen for the sound of your heart.
Be thankful that you are here, swallowed with all hope,
where you can rest and wait. Be nostalgic. Think of all
the things you did and could have done. Remember
treading water in the center of the still night sea, your toes
pointing again and again down, down into the black depths.
"""
by Eric Spiegelman of [[The Awl|http://www.theawl.com/2015/05/things-to-have-named-after-you-in-order-of-difficulty]]
"""
51. a Wi-Fi network
50. a star
49. an online publication
48. your son
47. your daughter
46. your company
45. your band
44. an autobiography
43. a public square in Los Angeles
42. a burger, drink, salad or sandwich at a Los Angeles restaurant
41. a scholarship
40. an award
39. a folly
38. a lunar crater
37. a hospital wing
36. a biography
35. a public park
34. a library
33. a high school
32. an expressway
31. an airport
30. a disease
29. a television series
28. a steamboat
27. a sports move
26. a generic item of clothing
25. fauna
24. flora
23. a comet
22. a musical instrument
21. a weapon
20. a medical procedure
19. a part of the human body
18. a public square in a European city
17. an “ism”
16. an adjective
15. a mountain
14. a bay
13. a river
12. a public holiday
11. an adage
10. a theorem
9. a law of physics
8. a unit of measurement
7. a chess opening
6. a slang word for money
5. a disreputable profession
4. a dynasty
3. a religious sect
2. a city
1. a month
"""
<<<
"""
This Be The Verse
by Philip Larkin
They fuck you up, your mum and dad.
They may not mean to, but they do.
They fill you with the faults they had
And add some extra, just for you.
But they were fucked up in their turn
By fools in old-style hats and coats,
Who half the time were soppy-stern
And half at one another's throats.
Man hands on misery to man.
It deepens like a coastal shelf.
Get out as early as you can,
And don't have any kids yourself.
"""
<<<
<<<
My subjective experience is living is one of having continually to make a choice between given alternatives, and it is this experience of doubt and temptation which seems more important and memorable to me then the actions I take when I have made my choice.
<<< W.H. Auden
Unofficial motto of local theological inquiry:
usque huc venies et non procedes amplius et hic confringes tumentes fluctus tuos
Something that comes up a fair bit in the later, more established season of the [[Moscow Project]]
I've seen it in a number of areas, but the one that comes to mind is this on liturgy:
<<<
I was talking [with our session of elders] about liturgy, high, low and middlin, and said that on a historic scale of one to ten, I thought our liturgical practices at Christ Church were about a 6. I then said that I wanted to get to 7. I hastened to add that I would rather be at 5 than at 8.
<<< Doug Wilson, [[Some Outdented Comments|http://dougwils.com/s16-theology/some-outdented-comments.html]]
<<<
"""This is no chance,
This bird of flame
That grips my glance:
I see God’s name
In scarlet flight
And know that He
Along the light
Is hailing me."""
<<< Sheldon Vanauken
[img[http://i.imgur.com/RzUUWCz.gif]]
"Hey nerds! Guess who's got two thumbs, speaks limited French, and hasn't cried once today? This moi!"
"That was the period, it may be remembered, in which many corporations were being floated and financed. The bankers, who before then had confined themselves to the railroads, got into industry.
My idea was then and still is that if a man did his work well, the price he would get for that work, the profits and all financial matters, would care for themselves and that a business ought to start small and build itself up and out of its earnings. If there are no earnings then that is a signal to the owner that he is wasting his time and does not belong in that business. I have never found it necessary to change those ideas, but I discovered that this //simple formula of doing good work and getting paid for it was supposed to be slow for modern business.//"
Henry Ford, [[My Life and Work|https://books.google.com/books?id=pTsCBwAAQBAJ&pg=PT16&dq=i+discovered+the+simple+formula+of+doing+good+work&hl=en&sa=X&ei=LAdNVYSGNoKooQT51oG4Cg&ved=0CB4Q6AEwAA#v=onepage&q=i%20discovered%20the%20simple%20formula%20of%20doing%20good%20work&f=false]] (emphasis added)
[img[http://i.imgur.com/q10PrM7.png]]
<<<
Those who hammer their guns into plows will plow for those who do not.
<<< Thomas Jefferson
<<<
"""Those Who Want Out
//by Denise Levertov, 1984//
In their homes, much glass and steel. Their cars
are fast — walking's for children, except in rooms.
When they take longer trips, they think with contempt
of the jet's archaic slowness. Monastic
in dedication to their work, they apply honed skills, impatient of
less than perfection. They sleep by day
when the bustle of lives might disturb their research,
and labor beneath fluorescent light in controlled environments
fitting their needs, as the dialects
in which they converse, with each other or with
the machines (which are not called machines)
are controlled and fitting. The air they breathe
is conditioned. Coffee and coke keep them alert.
But no one can say they don't dream,
that they have no vision. Their vision
consumes them, they think all the time
of the city in space, they long for the permanent colony,
not just a lab up there, the whole works, malls, raquet courts, hot tubs, state-of-the-art
ski machines, entertainment... Imagine it, they think, way
out there, outside of 'nature,' unhampered,
a place contrived by man, supreme
triumph of reason. They know it will happen.
//They do not love the earth.//
"""
<<<
<<<
Those who, in the biblical phrase, would save their lives – that is, those who want to get along, who don’t want commitments, who don’t want to get into problems, who want to stay outside of a situation that demands the involvement of all of us – they will lose their lives. But those who for love of Christ uproot themselves and accompany the people and go with the poor in their suffering and become incarnated and feel as their own the pain and the abuse – they will secure their lives, because the Father will reward them.
<<< Oscar Romero, The Violence of Love
<<<
Those who write clearly have readers. Those who write obscurely have commentators.
<<< Albert Camus
<<<
"""
''Thou Art Not As I Have Conceived Thee''
by Thomas Merton
Lord, it is nearly midnight and I am waiting for You
in the darkness and the great silence.
I am sorry for all my sins.
Do not let me ask any more than to sit in the darkness
and light no lights of my own,
and be crowded with no crowds of my own thoughts
to fill the emptiness of the night in which I await You.
Your brightness is my darkness.
I know nothing of you and, by myself,
I cannot even imagine how to go about knowing you.
If I imagine you, I am mistaken.
If I understand you, I am deluded.
If I am conscious and certain
I know you, I am crazy.
The darkness is enough.
"""
<<<
<<<
[In school] I soon learned to distinguish three kinds of citizens: the political, the a-political, and the anti-political.
The ''political'' is one whose values coincide with the State values. In a school, he is athletic, a good mixer, ambitious but not too ambitious, moral but not too moral. He climbs the social ladder rapidly, becomes a competent, unimaginative administrator of laws the rightness of which he does not question, is approved of and happy.
The ''a-political'' is one whose interests are not those of the State but do not clash with them, which usually means that they have nothing to do with people. Perhaps he is a photographer or a bird-watcher or a radio mechanic. As he is only anxious to be left alone, he performs his social duties well enough to keep out of trouble, and climbs slowly to a position of obscure security. He is the natural and sensible anarchist.
The ''anti-political'' is one whose interests and values clash with those of the State. He is not interested in athletics and shows it, his moral behavior is incorrect, he deliberately sabotages. There are however two sub-species of the anti-political: the one who, were the values of society more to his taste, would become a-political, and the one who in that case would become political. The latter is the true revolutionary: his anarchism is only a means to a political end. Whether he is a potential reformer or a potential tyrant depends on whether or not his personal ambition is combined with intellectual ability.
<<< W.H. Auden, The Prolific and the Devourer (emphasis mine)
<<<
We started mapping the story, and it took three weeks to finish the screenplay...
I believe that screenplays take three weeks or five years to write, and I just prefer to do the ones that take three weeks.
<<< Alfonso Cuarón
<<<
In what belongs to the deeper meanings of nature and her mediation between us and God, the appearances of nature are the truths of nature, far deeper than any scientific discoveries in and concerning them. The show of things is that for which God cares most, for their show is the face of far deeper things than they; we see in them, in a distant way, as in a glass darkly, the face of the unseen. It is through their show, not through their analysis, that we enter into their deepest truths. What they say to the childlike soul is the truest thing to be gathered of them.
<<< George MacDonald, The Voice of Job
This site is built on the [[TiddlyWiki|http://tiddlywiki.com/]] framework, a single-page ~JavaScript web app and self-described "non-linear personal web notebook". I highly recommend it.
<<<
Poetry is sane because it floats easily in an infinite sea; reason seeks to cross the infinite sea, and so make it finite. The result is mental exhaustion. To accept everything is an exercise, to understand everything a strain.
<<< Chesterton
<<<
To achieve great things, two things are needed: a plan, and not quite enough time.
<<< Leonard Bernstein
<<<
Jesus Christ has not come to establish social justice any more than he has come to establish the power of the state or the reign of money or art. Jesus Christ has come to save men, and all that matters is that men may come to know him. We are adept at finding reasons-good theological, political, or practical reasons, for camouflaging this. But the real reason is that we let ourselves be impressed and dominated by the forces of the world, by the press, by public opinion, by the political game, by appeals to justice, liberty, peace, the poverty of the third world, and the Christian civilization of the west, all of which play on our inclinations and weaknesses. Modern protestants are in the main prepared to be all things to all men, like St. Paul, but unfortunately this is not in order that they may save some but in order that they may be like all men.”
<<< Jacques Ellul. The Ethics of Freedom, 254–255
<<<
Piglet sidled up to Pooh from behind. "Pooh?" he whispered. "Yes, Piglet?" "Nothing," said Piglet, taking Pooh's hand. "I just wanted to be sure of you."
<<< A.A. Milne
<<<
That’s when I was 19, and I’m 40 now,” she says. “I see things differently. I definitely make films to connect with people, to bring light to things that need to be seen and heard—but I don’t set out self-righteously to change people. …You want to represent people who are good, kind, and generous to trust you with their stories. You want to do that respectfully.
<<< Laura Dunn, Austin-based filmmaker
<<<
To choose what is difficult all one's days / As if it were easy, that is faith.
<<< W.H. Auden
<<<
What the NYT and many others describe as new era of identity politics is in fact an era in which the historical, traditional underpinnings of identity have been ruptured, or even destroyed, unleashing an often desperate search for new identities, a rush for self-identification, for shallow identity construction. The subjectivity of human identity in the 21st century is striking, and alarming. Today, to feel something is to be something. In many Western nations now, including Britain, a man can become a woman – legally, and on his passport – simply by ‘identifying as’ a woman. People now ‘identify as disabled’, and it often isn’t entirely clear that they are disabled. One academic says that his ‘personal identification as a disabled person fluctuates according to the context’. In short, sometimes he is disabled, sometimes he isn’t. The objective category of disability – as a physical or mental impairment that limits a person’s ability to engage in public life – is done away with, and instead disability becomes something one feels, one ‘identifies with’, in certain situations if not in others.
<<< Brendan O'Neill in [[spiked|http://www.spiked-online.com/spiked-review/article/the-crisis-of-character/17691#.VnSxUBFVhBf]]
<<<
To forgive the incessant provocations of daily life – to keep on forgiving the bossy mother-in-law, the bullying husband, the nagging wife, the selfish daughter, the deceitful son – how can we do it? Only, I think, by remembering where we stand, by meaning our words when we say in our prayers each night, “Forgive our trespasses as we forgive those who trespass against us.” We are offered forgiveness on no other terms. To refuse it is to refuse God’s mercy for ourselves. There is no hint of exceptions and God means what he says.
<<< C.S. Lewis, The Weight of Glory
<<<
//One thing I realized is that to just have merely suffered isn't enough.// One day I was in a bookstore trying to steal a book. This guy knew it and followed me. So to not seem like a thief, I asked him for transgressive books, a term I'd just learned and felt like a big shot bandying. He handed me a book by this guy who had been in prison and writing about his experiences. He had a really horrible life, but it was so horribly written that I just didn't care.
<<< J. T. ~LeRoy, emphasis added
This is from the interview with [[Tom Waits]], in answer to the amazing [[quality of our suffering]] question.
<<<
I make them warm to keep my family from freezing; I make them beautiful to keep my heart from breaking.
<<< A 19th cent. woman on her quilts
<<<
I always think that the best way to know God is to love many things. Love a friend, a wife, something, whatever you like, and you will be on the right way to knowing more about it; that is what I say to myself. But one must love with a lofty and serious intimate sympathy, with strength, with intelligence, and one must always try to know deeper, better, and more. That leads to God, that leads to unwavering faith.
<<< Vincent van Gogh, from his collected letters
<<<
If we don't learn to mythologize our lives, inevitably we will pathologize them.
<<< Richard Rohr, On the Threshold of Transformation (book)
<<<
[It has never been] the genius of the Church of England to grow its own theological nourishment, but only to prepare what was provided from elsewhere and to set it decently upon the table.
<<< Oliver O’Donovan, from his book on the Thirty-Nine Articles
<<<
The real key is to remain different while you're connected. The problem with being connected is it tends to homogenize everybody, so there's this pressure to be the same if you're connected. You go to any large city around the world, and there is a uniformity in what that downtown looks like. Connection tends to drive things to uniformity, but the value, the power of being connected is by remaining different. There's this conundrum, this dilemma of remaining different while connected, because if you're just different but not connected, there's no power in that, and that's actually easy to do, but can you remain different while connected? You're different in certain degrees, yet you're part of the uniform standard. So it's like you don't want to make up new words that don't mean anything. You want to write a book that uses the standard words in the dictionary, so you're going to be different while connected to the standard. You're connected to the English language, but you're going to be different with what the words say.
That's the challenge for artists or even protestors to some extent, even those who are trying to change things, is that you want to be connected and yet remain different, and that's a tremendous trick and tremendous challenge and requires a certain art in your life, but that's what the leverage will be: to be different while connected.
<<< Kevin Kelly, [[this interview|http://edge.org/conversation/the-technium]]
I think a key is to be exposed to a wider range of things - we're impoverished in our exposure to history, which is why [[skinny jeans]] catch such flack in my small circle. Their only context is immediate, no one can place them in a wider, longer perspective.
<<<
"""''Choose Something Like a Star''
by Robert Frost
O Star (the fairest one in sight),
We grant your loftiness the right
To some obscurity of cloud—
It will not do to say of night,
Since dark is what brings out your light.
Some mystery becomes the proud.
But to be wholly taciturn
In your reserve is not allowed.
Say something to us we can learn
By heart and when alone repeat.
Say something! And it says, 'I burn.'
But say with what degree of heat.
Talk Fahrenheit, talk Centigrade.
Use language we can comprehend.
Tell us what elements you blend.
It gives us strangely little aid,
But does tell something in the end.
And steadfast as Keats' Eremite,
Not even stooping from its sphere,
It asks a little of us here.
It asks of us a certain height,
So when at times the mob is swayed
To carry praise or blame too far,
We may choose something like a star
To stay our minds on and be staid.
"""
<<< Robert Frost
<<<
It’s completely out of my hands. I’m looking at those people out there, but I don’t know what I’m seeing. And they’re watching me, too. But they don’t know what they’re looking at. My best guess is that they’ll keep on loving me till they start hating me, or their Waylon duds wear out. Because they already hate me a little, just because I’m me and they’re them. That’s why they always go on about how talented you are. Because they hate you. Because if they had this talent, they would be you. The fact that you’ve worked like a dog, lived like a horse thief, and broke your mama’s heart to do whatever you do, that don’t mean diddly-squat. To them, it’s talent. Supposedly, you got it, and, supposedly, they don’t. So eventually you’re bound to disappoint them.
<<< Waylon Jennings, quoted in Dave Hickey’s Air Guitar
<<<
I'm kind of over gettin' told to throw my hands up in the air / so there
<<< Lorde
<<<
Tolerance has limits; love does not.
<<< Peter Kreeft
<<<
Tolerance is a sort of cheap, low-grade parody of love.
<<< N.T. Wright
<<<
“…because nerds like us are allowed to be unironically enthusiastic about stuff… Nerds are allowed to love stuff, like jump-up-and-down-in-the-chair-can’t-control-yourself love it. Hank, when people call people nerds, mostly what they’re saying is ‘you like stuff.’ Which is just not a good insult at all. Like, ‘you are too enthusiastic about the miracle of human consciousness’.”
<<< John Green, from a ~YouTube video
Not this video, but it's related ("we're not in the content business, we're in the community business"): https://www.youtube.com/watch?v=LfABP083wbU
<<<
Too many clothes kills clothes … Fashion has changed. [It’s now just] a proliferation of clothing. Eight collections per season — that’s 16 a year. We’re making clothes that aren’t destined to be worn.
<<< Jean Paul Gaultier on the end of his RTW and menswear lines in 2015
<<<
I arise in the morning torn between a desire to improve (or save) the world and a desire to enjoy (or savor) the world. This makes it hard to plan the day.
<<< E. B. White
traa-dy-liooar
'time enough' in Manx
Meaning having a relaxed, 'island' attitude toward time.
There's a scholarship at UI for one student from the Isle of Man. Who knew?
One of them described Moscow as having a similar 'time enough' attitude.
<<<
The American lifestyle is very different with regards to food and sport but the traa-dy-liooar attitude here in Moscow is comforting and makes a Manx girl feel very much at home.
<<<
This interview: http://www.iomtoday.co.im/news/education/moscow-manx-cheese-1-2908142#ixzz3yJsdmDx6
<<<
Tradition is not only transmission of the past; it contributes also and at the same time to the opening of a new future.
<<< Yves Congar
<<<
On the face of it, it is hard to
see why conservatives should oppose offering traditionally-designed cities, towns and
neighborhoods as alternatives to post-war "sprawl" suburbs. As conservatives, we are
supposed to prefer traditional designs over modern innovations in most things (and we
do). We hope to demonstrate traditional designs for the places we live, work and shop
encourage traditional culture and morals. This should not surprise us. Edmund Burke told
us more than two hundred years ago that traditional societies are organic wholes. If you
(literally) disintegrate a society's physical setting, as sprawl has done, you tend to
disintegrate its culture as well.
<<< Paul M. Weyrich et al, [[Conservatives and the New Urbanism: Do We Have Some Things in Common?|https://www.cnu.org/sites/www.cnu.org/files/Conservatives&NewUrbanism.pdf]]
<<<
The marks life leaves on everything it touches transform perfection into wholeness. Older, wiser cultures choose to claim this wholeness in the things that they create. In Japan, Zen gardeners purposefully leave a fat dandelion in the midst of the exquisite, ritually precise patterns of the meditation garden. In Iran, even the most skilled of rug weavers includes an intentional error, the 'Persian Flaw,' in the magnificence of a Tabriz or Qashqai carpet…and Native Americans wove a broken bead, the “spirit bead,” into every beaded masterpiece. Nothing that has a soul is perfect. When life weaves a spirit bead into your very fabric, you may stumble upon a wholeness greater than you had dreamed possible before.
<<< Rachel Naomi Remen, M.D.
<<<
There it was: the thing that makes me so afraid of high-level managers. That impenetrable surface, the apparent lack of complication, doubt, even curiosity. Was she covering discomfort, ignorance, fear of appearing ignorant? Or was she simply bored by me? There was no way I could know. Extrapolating from myself, I thought: What a marvelous ability to affect self-assurance! What superb management of professionally undesirable traits! I longed for such ability to hide my feelings. I imagined someday I would sit in a meeting and be transparent as water, quietly emanating authority. Then I remembered that she probably had no fears or doubts around me. All she knew about me is what I’d told her: that I’m a software engineer. I’m no one.
<<< Ellen Ullman: Close to the Machine
For awhile in the late 90s a combination of green, muted yellow, and slightly marigold-y orange was very popular. We call it 'macaroni colors'. Once you start seeing it you'll notice it *everywhere*
[img[http://i.imgur.com/0UIGXvT.jpg]]
<<<
[Tim Schafer] said sometimes you have to trick yourself into taking risks. When he was working on Full Throttle, the team agonized over what the main character should look like. They came up with character after character, and kept shooting them down, worried if people would like him or not. 'That guy's too big, his jaw looks funny, he's too menacing, etc.'
So, the team decided to table the issue and just draw the biker gang instead. That should be easy. They could look as cool or as weird as they wanted. They went nuts! Fat guys, skinny guys, crazy-looking guys, on and on. One of those characters somebody drew up really stuck out. He just looked interesting. 'That's the main character!' Schafer remembers realizing. The lead character came about because the art team had tricked itself into taking risks.
<<< Tim Schafer, [[this interview|http://www.gamespy.com/articles/585/585524p3.html]]
This is very 'Art and Fear'
<<<
I know what it takes to be good at careers. Work like you might die for 10 years, and you can work a lot less for the next 10. But it all depends on how many people you can trick into working so hard for you that they think they might die. Convince a lot and you’ll be rich. Go figure: every job is a pyramid scheme. Convince enough and another rich person buys you and gives you more money and sometimes more people. But you have to be careful. If you’ve collected too many people and too much money, it can startle a different rich person who’ll lop off your head. When you’re gone, no one notices. They’re too busy tricking other people to take their place.
<<< Mary H.K. Choi: “Oh, Never Mind”
<<<
In the end, anybody can claim offense or triggering about anything: liberals about conservative politics, pacifists against violence, women against sexism, minorities against bigotry, Jews against anti-Semitism, Muslims against any mention of Israel, creationists against evolution, religionists against atheism, and so on. This ineluctably leads to a bland homogenization of all literature, and a stifling of challenging viewpoints. As someone who’s culturally Jewish, I’ve deliberately read anti-Semitic books like Mein Kampf, watched movies like Triumph of the Will, and read “triggering” material like The Diary of Anne Frank (trigger warning: anti-Semitism). I’ve deliberately visited Auschwitz to see what it was like (immensely disturbing and unforgettable; everyone should go), and I’ve read accounts of its inmates, like Primo Levi’s moving Survival in Auschwitz.
All of that saddened me, deeply upset me, and brought me to tears. But I am glad I did it, for in a way it’s enriched my life. It’s awakened me to not only what “decent people” are capable of under the right circumstances, but also to how humans can, in impossible situations, function and survive (or die) with bravery. Such literature shows us the full panoply of the human psyche, from its heights to its depths—and, after all, isn’t that what Shakespeare and Dostoevsky were about?
<<< Jerry A. Coyne, [[Life is Triggering|http://www.newrepublic.com/article/121790/life-triggering-best-literature-should-be-too]]
<<<
Whenever the devil harasses you, seek the company of men or drink more, or joke and talk nonsense, or do some other merry thing. Sometimes we must drink more, sport, recreate ourselves, and even sin a little to spite the devil, so that we leave him no place for troubling our consciences with trifles. We are conquered if we try too conscientiously not to sin at all. So when the devil says to you: do not drink, answer him: I will drink, and right freely, just because you tell me not to.
<<< Martin Luther, “The Life and Letters of Martin Luther”
P.L. Travers (author of Mary Poppins) praised The Little Prince when it first came out for having the three aspects necessary in children's books: "it is true in the most inward sense, it offers no explanations and it has a moral".
<<<
We must overturn so many idols, the idol of self first of all, so that we can be humble, and only from our humility can learn to be redeemers, can learn to work together in the way the world really needs. Liberation that raises a cry against others is no true liberation. Liberation that means revolutions of hate and violence and takes the lives of others or abases the dignity of others cannot be true liberty. True liberty does violence to self and, like Christ, who disregarded that he was sovereign, becomes a slave to serve others.
<<< Óscar Romero contrast to a concept of liberty that means absolute personal autonomy
<<<
True taste doesn’t swing, doesn’t veer. The very notion of taste swinging is anomalous. True taste, genuine taste, develops, expands, grows. It changes only insofar as it corrects itself, true taste. And it doesn’t do that temperamentally, but as part of the process of its growth. Growth means increasing openness, catholicity, inclusion more than exclusion. As you go along, get older and look at more and more art you find yourself liking more and more art, without having to lower your standards. Taste refines itself; it’s true. It discriminates more as it develops, and yet at the same time, paradoxically, it becomes opener.
<<< Clement Greenberg
http://www.sharecom.ca/greenberg/taste.html
<<<
Trusting free markets is trusting providence.
<<< Doug Wilson
<<<
You spent the first 5 years trying to get with the plan / & the next 5 years trying to be with your friends again
<<< James Murphy (of LCD Soundsystem)
<<<
Our turning to craftwork is a refusal. We may not all see ourselves this way, but we are working from a position of dissent. And that is a political position.
<<< Faith Gillespie
[img[http://i.imgur.com/5dtx6Wu.jpg]]
<<<
Every adult life could be said to be defined by two great love stories. The first—the story of our quest for sexual love—is well known and well charted, its vagaries form the staple of music and literature, it is socially accepted and celebrated. The second—the story of our quest for love
from the world—is a more secret and shameful tale. If mentioned, it tends to be in caustic, mocking terms, as something of interest chiefly to envious or deficient souls, or else the drive
for status is interpreted in an economic sense alone. And yet this second love story is no less intense than the first, it is no less complicated, important or universal, and its setbacks are no less painful. There is heartbreak here too.
...
Our ‘ego’ or self-conception could be pictured as a leaking balloon, forever requiring the helium of external love to remain inflated, and ever vulnerable to the smallest pinpricks of neglect. There is something at once sobering and absurd in the extent to which we are lifted by the attentions of others and sunk by their disregard. Our mood may blacken because a colleague greets us distractedly or our telephone calls go unreturned. And we are capable of thinking life worth living because someone remembers our name or sends us a fruit basket.
<<< Alain de Botton, Status Anxiety
<<<
When a tone-deaf person sings, it can be painful to hear. But if you have to listen to theologians who know only the one note of the law, it is not only painful but deadly. They like to describe the big picture of God’s plan as a test to see whether you will pass. They explain God’s mind or the order of God’s plan for salvation and how you can fit in if you follow the rules of the game that God plays. Then the church and its leaders act as referees deciding who is in and who is out of salvation by passing some test. Thinking this way makes it impossible to grasp what Luther is saying when he distinguishes law and gospel as what is old and done for and what is newly arriving with Jesus Christ…[Law and Gospel are] two notes, not one.
<<< Steven Paulson, Luther for Armchair Theologians
In addition to financial resources:
# Emotional - resources which enable emotional control in difficult circumstances. Difficult situations one has weathered in the past that act as a guide for unknown situations. Emotional resources often come from role models.
# Cognitive - reading & writing, math, learning skills
# Spiritual - purpose and worth, a sense of agency
# Physical - health and mobility
# Relationships - support systems
Meta - knowledge of unspoken [[rules|hidden rules]]
The 'uff da' tag refers to quotations I would like to remember, but typically disagree with.
//All <$count filter="[tag[uff da]]"></$count> entries, most recent first://
<$list filter="[tag[uff da]] +[!sort[modified]]">
<div class="tc-menu-list-item">
<$link to={{!!title}}><$view field="title"/></$link>
</div>
</$list>
<<<
Avoid dividing the world into “us” and “them.” If you do, you will harden your heart. There are not two worlds, one in God’s hands and the other one not. There are not two species of people either, one totally under God’s rule and the other completely outside of it.
<<< Christoph Friedrich Blumhardt, Everyone Belongs to God
<<<
Infants develop a sense of personal identity because we talk to them using names they didn't choose.
<<< Peter Leithart
[img[http://i.imgur.com/s74agYN.jpg]]
''Naumburg Master'', Uta, Naumburg Dom (cathedral), c.1249-55
''Uta''
<<<
When I first discovered this sculpture I remember very clearly the overwhelming feeling of wonder that overcame me. I was in awe of how a human being could visualise then create an object of such sophistication, such elegance and such timeless beauty. In a time when Gothic forms were mainly stylised and linear, Uta emerged, in a wave of realism.
There she stood in the western choir of Naumburg Cathedral, in an aura of mystery, head held high and purposeful, heavy cloak pulled closely around her face, eyes in a steady gaze. A regal lady with golden crown. Uta had lived two centuries before this was created, an important benefactor of the church. Wife of Ekkehard of Meissen. She had lived.
The anonymous Master of Naumburg was certainly a highly skilled, hugely talented and sensitive man. What an absolute treat that he left for us all to enjoy. Uta. He will be remembered.
<<< Jackie Honsig-Erlenburg, [[link|http://dominusvenustas.tumblr.com/post/34231680215/naumburg-master-uta-naumburg-dom-cathedral]]
Stub because I'm sure I got the idea from somewhere.
Making a small tool with utility to users, then building a network around it later.
The immediate user experience of Instagram, for instance. It made your pictures look better, then nearly immediately provided you with a feedback loop with high signal-to-noise ratio (almost no noise, until brands/advertising!). Super addictive combination, threatened Facebook and Twitter within the first year.
Here's some thoughts along this line, but it's not the post I was thinking of:
http://waffle.wootest.net/2014/08/24/community-services/
<<<
I believe that we as Christians are called to cultivate cultural maturity over time, and that in every generation there will be people in the vanguard trying to show the way.
<<< Doug Wilson, [[Infinite at the Top|http://dougwils.com/s7-engaging-the-culture/infinite-at-the-top.html]]
It's easier to define it by negation. What it's //not// generally falls into two categories - mostly economic and occasionally cultural:
* Subsidized housing
* Free education
* Medicare
* Food stamps
* Government aid for mercy programs
* Interested in reforming food, a secondary concern
<<<
the new pornography is a vast graveyard where the Left has gone to die. The Left cannot have its whores and its politics too.
<<< Andrea Dworkin
<<<
“To those who would criticize vegans for being privileged, or out of touch, or self-involved, I have this to ask. When a person is in a position to make conscious food choices in the interest of reducing the suffering of all animals — both human and non-human — but doesn’t, who is more privileged really?”
<<< Cadry Nelson
quoted here http://www.nationalreview.com/article/359761/pro-life-pro-animal-matthew-scully
[[Tyler Cowen|http://marginalrevolution.com/marginalrevolution/2015/07/what-makes-the-very-serious-people-so-very-serious.html]], after Paul Krugman:
# Everyone has a mix of beliefs, some of which are right, and some wrong.
# Everyone co-exists in a social system that tends to value, heavily reinforce and widely disseminate some people’s beliefs while disparaging, heavily discounting, and tending to limit the circulation of certain other people’s beliefs. This bias is not random, but instead reflects and reinforces existing power structures and asymmetries.
# People whose beliefs are reinforced and widely circulated so that they are socially and politically influential, even when they are manifestly wrong, are Very Serious People. The system provides them with no incentives to admit error or perhaps to understand that they have erred, even when their mistakes have devastating consequences.
That summary from [[here|http://crookedtimber.org/2015/07/22/a-brief-theory-of-very-serious-people/]].
Paul Krugman's [[dramatically simpler version|http://krugman.blogs.nytimes.com/2015/07/14/faithocrats/]].
<<<
Take for example, the phrase “victim-blaming”. Anyone who spends much time on the Internet has stumbled upon it in a comments thread or clickbait title. The origin of the phrase is undeniably noble: to protect those who have been legitimately victimized and curtail cycles of abuse by policing rationalizations such as “she was asking for it”, wherever they might appear, in the hopes of snuffing out the thinking behind them. In one sense, nothing could be more compassionate or urgent. Yet where once upon a time the term was reserved for matters pertaining to sexual assault or domestic violence, today you see it used in relation to social media gaffes.
The parameters of what constitutes victim-blaming, in other words, have been vastly (and irresponsibly) expanded. What hasn’t changed, though, is that you do not want to be accused of victim-blaming–however trivial the circumstances may be. It signals the height of callousness and/or privilege, essentially a nuclear option in the rhetoric of identity politics.
Indeed, it feels callous to even pause over the phrase, such is its unassailability. The only reason I dare do so is because the prohibition on “victim-blaming” seems to be resulting in the widespread notion that victims are, by definition, blameless–or to use a religious term, righteous. Perhaps it sounds like a minor distinction, but the logic is worth spelling out: by virtue of something unrighteous (or anti-righteous) happening to a person, they are made righteous, sanctified. An act of malice or injustice doesn’t just injure the victim, it somehow absolves them, often reducing their humanity to a single act or attribute. Grievance thus becomes a new form of moral currency.
<<<
http://www.mbird.com/2016/02/the-outsider-gets-radical-notes-on-loving-the-alien/
<<<
Be regular and orderly in your life like a bourgeois, so that you may be violent and original in your work.
<<< Gustave Flaubert
Not actually magic realism, but has the same spirit. Subtlely full of 'ideas'
[img[http://upload.wikimedia.org/wikipedia/commons/b/b9/Caspar_David_Friedrich_-_Wanderer_above_the_sea_of_fog.jpg]]
<<<
But Jesus declared war on Pharisees, and anyone who wants to follow Jesus needs to get used to this war.
<<< Toby Sumpter, [[Why Fight?|http://www.tobyjsumpter.com/why-fight/]]
This places the conflict correctly - between Jesus and religious hypocrites, not between Jesus and the vulnerable and oppressed.
<<<
There’s one thing you should know about trans women if you don’t already. Because we weren’t raised as girls, we have a lot of catching up to do after transition. On top of this, many of us have issues socializing with cis women at the beginning, and cis women have issues with us. My solution to this problem was to watch a lot of TV to figure out how to be a woman.
Shonda Rhimes’ Grey’s Anatomy came along right after I transitioned, and it became my main template for how to behave as a woman on the planet. Like, I knew this wasn’t actually how the world worked, but the fact that Shonda’s world seemed *so* real made it feel like it could. I’m not ashamed to admit that my female personality has been hugely shaped by Shonda, and I’ve made some key life choices under her influence.
<<< Meredith Talusan, from The Toast
This makes me so sad, the idea of having to learn about one's gender from mass culture.
Of course this is not in response to this notion, but I couldn't help but be reminded of this...
<<<
I make stuff up for a living. Remember, it's not real, okay? Don't tweet me your craziness.
<<< Shonda Rhimes, from her Twitter profile
<<<
We always overestimate the change that will occur in the next two years and underestimate [what] will occur in the next ten.
<<< Bill Gates
<<<
“You know we are all unconsciously holding our anus. In one LSD dream, I shit all over the rug and shit all over the floor. Another time I imagined myself as a giant penis launching off from Earth like a spaceship... I seemed to be in a world of healthy, chubby little babies’ legs and diapers, smeared blood, a sort of general menstrual activity taking place.”
<<< Cary Grant describing his LSD experiences in a contemporary psychological journal
<<<
We are not built for the mountains and the dawns and aesthetic affinities; those are for moments of inspiration, that is all. We are built for the valley, for the ordinary stuff we are in, and that is where we have to prove our mettle.…The mount is not meant to teach us anything, it is meant to make us something.
<<< Oswald Chambers, My Utmost for His Highest
<<<
O Kate, nice customs curtsy to great kings. Dear Kate, //you and I cannot be confined within the weak list of a country’s fashion. We are the makers of manners//, Kate, and the liberty that follows our places stops the mouth of all find- faults, as I will do yours for upholding the nice fashion of your country in denying me a kiss.
<<< Shakespeare, Henry V
[img[http://images3.cinema.de/imedia/7367/2277367,YbaW+S0Nk9IrXO0QCnIQawdIBHTqZL2AId_hyIjlV1i5vlLma+InCuf+WGyZGONpFG54BcGDKzs2m9EcdXUIwQ==.jpg]]
//See also://
* [[Love God and do what you will]]
<<<
The great obstacle is simply this: the conviction that we cannot change because we are dependent on what is wrong. But that is the addict’s excuse, and we know that it will not do.
<<< Wendell Berry (talking about environmental abuse, but the principle applies widely)
Rod Dreher: "There is not one of us - not one - who has never been guilty of this... The logic goes like this:"
<<<
1. [Our side] is accused of doing/supporting/enabling this horrible thing.
2. We are not the kind of people who would do/support/enable that sort of thing.
3. Therefore we are not guilty.
<<<
Or it goes like this:
<<<
1. Our side is accused, etc.
2. But the people making the accusation are bad.
3. If they are right, bad people win.
4. Therefore, they are wrong.
<<<
Or like this:
<<<
1. Our side is accused, etc.
2. If the accusers are right, then we will have to stop doing what we’re doing.
3. The cost of that would be too high.
4. Therefore, the accusers are wrong.
<<<
<<<
“Everyone just wanted to watch us work, and that got old real fast,” Johannes said.
“We weren’t good at being able to explain the spiritual part, either. People would say: ‘Let’s write down your philosophy. Let’s create some commandments.’ But that didn’t come naturally. When we tried to explain our beliefs [...] people just thought we were weird.”
<<<
This amazing article: http://www.nytimes.com/2015/05/17/style/they-built-it-no-one-came.html
By the time you get to the end, it's just astounding:
<<<
“It was a dream, and it was a good dream,” Zephram said. “Though it broke our spirits that we had no one to share it with. Now, it doesn’t matter that we didn’t have brothers. It doesn’t matter if the place survives. We carry it with us, in the moment. The work we did. What we felt. Star and Bright and all the animals.
“It’s not a lonely place. It’s just jumbled.”
<<<
<<<
We have all known the long loneliness and we have learned that the only solution is love and that love comes with community.
<<< Dorothy Day
<<<
We like lists because we do not want to die.
<<< Umberto Eco
<<<
"""
All things counter, original, spare, strange...
"""
<<< Gerard Manley Hopkins, Pied Beauty
<<<
I must create a system or be enslaved by another man's.
<<< William Blake
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">My favorite American story: we lived where nothing was happening and we made something happen ourselves</p>— Austin Kleon (@austinkleon) <a href="https://twitter.com/austinkleon/status/758419060849676288">July 27, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="en" dir="ltr">Young folks: Forget New York City. Forget San Francisco. Forget Austin, Texas. Stay out of debt, live somewhere cheap, make something happen</p>— Austin Kleon (@austinkleon) <a href="https://twitter.com/austinkleon/status/758419696559398912">July 27, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<<<
We make ourselves lists in order to know if we think what we think.
<<< Sasha Frere-Jones
<<<
There is a huge lag between the arrival and our use of something and our complete understanding of it, what its role is and what it means and its effects plus and minus. That gap, even when we speed up, is going to remain. There's still going to be a gap between our placement of it and our acceptance of it. The acceptance comes first, but this is actually important, because I did a study of technology looking at prohibitions, which don't work. Prohobitions are always just postponements. We can't regulate technology by prohibiting it. We have to only regulate it by use. We have to use things in order to steer them or rearrange them or reassign them. We can't manage our technology by not using them, by prohibiting them, by outlawing them.
It's important that we understand that the proper way and the best way and the most efficient way for us to manage and regulate and control our technology is not by surrendering it and giving it up, relinquishing it or prohibiting it. The primary way we want to do this is by engaging with it, being constantly vigilant and working with it, using it, and it's through use that we can actually steer it.
<<< Kevin Kelly, [[this interview|http://edge.org/conversation/the-technium]]
<<<
We can permit ourselves to be more romantic than the romanticists and more humanistic than the humanists. But we must be more precise.
<<< Karl Barth, “The Christian’s Place in Society”
<<<
"""''A Brief for the Defense''
Sorrow everywhere. Slaughter everywhere. If babies
are not starving someplace, they are starving
somewhere else. With flies in their nostrils.
But we enjoy our lives because that's what God wants.
Otherwise the mornings before summer dawn would not
be made so fine. The Bengal tiger would not
be fashioned so miraculously well. The poor women
at the fountain are laughing together between
the suffering they have known and the awfulness
in their future, smiling and laughing while somebody
in the village is very sick. There is laughter
every day in the terrible streets of Calcutta,
and the women laugh in the cages of Bombay.
If we deny our happiness, resist our satisfaction,
we lessen the importance of their deprivation.
We must risk delight. We can do without pleasure,
but not delight. Not enjoyment. We must have
the stubbornness to accept our gladness in the ruthless
furnace of this world. To make injustice the only
measure of our attention is to praise the Devil.
If the locomotive of the Lord runs us down,
we should give thanks that the end had magnitude.
We must admit there will be music despite everything.
We stand at the prow again of a small ship
anchored late at night in the tiny port
looking over to the sleeping island: the waterfront
is three shuttered cafés and one naked light burning.
To hear the faint sound of oars in the silence as a rowboat
comes slowly out and then goes back is truly worth
all the years of sorrow that are to come."""
<<< Jack Gilbert
<<<
Consider the story of Joan Chittister, a Benedictine nun. (It’s recounted in a new book, Driven To Distraction At Work, on finding focus at the office.) Talking with eager novice nuns at her convent, Chittister recalls, she’d ask them: “Why do we pray?” Their pious answers were all about praising God. “No,” the older nun eventually answered. “We pray because the bell rings.” You can talk lofty principles all you like, but it’s structure – designating time for something, then doing it – that gets things done.
<<< via [[http://www.theguardian.com/lifeandstyle/2015/may/08/lessons-in-time-management-oliver-burkeman]]
<<<
We profess to be strangers and pilgrims, seeking after a country of our own, yet we settle down in the most un-stranger-like fashion, exactly as if we were quite at home and meant to stay as long as we could. I don't wonder apostolic miracles have died. Apostolic living certainly has.
<<< Amy Carmichael, Side by Side
<<<
They use violence to prey on people. They’re the wolves. Then there are those blessed with the gift of aggression and an overpowering need to protect the flock. They are a rare breed who live to confront the wolf. They are the sheepdog. We’re not raising any sheep in this family.
<<< Chris Kyle's father in Clint Eastwood's American Sniper
<<<
My grandfather, an ordinary blue collar working man, had one good readymade suit and one sports jacket, one good pair of shoes, perhaps four or five dress shirts and as many ties. Today it seems that many have steaming piles of cheap clothing, but no good clothes. Even many luxury brands are no longer concerned with quality.
I think the reason is that, in today’s world, we’ve lost both the sense of occasion and a sense of quality. I do find this a bit frightening because I think it may mean we no longer think about the future. Those who are concerned for the ecology have been saying this for years now, and I’m worried that it may be true. We’re living too much for today, “getting and spending” as the poet William Wordsworth put it. And on an even deeper level, it means we may have no sense of faith in ourselves anymore.
It does seem to me that men used to dress in order to look better. I am optimistic that this idea will return, if for no other reason that we’re living in a global economy, competition is fierce, and the weapons of dress and grooming and manners will once again come into play.
<<< an [[interview with Bruce Boyer|http://articlesofstyle.com/57356/a-discourse-on-american-style-feat-bruce-boyer/#sthash.TcNOde1y.dpuf]]
<<<
A new study looks specifically at how formal attire changes people’s thought processes. “Putting on formal clothes makes us feel powerful, and that changes the basic way we see the world,” says Abraham Rutchick, an author of the study and a professor of psychology at California State University, Northridge. Rutchick and his co-authors found that wearing clothing that’s more formal than usual makes people think more broadly and holistically, rather than narrowly and about fine-grained details. In psychological parlance, wearing a suit encourages people to use abstract processing more readily than concrete processing.
Research on the effects of clothing on cognition remains in its early stages. Another similar study showed that when subjects wore a white coat that they believed belonged to a doctor, they became more attentive, an effect that didn’t hold when they believed the garment was a painter’s. But clothing’s psychological effects have been specified for only a couple of the ways the brain makes sense of stimuli.
That said, at work, when some have to wear suits, there are some specific implications when attire flicks on abstract processing. “If you get a stinging piece of critical feedback at work, if you think about it with a concrete processing style, it’s more likely to negatively impact your self-esteem,” says Michael Slepian, another one of the paper’s authors and a professor of management at Columbia Business School. Slepian added that thinking about money with an abstract processing style might lead one to skip impulsive purchases in favor of smarter, long-term savings behaviors.
<<< [[Wearing a Suit|http://www.theatlantic.com/business/archive/2015/04/wearing-a-suit-makes-people-think-differently/391802/]], the Atlantic
<<<
""" Weary from hunger of spirit
Through grim wasteland I dragged my way,
And a six-winged seraph came to me
At a place where two paths crossed.
With finger-tips as light as sleep
He touched the pupils of my eyes,
And my mantic pupils opened
Like eyes of an eagle scared.
As his fingers touched my ears
They were filled with roar and clang:
And I heard the shuddering of the sky,
And angels’ mountain flight,
And sea beasts moving in the deep,
And growth of valley vine.
And he pressed against my mouth,
And out he plucked my sinful tongue,
And all its guile and empty words,
And taking a wise serpent’s tongue
He thrust it in my frozen mouth
With his incarnadine right hand.
And with his sword he cleft my breast,
And out he plucked my trembling heart,
And in my gaping breast he placed
A coal alive with flames.
Like a corpse I lay in the wasteland,
And I heard God’s voice cry out:
‘Arise, prophet, and see and hear,
Be charged with my will—
And go out over seas and lands
To fire men’s hearts with the word.’ """
<<< Alexander Pushkin, 1826
Web 1.0 is the future of the web. Pages not apps, links not rich functionality. Transparency, hierarchy, actual content. Get some liberal arts up in this web.
---
Speaking of web 1.0:
<img src="http://i.imgur.com/uimjLaB.gif">
You are visitor number: <img src="http://simplehitcounter.com/hit.php?uid=1858033&f=16777215&b=0" border="0" height="18" width="83">
http://blog.intercom.io/design-futures-1-creating-systems-not-products/
Web components on one's own site and on other's sites and in apps is the equivalent of Amazon / Jeff Bezos's API-everything.
[img[http://i.imgur.com/R9YKgvZ.jpg]]
Weeping Cherry and Bullfinch by Hokusai
The sweep of the branch, expressively positioned bullfinch, rich colors... Hokusai deserves his reputation as a master, beyond the pop culture resonance of Great Wave
//You're so [[vain|tuxedo]], you probably think this wiki is [[about you|Austin Storm]], don't you?//
My name is [[Austin Storm]], and this is my homepage - [[web 1.0]] style. It's a [[wiki|wikis are hammers]] built on the TiddlyWiki framework, containing a total of <$count filter="[!is[system]sort[title]]"></$count> entries and clocking in at around 2 MB.<img src="http://simplehitcounter.com/hit.php?uid=1858033&f=16777215&b=0" border="0" height="0" width="0">
''[[But Austin, I seem to be able to edit your entire site!]]''
!! Table of Contents
!!! Commonplace Book
The majority of this site is my [[commonplace book|commonplace]] - a collection of quotations and links to articles.
There's also a [[dictionary]], and a collection of my favorite [[poetry]].
!!! Blog
How could I forget the blog? There's a [[blog|Blog]]... sort of. The writing is dreadful and entries are sparse. But it's there.
Latest entry: <$list filter="[tag[Blog]] +[!sort[modified]limit[1]]"><$link to={{!!title}}><$view field="title"/></$link>
</$list>
!!! Projects
You can also find information about my personal [[projects]], including:
!!!! The Storm Cellar
[[The Storm Cellar]] is a secondhand consignment clothing store with a healthy dollop of housewares and novel gifts.
!!!! The Anchor
[[The Anchor on Main|The Anchor]] is a historic building in downtown [[Moscow, ID|Moscow]] which we are renovating. When it's completed I hope it will host a variety of new, independent restaurants.
!!! Lists, Links and Recommends
I [[really|We like lists]] [[like|we make ourselves lists]] [[lists]]. [[Breakfast breads ranked|Breakfast breads]], [[Movies I've cried in]], [[Alternate Universe Future Moscow|Future Moscow]]... but if you're not me the list you're probably looking for is our list of [[favorite places in Spokane|Spokane List]].
I also plan on using this more to store [[links|link]] and [[recommends|recommend]], and pop-culture things I'm [[deeply enthusiastic about|fandom]]
!!! Hypertext Essays
Lastly, this site has a number of [[hypertext essays|hypertext essay]]. The main one is a collection of snippets on what I call (for lack of a better term) the [[Moscow Project]]
<<<
To a remarkable extent, American political and cultural thinking takes place within well-worn, familiar grooves. The right is religious; the left is secular. The right frets about sexual liberation; the left cheers it. The right valorizes markets; the left views them with suspicion. The right praises individualism; the left longs for solidarity. The right defends nations and borders; the left longs for universalism. The right worries about the collapse of authority and the rise or moral and cultural decadence; the left does not.
<<< Damon Linker, [[France's Islamic future?|http://theweek.com/articles/532002/frances-islamic-future]]
As Edward Abbey bluntly puts it, "The best serious essayist now at work in the United States."
<<<
My friend and I actually had started this group called The Haven where we had met a lot of people who are artists whose faith was important to them, but they maybe weren’t necessarily supported by their church back home or they weren’t maybe supported by the Christian community with what they were doing… And she had come to that. And we met and just kind of hit it off…
I think any time in someone’s faith journey — my faith journey also — you go through doubting. I think you kind of have to go through that, honestly, just to ask the tough questions. And so I think there’s always been some redefining — I don’t know if ‘redefining’ is the right word but just making it more mine rather than maybe something I grew up with, because I was raised in the South. And I was raised in the Baptist church.
And yeah, I mean, it’s everything to me. It’s incredibly — to walk through this — I mean, life is crazy. And to know that, honestly, a loving God is walking through it with me is very comforting for me. But I’ve been through my own times of just, like, what does this mean?… And I’ve thankfully had a lot of people around me who have allowed me to ask those questions. And we’ve talked about it and walked through it together and struggled through it. And, I mean, that’s very, very important. And it’s important to have those people around you you can be honest with.
<<< Tony Hale, http://www.mbird.com/2016/06/tony-hales-awkward-silent-prison/
<<<
As you read through the text to be preached, and as you gather your thoughts on ways in which it might be preached, think about what creedal affirmation correlates with your ideas. Whether it is a point of the Nicene Creed, the Apostles’ Creed, or the Westminster Confession, think about how it supports and directs your explication. Simultaneously, think about how the biblical text gives dimension to, illustrates, and makes sense of the creedal affirmation…. I am continually amazed at how refreshing it is to hear a robust, cohesive explanation of even the most fundamental points of Christian faith when those points are drawn out of Scripture with a passion for showing their interrelatedness and mutuality.
<<< Christine McSpadden
<<<
The highest reward for man's toil is not what he gets for it, but what he becomes by it.
<<< John Ruskin
<<<
What important truth do very few people agree with you on?
<<<Peter Thiel's reported favorite interview question
For me, this would probably be the destructiveness of ideological tribalism.
<<<
When asked “What is a gentleman?”
Tom Waits: “A man who can play the accordion, but doesn’t.”
<<<
<<<
In literature, as in love, we are astonished at what is chosen by others.
<<< André Maurois
<<<
There is something which unites magic and applied science while separating both from the ‘wisdom’ of the earlier ages. For the wise men of old the cardinal problem had been how to conform the soul to reality, and the solution had been knowledge, self-discipline, and virtue. For magic and applied science alike the problem is how to subdue reality to the wishes of men: the solution is a technique; and both, in the practice of this technique, are ready to do things hitherto regarded as disgusting and impious – such as digging up and mutilating the dead.
<<<
And later:
<<<
It is in Man’s power to treat himself as a mere ‘natural object’ and his own judgments of value as raw material for scientific manipulation to alter at will. The objection to his doing so does not lie in the fact that this point of view (like one’s first day in a dissecting room) is painful and shocking till we grow used to it. The pain and the shock are at most a warning and a symptom. The real objection is that if man chooses to treat himself as raw material, raw material he will be: not raw material to be manipulated, as he fondly imagined, by himself, but by mere appetite, that is, mere Nature, in the person of his de-humanized Conditioners.
<<<
From The Abolition of Man.
[img[http://i.imgur.com/iceDI7h.jpg]]
The Tempest, Act 2, Scene I.
<<<
What is the malaise? You ask. The malaise is the pain of loss. The world is lost to you, the world and the people in it, and there remains only you and the world and you no more able to be in the world than Banquo’s ghost.
<<< Walker Percy, The Moviegoer
<<<
Heidegger’s “The Question Concerning Technology” seems apropos here. Not everyone (perhaps not even most) using apps like Tinder or ~OkCupid are actually indulging in mind-bogglingly shallow promiscuity. I know plenty of people who use such apps to, you know, go on dates. However, even when the behavior is less obviously dysfunctional, the *medium* exercises a profound influence on the way we think about relationships. “Swiping” through pictures of dozens of complete strangers to compare romantic options necessarily fosters a commodified understanding of relationships even if one’s intentions were as pure as the driven snow. Heidegger would call that the Gestell: the “frame” that technology imposes on how we relate to the world regardless of how we consciously intend to use it.
It’s precisely the awareness of the pervasiveness and the danger of the “frame” of late-modern liberal culture that distinguishes the Benedict Option (I think) from “just the Church being the Church.” The culture of Tinder is obviously a challenge to Christian notions of chastity, but that doesn’t mean that merely a redoubled moralism is equal to the task. The problem is not simply what people choose or what they value. It is not even simply how people think. It it is what they can *imagine* thinking and choosing. A certain distance from the mainstream culture is necessary not simply to cultivate better habits or more coherent beliefs, but to create imaginative spaces where orthodoxy and orthopraxy are even intelligible.
Burke spoke of “the wardrobe of the moral imagination” that was “necessary to cover the defects of our naked, shivering nature.” I think modernist Christians often try to “clothe” their children from the common American armoire, only to find it’s mostly (imaginative) booty shorts and Lycra.
<<< commenter Patrick Harris on [[Rod Dreher's blog|http://www.theamericanconservative.com/dreher/man-inhumanity-to-man-tinder-mercenaries/]]
<<<
What we call Capitalism ought to be called Proletarianism. Most only have wages because they do not have capital.
<<< G.K. Chesterton
<<<
When I paint, I think that what would satisfy me is to express what Bonnard said Renoir told him: make everything more beautiful.
<<< Fairfield Porter
<<<
What you see and what you hear depends a great deal on where you are standing. It also depends on what sort of person you are.
<<< C.S. Lewis, The Magician's Nephew
<iframe width="420" height="315" src="https://www.youtube.com/embed/rLMsavNEZ1U" frameborder="0" allowfullscreen></iframe>
[img[http://pixel.nymag.com/imgs/daily/vulture/2015/09/17/magazine/19-eileen-myles.w1200.h630.jpg]]
<<<
She said, “It’s not intuitive at all. But I’m obsessed with that part in the Bible when Jesus is given the opportunity to cure a person possessed by demons, and Jesus says, ‘What is your name?’ And the person replies, ‘My name is legion.’ Whatever is not normative is many.” She liked the idea of a person containing more than one self, more than one gender.
“Part of it is just the fiction of being alive,” she said. “Every step, you’re making up who you are.”
<<< Eileen Myles
In a [[profile of Jill Soloway|http://www.newyorker.com/magazine/2015/12/14/dolls-and-feelings]], who's currently dating Myles.
This is such a striking thing to say. I read this sort of thing as a denial of one's true self - a schizophrenia, but of course the prevailing view is that it's an embrace of one's self.
<<<
When a writer is born into a family, the family is finished.
<<< Czeslaw Milosz
<<<
When all you have is your reason, everything looks like a doubt.
<<< Eve Tushnet
<<<
When God closes a door, he opens a window. Our heating bill is outrageous & six raccoons got in last night. Please God, this has to stop.
<<< Rob Fee
<<<
Inspirational thought: When God hands you a rock he always closes a window.
<<< Aaron Rench
<<<
When hungry, eat your rice; when tired, close your eyes. Fools may laugh at me, but wise men will know what I mean.
<<< Lin-Chi
<<<
I have to be damn careful when I talk about grace. I have to be extremely allusive.
<<< Walker Percy
<<<
When small men cast long shadows, you know the sun is setting.
<<< Lao Tzu
<<<
"""When the Time's Toxins
by Christian Wiman
When the time’s toxins
have seeped into every cell
and like a salted plot
from which all rain, all green, are gone
I and life are leached
of meaning
somehow a seed
of belief
sprouts the instant
I acknowledge it:
little weedy hardy would-be
greenness
tugged upward
by light
while deep within
roots like talons
are taking hold again
of this our only earth.
"""
<<<
<<<
When we get our spiritual houses in order, we’ll be dead. This goes on. You arrive at enough certainty to be able to make your way, but it is making it in darkness. Don’t expect faith to clear things up for you. It is trust, not certainty.
<<< Flannery O'Connor, The Habit of Being
<<<
When we read too fast or too slowly, we understand nothing.
<<< Blaise Pascal
<<<
Where you have absolute solutions, you have no need of faith. Faith is what you have in the absence of knowledge. The reason this clash doesn’t bother me any longer is because I have got, over the years, a sense of the immense sweep of creation, of the evolutionary process in everything, of how incomprehensible God must necessarily be to be the God of heaven and earth. You can’t fit the Almighty into your intellectual categories.
<<< Flannery O'Connor, The Habit of Being
<<<
It is only when you see people looking ridiculous that you realize just how much you love them.
<<< Agatha Christie
<<<
Whenever an angel says "Be not afraid!" you'd better start worrying. A big assignment is on the way.
<<< Elie Wiesel
<<<
Where else can a liberal arts education be put to such good use?
<<< Mel Ziegler, founder of Banana Republic, on starting a business
<<<
Where is the wisdom? Lost in the knowledge. Where is the knowledge? Lost in the information.
<<< T.S. Eliot
<<<
Where is the information? Lost in the data. Where is the data? Lost in the #@$$%?!& database.
<<< Joe Celko, database theorist
[[Noisli|http://www.noisli.com/]]
On the Pledge of Allegiance
<<<
...there are also plenty of non-sectarian reasons to dislike this ceremonial idolatry. Like, for example, the way it twists expressions of patriotism into substance-less, performative gestures that therefore ultimately become competitive — promoting division more than national unity.
Or, again, the fact that a country requiring its citizens — particularly its children — to participate in reciting a mandatory loyalty oath is just about the skin-crawlingly creepiest thing imaginable. “Liberty and justice for all” is a beautiful thing. Social coercion requiring us to pledge allegiance to a symbol representing such ideals is several steps backwards from those ideals themselves. And it’s creepy, creepy, creepy.
<<< Fred Clark, [[Slacktivist|http://www.patheos.com/blogs/slacktivist/2015/05/25/walmart-moose/]]
<<<
In the relation to God, unconditional exclusiveness and unconditional inclusiveness are one. For those who enter into the absolute relationship, nothing particular retains any importance—neither things nor beings, neither earth nor heaven—but everything is included in the relationship. For entering into the pure relationship does not involve ignoring everything but seeing everything in the You, not renouncing the world but placing it upon its proper ground. Looking away from the world is no help toward God; staring at the world is no help either; but whoever beholds the world in him stands in his presences…
<<< Martin Buber, 'I and Thou'
<<<
While not everyone is a vegan, pretty much everybody who knows anything about factory farming is upset by it. There is pretty much zero room for PETA to convert people from pro-factory-farming to anti-factory-farming, because there aren’t any radical grassroot pro-factory-farming activists to be found. Their problem isn’t lack of agreement. It’s lack of publicity.
[...]
It’s in activists’ interests to destroy their own causes by focusing on the most controversial cases and principles, the ones that muddy the waters and make people oppose them out of spite. And it’s in the media’s interest to help them and egg them on.
<<< [[The Toxoplasma of Rage|http://slatestarcodex.com/2014/12/17/the-toxoplasma-of-rage/]]
This explains a lot
[img[http://i.imgur.com/OHAaI69.jpg]]
<<<
Allegedly they are orange for entirely political reasons: in the 17th century, Dutch growers are thought to have cultivated orange carrots as a tribute to William of Orange – who led the the struggle for Dutch independence – and the color stuck. A thousand years of yellow, white and purple carrot history, was wiped out in a generation.
Although some scholars doubt if orange carrots even existed prior to the 16th century, they now form the basis of most commercial cultivators around the world. Presumably crosses between Eastern (purple), Western (white, red) and perhaps wild carrots led to the formation of the orange rooted carrot sub species. Turkey is often cited as the original birthplace of the hybrids (or mutations) of the two groups.
Whatever the origins, the Long Orange Dutch carrot, first described in writing in 1721, is the forebear of the orange Horn carrot varieties so abundant nowadays. The Horn Carrot derives from the Netherlands town of Hoorn in the neighborhood of which it was presumably bred. All our modern, western carrots ultimately descend from these varieties.
<<<
<<<
But there's a powerful truth here, which is that people dispensing financial advice are even less neutral than we realise. We're good at spotting the obvious conflicts of interest: of course mortgage providers always think it's a great time to buy a house; of course the sharp-suited guys from SpeedyMoola.co.uk think their payday loans are good value. But it's more difficult to see that everyone offering advice has a deeper vested interest: they need you to believe things are complex enough to make their assistance worthwhile. It's hard to make a living as a financial adviser by handing clients an index card and telling them never to return; and those stock-tipping columns in newspapers would be dull if all they ever said was "ignore stock tips". Yes, the world of finance is complex, but it doesn't follow that you need a complex strategy to navigate it.
There's no reason to assume this situation only occurs with money, either. The human body is another staggeringly complex system, but based on current science, Michael Pollan's seven-word guidance -- "Eat food, not too much, mostly plants" -- is probably wiser than all other diets.
<<< Oliver Burkeman
http://www.theguardian.com/lifeandstyle/2016/mar/04/complex-questions-simple-answers-oliver-burkeman
<<<
I am occasionally accused of hating movies just because I hate most movies. I actually love movies. Which is why I hate most of them.
<<< N.D. Wilson
A counterpoint to [[The movies are so rarely great art]], although I'm sure Wilson's not expressing a desire for more 'great art'.
<<<
...there is a negative relationship between yield and nutritional content. And during the last 50 years, the farmers have optimized for one thing: yield. When you optimize for yield, you compromise nutrition.
<<<
via this post: http://calmscience.net/2015/12/11/tale-of-tasteless-tomatoes-why-vegetables-do-not-taste-good-anymore/
After Mark Schatzker's book The Dorito Effect
A delightful discussion around the topic here: https://news.ycombinator.com/item?id=10997485
Comparable knowledge base from the Wikipedia foundation.
<<<
...as I’ve said before, wikis are hammers, but not everything is a nail.
<<< Michael Arrington
"Wisdom comes from awe rather than from shrewdness. It is evoked not in moments of calculation but in moments of being in rapport with the mystery of reality. The greatest insights happen to us in moments of awe."
<<<
...people find consolation in whatever the going “weird” is. If it’s ripped pants, pink hair, three more piercings, gaudy make-up, icons, dietary bling, fastidious immodesty, bands no one has ever heard of, stylish glasses, esoteric theology, whatever. If it’s in a catalogue (whether mass produced and mass mailed or found on a little known myspace cave), and it’s a little bit different, then the suckers gather round and the Sylvester ~McMonkey ~McBeans set up shop.
<<< Toby Sumpter, [[Wisdom is a Screamer|http://www.tobyjsumpter.com/wisdom-is-a-screamer/]]
Agreed - consumerism offers a myriad of alternative, idolatrous identities. But I disagree with Toby's understanding of [[the prophetic|prophetic voice]].
<<<
With the red hair of one urchin in the gutter I will set fire to all modern civilization. Because a girl should have clean hair, she should not have an unclean home: because she should not have an unclean home, she should have a free and leisured mother; because she should have a free mother, she should not have an usurious landlord; because there should not be an usurious landlord, there should be a redistribution of property; because there should be a redistribution of property, there shall be a revolution.
<<< G.K. Chesterton
Chesterton logic
<<<
Within that household the human spirit has both roof and hearth.
<<< Hilaire Belloc on the church
<<<
“Isak Dinesen said that she wrote a little every day, without hope and without despair. I like that.”
<<< Raymond Carver
<<<
Without your wound where would your power be?…The very angels themselves cannot persuade the wretched and blundering children on earth as can one human being broken on the wheels of living. In love’s service, only the wounded soldiers can serve.
<<< Thornton Wilder
I can't remember which play this is from.
[img[http://i.imgur.com/jSge3mk.jpg]]
<<<
On the one hand, we have the Reformational view, represented by Barth, that preaching is essential for Christian worship and for the very being of the church, while the eucharist, though important, would be optional on any given Sunday (even if required on some regular basis). (The later Barth urged that it be celebrated every Sunday.) On the other hand, we have the contemporary Roman Catholic alternative that the eucharist is always essential, while preaching, though mandatory except under exceptional circumstances, is still secondary and in principle dispensable.
A way beyond this impasse is suggested by Alexander Schmemann. In his book The Eucharist: Sacrament of the Kingdom (St. Vladimir’s, 1988), Schmemann posits an ‘unbreakable unity of word and sacrament’ (p. 69). The word proclaims Christ in his saving significance as the Incarnate Saviour. The sacrament, on the other hand, is said to do more than merely ‘confirm’ the word and ‘illustrate’ it. It rather ‘fulfills’ and ‘interprets’ it…. When the sacrament is severed from proclamation and so from scripture, it threatens to become an object of priestly manipulation and superstition. On the other hand, when scripture is severed from its fulfilment in the sacrament, it all too easily dissolves under the pressures of modern scholarly dissection. Only when word and sacrament are held firmly together in the liturgy, and so in the formative experience of the church, can each truly be what it is.
<<< George Hunsinger, Conversational Theology: Essays on Ecumenical, Postliberal, and Political Themes, with Special Reference to Karl Barth
Wordpress plugin still seems like the best strategy for adaptation. It's in line with the [[utility to network]] approach
<<<
In all ages, the technique of the Black Magician has been essentially the same. In all spells the words are deprived of their meanings and reduced to syllables or verbal noises. This may be done literally, as when magicians used to recite the Lord’s Prayer backwards, or by reiterating a word over and over again as loudly as possible until it has become a mere sound. For millions of people today, words like communism, capitalism, imperialism, peace, freedom, democracy, have ceased to be words, the meaning of which can be inquired into and discussed, and have become right or wrong noises to which the response is as involuntary as a knee-reflex.
It makes no difference if the magic is being employed simply for the aggrandizement of the magician himself or if, as is more usual, he claims to be serving some good cause. Indeed, the better the cause he claims to be serving, the more evil he does…. Propaganda, like the sword, attempts to eliminate consent or dissent and, in our age, magical language has to a great extent replaced the sword.
<<< W. H. Auden, “Words and the Word,” in Secondary Worlds (1968).
<<<
A satisfactory human life, individually or collectively, is possible only if proper respect is paid to all three worlds [Work, Carnival, and Prayer]. Without Prayer and Work, the Carnival laughter turns ugly, the comic obscenities grubby and pornographic, the mock aggression into real hatred and cruelty…. Without Laughter and Work, Prayer turns Gnostic, cranky, Pharisaic, while those who try to live by Work alone, without Laughter or Prayer, turn into insane lovers of power, tyrants who would enslave Nature to their immediate desires — an attempt which can only end in utter catastrophe, shipwreck on the Isle of the Sirens.
<<< W.H. Auden, a lecture published in 'Complete Works' Vol. V, 1963-1968
<<<
Works of art cannot save us. They can simply render us more sensitive to what needs to be repaired.
<<< Terry Eagleton
<<<
I love to create beautiful worlds where light dances and peace reigns. I like to portray a world without the Fall.
<<<Thomas Kinkade
http://www.christianitytoday.com/ct/2000/december4/6.48.html
<<<
“Sometimes the Bible in the hand of one man is worse than a whisky bottle in the hand of (another) ... There are just some kind of men who - who're so busy worrying about the next world they've never learned to live in this one, and you can look down the street and see the results.”
<<< Harper Lee, To Kill a Mockingbird
<<<
If a thing is worth doing, it is worth doing badly.
<<< G.K. Chesterton, What's Wrong With the World
This is what Chesterton calls “the democratic faith: that the most terribly important things must be left to ordinary men themselves – the mating of the sexes, the rearing of the young, the laws of the state.”
He is defending the generalist and the amateur - someone who does something for love - versus the professional.
The line became famously attached to him in his lifetime, and he [[seemed to know|paradox]] it was a bit cheeseball.
//See also://
* [[worth doing right]]
* [[better off doing nothing]]
* [[specialization is for insects]]
<<<
Anything worth doing, is worth doing right.
<<< Hunter S. Thompson
[[after G.K. Chesteron|worth doing badly]]
<<<
A good way to test whether your worship music is keeping the 5th commandment: would your grandpa know any of it?
<<< Toby Sumpter, [[1/27/2012|https://twitter.com/TJSumpter/status/162972928634388480]]
This is an odd standard, but maybe I have odd grandparents.
<<<
"""''Healing''
I am not a mechanism, an assembly of various sections.
And it is not because the mechanism is working wrongly, that I am ill.
I am ill because of wounds to the soul, to the deep emotional self
and the wounds to the soul take a long, long time, only time can help
and patience, and a certain difficult repentance
long, difficult repentance, realization of life’s mistake, and the freeing oneself
from the endless repetition of the mistake
which mankind at large has chosen to sanctify."""
<<< D.H. Lawrence
I've always been bothered by Wikipedia's 'Notability' policy. If you're going to make an internet encyclopedia, why not make it have a page on everything in the world?
But that's beside the point. This is my online notebook, so apart from the commonplaces each entry just reflects my opinion. It's not an encyclopedia.
Just in case you were confused about that.
<<<
"Writing is a concentrated form of thinking. I don’t know what I think about certain subjects, even today, until I sit down and try to write about them"
<<< Paris Review - The Art of Fiction No. 135, Don ~DeLillo
<<<
...writing is like driving sheep down a road. If there is any gate open to the left or the right the reader will go into it.
<<< C.S. Lewis
<<<
Writing is nature's way of letting you know how sloppy your thinking is.
<<< Dick Guindon
<<<
Writing is the art of repeating oneself without anyone noticing.
<<< Nassim Taleb
Cabinet of curiosities.
[img[http://i.imgur.com/MjQ6kxN.jpg]]
<<<
You are not big enough to accuse the whole age effectively, but let us say you are in dissent. You are in no position to issue commands, but you can speak words of hope. Shall this be the substance of your message? Be human in this most inhuman of ages; guard the image of man for it is the image of God.
<<< Thomas Merton
<<<
So, the truth: Right now, today, in 2014 is the best time to start something on the internet. There has never been a better time in the whole history of the world to invent something. There has never been a better time with more opportunities, more openings, lower barriers, higher benefit/risk ratios, better returns, greater upside, than now. Right now, this minute. This is the time that folks in the future will look back at and say, “Oh to have been alive and well back then!”
<<< Kevin Kelly
Kevin Kelly points out how much of the Internet frontier we have yet to explore in a remarkable essay: [[You Are Not Late|https://medium.com/message/you-are-not-late-b3d76f963142]]
We do not get to choose our cultural moment, but this is a great one. Like Archimedes we just need to find our lever and a place to stand.
<<<
Learned tonight that you can be a hero & a villain at the same time. Might sound like a contradiction but it was in a movie [Maleficent] so must be true.
<<< Toby Sumpter, 11/2/2014
This is an extension of the [[story self-awareness|see yourself in a story]] thing.
[img[http://www.froufrouu.com/wp/wp-content/uploads/2012/09/IMG_1174.jpg]]
<<<
But I am a Calvinist: severe because you can only do what you know how to do.
<<< Romeo Gigli
I miss this guy. Apparently his house collapsed do to mis-management by his girlfriend and her ex-husband, and things are still contested. His diffusion stuff (fragrances, sunglasses) have done well but are a shadow of his promise.
<<<
You can survive on your own; can grow strong on your own; prevail on your own; but you cannot become human on your own.
<<< Frederick Buechner
<<<
Be not angry that you cannot make others as you wish them to be, since you cannot make yourself as you wish to be.
<<< Thomas à Kempis, from The Imitation of Christ
ie "The wrath of man does not produce the righteousness of God."
<<<
A successful startup takes a very long time - much longer than most founders think. You cannot treat it as an all-nighter. You have to eat well, sleep well, exercise, and spend time with your family and friends.
<<< Sam Altman
<<<
“By worrying less about conformity and expressing more individual style. In a funny way I think social media is making people less rather more experimental. People are too worried about looking good all the time. When I grew up you could get it all horribly wrong and it didn’t matter, there was no record.”
<<< Patrick Grant on how men can be more stylish
<<<
You don’t become completely free by just avoiding to be a slave; you also need to avoid becoming a master.
<<< Nassim Taleb
<<<
But who was teaching the men how to spend money? It was Playboy [Magazine]. This was the brilliance of Hugh Hefner. He understood that you don’t just commodify sexuality, you sexualize commodities. The promise that Playboy held out was not the girls or the women, it was that if you buy at this level, if you consume at the level Playboy tells you to, then you will get the prize, which is the women. The step that was crucial to getting the prize was the consumption of commodities. He wrapped porn, which sexualized and commoditized women’s bodies, in an upper-middle-class blanket. He gave it a veneer of respectability.
<<< Gail Dines
<<<
It almost always goes wrong. Although people don’t think of it this way, identity in general tends to be a toxic succession. Identity depends on group consensus. If you say something that other people [in your group] don’t believe, their response tends to be violent; they depend on that group consensus. It’s a defensive technique.
The other thing I think is wrong with this moment of great offense is that you get a cookie for getting offended about something. People are like, “If I get offended about that, it means I’m righteous.” On Twitter, you get a cookie not only from more people approving of you but from more people following you. You raise your profile by being offended. So the natural consequence of that is that people get more and more offended. Because the thing is, there’s nothing to risk by being offended. Once you’re offended, you’re partly saying, “I’m more pure than this, and as such I reject this.” There’s just nothing at risk.
<<<
http://www.salon.com/2015/05/24/you_get_a_cookie_for_being_offended_mat_johnson_on_the_fine_art_of_racial_satire/
From his [[Reddit Q&A|http://www.reddit.com/r/IAmA/comments/16k598/iama_columnist_and_reporter_on_media_and_culture/]]:
<<<
Q: I’m a freshman in college right now & journalism is a career that interests me. Is there any advice you can share on being successful in journalism?
A: You have to make stuff. The tools of journalism are in your hands and no one is going to give a damn about what is on your resume, they want to see what you have made with your own little fingies. Can you use Final Cut Pro? Have you created an Instagram that is about something besides a picture of your cat every time she rolls over? Is HTML 5 a foreign language to you? Is your social media presence dominated by a picture of your beer bong, or is it an RSS of interesting stuff that you add insight to? People who are doing hires will have great visibility into what you can actually do, what you care about and how you can express on any number of platforms.
<<<
<<<
Albini contrasts this approach to how he runs his business. “From an entrepreneurial standpoint, from someone like me — someone who builds a business for a reason — the reason my company exists is to make recordings of music. And in so doing, every now and again we’ll turn a profit. But that’s not why we’re in business. We’re not in business so that we can make money. And there’s a pretty strong argument that most businesses that are not part of the public sphere, not part of the investment transaction or equity management or whatever, most businesses operate on that level,” he said.
“Like a bakery opens because a guy wants to make bread. A tavern opens because a guy wants to serve beer to people. That’s why people start businesses. It’s because they want to do something with their time. They want that enterprise to be how they spend their days. But from an academic standpoint or from an analytical standpoint or from the standpoint of publicly held companies and investment class and everything, the reason the company started is meaningless. All they want to know is the share price going up. And for people like me that seems insane.”
“It’s like defining a marriage by the size of the house it occupies as opposed to defining the marriage by the love between two people and the life they build for themselves and the experience they share as part of the marriage. That’s the difference between the people who don’t get it (that you’re talking about), business people who can’t seem to buy into the greater culture of their business, and entrepreneurs, who started the business because the business itself means a lot to them.
“And there’s literally no way you can turn the second type of businessman into the first type. If somebody is hired to run a company and that company has investors who have expectations, then it is already impossible for that company to mean more to the employees as a concept than a paycheck. Because the value of the company has already been defined by the investor class. Now it is possible for somebody to start as an entrepreneur and then eventually sell off his company into the publicly held market and then he’s transformed from an entrepreneur into that second type of businessman. But it’s literally impossible to go the other way.”
<<< [[Steve Albini Shows That Punk Rock Ethics are Good Business|https://www.psychologytoday.com/blog/brick-brick/201507/steve-albini-shows-punk-rock-ethics-are-good-business]]
<<<
Don’t focus too much on this idea that your influences will be similar to people whose films you admire. In fact, it’s really the opposite: You like people who are doing something completely different, and it’s very relaxing to you because they’re dealing with all kinds of problems you don’t have to deal with.
<<< Whit Stillman
<<<
You owe it to all of us all get on with what you're good at.
<<< W. H. Auden
<<<
If you don’t say what you mean in a readable way, you actually risk nothing.
<<< Mary Karr
<<<
“Our garbage is collected early in the morning. Sometimes the bang of the cans and the grind of the city trucks awaken us before our time. We are resentful, mutter into our pillows, then go back to sleep. On the morning of August 6th, the people of Woodside Avenue do just that. When at last they rise from their beds, dress, eat breakfast, and leave their houses for work, they have forgotten, if they had ever known, that the garbage truck had passed earlier that morning. The event has slipped into unmemory, like a dream. They close their doors and descend to the pavement.
“It is midsummer. You measure the climate, decide how you feel in relation to the heat and humidity. You walk toward the bus stop. Others, your neighbors, are waiting there. It is all so familiar.
“All at once you step on something soft. You feel it with your foot. Even through your shoe you have the sense of something unusual, something marked by a special 'give.' It is a foreignness upon the pavement. Instinct pulls your foot away in an awkward little movement. You look down, and you see... a tiny naked body, its arms and legs flung apart, its head thrown back, its mouth agape, its face serious. A bird, you think, fallen from its nest. But there is no nest here on Woodside, no bird so big. It is rubber, then. A model. A joke. Yes, that's it, a joke. And you bend to see. Because you must. And it is no joke. Such a gray softness can be but one thing. It is a baby, and dead.
“You cover your mouth, your eyes. You are fixed. Horror has found its chink and crawled in, and you will never be the same as you were. Years later you will step from a sidewalk to a lawn, and you will start at its softness, and think of that upon which you have just trod. Now you look about; another man has seen it too. 'My God,' he whispers... There is a cry. 'Here's another!' and 'Another!' and 'Another.'
“Later, at the police station, the investigation is brisk, conclusive. It is the hospital director speaking. 'Fetuses accidentally got mixed up with the hospital rubbish... were picked up at approximately 8:15 am by a sanitation truck. Somehow, the plastic lab bag, labeled hazardous material, fell off the back of the truck and broke open. No, it is not known how the fetuses got in the orange plastic bag labeled hazardous material. It is a freak accident.'
“The hospital director wants you to know that it is not an everyday occurrence. Once in a lifetime, he says. But you have seen it, and what are his words to you now? He grows affable, familiar, tells you that, by mistake, the fetuses got mixed up with the other debris. (Yes, he says other, he says debris.) He has spent the entire day, he says, trying to figure out how it happened. He wants you to know that. Somehow it matters to him. He goes on: aborted fetuses that weigh one pound or less are incinerated. Those weighing over one pound are buried at the city cemetery. He says this.
“Now you see. It is orderly. It is sensible. The world is not mad. This is still a civilized society... But just this once, you know it isn't. You saw, and you know.”
<<< From Richard Selzer’s Mortal Lessons: Notes On The Art Of Surgery. http://vlt.tc/209i
After all, as Dillard told me, one of the goals of writing about an experience is to mythologize it—“not that one is aware that one is mythologizing, but you want everything simplified and enlarged.”
Annie Dillard quoted in [[The Thoreau of the Suburbs|http://www.theatlantic.com/features/archive/2015/02/the-thoreau-of-the-suburbs/385128/]]
<<<
You know that job where you teach people to be good at social media? Not real! Doesn't exist. There is no being good at social media, because it is a horror show. Being popular online is like being popular in middle school: Congratulations, you’re the king of the worst.
I have friends who have admitted to feeling as though they have entirely different personalities on Facebook and in real life. At first that sounds kind of terrifying and serial-killer-y, but the thing is, it's understandable. To front is human. The danger here is thinking we know people based on what we know OF them. In Jane Austen's day, you at least had to be in a room with someone before completely misinterpreting them — now, it's possible to do that for whole years with people you will never be close enough to touch with a longish stick.
<<< [[I am not my internet personality|http://nymag.com/thecut/2015/03/i-am-not-my-internet-personality.html]]
[img[http://i.imgur.com/rEpwJ1l.jpg]]
<<<
We chose to increase the complexity of our lives by having children. The greatest benefit of having those children has been to look at the world through their eyes and to understand their level of curiosity and to learn things the way they learn things.
<<< Tibor Kalman
<<<
For years, I’ve been saying that your company doesn’t have a culture. You are incorrectly applying the word “culture” to a group of people who behave a certain way because their lives are dominated by a few powerful figures in your office.
That’s it. Your shitty software company or little marketing agency doesn’t have a culture — it has a CEO and a leadership team that has particular points of view about how work should “feel.”
<<< [[Company Culture is a Myth|http://laurieruettimann.com/company-culture-myth/]] by Laurie Ruettimann
[img[http://media.tumblr.com/d4730c12970af8a188ac19263cbf0116/tumblr_inline_nj79bp17Rt1qf0t7e.jpg]]
<<<
The moral, I guess, is that as long as you carry yourself in the proper noncommittal manner you’ll never have to do anything else, and your very mysterious impassiveness will implicitly confer all the charisma you’ll ever need.
<<< Lester Bangs
<<<
How long has it been since you wrote a story where your real love or your real hatred somehow got onto the paper? When was the last time you dared release a cherished prejudice so it slammed the page like a lighting bolt? What are the best things and the worst things in your life, and when are you going to get around to whispering or shouting them?
…
Find a character, like yourself, who will want something or not want something, with all his heart. Give him running orders. Shoot him off. Then follow as fast as you can go. The character, in his great love, or hate, will rush you through to the end of the story. The zest and gusto of his need, and there is zest in hate as well as in love, will fire the landscape and raise the temperature of your typewriter thirty degrees.
<<< Ray Bradbury, Zen in the Art of Writing, 4-5, 6-7.
<<<
Regardless of how large, your vision is too small.
<<< Thomas Chalmers
<<<
The Lord Jesus enacted the true nature of the world for us when He fed the 5,000 and the 4,000. In both cases, He refuted the central tenet of unbelief, which is that resources are scarce, and that God must be a skinflint. Zero-sum thinking is the idea that more for one person means less for somebody else.
<<< Doug Wilson, [[Bread and Wine Multiply|http://dougwils.com/s7-engaging-the-culture/bread-and-wine-multiply.html]]
<<<
Let me begin with a definition of zero-sum thinking with regard to wealth, which I have referred to in this space a number of times. Zero-sum thinking assumes (in unbelief) that the amount of available blessings is necessarily fixed, and that it therefore follows that if one man gets a larger piece of the pie, others have to get a smaller piece. A wonderfully succinct summary of this mentality is found on the bumpersticker “Live Simply So That Others Can Simply Live.” Anyone who agrees with that bumpersticker, or is in sympathy with it, is in the grip of zero-sum thinking.
<<< Doug Wilson, [[Sell the Car, Champ|http://dougwils.com/s22-money-love-desire/sell-the-car-champ.html]]
This idea comes from [[Herbert Schlossberg|redistributive processes are zero-sum games]], I think.
I agree with this in principle. But the world is in important ways finite, and there are finite systems within the world. I think we could qualify the 'zero-sum thinking' concept in certain ways, specifically by invoking God's blessing.
Malthusianism is retarded, but take the example of having children - is it possible to have so many children that it strains the resources of the small system that is your family? Yes, although some could not acknowledge this. Is it possible to overtax the land? Yes, and observing as much is not falling prey to zero-sum thinking.
[[Finite and Infinite Games]] might be helpful in distinguishing between small systems which may be 'zero-sum' in certain respects, and systems that are infinite.
<<<
The Zeigarnik Effect is the tendency to experience intrusive thoughts about an objective that was once pursued and left incomplete
<<< (Baumeister & Bushman, 2008, pg. 122).