<<option chkGenerateAnRssFeed>> GenerateAnRssFeed\n<<option chkOpenInNewWindow>> OpenLinksInNewWindow\n<<option chkSaveEmptyTemplate>> SaveEmptyTemplate\n<<option chkToggleLinks>> Clicking on links to tiddlers that are already open causes them to close\n^^(override with Control or other modifier key)^^\n<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP\n<<option chkForceMinorUpdate>> Treat edits as MinorChanges by preserving date and time\n^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^\n<<option chkConfirmDelete>> ConfirmBeforeDeleting\nMaximum number of lines in a tiddler edit box: <<option txtMaxEditRows>>\nFolder name for backup files: <<option txtBackupFolder>>\n<<option chkInsertTabs>> Use tab key to insert tab characters instead of jumping to next field\n<<option txtFileSystemCharSet>> Character set to use for saving (Firefox/Mozilla only)
<<list all>>
Spacecraft (lunar missions)
Nov 2007"
/***\n| Name|CloseOnCancelPlugin|\n| Description|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\nmerge(config.commands.cancelTiddler,{\n\n handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,\n\n handler: function(event,src,title) {\n this.handler_orig_closeUnsaved(event,src,title);\n if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))\n story.closeTiddler(title,true);\n return false;\n }\n\n});\n\n//}}}\n\n
Welcome
<!--{{{-->\n<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit text'></div>\n<span macro="edit notation">Notation: </span><br/>\n<span class='editor' macro="edit scopenote">Scope Note: </span>\n<span class='editor' macro="edit use">Use: </span>\n<span class='editor' macro="edit usefor">Used For: </span>\n<span class='editor' macro="edit broader">Broader Terms: </span>\n<span class='editor' macro="edit narrower">Narrower Terms: </span>\n<span class='editor' macro="edit relatedto">Related Terms: </span>\n<div class='editor' macro='edit tags'>Tags: </div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n<!--}}}-->
/***\n| Name:|ExtentTagButtonPlugin|\n| Description:|Adds a New tiddler button in the tag drop down|\n| Version:|3.2 ($Rev: 2406 $)|\n| Date:|$Date: 2007-08-08 22:50:23 +1000 (Wed, 08 Aug 2007) $|\n| Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\n\nwindow.onClickTag_mptw_orig = window.onClickTag;\nwindow.onClickTag = function(e) {\n window.onClickTag_mptw_orig.apply(this,arguments);\n var tag = this.getAttribute("tag");\n var title = this.getAttribute("tiddler");\n // Saq, you're a genius :)\n var popup = Popup.stack[Popup.stack.length-1].popup;\n createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");\n wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));\n return false;\n}\n\n//}}}\n\n
/***\n|Name|FontSizePlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#FontSizePlugin|\n|Version|1.0|\n|Requires|~TW2.x|\n!Description:\nResize tiddler text on the fly. The text size is remembered between sessions by use of a cookie.\nYou can customize the maximum and minimum allowed sizes.\n(only affects tiddler content text, not any other text)\n\nAlso, you can load a TW file with a font-size specified in the url.\nEg: http://tw.lewcid.org/#font:110\n\n!Demo:\nTry using the font-size buttons in the sidebar, or in the MainMenu above.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nThen put {{{<<fontSize "font-size:">>}}} in your SideBarOptions tiddler, or anywhere else that you might like.\n\n!Usage\n{{{<<fontSize>>}}} results in <<fontSize>>\n{{{<<fontSize font-size: >>}}} results in <<fontSize font-size:>>\n\n!Customizing:\nThe buttons and prefix text are wrapped in a span with class fontResizer, for easy css styling.\nTo change the default font-size, and the maximum and minimum font-size allowed, edit the config.fontSize.settings section of the code below.\n\n!Notes:\nThis plugin assumes that the initial font-size is 100% and then increases or decreases the size by 10%. This stepsize of 10% can also be customized.\n\n!History:\n*27-07-06, version 1.0 : prevented double clicks from triggering editing of containing tiddler.\n*25-07-06, version 0.9\n\n!Code\n***/\n\n//{{{\nconfig.fontSize={};\n\n//configuration settings\nconfig.fontSize.settings =\n{\n defaultSize : 100, // all sizes in %\n maxSize : 200,\n minSize : 40,\n stepSize : 10\n};\n\n//startup code\nvar fontSettings = config.fontSize.settings;\n\nif (!config.options.txtFontSize)\n {config.options.txtFontSize = fontSettings.defaultSize;\n saveOptionCookie("txtFontSize");}\nsetStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\sn","fontResizerStyles");\nsetStylesheet("#contentWrapper .fontResizer .button {display:inline;font-size:105%; font-weight:bold; margin:0 1px; padding: 0 3px; text-align:center !important;}\sn .fontResizer {margin:0 0.5em;}","fontResizerButtonStyles");\n\n//macro\nconfig.macros.fontSize={};\nconfig.macros.fontSize.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n\n var sp = createTiddlyElement(place,"span",null,"fontResizer");\n sp.ondblclick=this.onDblClick;\n if (params[0])\n createTiddlyText(sp,params[0]);\n createTiddlyButton(sp,"+","increase font-size",this.incFont);\n createTiddlyButton(sp,"=","reset font-size",this.resetFont);\n createTiddlyButton(sp,"–","decrease font-size",this.decFont);\n}\n\nconfig.macros.fontSize.onDblClick = function (e)\n{\n if (!e) var e = window.event;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nconfig.macros.fontSize.setFont = function ()\n{\n saveOptionCookie("txtFontSize");\n setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\sn","fontResizerStyles");\n}\n\nconfig.macros.fontSize.incFont=function()\n{\n if (config.options.txtFontSize < fontSettings.maxSize)\n config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;\n config.macros.fontSize.setFont();\n}\n\nconfig.macros.fontSize.decFont=function()\n{\n\n if (config.options.txtFontSize > fontSettings.minSize)\n config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;\n config.macros.fontSize.setFont();\n}\n\nconfig.macros.fontSize.resetFont=function()\n{\n\n config.options.txtFontSize=fontSettings.defaultSize;\n config.macros.fontSize.setFont();\n}\n\nconfig.paramifiers.font =\n{\n onstart: function(v)\n {\n config.options.txtFontSize = v;\n config.macros.fontSize.setFont();\n }\n};\n//}}}
/***\n| Name|HideWhenPlugin|\n| Description|Allows conditional inclusion/exclusion in templates|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source|http://mptw.tiddlyspot.com/#HideWhenPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\nFor use in ViewTemplate and EditTemplate. Example usage:\n{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\n\nwindow.removeElementWhen = function(test,place) {\n if (test) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n};\n\nmerge(config.macros,{\n\n hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( eval(paramString), place);\n }},\n\n showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !eval(paramString), place);\n }},\n\n hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAny(params), place);\n }},\n\n showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAny(params), place);\n }},\n\n hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);\n }},\n\n showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);\n }}\n\n});\n\n//}}}\n\n
/***\n|Name|InlineJavascriptPlugin|\n|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|\n|Version|1.6.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Insert Javascript executable code directly into your tiddler content.|\n\n''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n!!!!!Usage\n<<<\nWhen installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.\n\n''Deferred execution from an 'onClick' link''\nBy including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered. You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text\n\n''External script source files:''\nYou can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.\n\n''Display script source in tiddler output''\nBy including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.\n\n''Defining javascript functions and libraries:''\nAlthough the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed. Thus, you cannot load a library and //immediately// use it's functions within the same tiddler. However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).\n\nTo ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened. For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.\n\nSince the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines. Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.\n\n''Creating dynamic tiddler content''\nAn important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:\n* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.\n* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.\n* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.\n\nIf your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display. For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.\n\n//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//\n\n''Accessing the ~TiddlyWiki DOM''\nThe plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.\n\nAccess to this DOM element allows you to create scripts that can:\n* vary their actions based upon the specific location in which they are embedded\n* access 'tiddler-relative' information (use findContainingTiddler(place))\n* perform direct DOM manipulations (when returning wikified text is not enough)\n<<<\n!!!!!Examples\n<<<\nan "alert" message box:\n><script show>\n alert('InlineJavascriptPlugin: this is a demonstration message');\n</script>\ndynamic output:\n><script show>\n return (new Date()).toString();\n</script>\nwikified dynamic output:\n><script show>\n return "link to current user: [["+config.options.txtUserName+"]]";\n</script>\ndynamic output using 'place' to get size information for current tiddler:\n><script show>\n if (!window.story) window.story=window;\n var title=story.findContainingTiddler(place).id.substr(7);\n return title+" is using "+store.getTiddlerText(title).length+" bytes";\n</script>\ncreating an 'onclick' button/link that runs a script:\n><script label="click here" title="clicking this link will show an 'alert' box" show>\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\nloading a script from a source url:\n>http://www.TiddlyTools.com/demo.js contains:\n>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}\n>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}\n><script src="demo.js" show>\n return "loading demo.js..."\n</script>\n><script label="click to execute demo() function" show>\n demo()\n</script>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.02.19 [1.6.0]'' added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script\n''2006.10.16 [1.5.2]'' add newline before closing '}' in 'function out_' wrapper. Fixes error caused when last line of script is a comment.\n''2006.06.01 [1.5.1]'' when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly\n''2006.04.19 [1.5.0]'' added 'show' parameter to force display of javascript source code in tiddler output\n''2006.01.05 [1.4.0]'' added support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.\n''2005.12.13 [1.3.1]'' when catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by UdoBorkowski\n''2005.11.09 [1.3.0]'' for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content. Based on a suggestion by BradleyMeck\n''2005.11.08 [1.2.0]'' handle loading of javascript from an external URL via src="..." syntax\n''2005.11.08 [1.1.0]'' pass 'place' param into scripts to provide direct DOM access \n''2005.11.08 [1.0.0]'' initial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 6, revision: 0, date: new Date(2007,2,19)};\n\nconfig.formatters.push( {\n name: "inlineJavascript",\n match: "\s\s<script",\n lookahead: "\s\s<script(?: src=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: label=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: title=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?( show)?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n if (lookaheadMatch[1]) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n var script = document.createElement("script"); script.src = lookaheadMatch[1];\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (lookaheadMatch[5]) { // there is script code\n if (lookaheadMatch[4]) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (lookaheadMatch[2]) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);\n link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}\n link.code="function _out(place){"+lookaheadMatch[5]+"\sn};_out(this);"\n link.setAttribute("title",lookaheadMatch[3]?lookaheadMatch[3]:"");\n link.setAttribute("href","javascript:;");\n link.style.cursor="pointer";\n }\n else { // run inline script code\n var code="function _out(place){"+lookaheadMatch[5]+"\sn};_out(w.output);"\n code=code.replace(/document.write\s(/gi,'place.innerHTML+=(');\n try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}
/***\n|''Name:''|IntelliTaggerPlugin|\n|''Version:''|1.0.2 (2007-07-25)|\n|''Type:''|plugin|\n|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Documentation:''|[[IntelliTaggerPlugin Documentation]]|\n|''~SourceCode:''|[[IntelliTaggerPlugin SourceCode]]|\n|''Licence:''|[[BSD open source license (abego Software)]]|\n|''~CoreVersion:''|2.0.8|\n|''Browser:''|Firefox 1.5.0.2 or better|\n***/\n/***\n!Version History\n* 1.0.2 (2007-07-25): \n** Feature: "Return" key may be used to accept first tag suggestion (beside "Alt-1")\n** Bugfix: Keyboard shortcuts (Alt+3 etc.) shifted\n* 1.0.1 (2007-05-18): Improvement: Speedup when using TiddlyWikis with many tags\n* 1.0.0 (2006-04-26): Initial release\n\n***/\n// /%\nif(!version.extensions.IntelliTaggerPlugin){if(!window.abego){window.abego={};}if(!abego.internal){abego.internal={};}abego.alertAndThrow=function(s){alert(s);throw s;};if(version.major<2){abego.alertAndThrow("Use TiddlyWiki 2.0.8 or better to run the IntelliTagger Plugin.");}version.extensions.IntelliTaggerPlugin={major:1,minor:0,revision:2,date:new Date(2007,6,25),type:"plugin",source:"http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin",documentation:"[[IntelliTaggerPlugin Documentation]]",sourcecode:"[[IntelliTaggerPlugin SourceCode]]",author:"Udo Borkowski (ub [at] abego-software [dot] de)",licence:"[[BSD open source license (abego Software)]]",tiddlywiki:"Version 2.0.8 or better",browser:"Firefox 1.5.0.2 or better"};abego.createEllipsis=function(_2){var e=createTiddlyElement(_2,"span");e.innerHTML="…";};abego.isPopupOpen=function(_4){return _4&&_4.parentNode==document.body;};abego.openAsPopup=function(_5){if(_5.parentNode!=document.body){document.body.appendChild(_5);}};abego.closePopup=function(_6){if(abego.isPopupOpen(_6)){document.body.removeChild(_6);}};abego.getWindowRect=function(){return {left:findScrollX(),top:findScrollY(),height:findWindowHeight(),width:findWindowWidth()};};abego.moveElement=function(_7,_8,_9){_7.style.left=_8+"px";_7.style.top=_9+"px";};abego.centerOnWindow=function(_a){if(_a.style.position!="absolute"){throw "abego.centerOnWindow: element must have absolute position";}var _b=abego.getWindowRect();abego.moveElement(_a,_b.left+(_b.width-_a.offsetWidth)/2,_b.top+(_b.height-_a.offsetHeight)/2);};abego.isDescendantOrSelf=function(_c,e){while(e){if(_c==e){return true;}e=e.parentNode;}return false;};abego.toSet=function(_e){var _f={};for(var i=0;i<_e.length;i++){_f[_e[i]]=true;}return _f;};abego.filterStrings=function(_11,_12,_13){var _14=[];for(var i=0;i<_11.length&&(_13===undefined||_14.length<_13);i++){var s=_11[i];if(s.match(_12)){_14.push(s);}}return _14;};abego.arraysAreEqual=function(a,b){if(!a){return !b;}if(!b){return false;}var n=a.length;if(n!=b.length){return false;}for(var i=0;i<n;i++){if(a[i]!=b[i]){return false;}}return true;};abego.moveBelowAndClip=function(_1b,_1c){if(!_1c){return;}var _1d=findPosX(_1c);var _1e=findPosY(_1c);var _1f=_1c.offsetHeight;var _20=_1d;var _21=_1e+_1f;var _22=findWindowWidth();if(_22<_1b.offsetWidth){_1b.style.width=(_22-100)+"px";}var _23=_1b.offsetWidth;if(_20+_23>_22){_20=_22-_23-30;}if(_20<0){_20=0;}_1b.style.left=_20+"px";_1b.style.top=_21+"px";_1b.style.display="block";};abego.compareStrings=function(a,b){return (a==b)?0:(a<b)?-1:1;};abego.sortIgnoreCase=function(arr){var _27=[];var n=arr.length;for(var i=0;i<n;i++){var s=arr[i];_27.push([s.toString().toLowerCase(),s]);}_27.sort(function(a,b){return (a[0]==b[0])?0:(a[0]<b[0])?-1:1;});for(i=0;i<n;i++){arr[i]=_27[i][1];}};abego.getTiddlerField=function(_2d,_2e,_2f){var _30=document.getElementById(_2d.idPrefix+_2e);var e=null;if(_30!=null){var _32=_30.getElementsByTagName("*");for(var t=0;t<_32.length;t++){var c=_32[t];if(c.tagName.toLowerCase()=="input"||c.tagName.toLowerCase()=="textarea"){if(!e){e=c;}if(c.getAttribute("edit")==_2f){e=c;}}}}return e;};abego.setRange=function(_35,_36,end){if(_35.setSelectionRange){_35.setSelectionRange(_36,end);var max=0+_35.scrollHeight;var len=_35.textLength;var top=max*_36/len,bot=max*end/len;_35.scrollTop=Math.min(top,(bot+top-_35.clientHeight)/2);}else{if(_35.createTextRange!=undefined){var _3b=_35.createTextRange();_3b.collapse();_3b.moveEnd("character",end);_3b.moveStart("character",_36);_3b.select();}else{_35.select();}}};abego.internal.TagManager=function(){var _3c=null;var _3d=function(){if(_3c){return;}_3c={};store.forEachTiddler(function(_3e,_3f){for(var i=0;i<_3f.tags.length;i++){var tag=_3f.tags[i];var _42=_3c[tag];if(!_42){_42=_3c[tag]={count:0,tiddlers:{}};}_42.tiddlers[_3f.title]=true;_42.count+=1;}});};var _43=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_44,_45,_46,_47,_48,_49){var _4a=this.fetchTiddler(_44);var _4b=_4a?_4a.tags:[];var _4c=(typeof _49=="string")?_49.readBracketedList():_49;_43.apply(this,arguments);if(!abego.arraysAreEqual(_4b,_4c)){abego.internal.getTagManager().reset();}};var _4d=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_4e){var _4f=this.fetchTiddler(_4e);var _50=_4f&&_4f.tags.length>0;_4d.apply(this,arguments);if(_50){abego.internal.getTagManager().reset();}};this.reset=function(){_3c=null;};this.getTiddlersWithTag=function(tag){_3d();var _52=_3c[tag];return _52?_52.tiddlers:null;};this.getAllTags=function(_53){_3d();var _54=[];for(var i in _3c){_54.push(i);}for(i=0;_53&&i<_53.length;i++){_54.pushUnique(_53[i],true);}abego.sortIgnoreCase(_54);return _54;};this.getTagInfos=function(){_3d();var _56=[];for(var _57 in _3c){_56.push([_57,_3c[_57]]);}return _56;};var _58=function(a,b){var a1=a[1];var b1=b[1];var d=b[1].count-a[1].count;return d!=0?d:abego.compareStrings(a[0].toLowerCase(),b[0].toLowerCase());};this.getSortedTagInfos=function(){_3d();var _5e=this.getTagInfos();_5e.sort(_58);return _5e;};this.getPartnerRankedTags=function(_5f){var _60={};for(var i=0;i<_5f.length;i++){var _62=this.getTiddlersWithTag(_5f[i]);for(var _63 in _62){var _64=store.getTiddler(_63);if(!(_64 instanceof Tiddler)){continue;}for(var j=0;j<_64.tags.length;j++){var tag=_64.tags[j];var c=_60[tag];_60[tag]=c?c+1:1;}}}var _68=abego.toSet(_5f);var _69=[];for(var n in _60){if(!_68[n]){_69.push(n);}}_69.sort(function(a,b){var d=_60[b]-_60[a];return d!=0?d:abego.compareStrings(a.toLowerCase(),b.toLowerCase());});return _69;};};abego.internal.getTagManager=function(){if(!abego.internal.gTagManager){abego.internal.gTagManager=new abego.internal.TagManager();}return abego.internal.gTagManager;};(function(){var _6e=2;var _6f=1;var _70=30;var _71;var _72;var _73;var _74;var _75;var _76;if(!abego.IntelliTagger){abego.IntelliTagger={};}var _77=function(){return _72;};var _78=function(tag){return _75[tag];};var _7a=function(s){var i=s.lastIndexOf(" ");return (i>=0)?s.substr(0,i):"";};var _7d=function(_7e){var s=_7e.value;var len=s.length;return (len>0&&s[len-1]!=" ");};var _81=function(_82){var s=_82.value;var len=s.length;if(len>0&&s[len-1]!=" "){_82.value+=" ";}};var _85=function(tag,_87,_88){if(_7d(_87)){_87.value=_7a(_87.value);}story.setTiddlerTag(_88.title,tag,0);_81(_87);abego.IntelliTagger.assistTagging(_87,_88);};var _89=function(n){if(_76&&_76.length>n){return _76[n];}return (_74&&_74.length>n)?_74[n]:null;};var _8b=function(n,_8d,_8e){var _8f=_89(n);if(_8f){_85(_8f,_8d,_8e);}};var _90=function(_91){var pos=_91.value.lastIndexOf(" ");var _93=(pos>=0)?_91.value.substr(++pos,_91.value.length):_91.value;return new RegExp(_93.escapeRegExp(),"i");};var _94=function(_95,_96){var _97=0;for(var i=0;i<_95.length;i++){if(_96[_95[i]]){_97++;}}return _97;};var _99=function(_9a,_9b,_9c){var _9d=1;var c=_9a[_9b];for(var i=_9b+1;i<_9a.length;i++){if(_9a[i][1].count==c){if(_9a[i][0].match(_9c)){_9d++;}}else{break;}}return _9d;};var _a0=function(_a1,_a2){var _a3=abego.internal.getTagManager().getSortedTagInfos();var _a4=[];var _a5=0;for(var i=0;i<_a3.length;i++){var c=_a3[i][1].count;if(c!=_a5){if(_a2&&(_a4.length+_99(_a3,i,_a1)>_a2)){break;}_a5=c;}if(c==1){break;}var s=_a3[i][0];if(s.match(_a1)){_a4.push(s);}}return _a4;};var _a9=function(_aa,_ab){return abego.filterStrings(abego.internal.getTagManager().getAllTags(_ab),_aa);};var _ac=function(){if(!_71){return;}var _ad=store.getTiddlerText("IntelliTaggerMainTemplate");if(!_ad){_ad="<b>Tiddler IntelliTaggerMainTemplate not found</b>";}_71.innerHTML=_ad;applyHtmlMacros(_71,null);refreshElements(_71,null);};var _ae=function(e){if(!e){var e=window.event;}var tag=this.getAttribute("tag");if(_73){_73.call(this,tag,e);}return false;};var _b2=function(_b3){createTiddlyElement(_b3,"span",null,"tagSeparator"," | ");};var _b4=function(_b5,_b6,_b7,_b8,_b9){if(!_b6){return;}var _ba=_b8?abego.toSet(_b8):{};var n=_b6.length;var c=0;for(var i=0;i<n;i++){var tag=_b6[i];if(_ba[tag]){continue;}if(c>0){_b2(_b5);}if(_b9&&c>=_b9){abego.createEllipsis(_b5);break;}c++;var _bf="";var _c0=_b5;if(_b7<10){_c0=createTiddlyElement(_b5,"span",null,"numberedSuggestion");_b7++;var key=_b7<10?""+(_b7):"0";createTiddlyElement(_c0,"span",null,"suggestionNumber",key+") ");var _c2=_b7==1?"Return or ":"";_bf=" (Shortcut: lt-%0)".format([key,_c2]);}var _c3=config.views.wikified.tag.tooltip.format([tag]);var _c4=(_78(tag)?"Remove tag '%0'%1":"Add tag '%0'%1").format([tag,_bf]);var _c5="%0; Shift-Click: %1".format([_c4,_c3]);var btn=createTiddlyButton(_c0,tag,_c5,_ae,_78(tag)?"currentTag":null);btn.setAttribute("tag",tag);}};var _c7=function(){if(_71){window.scrollTo(0,ensureVisible(_71));}if(_77()){window.scrollTo(0,ensureVisible(_77()));}};var _c8=function(e){if(!e){var e=window.event;}if(!_71){return;}var _cb=resolveTarget(e);if(_cb==_77()){return;}if(abego.isDescendantOrSelf(_71,_cb)){return;}abego.IntelliTagger.close();};addEvent(document,"click",_c8);var _cc=Story.prototype.gatherSaveFields;Story.prototype.gatherSaveFields=function(e,_ce){_cc.apply(this,arguments);var _cf=_ce.tags;if(_cf){_ce.tags=_cf.trim();}};var _d0=function(_d1){story.focusTiddler(_d1,"tags");var _d2=abego.getTiddlerField(story,_d1,"tags");if(_d2){var len=_d2.value.length;abego.setRange(_d2,len,len);window.scrollTo(0,ensureVisible(_d2));}};var _d4=config.macros.edit.handler;config.macros.edit.handler=function(_d5,_d6,_d7,_d8,_d9,_da){_d4.apply(this,arguments);var _db=_d7[0];if((_da instanceof Tiddler)&&_db=="tags"){var _dc=_d5.lastChild;_dc.onfocus=function(e){abego.IntelliTagger.assistTagging(_dc,_da);setTimeout(function(){_d0(_da.title);},100);};_dc.onkeyup=function(e){if(!e){var e=window.event;}if(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.keyCode>=48&&e.keyCode<=57)){_8b(e.keyCode==48?9:e.keyCode-49,_dc,_da);}else{if(e.ctrlKey&&e.keyCode==32){_8b(0,_dc,_da);}}if(!e.ctrlKey&&(e.keyCode==13||e.keyCode==10)){_8b(0,_dc,_da);}setTimeout(function(){abego.IntelliTagger.assistTagging(_dc,_da);},100);return false;};_81(_dc);}};var _e0=function(e){if(!e){var e=window.event;}var _e3=resolveTarget(e);var _e4=_e3.getAttribute("tiddler");if(_e4){story.displayTiddler(_e3,_e4,"IntelliTaggerEditTagsTemplate",false);_d0(_e4);}return false;};var _e5=config.macros.tags.handler;config.macros.tags.handler=function(_e6,_e7,_e8,_e9,_ea,_eb){_e5.apply(this,arguments);abego.IntelliTagger.createEditTagsButton(_eb,createTiddlyElement(_e6.lastChild,"li"));};var _ec=function(){if(_71&&_72&&!abego.isDescendantOrSelf(document,_72)){abego.IntelliTagger.close();}};setInterval(_ec,100);abego.IntelliTagger.displayTagSuggestions=function(_ed,_ee,_ef,_f0,_f1){_74=_ed;_75=abego.toSet(_ee);_76=_ef;_72=_f0;_73=_f1;if(!_71){_71=createTiddlyElement(document.body,"div",null,"intelliTaggerSuggestions");_71.style.position="absolute";}_ac();abego.openAsPopup(_71);if(_77()){var w=_77().offsetWidth;if(_71.offsetWidth<w){_71.style.width=(w-2*(_6e+_6f))+"px";}abego.moveBelowAndClip(_71,_77());}else{abego.centerOnWindow(_71);}_c7();};abego.IntelliTagger.assistTagging=function(_f3,_f4){var _f5=_90(_f3);var s=_f3.value;if(_7d(_f3)){s=_7a(s);}var _f7=s.readBracketedList();var _f8=_f7.length>0?abego.filterStrings(abego.internal.getTagManager().getPartnerRankedTags(_f7),_f5,_70):_a0(_f5,_70);abego.IntelliTagger.displayTagSuggestions(_a9(_f5,_f7),_f7,_f8,_f3,function(tag,e){if(e.shiftKey){onClickTag.call(this,e);}else{_85(tag,_f3,_f4);}});};abego.IntelliTagger.close=function(){abego.closePopup(_71);_71=null;return false;};abego.IntelliTagger.createEditTagsButton=function(_fb,_fc,_fd,_fe,_ff,id,_101){if(!_fd){_fd="[edit]";}if(!_fe){_fe="Edit the tags";}if(!_ff){_ff="editTags";}var _102=createTiddlyButton(_fc,_fd,_fe,_e0,_ff,id,_101);_102.setAttribute("tiddler",(_fb instanceof Tiddler)?_fb.title:String(_fb));return _102;};abego.IntelliTagger.getSuggestionTagsMaxCount=function(){return 100;};config.macros.intelliTagger={label:"intelliTagger",handler:function(_103,_104,_105,_106,_107,_108){var _109=_107.parseParams("list",null,true);var _10a=_109[0]["action"];for(var i=0;_10a&&i<_10a.length;i++){var _10c=_10a[i];var _10d=config.macros.intelliTagger.subhandlers[_10c];if(!_10d){abego.alertAndThrow("Unsupported action '%0'".format([_10c]));}_10d(_103,_104,_105,_106,_107,_108);}},subhandlers:{showTags:function(_10e,_10f,_110,_111,_112,_113){_b4(_10e,_74,_76?_76.length:0,_76,abego.IntelliTagger.getSuggestionTagsMaxCount());},showFavorites:function(_114,_115,_116,_117,_118,_119){_b4(_114,_76,0);},closeButton:function(_11a,_11b,_11c,_11d,_11e,_11f){var _120=createTiddlyButton(_11a,"close","Close the suggestions",abego.IntelliTagger.close);},version:function(_121){var t="IntelliTagger %0.%1.%2".format([version.extensions.IntelliTaggerPlugin.major,version.extensions.IntelliTaggerPlugin.minor,version.extensions.IntelliTaggerPlugin.revision]);var e=createTiddlyElement(_121,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";},copyright:function(_124){var e=createTiddlyElement(_124,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">© 2006-2007 <b><font color=\s"red\s">abego</font></b> Software<font>";}}};})();config.shadowTiddlers["IntelliTaggerStyleSheet"]="/***\sn"+"!~IntelliTagger Stylesheet\sn"+"***/\sn"+"/*{{{*/\sn"+".intelliTaggerSuggestions {\sn"+"\stposition: absolute;\sn"+"\stwidth: 600px;\sn"+"\sn"+"\stpadding: 2px;\sn"+"\stlist-style: none;\sn"+"\stmargin: 0;\sn"+"\sn"+"\stbackground: #eeeeee;\sn"+"\stborder: 1px solid DarkGray;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .currentTag {\sn"+"\stfont-weight: bold;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .suggestionNumber {\sn"+"\stcolor: #808080;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .numberedSuggestion{\sn"+"\stwhite-space: nowrap;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter {\sn"+"\stmargin-top: 4px;\sn"+"\stborder-top-width: thin;\sn"+"\stborder-top-style: solid;\sn"+"\stborder-top-color: #999999;\sn"+"}\sn"+".intelliTaggerSuggestions .favorites {\sn"+"\stborder-bottom-width: thin;\sn"+"\stborder-bottom-style: solid;\sn"+"\stborder-bottom-color: #999999;\sn"+"\stpadding-bottom: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .normalTags {\sn"+"\stpadding-top: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter .button {\sn"+"\stfont-size: 10px;\sn"+"\sn"+"\stpadding-left: 0.3em;\sn"+"\stpadding-right: 0.3em;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn";config.shadowTiddlers["IntelliTaggerMainTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class=\s"favorites\s" macro=\s"intelliTagger action: showFavorites\s"></div>\sn"+"<div class=\s"normalTags\s" macro=\s"intelliTagger action: showTags\s"></div>\sn"+"<!-- The Footer (with the Navigation) ============================================ -->\sn"+"<table class=\s"intelliTaggerFooter\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\st<span macro=\s"intelliTagger action: closeButton\s"></span>\sn"+"\st</td>\sn"+"\st<td align=\s"right\s">\sn"+"\st\st<span macro=\s"intelliTagger action: version\s"></span>, <span macro=\s"intelliTagger action: copyright \s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["IntelliTaggerEditTagsTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='title' macro='view title'></div>\sn"+"<div class='tagged' macro='tags'></div>\sn"+"<div class='viewer' macro='view text wikified'></div>\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["BSD open source license (abego Software)"]="See [[Licence|http://tiddlywiki.abego-software.de/#[[BSD open source license]]]].";config.shadowTiddlers["IntelliTaggerPlugin Documentation"]="[[Documentation on abego Software website|http://tiddlywiki.abego-software.de/doc/IntelliTagger.pdf]].";config.shadowTiddlers["IntelliTaggerPlugin SourceCode"]="[[Plugin source code on abego Software website|http://tiddlywiki.abego-software.de/archive/IntelliTaggerPlugin/Plugin-IntelliTagger-src.1.0.2.js]]\sn";(function(){var _126=restart;restart=function(){setStylesheet(store.getTiddlerText("IntelliTaggerStyleSheet"),"IntelliTaggerStyleSheet");_126.apply(this,arguments);};})();}\n// %/\n
/***\n|''Name:''|IntelliTagsEditCommandPlugin|\n|''Version:''|1.0.0 (2007-10-03)|\n|''Type:''|plugin|\n|''Description:''|A command for your tiddler's toolbar to directly edit the tiddler's tags using the IntelliTaggerPlugin, without switching to "edit mode".|\n|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTagsEditCommandPlugin|\n|''Requires:''|IntelliTaggerPlugin http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)]]|\n|''~CoreVersion:''|2.0.8|\n|''Browser:''|Firefox 1.5.0.2 or better|\n***/\n/***\n!Using the "IntelliTagsEditCommandPlugin"\nAdd the command {{{intelliTagsEdit}}} into the 'macro' attribute of the 'toolbar' {{{<div...>}}} in your ViewTemplate.\n\n''Example:''\n{{{\n<div class='toolbar' \n macro='toolbar -closeTiddler closeOthers +editTiddler intelliTagsEdit permalink references jump'>\n</div>\n}}}\n\nThis adds a "tags" button to the toolbar of the tiddlers (next to the ''edit'' button). Pressing the "tags" button will open the input field for the tiddler's tags and let you edit the tags with all the [[IntelliTaggerPlugin|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin]] features.\n***/\n/***\n!Source Code\n***/\n//{{{\n(function(){\n\nif (!version.extensions.IntelliTaggerPlugin)\n throw Error("IntelliTagsEditCommandPlugin requires the IntelliTaggerPlugin (http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin)");\n\nif (config.commands.intelliTagsEdit) \n return;\n\nconfig.commands.intelliTagsEdit = {\n text: "tags",\n tooltip: "edit the tags"\n};\n\nconfig.commands.intelliTagsEdit.handler = function(event,src,title) {\n var button = abego.IntelliTagger.createEditTagsButton(title, null, "tags", "edit the tags");\n button.onclick(event);\n return false;\n};\n\n})();\n//}}}\n
Nov 2007"
[[Welcome]]\n[[Alphabetical list]]\n[[Tag list]]\n[[Preferred Terms|preferred]]\n[[Orphan Terms]]\n<<tiddler PopupTiddlersByAuthor with: "adcockm">>\n<<tiddler PopupTiddlersByAuthor with: "timshock">>\n<<tiddler PopupTiddlersByAuthor with: "suthes">>
A catalog of 110 relatively bright deep sky objects (galaxies, nebulae, and star clusters; the list of objects was compiled by French astronomer Charles Messier during the late 18th century.
A Messier marathon is an attempt, usually organized by amateur astronomers, to find as many Messier objects as possible during one night.
/***\n|''Name:''|Minesweeper|\n|''Version:''|0.72 (12 Oct 2005)|\n|''Source:''|Tiddly W;nks (http://www.bur.st/~blazeoz/tiddlywinks/)|\n|''Author:''|[[Daniel Baird]]|\n|''Type:''|Macro|\n!Description\nIt's minesweeper!\n\n!Syntax/Example usage\n{{{<<minesweeper>>}}} or {{{<<minesweeper [width] [height] [bombs]>>}}}\n<<minesweeper>>\n\n!Notes\n* Let me know if you want graphics, or that MSWindows Minesweeper thing where you can click with both buttons on a numbered square, and it does the thinking for you..\n\n!Revision History\n* 0.5.0 (2-Oct-05)\n** original version (Daniel)\n* 0.5.1 (3-Oct-05)\n** added the css styles via set~StyleSheet (Simon)\n* 0.5.2 (3-Oct-05)\n** added parameters to macro and fixed bug preventing detection of win (Simon)\n* 0.6 (5-Oct-05)\n** Fixed the problem with multiple games on screen at once.\n** Cleaned up the JavaScript warning generated when you clicked anywhere but on a square.\n* 0.7 (6-Oct-05)\n** Integrated sweet additions from Genesis_mage (genisis329 at gmail dot com) that:\n*** allows winning by having all non-mines clicked (without having to mark every mine)\n*** added a mark button to mark and unmark mines without the keyboard\n** Win time now shows tenths of a second.\n* 0.71 (10-Oct-05)\n** tweaked a style to make the mark button work better in IE\n* 0.72 (12-Oct-05)\n** worked out how to use a closure as a event handler, which means that the code added in 0.6 could be made a lot simpler.\n\n***/\n/*{{{*/\n\nversion.extensions.minesweeper = {major: 0, minor: 7, revision: 2};\n\nconfig.macros.minesweeper = {};\n\nconfig.macros.minesweeper.handler = function(place,macroName,params) {\n var width = params[0];\n var height = params[1];\n var bombs = params[2];\n\n if (width == undefined) width = 9;\n if (height == undefined) height = width;\n if (bombs == undefined) bombs = Math.round(width * height / 8)\n if (bombs > width * height) bombs = width * height;\n\n var aGame = new MinesweeperGame();\n\n createTiddlyElement(place,'div',aGame.id,null,'If you see this, Minesweeper is broken. Let Daniel know (DanielBaird at gmail dot com).');\n aGame.newGame(width, height, bombs);\n}\n// =======================================================================\nfunction MinesweeperGame() {\n this.idprefix = 'mines';\n this.version = '0.72 beta';\n this.id = this.idprefix + MinesweeperGame.prototype.nextid;\n MinesweeperGame.prototype.nextid++;\n return this;\n}\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.nextid = 0;\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.newGame = function(height, width, mines) {\n this.height = height;\n this.width = width;\n this.mines = mines;\n this.total = height * width;\n this.markMode = false;\n\n this.startGame();\n}\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.startGame = function() {\n\n this.gamestate = 'ready';\n this.clicks = 0;\n this.marks = 0;\n this.message = 'click on the board to begin';\n\n this.starttime = null;\n this.wintime = null;\n this.board = new Array();\n\n // create the squares\n for (var x = 0; x < this.height; x++) {\n var row = new Array();\n for (var y = 0; y < this.width; y++) {\n row.push( {count: 0, mine: false, clicked: false, marked: false} );\n }\n this.board.push(row);\n }\n\n // add mines\n for (var m = 0; m < this.mines; m++) {\n var mx = Math.round((this.height-1)*Math.random());\n var my = Math.round((this.width-1)*Math.random());\n if (this.board[mx][my].mine) {\n m--;\n } else {\n this.board[mx][my].mine = true;\n }\n }\n\n // work out counts\n for (var cx = 0; cx < this.height; cx++) {\n for (var cy = 0; cy < this.width; cy++) {\n var count = 0;\n for (var dx = -1; dx < 2; dx++) {\n for (var dy = -1; dy < 2; dy++) {\n var nx = cx + dx;\n var ny = cy + dy;\n if ( (!(dx==0 && dy==0))\n && (nx >= 0) && (nx < this.height)\n && (ny >= 0) && (ny < this.width)\n && this.board[nx][ny].mine) {\n count++;\n }\n }\n }\n this.board[cx][cy].count = count;\n }\n }\n this.showBoard();\n}\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.showBoard = function() {\n var node = document.getElementById(this.id);\n var html = new Array();\n html.push('<table class="minefield" cellspacing="2">');\n html.push('<tr><td class="info" colspan="'+this.width+'">');\n html.push('Minesweeper '+this.version+'<br /><b>'+this.gamestate+'</b>');\n if (this.gamestate == 'playing') {\n this.message = (this.mines - this.marks)+' mines unmarked';\n }\n html.push('</td></tr>');\n for (var x = 0; x < this.height; x++) {\n html.push('<tr>');\n for (var y = 0; y < this.width; y++) {\n html.push( this.makeSquare(x,y) );\n }\n html.push('</tr>');\n }\n var cls = 'un';\n if (this.markMode) cls = '';\n html.push('<tr><td id="'+this.id+'_markbtn" class="'+cls+'clicked widebtn" colspan="'+this.width+'">mark / unmark mines</td></tr>');\n html.push('<tr><td class="info" colspan="'+this.width+'">'+this.message);\n html.push('<small>');\n html.push('<br /><span class="minesweeper' + cls + 'show">ctrl- shift- or alt-</span>click to reveal a square');\n html.push('<br /><span class="minesweeper' + cls + 'hide">ctrl- shift- or alt-</span>click to mark a mine');\n html.push('</small>');\n html.push('</td></tr>');\n html.push('</table>');\n node.innerHTML = html.join('');\n node.onclick = this.getClickHandler();\n}\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.makeSquare = function(x,y) {\n var sq = this.board[x][y];\n var reveal = (this.gamestate != 'playing' && this.gamestate != 'ready');\n var html = new Array();\n if (sq.clicked) {\n html.push('<td class="clicked" id="'+this.id+'_x-'+x+'_y-'+y+'">');\n if (!sq.marked && reveal && sq.mine) {\n html.push('B!');\n } else if (!sq.marked && reveal && sq.mine) {\n html.push('B!');\n } else if (sq.count > 0){\n html.push(sq.count);\n } else {\n html.push(' ');\n }\n } else {\n html.push('<td class="unclicked" id="'+this.id+'_x-'+x+'_y-'+y+'">');\n if (sq.marked && !reveal) {\n html.push('B?');\n } else if (sq.marked && sq.mine && reveal) {\n html.push('B');\n } else if (sq.marked && !sq.mine && reveal) {\n html.push('X');\n } else if (sq.mine && reveal) {\n html.push('B!');\n } else {\n html.push(' ');\n }\n }\n html.push('</td>');\n return html.join('');\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.clickSquare = function(cx,cy,modifier) {\n if (this.gamestate == 'ready') {\n this.starttime = new Date();\n this.gamestate = 'playing';\n }\n if (this.gamestate == 'playing') {\n if (!this.board[cx][cy].clicked) {\n if ( (modifier && !this.markMode) || (!modifier && this.markMode) ) {\n if (this.board[cx][cy].marked) {\n this.marks--;\n this.board[cx][cy].marked = false;\n } else {\n this.marks++;\n this.board[cx][cy].marked = true;\n }\n } else if (!this.board[cx][cy].clicked && !this.board[cx][cy].marked) {\n this.revealSquare(cx,cy);\n }\n this.markMode = false;\n }\n this.checkWin();\n this.showBoard();\n } else {\n // clicked when we're not playing..\n this.startGame();\n }\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.revealSquare = function(x,y) {\n if (this.board[x][y].clicked == false && this.board[x][y].marked == false) {\n this.board[x][y].clicked = true;\n this.clicks++;\n if (this.board[x][y].mine) {\n this.gamestate = 'boom!';\n this.message = 'click board to play again';\n } else if (this.board[x][y].count == 0) {\n // if it's a zero, we might have to reveal some other squares..\n for (var dx = -1; dx < 2; dx++) {\n for (var dy = -1; dy < 2; dy++) {\n var nx = x + dx;\n var ny = y + dy;\n if ( (!(dx==0 && dy==0)) && (nx >= 0) && (nx < this.height) && (ny >= 0) && (ny < this.width) ) {\n this.revealSquare(nx,ny);\n }\n }\n }\n }\n }\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.handleClick = function(e) {\n // work out which cell was clicked\n if (!e) var e = window.event;\n var str = resolveTarget(e).id;\n if (str && str != undefined) {\n if (str == this.id + '_markbtn') {\n this.markMode = !this.markMode;\n this.showBoard();\n } else {\n var cx = parseInt(str.substr( str.indexOf('x-')+2 ));\n var cy = parseInt(str.substr( str.indexOf('y-')+2 ));\n if ( !isNaN(cx) && !isNaN(cy) ) {\n this.clickSquare(cx,cy,(e.altKey || e.shiftKey || e.ctrlKey));\n }\n }\n }\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.getClickHandler = function() {\n var thisGame = this;\n return function(e) {\n thisGame.handleClick(e);\n }\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.checkWin = function() {\n if (this.clicks == this.total - this.mines && this.gamestate !='boom!') {\n this.gamestate = 'win';\n this.wintime = new Date();\n this.message = 'You won in '+Math.round(((this.wintime - this.starttime)/100))/10+' seconds';\n this.message = this.message + '<br />click board to play again';\n }\n}\n// -----------------------------------------------------------------------\n\nsetStylesheet(\n ".viewer .minefield { "+\n "background: #ddd; "+\n "border: double 3px black; "+\n "border-collapse: separate; "+\n "border-spacing: 2px; "+\n "} \sn"+\n\n ".viewer .minefield td { "+\n "cursor: default; "+\n "width: 1.3em; "+\n "height: 1.1em; "+\n "text-align: center; "+\n "vertical-align: center; "+\n "background: #ddd; "+\n "border: 1px solid #ccc; "+\n "} \sn"+\n\n ".viewer .minefield td.info, .viewer .minefield td.widebtn { "+\n "width: auto; "+\n "} \sn"+\n\n ".minesweeperhide, .minesweeperunshow { "+\n "display: none; "+\n "} \sn"+\n\n ".viewer .minefield td.unclicked { "+\n "cursor: pointer; "+\n "border-color: #fff; "+\n "border-right-color: #999; "+\n "border-bottom-color: #999; "+\n "} \sn"+\n "",\n "MinesweeperGame");\n\n/*}}}*/
Nov 2007"
/***\n|Name|NestedSlidersPlugin|\n|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|\n|Version|2.3.1|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|Slider.prototype.stop|\n|Description|show content in nest-able 'slider' or 'floating' panels, without needing to create separate tiddlers for each panel|\n\n!!!!!Configuration\n<<<\nEnable animation for slider panels\n<<option chkFloatingSlidersAnimate>> allow sliders to animate when opening/closing\n>(note: This setting is in //addition// to the general option for enabling/disabling animation effects:\n><<option chkAnimate>> enable animations (entire document)\n>For slider animation to occur, you must also allow animation in general.\n\nDebugging messages for 'lazy sliders' deferred rendering:\n<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering\n<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered\n<<<\n!!!!!Usage\n<<<\nWhen installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.\n\nAdditional optional syntax elements let you specify\n*default to open\n*cookiename\n*heading level\n*floater (with optional CSS width value)\n*transient display (clicking elsewhere closes panel)\n*custom class/label/tooltip/accesskey\n*alternate label/tooltip (displayed when panel is open)\n*panelID (for later use with {{{<<DOM>>}}} macro. See [[DOMTweaksPlugin]])\n*automatic blockquote style on panel\n*deferred rendering of panel content\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip][altlabel|alttooltip]}}}#panelID:>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}<br>marks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.\n* {{{(cookiename)}}}<br>saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.\n* {{{!}}} through {{{!!!!!}}}<br>displays the slider label using a formatted headline (Hn) style instead of a button/link style\n* {{{^width^}}} (or just {{{^}}})<br>makes the slider 'float' on top of other content rather than shifting that content downward. 'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.). If omitted, the default width is "auto" (i.e., fit to content)\n* {{{"*"}}} //(without the quotes)//<br>denotes "transient display": when a click occurs elsewhere in the document, the slider/floating panel will be automatically closed. This is useful for creating 'pulldown menus' that automatically go away after they are used.\n* """{{class{[label=key|tooltip][altlabel|alttooltip]}}}"""<br>uses label/tooltip/accesskey. """{{class{...}}}""", """=key""", """|tooltip""" and """[altlabel|alttooltip]""" are optional. 'class' is any valid CSS class name, used to style the slider label text. 'key' must be a ''single letter only''. altlabel/alttooltip specifiy alternative label/tooltip for use when slider/floating panel is displayed.\n* {{{#panelID:}}}<br>defines a unique DOM element ID that is assigned to the panel element used to display the slider content. This ID can then be used later to reposition the panel using the {{{<<DOM move id>>}}} macro (see [[DOMTweaksPlugin]]), or to access/modify the panel element through use of {{{document.getElementById(...)}}}) javascript code in a plugin or inline script.\n* {{{">"}}} //(without the quotes)//<br>automatically adds blockquote formatting to slider content\n* {{{"..."}}} //(without the quotes)//<br>defers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//\n\n//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//\n<<<\n!!!!!Examples\n<<<\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, cookie, heading, sized floater, transient, class, label/tooltip/key, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n}}}\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++[get info...=I|click for information or press Alt-I]\n put some general information here,\n plus a floating panel with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could in turn contain a transient panel,\n perhaps with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++[get info...=I|click for information or press Alt-I]\n put some general information here,\n plus a floating panel with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could in turn contain a transient panel,\n perhaps with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.07.26 - 2.3.1'' in document.onclick(), propagate return value from hijacked core click handler to consume OR bubble up click as needed. Fixes "IE click disease", whereby nearly every mouse click causes a page transition.\n''2007.07.20 - 2.3.0'' added syntax for setting panel ID (#panelID:). This allows individual slider panels to be repositioned within tiddler content simply by giving them a unique ID and then moving them to the desired location using the {{{<<DOM move id>>}}} macro.\n''2007.07.19 - 2.2.0'' added syntax for alttext and alttip (button label and tooltip to be displayed when panel is open)\n''2007.07.14 - 2.1.2'' corrected use of 'transient' attribute in IE to prevent (non-recursive) infinite loop\n''2007.07.12 - 2.1.0'' replaced use of "*" for 'open/close on rollover' (which didn't work too well). "*" now indicates 'transient' panels that are automatically closed if a click occurs somewhere else in the document. This permits use of nested sliders to create nested "pulldown menus" that automatically disappear after interaction with them has been completed. Also, in onClickNestedSlider(), use "theTarget.sliderCookie", instead of "this.sliderCookie" to correct cookie state tracking when automatically dismissing transient panels.\n''2007.06.10 - 2.0.5'' add check to ensure that window.adjustSliderPanel() is defined before calling it (prevents error on shutdown when mouse event handlers are still defined)\n''2007.05.31 - 2.0.4'' add handling to invoke adjustSliderPanel() for onmouseover events on slider button and panel. This allows the panel position to be re-synced when the button position shifts due to changes in unrelated content above it on the page. (thanks to Harsha for bug report)\n''2007.03.30 - 2.0.3'' added chkFloatingSlidersAnimate (default to FALSE), so that slider animation can be disabled independent of the overall document animation setting (avoids strange rendering and focus problems in floating panels)\n''2007.03.01 - 2.0.2'' for TW2.2+, hijack Morpher.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends\n''2007.03.01 - 2.0.1'' in hijack for Slider.prototype.stop, use apply() to pass params to core function\n|please see [[NestedSlidersPluginHistory]] for additional revision details|\n''2005.11.03 - 1.0.0'' initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.nestedSliders = {major: 2, minor: 3, revision: 1, date: new Date(2007,7,26)};\n//}}}\n\n//{{{\n// options for deferred rendering of sliders that are not initially displayed\nif (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;\nif (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;\nif (config.options.chkFloatingSlidersAnimate==undefined) config.options.chkFloatingSlidersAnimate=false;\n\n// default styles for 'floating' class\nsetStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \s\n background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s^(?:[^\s\s^\s\s*\s\s[\s\s>]*\s\s^)?)?(\s\s*)?(?:\s\s{\s\s{([\s\sw]+[\s\ss\s\sw]*)\s\s{)?(\s\s[[^\s\s]]*\s\s])?(\s\s[[^\s\s]]*\s\s])?(?:\s\s}{3})?(\s\s#[^:]*\s\s:)?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // var defopen=lookaheadMatch[1]\n // var cookiename=lookaheadMatch[2]\n // var header=lookaheadMatch[3]\n // var panelwidth=lookaheadMatch[4]\n // var transient=lookaheadMatch[5]\n // var class=lookaheadMatch[6]\n // var label=lookaheadMatch[7]\n // var openlabel=lookaheadMatch[8]\n // var panelID=lookaheadMatch[9]\n // var blockquote=lookaheadMatch[10]\n // var deferred=lookaheadMatch[11]\n\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie, no accesskey, no alternate text/tip\n var show="none"; var cookie=""; var key="";\n var closedtext=">"; var closedtip="";\n var openedtext="<"; var openedtip="";\n\n // extra "+", default to open\n if (lookaheadMatch[1]) show="block";\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().slice(1,-1);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n show=config.options[cookie]?"block":"none";\n }\n\n // parse label/tooltip/accesskey: [label=X|tooltip]\n if (lookaheadMatch[7]) {\n var parts=lookaheadMatch[7].trim().slice(1,-1).split("|");\n closedtext=parts.shift();\n if (closedtext.substr(closedtext.length-2,1)=="=") \n { key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }\n openedtext=closedtext;\n if (parts.length) closedtip=openedtip=parts.join("|");\n else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }\n }\n\n // parse alternate label/tooltip: [label|tooltip]\n if (lookaheadMatch[8]) {\n var parts=lookaheadMatch[8].trim().slice(1,-1).split("|");\n openedtext=parts.shift();\n if (parts.length) openedtip=parts.join("|");\n else openedtip="hide "+openedtext;\n }\n\n var title=show=='block'?openedtext:closedtext;\n var tooltip=show=='block'?openedtip:closedtip;\n\n // create the button\n if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);\n btn.onclick=onClickNestedSlider;\n btn.setAttribute("href","javascript:;");\n btn.setAttribute("title",tooltip);\n }\n else\n var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);\n btn.innerHTML=title; // enables use of HTML entities in label\n\n // set extra button attributes\n btn.setAttribute("closedtext",closedtext);\n btn.setAttribute("closedtip",closedtip);\n btn.setAttribute("openedtext",openedtext);\n btn.setAttribute("openedtip",openedtip);\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\n btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)\n btn.keyparam=key; // save the access key letter ("" if none)\n if (key.length) {\n btn.setAttribute("accessKey",key); // init access key\n btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus\n }\n btn.onmouseover=function(event) // mouseover on button aligns floater position with button\n { if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel,this.sliderPanel.className); }\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panelID=lookaheadMatch[9]; if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters\n var panel=createTiddlyElement(place,"div",panelID,panelClass,null);\n panel.button = btn; // so the slider panel know which button it belongs to\n btn.sliderPanel=panel; // so the button knows which slider panel it belongs to\n panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):"";\n panel.setAttribute("transient",lookaheadMatch[5]=="*"?"true":"false");\n panel.style.display = show;\n panel.style.width=panel.defaultPanelWidth;\n panel.onmouseover=function(event) // mouseover on panel aligns floater position with button\n { if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this,this.className); }\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[11]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[10]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align floater position with button\n if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel,panelClass);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[10]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nwindow.onClickNestedSlider=function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel = theTarget.firstChild.data;\n var theSlider = theTarget.sliderPanel\n var isOpen = theSlider.style.display!="none";\n\n // toggle label\n theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");\n // toggle tooltip\n theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));\n\n // deferred rendering (if needed)\n if (theSlider.getAttribute("rendered")=="false") {\n if (config.options.chkDebugLazySliderRender)\n alert("rendering '"+theLabel+"':\sn\sn"+theSlider.getAttribute("raw"));\n var place=theSlider;\n if (theSlider.getAttribute("blockquote")=="true")\n place=createTiddlyElement(place,"blockquote");\n wikify(theSlider.getAttribute("raw"),place);\n theSlider.setAttribute("rendered","true");\n }\n // show/hide the slider\n if(config.options.chkAnimate && (theSlider.className!='floatingPanel' || config.options.chkFloatingSlidersAnimate))\n anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n theSlider.style.display = isOpen ? "none" : "block";\n // reset to default width (might have been changed via plugin code)\n theSlider.style.width=theSlider.defaultPanelWidth;\n // align floater panel position with target button\n if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\n // if showing panel, set focus to first 'focus-able' element in panel\n if (theSlider.style.display!="none") {\n var ctrls=theSlider.getElementsByTagName("*");\n for (var c=0; c<ctrls.length; c++) {\n var t=ctrls[c].tagName.toLowerCase();\n if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")\n { ctrls[c].focus(); break; }\n }\n }\n var cookie=theTarget.sliderCookie;\n if (cookie && cookie.length) {\n config.options[cookie]=!isOpen;\n if (config.options[cookie]!=theTarget.defOpen)\n saveOptionCookie(cookie);\n else { // remove cookie if slider is in default display state\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();\n }\n }\n return false;\n}\n//}}}\n\n//{{{\n// click in document background closes transient panels \ndocument.nestedSliders_savedOnClick=document.onclick;\ndocument.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);\n // call original click handler\n if (document.nestedSliders_savedOnClick)\n var retval=document.nestedSliders_savedOnClick.apply(this,arguments);\n // if click was inside transient panel (or something contained by a transient panel)... leave it alone\n var p=target;\n while (p)\n if ((p.className=="floatingPanel"||p.className=="sliderPanel")&&p.getAttribute("transient")=="true") break;\n else p=p.parentNode;\n if (p) return retval;\n // otherwise, find and close all transient panels...\n var all=document.all?document.all:document.getElementsByTagName("DIV");\n for (var i=0; i<all.length; i++) {\n // if it is not a transient panel, or the click was on the button that opened this panel, don't close it.\n if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;\n // otherwise, if the panel is currently visible, close it by clicking it's button\n if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button}) \n }\n return retval;\n};\n//}}}\n\n//{{{\n// adjust floating panel position based on button position\nif (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {\n if (panelClass=="floatingPanel") {\n var left=0;\n var top=btn.offsetHeight; \n if (place.style.position!="relative") {\n var left=findPosX(btn);\n var top=findPosY(btn)+btn.offsetHeight;\n var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;\n if (p) { left-=findPosX(p); top-=findPosY(p); }\n }\n if (findPosX(btn)+panel.offsetWidth > getWindowWidth()) // adjust position to stay inside right window edge\n left-=findPosX(btn)+panel.offsetWidth-getWindowWidth()+15; // add extra 15px 'fudge factor'\n panel.style.left=left+"px"; panel.style.top=top+"px";\n }\n}\n\nfunction getWindowWidth() {\n if(document.width!=undefined)\n return document.width; // moz (FF)\n if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )\n return document.documentElement.clientWidth; // IE6\n if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )\n return document.body.clientWidth; // IE4\n if(window.innerWidth!=undefined)\n return window.innerWidth; // IE - general\n return 0; // unknown\n}\n//}}}\n\n//{{{\n// TW2.1 and earlier:\n// hijack Slider animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function()\n { this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }\n\n// TW2.2+\n// hijack Morpher animation handler 'stop' handler so overflow is visible after animation has completed\nif (version.major+.1*version.minor+.01*version.revision>=2.2) {\n Morpher.prototype.coreStop = Morpher.prototype.stop;\n Morpher.prototype.stop = function()\n { this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }\n}\n//}}}
New General Catalogue (NGC) is the best-known catalogue of deep sky objects in amateur astronomy. It contains nearly 8,000 objects, known as the NGC objects.
/***\n| Name:|NewHerePlugin|\n| Description:|Creates the new here and new journal macros|\n| Version:|3.0 ($Rev: 1845 $)|\n| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\nmerge(config.macros, {\n newHere: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n },\n newJournalHere: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n }\n});\n\n//}}}\n\n
A type of reflecting telescope invented by the British scientist Sir Isaac Newton.
These terms are ''not'' marked [[preferred]], but also do ''not'' have a USE value (and are not [[proper_names]]).\nWe need to take care of all of these before we are done!\n\n<script>\nvar tids=store.reverseLookup("tags","excludeLists",false,"title");\nvar count = 0;\n\nfor (i=0;i<=tids.length-1;i++)\n{\n var tags=store.getValue(tids[i],"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n var skip = false;\n for (j=0;j<=list.length-1;j++)\n {\n if (list[j] == "preferred" || list[j] == "proper_names")\n {\n skip = true;\n }\n }\n var use=store.getValue(tids[i],"use");\n if (!use && !skip)\n {\n count++;\n }\n }\n}\nwikify("<br/>Total found: "+count+"<br/><br/>",place);\n\nfor (i=0;i<=tids.length-1;i++)\n{\n var tags=store.getValue(tids[i],"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n var skip = false;\n for (j=0;j<=list.length-1;j++)\n {\n if (list[j] == "preferred" || list[j] == "proper_names")\n {\n skip = true;\n }\n }\n var use=store.getValue(tids[i],"use");\n if (!use && !skip)\n {\n var text="[["+tids[i].title + "]]<br/>";\n wikify(text,place);\n }\n }\n}\n\n</script>
<!--{{{-->\n\n<div id='topMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->
/***\n|<html><a name="Top"/></html>''Name:''|PartTiddlerPlugin|\n|''Version:''|1.0.9 (2007-07-14)|\n|''Source:''|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.3|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Table of Content<html><a name="TOC"/></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Description',null, event)">Description, Syntax</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Applications',null, event)">Applications</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('LongTiddler',null, event)">Refering to Paragraphs of a Longer Tiddler</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Citation',null, event)">Citation Index</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('TableCells',null, event)">Creating "multi-line" Table Cells</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Tabs',null, event)">Creating Tabs</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Sliders',null, event)">Using Sliders</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Revisions',null, event)">Revision History</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Code',null, event)">Code</a></html>\n!Description<html><a name="Description"/></html>\nWith the {{{<part aPartName> ... </part>}}} feature you can structure your tiddler text into separate (named) parts. \nEach part can be referenced as a "normal" tiddler, using the "//tiddlerName//''/''//partName//" syntax (e.g. "About/Features"). E.g. you may create links to the parts (e.g. {{{[[Quotes/BAX95]]}}} or {{{[[Hobbies|AboutMe/Hobbies]]}}}), use it in {{{<<tiddler...>>}}} or {{{<<tabs...>>}}} macros etc.\n\n\n''Syntax:'' \n|>|''<part'' //partName// [''hidden''] ''>'' //any tiddler content// ''</part>''|\n|//partName//|The name of the part. You may reference a part tiddler with the combined tiddler name "//nameOfContainerTidder//''/''//partName//. <<br>>If you use a partName containing spaces you need to quote it (e.g. {{{"Major Overview"}}} or {{{[[Shortcut List]]}}}).|\n|''hidden''|When defined the content of the part is not displayed in the container tiddler. But when the part is explicitly referenced (e.g. in a {{{<<tiddler...>>}}} macro or in a link) the part's content is displayed.|\n|<html><i>any tiddler content</i></html>|<html>The content of the part.<br>A part can have any content that a "normal" tiddler may have, e.g. you may use all the formattings and macros defined.</html>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Applications<html><a name="Applications"/></html>\n!!Refering to Paragraphs of a Longer Tiddler<html><a name="LongTiddler"/></html>\nAssume you have written a long description in a tiddler and now you want to refer to the content of a certain paragraph in that tiddler (e.g. some definition.) Just wrap the text with a ''part'' block, give it a nice name, create a "pretty link" (like {{{[[Discussion Groups|Introduction/DiscussionGroups]]}}}) and you are done.\n\nNotice this complements the approach to first writing a lot of small tiddlers and combine these tiddlers to one larger tiddler in a second step (e.g. using the {{{<<tiddler...>>}}} macro). Using the ''part'' feature you can first write a "classic" (longer) text that can be read "from top to bottom" and later "reuse" parts of this text for some more "non-linear" reading.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Citation Index<html><a name="Citation"/></html>\nCreate a tiddler "Citations" that contains your "citations". \nWrap every citation with a part and a proper name. \n\n''Example''\n{{{\n<part BAX98>Baxter, Ira D. et al: //Clone Detection Using Abstract Syntax Trees.// \nin //Proc. ICSM//, 1998.</part>\n\n<part BEL02>Bellon, Stefan: //Vergleich von Techniken zur Erkennung duplizierten Quellcodes.// \nThesis, Uni Stuttgart, 2002.</part>\n\n<part DUC99>Ducasse, Stéfane et al: //A Language Independent Approach for Detecting Duplicated Code.// \nin //Proc. ICSM//, 1999.</part>\n}}}\n\nYou may now "cite" them just by using a pretty link like {{{[[Citations/BAX98]]}}} or even more pretty, like this {{{[[BAX98|Citations/BAX98]]}}}.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Creating "multi-line" Table Cells<html><a name="TableCells"/></html>\nYou may have noticed that it is hard to create table cells with "multi-line" content. E.g. if you want to create a bullet list inside a table cell you cannot just write the bullet list\n{{{\n* Item 1\n* Item 2\n* Item 3\n}}}\ninto a table cell (i.e. between the | ... | bars) because every bullet item must start in a new line but all cells of a table row must be in one line.\n\nUsing the ''part'' feature this problem can be solved. Just create a hidden part that contains the cells content and use a {{{<<tiddler >>}}} macro to include its content in the table's cell.\n\n''Example''\n{{{\n|!Subject|!Items|\n|subject1|<<tiddler ./Cell1>>|\n|subject2|<<tiddler ./Cell2>>|\n\n<part Cell1 hidden>\n* Item 1\n* Item 2\n* Item 3\n</part>\n...\n}}}\n\nNotice that inside the {{{<<tiddler ...>>}}} macro you may refer to the "current tiddler" using the ".".\n\nBTW: The same approach can be used to create bullet lists with items that contain more than one line.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Creating Tabs<html><a name="Tabs"/></html>\nThe build-in {{{<<tabs ...>>}}} macro requires that you defined an additional tiddler for every tab it displays. When you want to have "nested" tabs you need to define a tiddler for the "main tab" and one for every tab it contains. I.e. the definition of a set of tabs that is visually displayed at one place is distributed across multiple tiddlers.\n\nWith the ''part'' feature you can put the complete definition in one tiddler, making it easier to keep an overview and maintain the tab sets.\n\n''Example''\nThe standard tabs at the sidebar are defined by the following eight tiddlers:\n* SideBarTabs\n* TabAll\n* TabMore\n* TabMoreMissing\n* TabMoreOrphans\n* TabMoreShadowed\n* TabTags\n* TabTimeline\n\nInstead of these eight tiddlers one could define the following SideBarTabs tiddler that uses the ''part'' feature:\n{{{\n<<tabs txtMainTab \n Timeline Timeline SideBarTabs/Timeline \n All 'All tiddlers' SideBarTabs/All \n Tags 'All tags' SideBarTabs/Tags \n More 'More lists' SideBarTabs/More>>\n<part Timeline hidden><<timeline>></part>\n<part All hidden><<list all>></part>\n<part Tags hidden><<allTags>></part>\n<part More hidden><<tabs txtMoreTab \n Missing 'Missing tiddlers' SideBarTabs/Missing \n Orphans 'Orphaned tiddlers' SideBarTabs/Orphans \n Shadowed 'Shadowed tiddlers' SideBarTabs/Shadowed>></part>\n<part Missing hidden><<list missing>></part>\n<part Orphans hidden><<list orphans>></part>\n<part Shadowed hidden><<list shadowed>></part>\n}}}\n\nNotice that you can easily "overwrite" individual parts in separate tiddlers that have the full name of the part.\n\nE.g. if you don't like the classic timeline tab but only want to see the 100 most recent tiddlers you could create a tiddler "~SideBarTabs/Timeline" with the following content:\n{{{\n<<forEachTiddler \n sortBy 'tiddler.modified' descending \n write '(index < 100) ? "* [["+tiddler.title+"]]\sn":""'>>\n}}}\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Using Sliders<html><a name="Sliders"/></html>\nVery similar to the build-in {{{<<tabs ...>>}}} macro (see above) the {{{<<slider ...>>}}} macro requires that you defined an additional tiddler that holds the content "to be slid". You can avoid creating this extra tiddler by using the ''part'' feature\n\n''Example''\nIn a tiddler "About" we may use the slider to show some details that are documented in the tiddler's "Details" part.\n{{{\n...\n<<slider chkAboutDetails About/Details details "Click here to see more details">>\n<part Details hidden>\nTo give you a better overview ...\n</part>\n...\n}}}\n\nNotice that putting the content of the slider into the slider's tiddler also has an extra benefit: When you decide you need to edit the content of the slider you can just doubleclick the content, the tiddler opens for editing and you can directly start editing the content (in the part section). In the "old" approach you would doubleclick the tiddler, see that the slider is using tiddler X, have to look for the tiddler X and can finally open it for editing. So using the ''part'' approach results in a much short workflow.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Revision history<html><a name="Revisions"/></html>\n* v1.0.9 (2007-07-14)\n** Bugfix: Error when using the SideBarTabs example and switching between "More" and "Shadow". Thanks to cmari for reporting the issue.\n* v1.0.8 (2007-06-16)\n** Speeding up display of tiddlers containing multiple pard definitions. Thanks to Paco Rivière for reporting the issue.\n** Support "./partName" syntax inside <<tabs ...>> macro\n* v1.0.7 (2007-03-07)\n** Bugfix: <<tiddler "./partName">> does not always render correctly after a refresh (e.g. like it happens when using the "Include" plugin). Thanks to Morris Gray for reporting the bug.\n* v1.0.6 (2006-11-07)\n** Bugfix: cannot edit tiddler when UploadPlugin by Bidix is installed. Thanks to José Luis González Castro for reporting the bug.\n* v1.0.5 (2006-03-02)\n** Bugfix: Example with multi-line table cells does not work in IE6. Thanks to Paulo Soares for reporting the bug.\n* v1.0.4 (2006-02-28)\n** Bugfix: Shadow tiddlers cannot be edited (in TW 2.0.6). Thanks to Torsten Vanek for reporting the bug.\n* v1.0.3 (2006-02-26)\n** Adapt code to newly introduced Tiddler.prototype.isReadOnly() function (in TW 2.0.6). Thanks to Paulo Soares for reporting the problem.\n* v1.0.2 (2006-02-05)\n** Also allow other macros than the "tiddler" macro use the "." in the part reference (to refer to "this" tiddler)\n* v1.0.1 (2006-01-27)\n** Added Table of Content for plugin documentation. Thanks to RichCarrillo for suggesting.\n** Bugfix: newReminder plugin does not work when PartTiddler is installed. Thanks to PauloSoares for reporting.\n* v1.0.0 (2006-01-25)\n** initial version\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Code<html><a name="Code"/></html>\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n***/\n//{{{\n//============================================================================\n// PartTiddlerPlugin\n\n// Ensure that the PartTiddler Plugin is only installed once.\n//\nif (!version.extensions.PartTiddlerPlugin) {\n\n\n\nversion.extensions.PartTiddlerPlugin = {\n major: 1, minor: 0, revision: 9,\n date: new Date(2007, 6, 14), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#PartTiddlerPlugin"\n};\n\nif (!window.abego) window.abego = {};\nif (version.major < 2) alertAndThrow("PartTiddlerPlugin requires TiddlyWiki 2.0 or newer.");\n\n//============================================================================\n// Common Helpers\n\n// Looks for the next newline, starting at the index-th char of text. \n//\n// If there are only whitespaces between index and the newline \n// the index behind the newline is returned, \n// otherwise (or when no newline is found) index is returned.\n//\nvar skipEmptyEndOfLine = function(text, index) {\n var re = /(\sn|[^\ss])/g;\n re.lastIndex = index;\n var result = re.exec(text);\n return (result && text.charAt(result.index) == '\sn') \n ? result.index+1\n : index;\n}\n\n\n//============================================================================\n// Constants\n\nvar partEndOrStartTagRE = /(<\s/part>)|(<part(?:\ss+)((?:[^>])+)>)/mg;\nvar partEndTagREString = "<\s\s/part>";\nvar partEndTagString = "</part>";\n\n//============================================================================\n// Plugin Specific Helpers\n\n// Parse the parameters inside a <part ...> tag and return the result.\n//\n// @return [may be null] {partName: ..., isHidden: ...}\n//\nvar parseStartTagParams = function(paramText) {\n var params = paramText.readMacroParams();\n if (params.length == 0 || params[0].length == 0) return null;\n \n var name = params[0];\n var paramsIndex = 1;\n var hidden = false;\n if (paramsIndex < params.length) {\n hidden = params[paramsIndex] == "hidden";\n paramsIndex++;\n }\n \n return {\n partName: name, \n isHidden: hidden\n };\n}\n\n// Returns the match to the next (end or start) part tag in the text, \n// starting the search at startIndex.\n// \n// When no such tag is found null is returned, otherwise a "Match" is returned:\n// [0]: full match\n// [1]: matched "end" tag (or null when no end tag match)\n// [2]: matched "start" tag (or null when no start tag match)\n// [3]: content of start tag (or null if no start tag match)\n//\nvar findNextPartEndOrStartTagMatch = function(text, startIndex) {\n var re = new RegExp(partEndOrStartTagRE);\n re.lastIndex = startIndex;\n var match = re.exec(text);\n return match;\n}\n\n//============================================================================\n// Formatter\n\n// Process the <part ...> ... </part> starting at (w.source, w.matchStart) for formatting.\n//\n// @return true if a complete part section (including the end tag) could be processed, false otherwise.\n//\nvar handlePartSection = function(w) {\n var tagMatch = findNextPartEndOrStartTagMatch(w.source, w.matchStart);\n if (!tagMatch) return false;\n if (tagMatch.index != w.matchStart || !tagMatch[2]) return false;\n\n // Parse the start tag parameters\n var arguments = parseStartTagParams(tagMatch[3]);\n if (!arguments) return false;\n \n // Continue processing\n var startTagEndIndex = skipEmptyEndOfLine(w.source, tagMatch.index + tagMatch[0].length);\n var endMatch = findNextPartEndOrStartTagMatch(w.source, startTagEndIndex);\n if (endMatch && endMatch[1]) {\n if (!arguments.isHidden) {\n w.nextMatch = startTagEndIndex;\n w.subWikify(w.output,partEndTagREString);\n }\n w.nextMatch = skipEmptyEndOfLine(w.source, endMatch.index + endMatch[0].length);\n \n return true;\n }\n return false;\n}\n\nconfig.formatters.push( {\n name: "part",\n match: "<part\s\ss+[^>]+>",\n \n handler: function(w) {\n if (!handlePartSection(w)) {\n w.outputText(w.output,w.matchStart,w.matchStart+w.matchLength);\n }\n }\n} )\n\n//============================================================================\n// Extend "fetchTiddler" functionality to also recognize "part"s of tiddlers \n// as tiddlers.\n\nvar currentParent = null; // used for the "." parent (e.g. in the "tiddler" macro)\n\n// Return the match to the first <part ...> tag of the text that has the\n// requrest partName.\n//\n// @return [may be null]\n//\nvar findPartStartTagByName = function(text, partName) {\n var i = 0;\n \n while (true) {\n var tagMatch = findNextPartEndOrStartTagMatch(text, i);\n if (!tagMatch) return null;\n\n if (tagMatch[2]) {\n // Is start tag\n \n // Check the name\n var arguments = parseStartTagParams(tagMatch[3]);\n if (arguments && arguments.partName == partName) {\n return tagMatch;\n }\n }\n i = tagMatch.index+tagMatch[0].length;\n }\n}\n\n// Return the part "partName" of the given parentTiddler as a "readOnly" Tiddler \n// object, using fullName as the Tiddler's title. \n//\n// All remaining properties of the new Tiddler (tags etc.) are inherited from \n// the parentTiddler.\n// \n// @return [may be null]\n//\nvar getPart = function(parentTiddler, partName, fullName) {\n var text = parentTiddler.text;\n var startTag = findPartStartTagByName(text, partName);\n if (!startTag) return null;\n \n var endIndexOfStartTag = skipEmptyEndOfLine(text, startTag.index+startTag[0].length);\n var indexOfEndTag = text.indexOf(partEndTagString, endIndexOfStartTag);\n\n if (indexOfEndTag >= 0) {\n var partTiddlerText = text.substring(endIndexOfStartTag,indexOfEndTag);\n var partTiddler = new Tiddler();\n partTiddler.set(\n fullName,\n partTiddlerText,\n parentTiddler.modifier,\n parentTiddler.modified,\n parentTiddler.tags,\n parentTiddler.created);\n partTiddler.abegoIsPartTiddler = true;\n return partTiddler;\n }\n \n return null;\n}\n\n// Hijack the store.fetchTiddler to recognize the "part" addresses.\n//\nvar hijackFetchTiddler = function() {\n var oldFetchTiddler = store.fetchTiddler ;\n store.fetchTiddler = function(title) {\n var result = oldFetchTiddler.apply(this, arguments);\n if (!result && title) {\n var i = title.lastIndexOf('/');\n if (i > 0) {\n var parentName = title.substring(0, i);\n var partName = title.substring(i+1);\n var parent = (parentName == ".") \n ? store.resolveTiddler(currentParent)\n : oldFetchTiddler.apply(this, [parentName]);\n if (parent) {\n return getPart(parent, partName, parent.title+"/"+partName);\n }\n }\n }\n return result; \n };\n};\n\n// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. \n// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.\n// Otherwise hijack now.\nif (!store) {\n var oldRestartFunc = restart;\n window.restart = function() {\n hijackFetchTiddler();\n oldRestartFunc.apply(this,arguments);\n };\n} else\n hijackFetchTiddler();\n\n\n\n\n// The user must not edit a readOnly/partTiddler\n//\n\nconfig.commands.editTiddler.oldIsReadOnlyFunction = Tiddler.prototype.isReadOnly;\n\nTiddler.prototype.isReadOnly = function() {\n // Tiddler.isReadOnly was introduced with TW 2.0.6.\n // For older version we explicitly check the global readOnly flag\n if (config.commands.editTiddler.oldIsReadOnlyFunction) {\n if (config.commands.editTiddler.oldIsReadOnlyFunction.apply(this, arguments)) return true;\n } else {\n if (readOnly) return true;\n }\n\n return this.abegoIsPartTiddler;\n}\n\nconfig.commands.editTiddler.handler = function(event,src,title)\n{\n var t = store.getTiddler(title);\n // Edit the tiddler if it either is not a tiddler (but a shadowTiddler)\n // or the tiddler is not readOnly\n if(!t || !t.abegoIsPartTiddler)\n {\n clearMessage();\n story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(title,"text");\n return false;\n }\n}\n\n// To allow the "./partName" syntax in macros we need to hijack \n// the invokeMacro to define the "currentParent" while it is running.\n// \nvar oldInvokeMacro = window.invokeMacro;\nfunction myInvokeMacro(place,macro,params,wikifier,tiddler) {\n var oldCurrentParent = currentParent;\n if (tiddler) currentParent = tiddler;\n try {\n oldInvokeMacro.apply(this, arguments);\n } finally {\n currentParent = oldCurrentParent;\n }\n}\nwindow.invokeMacro = myInvokeMacro;\n\n// To correctly support the "./partName" syntax while refreshing we need to hijack \n// the config.refreshers.tiddlers to define the "currentParent" while it is running.\n// \n(function() {\n var oldTiddlerRefresher= config.refreshers.tiddler;\n config.refreshers.tiddler = function(e,changeList) {\n var oldCurrentParent = currentParent;\n try {\n currentParent = e.getAttribute("tiddler");\n return oldTiddlerRefresher.apply(this,arguments);\n } finally {\n currentParent = oldCurrentParent;\n }\n };\n})();\n\n// Support "./partName" syntax inside <<tabs ...>> macro\n(function() {\n var extendRelativeNames = function(e, title) {\n var nodes = e.getElementsByTagName("a");\n for(var i=0; i<nodes.length; i++) {\n var node = nodes[i];\n var s = node.getAttribute("content");\n if (s && s.indexOf("./") == 0)\n node.setAttribute("content",title+s.substr(1));\n }\n };\n var oldHandler = config.macros.tabs.handler;\n config.macros.tabs.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var result = oldHandler.apply(this,arguments);\n if (tiddler)\n extendRelativeNames(place, tiddler.title);\n return result;\n };\n})();\n\n// Scroll the anchor anchorName in the viewer of the given tiddler visible.\n// When no tiddler is defined use the tiddler of the target given event is used.\nwindow.scrollAnchorVisible = function(anchorName, tiddler, evt) {\n var tiddlerElem = null;\n if (tiddler) {\n tiddlerElem = document.getElementById(story.idPrefix + tiddler);\n }\n if (!tiddlerElem && evt) {\n var target = resolveTarget(evt);\n tiddlerElem = story.findContainingTiddler(target);\n }\n if (!tiddlerElem) return;\n\n var children = tiddlerElem.getElementsByTagName("a");\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n var name = child.getAttribute("name");\n if (name == anchorName) {\n var y = findPosY(child);\n window.scrollTo(0,y);\n return;\n }\n }\n}\n\n} // of "install only once"\n//}}}\n\n/***\n<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])\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 abego Software 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\n<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n***/\n
Nov 2007"
/%\n|Name|PopupTiddlersByAuthor|\n|Source|http://www.TiddlyTools.com/#PopupTiddlersByAuthor|\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|html|\n|Requires||\n|Overrides||\n|Description|create a popup list of tiddlers modified by a given author|\n\nusage: create a tiddler with title==authorname, containing "<<tiddler PopupTiddlersByAuthor>>"\n\n%/<html><a href="javascript:;" onclick="var who='$1'; var p=Popup.create(this); if (!p) return; createTiddlyText(p,'last 25 modified by '+who); createTiddlyElement(p,'hr'); var tids=store.getTiddlers('modified'); var countlimit=25; for (i=tids.length-1;i>=0;i--) if (tids[i].modifier==who && countlimit>0) { createTiddlyLink(p,tids[i].title,false).innerHTML=tids[i].modified.formatString('YY0MM0DD 0hh:0mm')+' '+tids[i].title; createTiddlyElement(p,'br'); countlimit--; } Popup.show(p,false); event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return(false);">$1</a></html>
/***\n| Name|QuickOpenTagPlugin|\n| Description|Changes tag links to make it easier to open tags as tiddlers|\n| Version|3.0.1 ($Rev: 2342 $)|\n| Date|$Date: 2007-07-05 10:57:49 +1000 (Thu, 05 Jul 2007) $|\n| Source|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\nconfig.quickOpenTag = {\n\n dropdownChar: (document.all ? "\su25bc" : "\su25be"), // the little one doesn't work in IE?\n\n createTagButton: function(place,tag,excludeTiddler) {\n // little hack so we can to <<tag PrettyTagName|RealTagName>>\n var splitTag = tag.split("|");\n var pretty = tag;\n if (splitTag.length == 2) {\n tag = splitTag[1];\n pretty = splitTag[0];\n }\n \n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyText(createTiddlyLink(sp,tag,false),pretty);\n \n var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if (excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n },\n\n miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n },\n\n allTagsHandler: function(place,macroName,params) {\n var tags = store.getTags(params[0]);\n var filter = params[1]; // new feature\n var ul = createTiddlyElement(place,"ul");\n if(tags.length == 0)\n createTiddlyElement(ul,"li",null,"listTitle",this.noTags);\n for(var t=0; t<tags.length; t++) {\n var title = tags[t][0];\n if (!filter || (title.match(new RegExp('^'+filter)))) {\n var info = getTiddlyLinkInfo(title);\n var theListItem =createTiddlyElement(ul,"li");\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n var theDropDownBtn = createTiddlyButton(theListItem," " +\n config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n }\n },\n\n // todo fix these up a bit\n styles: [\n"/*{{{*/",\n"/* created by QuickOpenTagPlugin */",\n".tagglyTagged .quickopentag, .tagged .quickopentag ",\n" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",\n".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",\n".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",\n"/* extra specificity to make it work right */",\n"#displayArea .viewer .quickopentag a.button, ",\n"#displayArea .viewer .quickopentag a.tiddyLink, ",\n"#mainMenu .quickopentag a.tiddyLink, ",\n"#mainMenu .quickopentag a.tiddyLink ",\n" { border:0px solid black; }",\n"#displayArea .viewer .quickopentag a.button, ",\n"#mainMenu .quickopentag a.button ",\n" { margin-left:0px; padding-left:2px; }",\n"#displayArea .viewer .quickopentag a.tiddlyLink, ",\n"#mainMenu .quickopentag a.tiddlyLink ",\n" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",\n"a.miniTag {font-size:150%;} ",\n"#mainMenu .quickopentag a.button ",\n" /* looks better in right justified main menus */",\n" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", \n"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",\n"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",\n"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",\n"/*}}}*/",\n ""].join("\sn"),\n\n init: function() {\n // we fully replace these builtins. can't hijack them easily\n window.createTagButton = this.createTagButton;\n config.macros.allTags.handler = this.allTagsHandler;\n config.macros.miniTag = { handler: this.miniTagHandler };\n config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;\n store.addNotification("QuickOpenTagStyles",refreshStyles);\n }\n}\n\nconfig.quickOpenTag.init();\n\n//}}}\n
/***\n|Name|RelatedTiddlersPlugin|\n|Source|http://www.TiddlyTools.com/#RelatedTiddlersPlugin|\n|Version|1.1.7|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|starting from a selected tiddler, display a list and/or tree of linked or transcluded tiddlers|\nGiven a starting tiddler (default is the current tiddler), this plugin recursively follows the internal links[] data that is associated with each tiddler and constructs a list of all tiddlers that are related to the starting tiddler by being referenced in a TiddlyLink (e.g., {{{[[TiddlerName]]}}}) or used as macro parameter (e.g., {{{<<tiddler TiddlerName>>}}}) within the tiddler content.\n\nUsing the terminology of Graph Theory, the plugin's recursive algorithm finds what is called a 'minimal spanning tree' from any specific starting 'root node'. The results can be displayed as a simple flat list of related tiddler titles, or as an indented tree diagram that shows the specific connections between the related tiddlers, and can be helpful for identifying clusters of interdependent tiddlers or simply generating an on-the-fly site map for quick discovery and navigation through complex or unfamiliar document content. \n!!!!!Usage\n<<<\n//{{{\n<<relatedTiddlers TiddlerName hideform "exclude list">>\n//}}}\nwhere:\n*TiddlerName (optional)<br>sets the initial "root" to the specified tiddler (and hides the 'select a tiddler' form controls). You can use keyword 'here' to specify the current tiddler.\n*'hideform' (optional) or 'showform' (default)<br>keyword value to suppress display of 'select tiddler' droplist and buttons.\n*"exclude list" (optional)<br>space-separated list of tiddlers whose links should not be followed. use quotes or double-square brackets to ensure list is processed as a single parameter\nThe plugin also defines two functions that can be called externally (from other plugins or scripts) to generate and retrieve either a list of links or a formatted "tree view":\n>{{{var list=config.macros.relatedTiddlers.getList(start,exclude,callback);}}}\n>{{{var tree=config.macros.relatedTiddlers.getTree(start,exclude,callback);}}}\nThese functions accept parameters to specify the starting tiddler, and a list of tiddlers to exclude, as well as an optional callback function that takes any specified tiddler as input and returns a custom-defined array of links related to that tiddler:\n>{{{var list=callback(tiddler);}}}\nUse of the callback function enables you to generate an alternative list/tree, based on application-specific data (such tiddler references contained in tags or custom fields), rather than using the default "links" list.\n<<<\n!!!!!Configuration\n<<<\n<<option chkRelatedTiddlersZoom>> enable autosizing of tree display //(aka, "zoom" or "shrink-and-grow")//\ndon't follow links contained in these tiddlers: <<option txtRelatedTiddlersExclude>>\n<<<\n!!!!!Examples\n<<<\n{{smallform{<<relatedTiddlers>>}}}\n\nUsing getList()/getTree() public API from other scripts/plugins:\n><script show>\n var start="About";\n var exclude=config.options.txtRelatedTiddlersExclude.readBracketedList();\n var callback=null;\n var list=config.macros.relatedTiddlers.getList(start,exclude,callback);\n var tree=config.macros.relatedTiddlers.getTree(start,exclude,callback);\n return "There are "+list.length+" tiddlers related to [["+start+"]]...\sn"+tree;\n</script>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\nRelatedTiddlersPlugin, InlineJavascriptPlugin, NestedSlidersPlugin, StyleSheetShortcuts\n<<<\n!!!!!Revision History\n<<<\n''2007.11.11 [1.1.7]'' in findRelatedTiddlers(), refactored code to get links from a given tiddler into separate getlinks() function, and added param for optional callback function that can be used to return an alternative set of links. Also added API functions, getTree() and getList() for external use by other scripts\n''2007.07.13 [1.1.6]'' performance optimizations, more code cleanup\n''2007.07.10 [1.1.5]'' extensive code cleanup\n''2007.07.08 [1.1.0]'' converted from inline script\n''2007.06.29 [1.0.0]'' started (as inline script)\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by Eric L. Shulman\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.RelatedTiddlersPlugin={major: 1, minor: 1, revision: 7, date: new Date(2007,11,11)};\n\n// initialize 'autozoom' and 'exclude' tree options (defaults are not to zoom, and to follow all links)\nif (config.options.chkRelatedTiddlersZoom===undefined)\n config.options.chkRelatedTiddlersZoom=false;\nif (config.options.txtRelatedTiddlersExclude===undefined)\n config.options.txtRelatedTiddlersExclude='GettingStarted DefaultTiddlers SiteNews Download';\nif (config.options.chkRelatedTiddlersShowList===undefined)\n config.options.chkRelatedTiddlersShowList=true;\nif (config.options.chkRelatedTiddlersShowTree===undefined)\n config.options.chkRelatedTiddlersShowTree=false;\n\nconfig.macros.relatedTiddlers={\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n // create form with unique DOM element ID (using current timestamp)... permits multiple form instances\n var now=new Date().getTime();\n var span=createTiddlyElement(place,"span");\n span.innerHTML=this.form.format(["relatedTiddlers_form"+now]);\n var form=span.getElementsByTagName("form")[0]; // find form that we just created\n var target=createTiddlyElement(span,"div"); // create target block in which generated output will be placed\n\n // initialize droplist contents (all tiddlers except hidden ones)\n var tids=store.getTiddlers('title','excludeLists');\n for (i=0; i<tids.length; i++) form.list.options[form.list.options.length]=new Option(tids[i].title,tids[i].title,false,false);\n\n // initialize exclude field (space-separated list)\n if (config.options.txtRelatedTiddlersExclude) form.exclude.value=config.options.txtRelatedTiddlersExclude;\n\n // set starting tiddler, form display, and/or exclude list from macro params (if present) and then show the results!\n var root="";\n var hide=false;\n var exclude=config.options.txtRelatedTiddlersExclude;\n if (params[0]) root=params[0]; // TiddlerName\n if (params[1]) hide=(params[1].toLowerCase()=="hideform"); // keyword: "hideform" or "showform" (default)\n if (params[2]) exclude=params[2]; // list of tiddlers whose links should not be followed\n if (root=="here") { var tid=story.findContainingTiddler(place); if (tid) root=tid.getAttribute("tiddler"); }\n if (store.tiddlerExists(root)) {\n // NOTE: don't hide form when running IE, where putting initial focus on hidden form creates an error\n if (!config.browser.isIE) form.style.display=hide?"none":"block"; // show/hide the controls\n form.list.value=root; // set the root\n form.exclude.value=exclude; // set 'exclude' field\n form.get.click(); // DISPLAY INITIAL RESULTS (if tiddler is selected)\n }\n },\n form:\n "<form id='%0' action='javascript:;' style='display:inline;margin:0;padding:0;' onsubmit='return false'><!-- \s\n --><span class='fine' style='float:left;vertical-align:bottom;width:39.5%;'><i>find all tiddlers related to:</i></span><!-- \s\n --><span class='fine' style='float:left;vertical-align:bottom;'><i>exclude links contained in:</i></span><!-- \s\n --><div style='clear:both'><!-- \s\n --><select name=list size=1 style='width:39.5%' onchange='this.form.get.click()'><!-- \s\n --><option value=''>select a tiddler...</option><!-- \s\n --></select><!-- \s\n --><input type='text' option='txtRelatedTiddlersExclude' name='exclude' value='' style='width:40%' \s\n title='enter the names of tiddlers whose links should NOT be followed' \s\n onkeyup='if (event.keyCode==13) { this.blur(); this.form.get.click(); }' \s\n onchange='config.options[this.getAttribute(\s"option\s")]=this.value;saveOptionCookie(this.getAttribute(\s"option\s"));'><!-- \s\n --><input type=button name=get value='get related' style='width:10%' \s\n onclick='config.macros.relatedTiddlers.show(this.form,this.form.nextSibling);'><!-- \s\n --><input type=button name=done value='done' disabled style='width:10%' \s\n onclick='this.form.list.selectedIndex=0; this.form.get.click();'><!-- \s\n --></div><!-- \s\n --></form>",\n styles:\n ".relatedTiddlers blockquote \s\n { border-left:1px dotted #999; margin:0 25px; padding-left:.5em; font-size:%0%; line-height:115%; } \s\n .relatedTiddlers .borderleft \s\n { margin:0; padding:0; margin-left:1em; border-left:1px dotted #999; padding-left:.5em; } \s\n .relatedTiddlers .fourcolumns \s\n { display:block; -moz-column-count:4; -moz-column-gap:1em; -moz-column-width:25%} \s\n .relatedTiddlers a \s\n { font-weight:normal; } \s\n .relatedTiddlers .bold, .relatedTiddlers .bold a \s\n { font-weight:bold; } \s\n .relatedTiddlers .floatright \s\n { float:right; } \s\n .relatedTiddlers .clear \s\n { clear:both; } ",\n toggleform:\n "{{floatright{<html><a href='javascript:;' class='button' title='show/hide tiddler selection droplist and buttons' \s\n onclick='var here=story.findContainingTiddler(this); var tid=here?here.getAttribute(\s"tiddler\s"):\s"\s"; \s\n var f=document.getElementById(\s"%0\s"); var hide=(f.style.display!=\s"none\s"); \s\n f.style.display=hide?\s"none\s":\s"inline\s"; this.innerHTML=hide?\s"show form\s":\s"hide form\s"; return false;'>%1</a></html>}}}",\n treecheck:\n "{{floatright{@@display:none;<<option chkRelatedTiddlersShowTree>>@@<html><a href='javascript:;' class='button' onclick='this.parentNode.previousSibling.firstChild.click(); return false;'>tree view</a></html>}}}",\n tree:\n "{{clear{\sn----\sn}}} \s\n {{floatright small{<<option chkRelatedTiddlersZoom>>autosize tree display}}} \s\n {{fine{\sn''tiddlers linked from or included by'' [[%0]]\sn}}}%1",\n listcheck:\n "{{floatright{@@display:none;<<option chkRelatedTiddlersShowList>>@@<html><a href='javascript:;' class='button' onclick='this.parentNode.previousSibling.firstChild.click(); return false;'>list view</a></html>}}}",\n list:\n "{{clear{\sn----\sn}}} \s\n {{fine{\sn''tiddlers containing links to'' [[%0]]\sn}}} \s\n {{small fourcolumns borderleft{\sn%1}}} \s\n {{fine{\sn''tiddlers linked from or included by'' [[%0]]\sn}}} \s\n {{borderleft{\sn \s\n {{fine{\sn''bold''=//direct links//, plain=//indirect links//, ''...''=//links not followed//}}} \s\n {{small fourcolumns{\sn%2}}} \s\n }}}",\n skipped:\n "<html><span title='links from %0 have NOT been followed'>...</span></html>",\n mouseover: function(ev) {\n this.saveSize=this.style.fontSize;\n this.style.fontSize='100%';\n this.style.borderLeftStyle='solid';\n },\n mouseout: function(ev) {\n this.style.fontSize=this.saveSize;\n this.style.borderLeftStyle='dotted';\n },\n findRelatedTiddlers: function(tid,tids,treeout,level,exclude,callback) { \n // recursively build list of related tids (links and includes FROM the root tiddler) and generate treeview output\n var t=store.getTiddler(tid);\n if (!t || tids.contains(tid)) return tids; // tiddler already in results (or missing tiddler)... just return current results\n tids.push(t.title); // add tiddler to results\n var skip=exclude && exclude.contains(tid);\n treeout.text+=level+"[["+tid+"]]"+(skip?this.skipped.format([tid]):"")+"\sn";\n if (skip) return tids; // branch is pruned... don't follow links\n var links=callback?callback(t):this.getLinks(t);\n for (var i=0; i<links.length; i++) tids=this.findRelatedTiddlers(links[i],tids,treeout,level+">",exclude);\n return tids;\n },\n getLinks: function(tiddler) {\n if (!tiddler.linksUpdated) tiddler.changed();\n return tiddler.links;\n },\n getTree: function(start,exclude,callback) {\n // get related tiddlers and generate blockquote-indented tree output\n var list=[]; var tree={text:""}; var level="";\n list=this.findRelatedTiddlers(start,list,tree,level,exclude,callback);\n return tree.text;\n },\n getList: function(start,exclude,callback) {\n // get related tiddlers and generate blockquote-indented tree output\n var list=[]; var tree={text:""}; var level="";\n list=this.findRelatedTiddlers(start,list,tree,level,exclude,callback);\n return list;\n },\n show: function(form,target) {\n removeChildren(target); form.done.disabled=true; // clear any existing output and disable 'done' button\n var start=form.list.value; if (!start.length) return; // get selected starting tiddler. If blank value (heading), do nothing\n\n // get related tiddlers and generate blockquote-indented tree output\n var rels=[]; var treeview={text:""}; var level="";\n var exclude=config.options.txtRelatedTiddlersExclude.readBracketedList();\n var rels=this.findRelatedTiddlers(start,rels,treeview,level,exclude);\n rels.shift(); // remove self from list\n rels.sort(); // sort titles alphabetically\n\n // generate list output\n var tid=store.getTiddler(start);\n var relsview=""; for (t=0; t<rels.length; t++) {\n relsview+=tid.links.contains(rels[t])?("{{bold{[["+rels[t]+"]]}}}"):("[["+rels[t]+"]]");\n if (exclude && exclude.contains(rels[t])) relsview+=this.skipped.format([rels[t]]);\n relsview+="\sn";\n }\n \n // get references TO the root tiddler, add to related tiddlers and generate refsview output\n var refs=[]; var referers=store.getReferringTiddlers(start);\n for(var r=0; r<referers.length; r++)\n if(referers[r].title!=start && !referers[r].tags.contains("excludeLists")) refs.push(referers[r].title);\n var refcount=refs.length; var relcount=rels.length; // remember individual counts\n for (var r=0; r<refs.length; r++) rels.pushUnique(refs[r]); // combine lists without duplicates\n var total=rels.length; // get combined total\n var refsview="[["+refs.sort().join("]]\sn[[")+"]]\sn";\n \n // set custom blockquote styles for treeview\n setStylesheet(this.styles.format([config.options.chkRelatedTiddlersZoom?80:100]),'relatedTiddlers_styles');\n\n // assemble and render output\n var summary=(total?(total+" tiddler"+(total==1?" is":"s are")):"There are no tiddlers")+" related to: [["+start+"]]";\n var list=this.list.format([start,refsview.length?refsview:"//none//",relsview.length?relsview:"//none//"]);\n var tree=this.tree.format([start,treeview.text]);\n var toggle=this.toggleform.format([form.id,(form.style.display=='none'?'show form':'hide form')]);\n var sep="{{floatright{ | }}}";\n var showList=total && config.options.chkRelatedTiddlersShowList;\n var showTree=relcount && config.options.chkRelatedTiddlersShowTree;\n var out="{{relatedTiddlers{"+toggle+(relcount?sep+this.treecheck:"")+(total?sep+this.listcheck:"")+summary+(showList?list:"")+(showTree?tree:"")+"}}}";\n wikify(out,target);\n form.done.disabled=false; // enable 'done' button\n\n // add mouseover/mouseout handling to blockquotes (for autosizing)\n var blocks=target.getElementsByTagName("blockquote");\n for (var b=0; b<blocks.length; b++)\n { blocks[b].onmouseover=this.mouseover; blocks[b].onmouseout=this.mouseout; }\n\n // add side-effect to checkboxes so that display is refreshed when a checkbox state is changed\n var checks=target.getElementsByTagName("input");\n for (var c=0; c<checks.length; c++) {\n if (checks[c].type.toLowerCase()!="checkbox") continue;\n checks[c].coreClick=checks[c].onclick; // save standard click handler\n checks[c].formID=form.id; // link checkbox with correponding form\n checks[c].onclick=function() { this.coreClick.apply(this,arguments); document.getElementById(this.formID).get.click(); }\n }\n }\n}\n//}}}
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|3.0 ($Rev: 1845 $)|\n| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}\n\n
/%\n|Name|ReplaceTiddlerTitle|\n|Source|http://www.TiddlyTools.com/#ReplaceTiddlerTitle|\n|Version|1.0.1|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|replace tiddler's title text with other content - may include wiki syntax|\n\nUsage:\n <<tiddler ReplaceTiddlerTitle with: "new title text">>\n\n%/<script>\n // get the tiddler element\n var here=story.findContainingTiddler(place);\n if (!here || here.getAttribute("tiddler")=="ReplaceTiddlerTitle") return; // don't change the title on the script itself!\n var nodes=here.getElementsByTagName("*");\n for (var i=0; i<nodes.length; i++)\n if (hasClass(nodes[i],"title")) { removeChildren(nodes[i]); wikify("$1",nodes[i]); break; }\n</script>
Nov 2007"
/***\n| Name|SaveCloseTiddlerPlugin|\n| Description|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|\n| Version|3.0 ($Rev: 2134 $)|\n| Date|$Date: 2007-04-30 16:11:12 +1000 (Mon, 30 Apr 2007) $|\n| Source|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\nTo use these you must add them to the tool bar in your EditTemplate\n***/\n//{{{\nmerge(config.commands,{\n\n saveCloseTiddler: {\n text: 'done/close',\n tooltip: 'Save changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.saveTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n },\n\n cancelCloseTiddler: {\n text: 'cancel/close',\n tooltip: 'Undo changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.cancelTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n }\n\n});\n\n//}}}\n\n
<<tagCloud systemConfig excludeSearch excludeLists excludeMissing>>
<<search>><<closeAll>><<permaview>><<newTiddler>><<mtslogin>> <<saveChanges>> <<mtsdownload>><<fontSize font-size: >><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
by Michael Adcock, Tim Shockley, and Sonja Sutherland\n
Amateur Astronomy Thesaurus
/*{{{*/\n/*Blackicity Theme for TiddlyWiki*/\n/*Design and CSS by Saq Imtiaz*/\n/*Version 1.0*/\n/*}}}*/\n/*{{{*/\n\nbody{ font-family: "Neue Helvetica", Helvetica, "Lucida Grande", Verdana, sans-serif;\n background-color: #fff;\n color: #333;}\n\n#topMenu {position:relative; background:#282826; padding:10px; color:#fff;font-family:'Lucida Grande', Verdana, Sans-Serif;}\n#topMenu br {display:none;}\n\n#topMenu a{ color: #999;\n padding: 0px 8px 0px 8px;\n border-right: 1px solid #444;}\n#topMenu a:hover {color:#fff; background:transparent;}\n\n#displayArea {margin-left:1em; margin-bottom:2em; margin-top:0.5em;}\n\n\na, a:hover{\ncolor:#333;\ntext-decoration: none; background:transparent; \n}\n\n.viewer a, .viewer a:hover {border-bottom:1px dotted #333; font-weight:bold;}\n\n\n.viewer .button, .editorFooter .button{\ncolor: #333;\nborder: 1px solid #333;\n}\n\n.viewer .button:hover,\n.editorFooter .button:hover, .viewer .button:active, .viewer .highlight,.editorFooter .button:active, .editorFooter .highlight{\ncolor: #fff;\nbackground: #333;\nborder-color: #333;\n}\n\n.tiddler .viewer {line-height:1.45em;}\n.title {color:#222; border-bottom:1px solid#222; font-family:'Lucida Grande', Verdana, Sans-Serif; font-size:1.5em;}\n.subtitle, .subtitle a { color: #999999; font-size: 0.95em;margin:0.2em;}\n.shadow .title{color:#999;}\n\n.toolbar {font-size:90%;}\n.selected .toolbar a {color:#999999;}\n.selected .toolbar a:hover {color:#333; background:transparent;border:1px solid #fff;}\n\n.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active{color:#333; background:transparent;border:1px solid #fff;}\n\n/***\n!Sidebar\n***/\n#sidebar { margin-bottom:2em !important; margin-bottom:1em; right:0;\n}\n\n/***\n!SidebarOptions\n***/\n#sidebarOptions { padding-top:2em;background:#f3f3f3;padding-left:0.5em;}\n\n#sidebarOptions a {\n color:#333;\n background:#f3f3f3;\n border:1px solid #f3f3f3;\n text-decoration: none;\n}\n\n#sidebarOptions a:hover, #sidebarOptions a:active {\n color:#222;\n background-color:#fff;border:1px solid #fff;\n }\n\n#sidebarOptions input {border:1px solid #ccc; }\n\n#sidebarOptions .sliderPanel {\n background: #f3f3f3; font-size: .9em;\n}\n\n#sidebarOptions .sliderPanel input {border:1px solid #999;}\n#sidebarOptions .sliderPanel .txtOptionInput {border:1px solid #999;width:9em;}\n\n#sidebarOptions .sliderPanel a {font-weight:normal; color:#555;background-color: #f3f3f3; border-bottom:1px dotted #333;}\n\n\n#sidebarOptions .sliderPanel a:hover {\ncolor:#111;\nbackground-color: #f3f3f3;\nborder:none;\nborder-bottom:1px dotted #111;\n}\n/***\n!SidebarTabs\n***/\n .listTitle {color:#222;}\n#sidebarTabs {background:#f3f3f3;}\n\n#sidebarTabs .tabContents {background:#cfcfcf;}\n\n#sidebarTabs .tabUnselected:hover {color:#999;}\n\n#sidebarTabs .tabSelected{background:#cfcfcf;}\n\n#sidebarTabs .tabContents .tiddlyLink, #sidebarTabs .tabContents .button{color:#666;}\n#sidebarTabs .tabContents .tiddlyLink:hover,#sidebarTabs .tabContents .button:hover{color:#222;background:transparent; text-decoration:none;border:none;}\n\n#sidebarTabs .tabContents .button:hover, #sidebarTabs .tabContents .highlight, #sidebarTabs .tabContents .marked, #sidebarTabs .tabContents a.button:active{color:#222;background:transparent;}\n\n#sidebarTabs .txtMoreTab .tabSelected,\n#sidebarTabs .txtMoreTab .tab:hover,\n#sidebarTabs .txtMoreTab .tabContents{\n color: #111;\n background: #f3f3f3; border:1px solid #f3f3f3;\n}\n\n#sidebarTabs .txtMoreTab .tabUnselected {\n color: #555;\n background: #AFAFAF;\n}\n\n\n\n/***\n!Tabs\n***/\n.tabSelected{color:#fefefe; background:#999; padding-bottom:1px;}\n .tabSelected, .tabSelected:hover {\n color: #111;\n background: #fefefe;\n border: solid 1px #cfcfcf;\n}\n\n .tabUnselected {\n color: #999;\n background: #eee;\n border: solid 1px #cfcfcf;\n padding-bottom:1px;\n}\n.tabUnselected:hover {text-decoration:none; border:1px solid #cfcfcf;}\n.tabContents {background:#fefefe;}\n\n\n\n\n\n.tagging, .tagged {\nborder: 1px solid #eee;\nbackground-color: #F7F7F7;\n}\n\n.selected .tagging, .selected .tagged {\nbackground-color: #f3f3f3;\nborder: 1px solid #ccc;\n}\n\n.tagging .listTitle, .tagged .listTitle {\ncolor: #bbb;\n}\n\n.selected .tagging .listTitle, .selected .tagged .listTitle {\ncolor: #333;\n}\n\n.tagging .button, .tagged .button {\ncolor:#ccc;\n}\n.selected .tagging .button, .selected .tagged .button {\ncolor:#aaa;\n}\n\n.highlight, .marked {background:transparent; color:#111; border:none; text-decoration:underline;}\n\n.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active {\nborder: none; background:transparent; text-decoration:underline; color:#333;\n}\n\n\n\n.popup {\nbackground: #cfcfcf;\nborder: 1px solid #333;\n}\n\n.popup li.disabled {\ncolor: #000;\n}\n\n.popup li a, .popup li a:visited {\ncolor: #555;\nborder: none;\n}\n\n.popup li a:hover {\nbackground: #f3f3f3;\ncolor: #555;\nborder: none;\n}\n\n\n\n#messageArea {\n\nborder: 4px dotted #282826;\nbackground: #F3F3F3;\ncolor: #333;\nfont-size:90%;\n}\n\n#messageArea a:hover { background:#f5f5f5; border:none;}\n\n\n#messageArea .button{\ncolor: #333;\nborder: 1px solid #282826;\n}\n\n#messageArea .button:hover {\ncolor: #fff;\nbackground: #282826;\nborder-color: #282826;\n}\n\n\n\n\n\n\n.tiddler {padding-bottom:10px;}\n\n.viewer blockquote {\nborder-left: 5px solid #282826;\n}\n\n.viewer table, .viewer td {\nborder: 1px solid #282826;\n}\n\n.viewer th, thead td {\nbackground: #282826;\nborder: 1px solid #282826;\ncolor: #fff;\n}\n.viewer pre {\nborder: 1px solid #ccc;\nbackground: #f5f5f5;\n}\n\n.viewer code {\ncolor: #111; background:#f5f5f5;\n}\n\n.viewer hr {\nborder-top: dashed 1px #222; margin:0 1em;\n}\n\n.editor input {\nborder: 1px solid #ccc; margin-top:5px;\n}\n\n.editor textarea {\nborder: 1px solid #ccc;\n}\n\nh1,h2,h3,h4,h5 { color: #282826; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif; }\nh1 {font-size:18px;}\nh2 {font-size:16px;}\nh3 {font-size: 14px;}\n\n/*}}}*/
/*{{{*/\n@media print {\n#mainMenu, #sidebar, #messageArea, #breadCrumbs, #topMenu, #hoverMenu,\n#backstage, #backstageButton, .tagged,\n#backstageArea, .toolbar, .siteSubtitle, .siteTitle, .header, .subtitle\n{display: none ! important;}\n#displayArea {margin: 1em 1em 0em 1em;}\n/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the\nnoscript content */\nnoscript {display:none;}\n} \n\n/*}}}*/
/***\n|Name|StyleSheetShortcuts|\n|Source|http://www.TiddlyTools.com/#StyleSheetShortcuts|\n|Version||\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|CSS|\n|Requires||\n|Overrides||\n|Description|CSS classes for common formatting, alignment, boxes, tables, etc.|\n\nThese 'style tweaks' can be easily included in other stylesheet tiddler so they can share a baseline look-and-feel that can then be customized to create a wide variety of 'flavors'.\n***/\n/*{{{*/\n\n/* text alignments */\n.left\n { display:block;text-align:left; }\n.center\n { display:block;text-align:center; }\n.right \n { display:block;text-align:right; }\n.justify\n { display:block;text-align:justify; }\n.indent\n { display:block;margin:0;padding:0;border:0;margin-left:2em; }\n.floatleft\n { float:left; }\n.floatright\n { float:right; }\n.clear\n { clear:both; }\n.wrap\n { white-space:normal; }\n.nowrap\n { white-space:nowrap; }\n.hidden\n { display:none; }\n.span\n { display:span; }\n.block\n { display:block; }\n.relative\n { position:relative; }\n.absolute\n { position:absolute; }\n\n/* font sizes */\n.big\n { font-size:14pt;line-height:120% }\n.medium\n { font-size:12pt;line-height:120% }\n.normal\n { font-size:9pt;line-height:120% }\n.small\n { font-size:8pt;line-height:120% }\n.fine\n { font-size:7pt;line-height:120% }\n.tiny\n { font-size:6pt;line-height:120% }\n.larger\n { font-size:120%; }\n.smaller\n { font-size:80%; }\n\n/* font styles */\n.bold\n { font-weight:bold; }\n.italic\n { font-style:italic; }\n.underline\n { text-decoration:underline; }\n\n/* multi-column tiddler content (not supported in Internet Explorer) */\n.twocolumns { display:block;\n -moz-column-count:2; -moz-column-gap:1em; -moz-column-width:50%; /* FireFox */\n -webkit-column-count:2; -webkit-column-gap:1em; -webkit-column-width:50%; /* Safari */\n column-count:2; column-gap:1em; column-width:50%; /* Opera */\n}\n.threecolumns { display:block;\n -moz-column-count:3; -moz-column-gap:1em; -moz-column-width:33%; /* FireFox */\n -webkit-column-count:3; -webkit-column-gap:1em; -webkit-column-width:33%; /* Safari */\n column-count:3; column-gap:1em; column-width:33%; /* Opera */\n}\n.fourcolumns { display:block;\n -moz-column-count:4; -moz-column-gap:1em; -moz-column-width:25%; /* FireFox */\n -webkit-column-count:4; -webkit-column-gap:1em; -webkit-column-width:25%; /* Safari */\n column-count:4; column-gap:1em; column-width:25%; /* Opera */\n}\n\n/* show/hide browser-specific content for InternetExplorer vs. non-IE ("moz") browsers */\n*[class="ieOnly"]\n { display:none; } /* hide in moz (uses CSS selector) */\n* html .mozOnly, *:first-child+html .mozOnly\n { display: none; } /* hide in IE (uses IE6/IE7 CSS hacks) */\n\n/* borderless tables */\n.borderless, .borderless table, .borderless td, .borderless tr, .borderless th, .borderless tbody\n { border:0 !important; margin:0 !important; padding:0 !important; }\n\n/* thumbnail images (fixed-sized scaled images) */\n.thumbnail img { height:5em !important; }\n\n/* stretchable images (auto-size to fit tiddler) */\n.stretch img { width:95%; }\n\n/* grouped content */\n.outline\n { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; }\n.menubox\n { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; background:#fff; color:#000; }\n.menubox .button, .menubox .tiddlyLinkExisting, .menubox .tiddlyLinkNonExisting\n { color:#009 !important; }\n.groupbox\n { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; background:#ffe; color:#000; }\n.groupbox a, .groupbox .button, .groupbox .tiddlyLinkExisting, .groupbox .tiddlyLinkNonExisting\n { color:#009 !important; }\n.groupbox code\n { color:#333 !important; }\n.borderleft\n { margin:0;padding:0;border:0;margin-left:1em; border-left:1px dotted; padding-left:.5em; }\n.borderright\n { margin:0;padding:0;border:0;margin-right:1em; border-right:1px dotted; padding-right:.5em; }\n.borderbottom\n { margin:0;padding:1px 0;border:0;border-bottom:1px dotted; margin-bottom:1px; padding-bottom:1px; }\n.bordertop\n { margin:0;padding:0;border:0;border-top:1px dotted; margin-top:1px; padding-top:1px; }\n\n/* compact form */\n.smallform\n { white-space:nowrap; }\n.smallform input, .smallform textarea, .smallform button, .smallform checkbox, .smallform radio, .smallform select\n { font-size:8pt; }\n\n/* stretchable edit field (auto-size to fit tiddler) */\n.stretch input { width:95%; }\n\n/* colors */\n.green { color:#6f6 !important }\n.red { color:#f66 !important }\n.blue { color:#99f !important }\n\n/* rollover highlighting */\n.mouseover \n {color:[[ColorPalette::TertiaryLight]];}\n.mouseover a\n {color:[[ColorPalette::TertiaryLight]];}\n.selected .mouseover\n {color:[[ColorPalette::Foreground]];}\n.selected .mouseover .button, .selected .mouseover a\n {color:[[ColorPalette::PrimaryDark]];}\n\n/*}}}*/
Nov 2007"
<<allTags excludeLists>>
<<allTags excludeLists>>
/***\n| Name|TagglyTaggingPlugin|\n| Description|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version|3.1 ($Rev: 2351 $)|\n| Date|$Date: 2007-07-12 10:18:02 +1000 (Thu, 12 Jul 2007) $|\n| Source|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n!Notes\nSee http://mptw.tiddlyspot.com/#TagglyTagging\n***/\n//{{{\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as '%0':",\n excerpts: "excerpts",\n contents: "contents",\n sliders: "sliders",\n noexcerpts: "title only"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns",\n excerpts: "Click to show excerpts",\n contents: "Click to show entire tiddler contents",\n sliders: "Click to show tiddler contents in sliders",\n noexcerpts: "Click to show entire title only"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"],\n excerpts: ["noexcerpts","excerpts","contents","sliders"]\n },\n valuePrefix: "taggly.",\n excludeTags: ["excludeLists","excludeTagging"],\n excerptSize: 50,\n excerptMarker: "/%"+"%/"\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n }, \n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n return " ("+tagCount+")";\n }\n return "";\n },\n\n getExcerpt: function(inTiddlerTitle,title,indent) {\n if (!indent)\n indent = 1;\n if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "excerpts") {\n var t = store.getTiddler(title);\n if (t) {\n var text = t.text.replace(/\sn/," ");\n var marker = text.indexOf(this.config.excerptMarker);\n if (marker != -1) {\n return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";\n }\n else if (text.length < this.config.excerptSize) {\n return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";\n }\n else {\n return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";\n }\n }\n }\n else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "contents") {\n var t = store.getTiddler(title);\n if (t) {\n return "\sn{{contents indent"+indent+"{\sn" + t.text + "\sn}}}";\n }\n }\n else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "sliders") {\n var t = store.getTiddler(title);\n if (t) {\n return "<slider slide>\sn{{contents{\sn" + t.text + "\sn}}}\sn</slider>";\n }\n }\n return "";\n },\n\n notHidden: function(t,inTiddler) {\n if (typeof t == "string") \n t = store.getTiddler(t);\n return (!t || !t.tags.containsAny(this.config.excludeTags) ||\n (inTiddler && this.config.excludeTags.contains(inTiddler)));\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n var first = true;\n for (var i=0;i<list.length;i++) {\n if (this.notHidden(list[i],title)) {\n var countString = this.getTaggingCount(list[i].title);\n var excerpt = this.getExcerpt(title,list[i].title);\n if (useCommas)\n output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);\n else\n output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\sn");\n\n first = false;\n }\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n\n if (sortOrder == "desc")\n list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++)\n leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) {\n for (var j=0;j<list[i].tags.length;j++) {\n\n if (list[i].tags[j] != title) { // not this tiddler\n\n if (this.notHidden(list[i].tags[j],title)) {\n\n if (!allTagsHolder[list[i].tags[j]])\n allTagsHolder[list[i].tags[j]] = "";\n\n if (this.notHidden(list[i],title)) {\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\sn";\n\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n\n }\n }\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n if (this.notHidden(leftOvers[i],title))\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\sn";\n\n var output = [];\n\n if (sortOrder == "desc")\n allTags.reverse();\n else if (leftOverOutput != "")\n // leftovers first...\n output.push(leftOverOutput);\n\n for (var i=0;i<allTags.length;i++)\n if (allTagsHolder[allTags[i]] != "")\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\sn" + allTagsHolder[allTags[i]]);\n\n if (sortOrder == "desc" && leftOverOutput != "")\n // leftovers last...\n output.push(leftOverOutput);\n\n return this.drawTable(place,\n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used to build site map\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n if (this.notHidden(list[i].title,this.config.inTiddler))\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\sn" + childOutput;\n },\n\n // this if for the site map mode\n createTagglyListSiteMap: function(place,title) {\n this.config.inTiddler = title; // nasty. should pass it in to traverse probably\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var refreshContainer = createTiddlyElement(place,"div");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n refreshContainer.setAttribute("title",tiddler.title);\n this.refresh(refreshContainer);\n },\n\n refresh: function(place) {\n var title = place.getAttribute("title");\n removeChildren(place);\n if (store.getTaggedTiddlers(title).length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"excerpts");\n config.taggly.createListControl(place,title,"numCols");\n config.taggly.createTagglyList(place,title);\n }\n }\n }\n }\n },\n\n // todo fix these up a bit\n styles: [\n"/*{{{*/",\n"/* created by TagglyTaggingPlugin */",\n".tagglyTagging { padding-top:0.5em; }",\n".tagglyTagging li.listTitle { display:none; }",\n".tagglyTagging ul {",\n" margin-top:0px; padding-top:0.5em; padding-left:2em;",\n" margin-bottom:0px; padding-bottom:0px;",\n"}",\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",\n".tagglyTagging table { margin:0px; padding:0px; }",\n".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",\n".tagglyTagging .button, .tagglyTagging .hidebutton {",\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",\n" border:0px; padding-left:0.3em;padding-right:0.3em;",\n"}",\n".tagglyTagging .button:hover, .hidebutton:hover, ",\n".tagglyTagging .button:active, .hidebutton:active {",\n" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",\n"}",\n".selected .tagglyTagging .button { visibility:visible; }",\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",\n".tagglyTagging ul ul li {margin-left:0.5em; }",\n".editLabel { font-size:90%; padding-top:0.5em; }",\n".tagglyTagging .commas { padding-left:1.8em; }",\n"/* not technically tagglytagging but will put them here anyway */",\n".tagglyTagged li.listTitle { display:none; }",\n".tagglyTagged li { display: inline; font-size:90%; }",\n".tagglyTagged ul { margin:0px; padding:0px; }",\n".excerpt { color:[[ColorPalette::TertiaryDark]]; }",\n"div.tagglyTagging table,",\n"div.tagglyTagging table tr,",\n"td.tagglyTagging",\n" {border-style:none!important; }",\n".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",\n" margin-bottom:0.5em; }",\n".tagglyTagging .indent1 { margin-left:3em; }",\n".tagglyTagging .indent2 { margin-left:4em; }",\n".tagglyTagging .indent3 { margin-left:5em; }",\n".tagglyTagging .indent4 { margin-left:6em; }",\n".tagglyTagging .indent5 { margin-left:7em; }",\n".tagglyTagging .indent6 { margin-left:8em; }",\n".tagglyTagging .indent7 { margin-left:9em; }",\n".tagglyTagging .indent8 { margin-left:10em; }",\n".tagglyTagging .indent9 { margin-left:11em; }",\n".tagglyTagging .indent10 { margin-left:12em; }",\n"/*}}}*/",\n ""].join("\sn"),\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;\n store.addNotification("TagglyTaggingStyles",refreshStyles);\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n/***\nInlineSlidersPlugin\nBy Saq Imtiaz\nhttp://tw.lewcid.org/sandbox/#InlineSlidersPlugin\n\n// syntax adjusted to not clash with NestedSlidersPlugin\n\n***/\n//{{{\nconfig.formatters.unshift( {\n name: "inlinesliders",\n // match: "\s\s+\s\s+\s\s+\s\s+|\s\s<slider",\n match: "\s\s<slider",\n // lookaheadRegExp: /(?:\s+\s+\s+\s+|<slider) (.*?)(?:>?)\sn((?:.|\sn)*?)\sn(?:====|<\s/slider>)/mg,\n lookaheadRegExp: /(?:<slider) (.*?)(?:>)\sn((?:.|\sn)*?)\sn(?:<\s/slider>)/mg,\n handler: function(w) {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {\n var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\su00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");\n var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");\n panel.style.display = "none";\n wikify(lookaheadMatch[2],panel);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n },\n onClickSlider : function(e) {\n if(!e) var e = window.event;\n var n = this.nextSibling;\n n.style.display = (n.style.display=="none") ? "block" : "none";\n return false;\n }\n});\n\n//}}}\n\n
<<tiddlerTweaker>>
/***\n|Name|TiddlerTweakerPlugin|\n|Source|http://www.TiddlyTools.com/#TiddlerTweakerPlugin|\n|Version|2.0.3|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|select multiple tiddlers and modify author, created, modified and/or tag values|\n\nTiddlerTweaker is a tool for TiddlyWiki authors. It allows you to select multiple tiddlers from a listbox, and then modify the author, created, modified and/or tag values of those tiddlers using a compact set of form fields. The values you enter into the fields overwrite the existing values in all tiddlers you have selected.\n\n!!!!!Usage\n<<<\nTiddlerTweaker also allows you to quickly filter specified tags from the selected tiddlers, while leaving any other tags assigned to those tiddlers unchanged. Any tag preceded by a "+" (plus) or "-" (minus), will be added or removed from the existing tags instead of simply *replacing* the entire tag definition of each tiddler (e.g., enter "-excludeLists" to remove that tag from all selected tiddlers.\n\nNote: Because you may be working with many tags on many tiddlers, selecting and updating all tiddlers in a document operation may take a while and FireFox might warn about an "unresponsive script"... you should give it a whole bunch of time to 'continue'... it will complete the processing... eventually.\n\nAlso, by design, TiddlerTweaker does NOT update the 'modified' date of tiddlers simply by making changes to their tags. The tiddlers' dates are ONLY updated when the corresponding 'created' and/or 'modified' checkboxes are selected. Be sure to SAVE YOUR DOCUMENT WHEN YOU ARE DONE tweaking tiddlers, even if the tiddler timeline tab does not show any recently modified tiddlers.\n\nImportant: ''inasmuch as TiddlerTweaker is a 'power user' tool that can perform 'batch' functions (operating on many tiddlers at once), you should always have a recent backup of your document (or "save changes" just *before* tweaking the tiddlers), just in case you "shoot yourself in the foot".''\n<<<\n!!!!!Examples\n<<<\n{{{<<tiddlerTweaker>>}}}\n{{smallform{<<tiddlerTweaker>>}}}\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\nTiddlerTweakerPlugin\n<<<\n!!!!!Revision History\n<<<\n''2007.11.01 [2.0.3]'' added config.options.txtTweakerSortBy for cookie-based persistence of list display order preference setting.\n''2007.09.28 [2.0.2]'' in settiddlers() and deltiddlers(), added suspend/resume notification handling (improves performance when operating on multiple tiddlers)\n''2007.08.03 [2.0.1]'' added shadow definition for [[TiddlerTweaker]] tiddler for use as parameter references with {{{<<tiddler>>, <<slider>> or <<tabs>>}}} macros.\n''2007.08.03 [2.0.0]'' converted from inline script\n''2006.01.01 [1.0.0]'' initial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by Eric L Shulman / ELS Design Studios\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.tiddlerTweaker= {major: 2, minor: 0, revision: 3, date: new Date(2007,11,1)};\nconfig.shadowTiddlers.TiddlerTweaker="<<tiddlerTweaker>>";\nif (config.options.txtTweakerSortBy==undefined) config.options.txtTweakerSortBy="title";\nconfig.macros.tiddlerTweaker = {\n html: '<form style="display:inline"><!--\s\n --><table style="padding:0;margin:0;border:0;width:100%"><tr valign="top" style="padding:0;margin:0;border:0"><!--\s\n --><td style="text-align:center;white-space:nowrap;width:99%;padding:0;margin:0;border:0"><!--\s\n --><font size=-2><div style="text-align:left;">select tiddlers:</div><!--\s\n --></font><select multiple name=list size="8" style="width:99.99%" \s\n title="use click, shift-click and/or ctrl-click to select multiple tiddler titles" \s\n onclick="config.macros.tiddlerTweaker.selecttiddlers(this)" \s\n onchange="config.macros.tiddlerTweaker.setfields(this)"><!--\s\n --></select><br><!--\s\n -->show<input type=text size=1 value="8" \s\n onchange="this.form.list.size=this.value; this.form.list.multiple=(this.value>1);"><!--\s\n -->by<!--\s\n --><select name=sortby size=1 \s\n onchange="config.macros.tiddlerTweaker.init(this.form,this.value)"><!--\s\n --><option value="title">title</option><!--\s\n --><option value="size">size</option><!--\s\n --><option value="modified">date</option><!--\s\n --></select><!--\s\n --><input type="button" value="refresh" \s\n onclick="config.macros.tiddlerTweaker.init(this.form,this.form.sortby.value)"<!--\s\n --> <input type="button" name="stats" disabled value="totals..." \s\n onclick="config.macros.tiddlerTweaker.stats(this)"><!--\s\n --></td><td style="white-space:nowrap;padding:0;margin:0;border:0;width:1%"><!--\s\n --><div style="text-align:left"><font size=-2>modify values</font></div><!--\s\n --><table border=0 style="width:100%;padding:0;margin:0;border:0;"><tr style="padding:0;border:0;"><!--\s\n --><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=checkbox name=settitle unchecked \s\n title="allow changes to tiddler title (rename tiddler)" \s\n onclick="this.form.title.disabled=!this.checked">title<!--\s\n --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=text name=title size=35 style="width:98%" disabled><!--\s\n --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=checkbox name=setwho unchecked \s\n title="allow changes to tiddler author" \s\n onclick="this.form.who.disabled=!this.checked">author<!--\s\n --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=text name=who size=35 style="width:98%" disabled><!--\s\n --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=checkbox name=setcdate unchecked \s\n title="allow changes to created date" \s\n onclick="var f=this.form; f.cm.disabled=f.cd.disabled=f.cy.disabled=f.ch.disabled=f.cn.disabled=!this.checked"><!--\s\n -->created on<!--\s\n --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=text name=cm size=2 style="width:2em;padding:0;text-align:center" disabled><!--\s\n --> / <input type=text name=cd size=2 style="width:2em;padding:0;text-align:center" disabled><!--\s\n --> / <input type=text name=cy size=4 style="width:3em;padding:0;text-align:center" disabled><!--\s\n --> at <input type=text name=ch size=2 style="width:2em;padding:0;text-align:center" disabled><!--\s\n --> : <input type=text name=cn size=2 style="width:2em;padding:0;text-align:center" disabled><!--\s\n --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=checkbox name=setmdate unchecked \s\n title="allow changes to modified date" \s\n onclick="var f=this.form; f.mm.disabled=f.md.disabled=f.my.disabled=f.mh.disabled=f.mn.disabled=!this.checked"><!--\s\n -->modified on<!--\s\n --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=text name=mm size=2 style="width:2em;padding:0;text-align:center" disabled><!--\s\n --> / <input type=text name=md size=2 style="width:2em;padding:0;text-align:center" disabled><!--\s\n --> / <input type=text name=my size=4 style="width:3em;padding:0;text-align:center" disabled><!--\s\n --> at <input type=text name=mh size=2 style="width:2em;padding:0;text-align:center" disabled><!--\s\n --> : <input type=text name=mn size=2 style="width:2em;padding:0;text-align:center" disabled><!--\s\n --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=checkbox name=settags checked \s\n title="allow changes to tiddler tags" \s\n onclick="this.form.tags.disabled=!this.checked">tags<!--\s\n --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\s\n --><input type=text name=tags size=35 value="" style="width:98%" \s\n title="enter new tags or use \s'+tag\s' and \s'-tag\s' to add/remove tags from existing tags"><!--\s\n --></td></tr></table><!--\s\n --><div style="margin-top:.8em;text-align:center"><!--\s\n --><nobr><input type=button name=display disabled style="width:32%" value="display tiddlers" \s\n onclick="config.macros.tiddlerTweaker.displaytiddlers(this)"><!--\s\n --> <input type=button name=del disabled style="width:32%" value="delete tiddlers" \s\n onclick="config.macros.tiddlerTweaker.deltiddlers(this)"><!--\s\n --> <input type=button name=set disabled style="width:32%" value="update tiddlers" \s\n onclick="config.macros.tiddlerTweaker.settiddlers(this)"></nobr><!--\s\n --></div><!--\s\n --></td></tr></table><!--\s\n --></form><span style="display:none"><!--content replaced by tiddler "stats"--></span>\s\n ',\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var span=createTiddlyElement(place,"span");\n span.innerHTML=this.html;\n this.init(span.firstChild,config.options.txtTweakerSortBy);\n },\n init: function(f,sortby) { // initialize form controls\n if (!f) return; // form might not be rendered yet...\n while (f.list.options[0]) f.list.options[0]=null; // empty current list content\n var tids=store.getTiddlers(sortby);\n if (sortby=="size") // descending order (largest tiddlers listed first)\n tids.sort(function(a,b) {return a.text.length > b.text.length ? -1 : (a.text.length == b.text.length ? 0 : +1);});\n for (i=0; i<tids.length; i++) {\n var label=tids[i].title; var value=tids[i].title;\n if (sortby=="modified") {\n label=tids[tids.length-i-1].modified.formatString("YY.0MM.0DD 0hh:0mm ")+tids[tids.length-i-1].title;\n value=tids[tids.length-i-1].title;\n }\n if (sortby=="size") label="["+tids[i].text.length+"] "+label;\n f.list.options[f.list.length]=new Option(label,value,false,false);\n }\n f.title.value=f.who.value=f.tags.value="";\n f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value="";\n f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value="";\n f.stats.disabled=f.set.disabled=f.del.disabled=f.display.disabled=true;\n f.settitle.disabled=false;\n config.options.txtTweakerSortBy=sortby; // remember current setting\n f.sortby.value=sortby; // sync droplist selection with current setting\n if (sortby!="title") // non-default preference... save cookie\n saveOptionCookie("txtTweakerSortBy");\n else { // default preference... clear cookie\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = "txtTweakerSortBy=null; path=/; expires="+ex.toGMTString();\n }\n },\n selecttiddlers: function(here) { // enable/disable tweaker fields based on number of items selected\n // count how many tiddlers are selected\n var f=here.form; var list=f.list;\n var c=0; for (i=0;i<list.length;i++) if (list.options[i].selected) c++;\n if (c>1) f.title.disabled=true;\n if (c>1) f.settitle.checked=false;\n f.set.disabled=(c==0);\n f.del.disabled=(c==0);\n f.display.disabled=(c==0);\n f.settitle.disabled=(c>1);\n f.stats.disabled=(c==0);\n var msg=(c==0)?'select tiddlers:':(c+' tiddler'+(c!=1?'s':'')+' selected');\n here.previousSibling.firstChild.innerHTML=msg;\n },\n setfields: function(here) { // set tweaker edit fields from first selected tiddler\n var f=here.form;\n if (!here.value.length) {\n f.title.value=f.who.value=f.tags.value="";\n f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value="";\n f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value="";\n return;\n }\n var tid=store.getTiddler(here.value); if (!tid) return;\n f.title.value=tid.title;\n f.who.value=tid.modifier;\n f.tags.value=tid.tags.join(' ');\n var c=tid.created; var m=tid.modified;\n f.cm.value=c.getMonth()+1;\n f.cd.value=c.getDate();\n f.cy.value=c.getFullYear();\n f.ch.value=c.getHours();\n f.cn.value=c.getMinutes();\n f.mm.value=m.getMonth()+1;\n f.md.value=m.getDate();\n f.my.value=m.getFullYear();\n f.mh.value=m.getHours();\n f.mn.value=m.getMinutes();\n },\n settiddlers: function(here) {\n var f=here.form; var list=f.list;\n var tids=[];\n for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);\n if (!tids.length) { alert("please select at least one tiddler"); return; }\n var cdate=new Date(f.cy.value,f.cm.value-1,f.cd.value,f.ch.value,f.cn.value);\n var mdate=new Date(f.my.value,f.mm.value-1,f.md.value,f.mh.value,f.mn.value);\n if (tids.length>1 && !confirm("Are you sure you want to update these tiddlers:\sn\sn"+tids.join(', '))) return;\n store.suspendNotifications();\n for (t=0;t<tids.length;t++) {\n var tid=store.getTiddler(tids[t]); if (!tid) continue;\n var title=!f.settitle.checked?tid.title:f.title.value;\n var who=!f.setwho.checked?tid.modifier:f.who.value;\n var tags=tid.tags\n if (f.settags.checked) { \n var intags=f.tags.value.readBracketedList();\n var addtags=[]; var deltags=[]; var reptags=[];\n for (i=0;i<intags.length;i++) {\n if (intags[i].substr(0,1)=='+')\n addtags.push(intags[i].substr(1));\n else if (intags[i].substr(0,1)=='-')\n deltags.push(intags[i].substr(1));\n else\n reptags.push(intags[i]);\n }\n if (reptags.length)\n tags=reptags;\n if (addtags.length)\n tags=Array.concat(tags,addtags);\n if (deltags.length)\n for (i=0;i<deltags.length;i++)\n { var pos=tags.indexOf(deltags[i]); if (pos!=-1) tags.splice(pos,1); }\n }\n if (!f.setcdate.checked) cdate=tid.created;\n if (!f.setmdate.checked) mdate=tid.modified;\n store.saveTiddler(tid.title,title,tid.text,who,mdate,tags,tid.fields);\n if (f.setcdate.checked) tid.assign(null,null,null,null,null,cdate); // set create date\n }\n store.resumeNotifications();\n this.init(f,f.sortby.value);\n },\n displaytiddlers: function(here) {\n var f=here.form; var list=f.list;\n var tids=[];\n for (i=0; i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);\n if (!tids.length) { alert("please select at least one tiddler"); return; }\n story.displayTiddlers(story.findContainingTiddler(f),tids)\n },\n deltiddlers: function(here) {\n var f=here.form; var list=f.list;\n var tids=[];\n for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);\n if (!tids.length) { alert("please select at least one tiddler"); return; }\n if (!confirm("Are you sure you want to delete these tiddlers:\sn\sn"+tids.join(', '))) return;\n store.suspendNotifications();\n for (t=0;t<tids.length;t++) {\n var tid=store.getTiddler(tids[t]); if (!tid) continue;\n if (tid.tags.contains("systemConfig"))\n if (!confirm("'"+tid.title+"' is tagged with 'systemConfig'.\sn\snRemoving this tiddler may cause unexpected results. Are you sure?"))\n continue;\n store.removeTiddler(tid.title);\n }\n store.resumeNotifications();\n this.init(f,f.sortby.value);\n },\n stats: function(here) {\n var f=here.form; var list=f.list; var tids=[]; var out=''; var tot=0;\n var target=f.nextSibling;\n for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);\n if (!tids.length) { alert("please select at least one tiddler"); return; }\n for (t=0;t<tids.length;t++) {\n var tid=store.getTiddler(tids[t]); if (!tid) continue;\n out+='[['+tid.title+']] '+tid.text.length+'\sn'; tot+=tid.text.length;\n }\n var avg=tot/tids.length;\n out=tot+' bytes in '+tids.length+' selected tiddlers ('+avg+' bytes/tiddler)\sn<<<\sn'+out+'<<<\sn';\n removeChildren(target);\n target.innerHTML="<hr><font size=-2><a href='javascript:;' style='float:right' onclick='this.parentNode.parentNode.style.display=\s"none\s"'>close</a></font>";\n wikify(out,target);\n target.style.display="block";\n }\n};\n//}}}
/***\n| Name|ToggleTagPlugin|\n| Description|Makes a checkbox which toggles a tag in a tiddler|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source|http://tiddlyspot.com/mptw/#ToggleTagMacro|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n!Usage\n{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}\n* TagName - the tag to be toggled, default value "checked"\n* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler\n* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'\n(If a parameter is '.' then the default will be used)\n\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|\n|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|\nNotes:\n* If TiddlerName doesn't exist it will be silently created\n* Set label to '-' to specify no label\n* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2\n\n!Known issues\n* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing\n\n***/\n//{{{\n\nmerge(config.macros,{\n\n toggleTag: {\n\n doRefreshAll: true,\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;\n label = (label == '-' ? '' : label);\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {\n if (!store.tiddlerExists(title)) {\n if (config.macros.toggleTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n store.setTiddlerTag(title,this.checked,tag);\n return true;\n });\n }\n }\n});\n\n//}}}\n\n
Nov 2007"
<!--{{{-->\n<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler permalink references jump deleteTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div><br/>\n<span macro="notation"></span>\n<span macro="listsn"></span>\n<span macro="listu"></span>\n<span macro="listuf"></span>\n<span macro="listbt"></span>\n<span macro="listnt"></span>\n<span macro="listrt"></span>\n<div class='tagClear'></div>\n<!--}}}-->
The assignment [[instructions|Thesaurus-project.pdf]] are here.\n\nHere's a [[cheatsheet|http://www.nothickmanuals.info/lib/exe/fetch.php/cheatsheets:tiddlywiki_cheatsheet.pdf?id=cheatsheets&cache=cache]] PDF on exciting ~TiddlyWiki commands and things.\n\nAnd this is a [[link|537 Terms Sorted.xls]] to the original Excel file the Tiddlywiki was created from...\n\nWork in progress code:\n[[notationMacro]] [[listsnMacro]] [[listuMacro]] [[listufMacro]] [[listbtMacro]] [[listntMacro]] [[listrtMacro]]\n[[EditTemplate]] [[ViewTemplate]] [[StyleSheetPrint]]\n[[RelatedTiddlersPlugin]]\n[[ReplaceTiddlerTitle]]\n[[PopupTiddlersByAuthor]]
Adaptive optics is a technology to improve the performance of optical systems by reducing the effects of rapidly changing optical distortion. It is commonly used on astronomical telescopes to remove the effects of atmospheric distortion, or astronomical seeing. The simplest form of adaptive optics is tip-tilt correction.
<<tiddler PopupTiddlersByAuthor "suthes">>
Refers to the orbits around the Sun.
Refers to the blurring and twinkling of astronomical objects such as stars caused by turbulence in the Earth's atmosphere.
A unit of length approximately equal to the distance from the Earth to the Sun.
The absorption and scattering of light emitted by astronomical objects by the Earth's atmosphere between the emitting object and the observer.
A technique for viewing faint objects which involves not looking directly at the object, but looking a little off to the side, while continuing to concentrate on the object.
Angular measure around the horizon or parallel to it in the sky.
Nov 2007"
An exceptionally bright [[fireball|fireballs]], particularly one that explodes (sometimes called a detonating fireball).
The north and south celestial poles are the two imaginary points in the sky where the Earth's axis of rotation, infinitely extended, intersects the imaginary rotating sphere of stars called the celestial sphere.
A star that never rises or sets from the perspective of a given latitude on Earth.
[[listuMacro]]\n[[listufMacro]]\n[[listbtMacro]]\n[[listntMacro]]\n[[listrtMacro]]
One of the two coordinates of the equatorial coordinate system, the other being either right ascension or hour angle.
Occurs when one celestial object moves into the shadow of another.
The angle between the Sun and a planet, as viewed from Earth.
Type the text for 'equipment'
Type the text for 'excludeMissing'
Literally a "bright spot." It is used in planetary nomenclature for naming certain surface features of [[planets]] and [[moons]], and is also a type of surface phenomenon on the [[Sun]].
An angular area viewed by the instrument, in square degrees.
A small auxiliary telescope mounted atop the main astronomical telescope and pointed in the same direction.
For a thin lens in air, the focal length is the distance from the center of the lens to the principal foci (or focal points) of the lens.
The focal length of an objective divided by its diameter.
A plane which divides the sphere into two hemispheres.
Nov 2007"
Type the text for 'general'
A special type of lunar occultations that occurs within a mile or two of the edge of an [[occultation's|occultations]] predicted path, referred to as its northern or southern limit. Within that narrow zone, an observer may see the [[star|stars]] intermittently disappearing and reappearing as the irregular [[limb]] of the [[moon|Moon]] moves past the [[star|stars]], creating what is known as a grazing occultation. From an observational and scientific standpoint, these "grazes" are the most dynamic and interesting of [[lunar occultation|lunar occultations]].
Expanding clouds of dust or gas ejected in a [[comet's|comets]] head.
One of the coordinates used in the equatorial coordinate system for describing the position of a point on the celestial sphere.
version.extensions.listbtMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,13)};\n//Author: Michael Adcock\nconfig.macros.listbt = {}\nconfig.macros.listbt.handler = function(place,macroName,params)\n{\nvar here=story.findContainingTiddler(place); if (!here) return;\nvar start=here.getAttribute("tiddler");\nvar val=store.getValue(start,"broader");\nif (!val) val="";\nvar list=val.readBracketedList();\nlist.sort(); // alphanumeric sort by title \nif (list.length > 0)\n{\nvar text = "BT [["+list.join("]] <br/> [[")+"]] <br/><br/>"; \nwikify(text,place);\n}\n}
version.extensions.listntMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,13)};\n//Author: Michael Adcock\nconfig.macros.listnt = {}\nconfig.macros.listnt.handler = function(place,macroName,params)\n{\nvar here=story.findContainingTiddler(place); if (!here) return;\nvar start=here.getAttribute("tiddler");\nvar val=store.getValue(start,"narrower");\nif (!val) val="";\nvar list=val.readBracketedList();\nlist.sort(); // alphanumeric sort by title \nif (list.length > 0)\n{\nvar text = "NT [["+list.join("]] <br/> [[")+"]] <br/><br/>"; \nwikify(text,place);\n}\n}\n
version.extensions.listrtMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,13)};\n//Author: Michael Adcock\nconfig.macros.listrt = {}\nconfig.macros.listrt.handler = function(place,macroName,params)\n{\nvar here=story.findContainingTiddler(place); if (!here) return;\nvar start=here.getAttribute("tiddler");\nvar val=store.getValue(start,"relatedto");\nif (!val) val="";\nvar list=val.readBracketedList();\nlist.sort(); // alphanumeric sort by title \nif (list.length > 0)\n{\nvar text = "RT [["+list.join("]] <br/> [[")+"]] <br/><br/>"; \nwikify(text,place);\n}\n}
version.extensions.listsnMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,14)};\n//Author: Michael Adcock\nconfig.macros.listsn = {}\nconfig.macros.listsn.handler = function(place,macroName,params)\n{\nvar here=story.findContainingTiddler(place); if (!here) return;\nvar start=here.getAttribute("tiddler");\nvar val=store.getValue(start,"scopenote");\nif (val)\n{\nvar text = "SN "+val+"<br/><br/>"; \nwikify(text,place);\n}\n}
version.extensions.listuMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,13)};\n//Author: Michael Adcock\nconfig.macros.listu = {}\nconfig.macros.listu.handler = function(place,macroName,params)\n{\nvar here=story.findContainingTiddler(place); if (!here) return;\nvar start=here.getAttribute("tiddler");\nvar val=store.getValue(start,"use");\nif (!val) val="";\nvar list=val.readBracketedList();\nlist.sort(); // alphanumeric sort by title \nif (list.length > 0)\n{\nvar text = "USE [["+list.join("]] <br/> [[")+"]] <br/><br/>"; \nwikify(text,place);\n}\n}
version.extensions.listufMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,13)};\n//Author: Michael Adcock\nconfig.macros.listuf = {}\nconfig.macros.listuf.handler = function(place,macroName,params)\n{\nvar here=story.findContainingTiddler(place); if (!here) return;\nvar start=here.getAttribute("tiddler");\nvar val=store.getValue(start,"usefor");\nif (!val) val="";\nvar list=val.readBracketedList();\nlist.sort(); // alphanumeric sort by title \nif (list.length > 0)\n{\nvar text = "USED FOR [["+list.join("]] <br/> [[")+"]] <br/><br/>"; \nwikify(text,place);\n}\n}
The amount of energy a body radiates per unit of time.
Nov 2007"
Nov 2007"
version.extensions.notationMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,14)};\n//Author: Michael Adcock\nconfig.macros.notation = {}\nconfig.macros.notation.handler = function(place,macroName,params)\n{\nvar here=story.findContainingTiddler(place); if (!here) return;\nvar start=here.getAttribute("tiddler");\nvar val=store.getValue(start,"notation");\nvar oldtitle=store.getValue(start,"title");\nif (val)\n{\nvar nodes=here.getElementsByTagName("*");\nfor (var i=0; i<nodes.length; i++)\nif (hasClass(nodes[i],"title"))\n{ \nvar text = oldtitle + " ("+val+")";\nremoveChildren(nodes[i]); wikify(text,nodes[i]); break;\n}\n}\n\n}
The umbra (Latin: "shadow") is the darkest part of a shadow. This contrasts with the penumbra, where the light source is only partially blocked and there is only a partial shadow.javascript:;\ndone
Refers to orbits around the Earth.
Refers to orbits around the Sun.
The angle between the light incident onto an observed object and the light reflected from the object.
Nov 2007"
A position angle is a measurement derived from observing visual binary stars. It is defined as the angular offset in degrees of the secondary star to the primary, relative to the north celestial pole.
Type the text for 'preferred'
The proper motion of a star is the measurement of its change in position in the sky over time after improper motions are accounted for. Stars with large proper motions tend to be nearby; most stars are far enough away that their proper motions are very small, of order a few thousandths of an arcsecond per year.
Quadrature occurs when two celestial bodies appear 90° apart from one another as viewed from a third celestial body.
The apparent origin point of meteors in a meteor shower.
The motion of a planetary body in a direction opposite opposite to that of other bodies within its system.
One of the two coordinates of a point on the celestial sphere when using the equatorial coordinate system.
Nov 2007"
Nov 2007"
The period of the Moon's orbit as defined with respect to the celestial sphere; it is the time it takes the Moon to return to a given position among the stars.
Nov 2007"
Nov 2007"
The average period of the Moon's revolution with respect to the sun.
Type the text for 'systemConfig'
version.extensions.tagCloud = {major: 1, minor: 0 , revision: 1, date: new Date(2005,8,16)};\n//Created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman\n\nconfig.macros.tagCloud = {\n noTags: "No tag cloud created because there are no tags.",\n tooltip: "%1 tiddlers tagged with '%0'"\n};\n\nconfig.macros.tagCloud.handler = function(place,macroName,params) {\n \nvar tagCloudWrapper = createTiddlyElement(place,"div",null,"tagCloud",null);\n\nvar tags = store.getTags();\nfor (t=0; t<tags.length; t++) {\n for (p=0;p<params.length; p++) if (tags[t][0] == params[p]) tags[t][0] = "";\n}\n\n if(tags.length == 0) \n createTiddlyElement(tagCloudWrapper,"span",null,null,this.noTags);\n //Findout the maximum number of tags\n var mostTags = 0;\n for (t=0; t<tags.length; t++) if (tags[t][0].length > 0){\n if (tags[t][1] > mostTags) mostTags = tags[t][1];\n }\n //divide the mostTags into 4 segments for the 4 different tagCloud sizes\n var tagSegment = mostTags / 4;\n\n for (t=0; t<tags.length; t++) if (tags[t][0].length > 0){\n var tagCloudElement = createTiddlyElement(tagCloudWrapper,"span",null,null,null);\n tagCloudWrapper.appendChild(document.createTextNode(" "));\n var theTag = createTiddlyButton(tagCloudElement,tags[t][0],this.tooltip.format(tags[t]),onClickTag,"tagCloudtag tagCloud" + (Math.round(tags[t][1]/tagSegment)+1));\n theTag.setAttribute("tag",tags[t][0]);\n }\n\n};\n\nsetStylesheet(".tagCloud span{height: 1.8em;margin: 3px;}.tagCloud1{font-size: 1.2em;}.tagCloud2{font-size: 1.4em;}.tagCloud3{font-size: 1.6em;}.tagCloud4{font-size: 1.8em;}.tagCloud5{font-size: 1.8em;font-weight: bold;}","tagCloudsStyles");
A celestial body is at the transit when it is highest in the sky. At that moment, the body goes through the celestial meridian, which runs from the northern celestial pole via the zenith to the southern celestial pole.
The umbra (Latin: "shadow") is the darkest part of a shadow. This contrasts with the penumbra, where the light source is only partially blocked and there is only a partial shadow.\n
The direction pointing directly above a particular location.