Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
//{{{\n\nconfig.macros.AddProject = {};\nconfig.macros.AddProject.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n\nconfig.options.projectName = prompt("Enter Project Name");\n\nconfig.macros.newerTiddler = { \n\nname:config.options.projectName,\ntags:'Project',\ntext:'<<tiddler ProjectReport with:"'+config.options.projectName+'">>',\nbutton:"Create Project Tiddler for "+config.options.projectName,\n\n reparse: function( params ) {\n var re = /([^:\s'\s"\ss]+)(?::([^\s'\s":\ss]+)|:[\s'\s"]([^\s'\s"\s\s]*(?:\s\s.[^\s'\s"\s\s]*)*)[\s'\s"])?(?=\ss|$)/g;\n var ret = new Array() ;\n var m ;\n\n while( (m = re.exec( params )) != null )\n ret[ m[1] ] = m[2]?m[2]:m[3]?m[3]:true ;\n\n return ret ;\n },\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n if ( readOnly ) return ;\n\n var input = this.reparse( paramString ) ;\n var tiddlerName = input["name"]?input["name"].trim():config.macros.newerTiddler.name ;\n var tiddlerTags = input["tags"]?input["tags"]:config.macros.newerTiddler.tags ;\n var tiddlerBody = input["text"]?input["text"]:config.macros.newerTiddler.text ;\n var buttonText = input["button"]?input["button"]:config.macros.newerTiddler.button ;\n var template = input["template"]?input["template"]:null;\n\n if ( tiddlerBody == null || tiddlerBody.length == 0 )\n tiddlerBody = config.macros.newerTiddler.text ;\n\n var now = new Date() ;\n tiddlerName = now.formatString( tiddlerName ) ;\n \n var exists = store.tiddlerExists( tiddlerName );\n var t = store.createTiddler( tiddlerName );\n if ( ! exists ) {\n\n story.closeTiddler("Create A New Project",true);\n\n // the main tiddler is here\n store.saveTiddler(config.options.projectName+"",\n config.options.projectName+"",\n config.macros.newerTiddler.text,\n config.options.txtUserName,\n new Date(),config.macros.newerTiddler.tags);\n\n story.displayTiddler(null,config.options.projectName+""\n ,DEFAULT_EDIT_TEMPLATE)\n }\n else {\n story.closeTiddler("Create A New Project",true);\n alert("Careful "+config.options.txtUserName+" - That project already exists!");\n story.displayTiddler(null,config.options.projectName,\n DEFAULT_VIEW_TEMPLATE)\n }\n}\n}\n}\n//}}}
<<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>>
<<forEachTiddler \n where \n 'tiddler.tags.containsAll(["Project"])'\n sortBy \n '(tiddler.title.toLowerCase())'\n>>
{{cleartable{\n|''A''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("A")' write '"* [["+tiddler.title+"]]\sn"'>>''B''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("B")' write '"* [["+tiddler.title+"]]\sn"'>>''C''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("C")' write '"* [["+tiddler.title+"]]\sn"'>>''D''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("D")' write '"* [["+tiddler.title+"]]\sn"'>>''E''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("E")' write '"* [["+tiddler.title+"]]\sn"'>>''F''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("F")' write '"* [["+tiddler.title+"]]\sn"'>>''G''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("G")' write '"* [["+tiddler.title+"]]\sn"'>>''H''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("H")' write '"* [["+tiddler.title+"]]\sn"'>>|''I''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("I")' write '"* [["+tiddler.title+"]]\sn"'>>''J''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("J")' write '"* [["+tiddler.title+"]]\sn"'>>''K''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("K")' write '"* [["+tiddler.title+"]]\sn"'>>''L''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("L")' write '"* [["+tiddler.title+"]]\sn"'>>''M''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("M")' write '"* [["+tiddler.title+"]]\sn"'>>''N''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("N")' write '"* [["+tiddler.title+"]]\sn"'>>''O''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("O")' write '"* [["+tiddler.title+"]]\sn"'>>''P''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("P")' write '"* [["+tiddler.title+"]]\sn"'>>|''Q''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("Q")' write '"* [["+tiddler.title+"]]\sn"'>>''R''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("R")' write '"* [["+tiddler.title+"]]\sn"'>>''S''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("S")' write '"* [["+tiddler.title+"]]\sn"'>>''T''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("T")' write '"* [["+tiddler.title+"]]\sn"'>>''U''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("U")' write '"* [["+tiddler.title+"]]\sn"'>>''V''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("V")' write '"* [["+tiddler.title+"]]\sn"'>>''W''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("W")' write '"* [["+tiddler.title+"]]\sn"'>>''X''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("X")' write '"* [["+tiddler.title+"]]\sn"'>>''Y''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("Y")' write '"* [["+tiddler.title+"]]\sn"'>>''Z''<<forEachTiddler where '! tiddler.tags.containsAny(["excludeSearch", "systemConfig"]) && tiddler.title.startsWith("Z")' write '"* [["+tiddler.title+"]]\sn"'>>|\n}}}
/***\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//}}}
Background: #B5BDCA\nForeground: #000\nPrimaryPale: #8cf\nPrimaryLight: #5F7991\nPrimaryMid: #04b\nPrimaryDark: #014\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #384F6E\nSecondaryDark: #841\nTertiaryPale: #fff\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88
//{{{\nconfig.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit\nconfig.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler\nconfig.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist\nconfig.views.editor.defaultText = ""; // don't need message when creating a new tiddler \nconfig.options.txtBackupFolder = "clinpsydbackup"\n var thePlace = window.location.href.replace("Dept%20Wiki/rniolon.html","Department Docs/");\nconfig.options.filedirectory = thePlace; // the directory where documents will be stored\n\n//}}}
<<AddProject>>\n<<newerTiddler>>
[[MainMenu]]
/***\n|Name|DisableWikiLinksPlugin|\n|Source|http://www.TiddlyTools.com/#DisableWikiLinksPlugin|\n|Version|1.5.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|Tiddler.prototype.autoLinkWikiWords, 'wikiLink' formatter|\n|Description|selectively disable TiddlyWiki's automatic ~WikiWord linking behavior|\n\nThis plugin allows you to disable TiddlyWiki's automatic ~WikiWord linking behavior, so that WikiWords embedded in tiddler content will be rendered as regular text, instead of being automatically converted to tiddler links. To create a tiddler link when automatic linking is disabled, you must enclose the link text within {{{[[...]]}}}.\n\nYou can block automatic WikiWord linking behavior for any specific tiddler by ''tagging it with<<tag excludeWikiWords>>'' (see configuration below) or, check a plugin option to disable automatic WikiWord links to non-existing tiddler titles, while still linking WikiWords that correspond to existing tiddlers titles or shadow tiddler titles. You can also block specific selected WikiWords from being automatically linked by listing them in [[DisableWikiLinksList]] (see configuration below), separated by whitespace. This tiddler is optional and, when present, causes the listed words to always be excluded, even if automatic linking of other WikiWords is being permitted. \n\nNote: WikiWords contained in default ''shadow'' tiddlers will be automatically linked unless you select an additional checkbox option lets you disable these automatic links as well, though this is not recommended, since it can make it more difficult to access some TiddlyWiki standard default content (such as AdvancedOptions or SideBarTabs)\n\n!!!!!Configuration\n<<<\nSelf-contained control panel:\n<<option chkDisableWikiLinks>> Disable ALL automatic WikiWord tiddler links\n<<option chkAllowLinksFromShadowTiddlers>> ... except for WikiWords //contained in// shadow tiddlers\n<<option chkDisableNonExistingWikiLinks>> Disable automatic WikiWord links for non-existing tiddlers\nDisable automatic WikiWord links for words listed in: <<option txtDisableWikiLinksList>>\nDisable automatic WikiWord links for tiddlers tagged with: <<option txtDisableWikiLinksTag>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DisableWikiLinksPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.06.09 [1.5.0]'' added configurable txtDisableWikiLinksTag (default value: "excludeWikiWords") to allows selective disabling of automatic WikiWord links for any tiddler tagged with that value.\n''2006.12.31 [1.4.0]'' in formatter, test for chkDisableNonExistingWikiLinks\n''2006.12.09 [1.3.0]'' in formatter, test for excluded wiki words specified in DisableWikiLinksList\n''2006.12.09 [1.2.2]'' fix logic in autoLinkWikiWords() (was allowing links TO shadow tiddlers, even when chkDisableWikiLinks is TRUE). \n''2006.12.09 [1.2.1]'' revised logic for handling links in shadow content\n''2006.12.08 [1.2.0]'' added hijack of Tiddler.prototype.autoLinkWikiWords so regular (non-bracketed) WikiWords won't be added to the missing list\n''2006.05.24 [1.1.0]'' added option to NOT bypass automatic wikiword links when displaying default shadow content (default is to auto-link shadow content)\n''2006.02.05 [1.0.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2005.12.09 [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.disableWikiLinks= {major: 1, minor: 5, revision: 0, date: new Date(2007,6,9)};\n\nif (config.options.chkDisableNonExistingWikiLinks==undefined) config.options.chkDisableNonExistingWikiLinks= false;\nif (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks=false;\nif (config.options.txtDisableWikiLinksList==undefined) config.options.txtDisableWikiLinksList="DisableWikiLinksList";\nif (config.options.chkAllowLinksFromShadowTiddlers==undefined) config.options.chkAllowLinksFromShadowTiddlers=true;\nif (config.options.txtDisableWikiLinksTag==undefined) config.options.txtDisableWikiLinksTag="excludeWikiWords";\n\n// find the formatter for wikiLink and replace handler with 'pass-thru' rendering\ninitDisableWikiLinksFormatter();\nfunction initDisableWikiLinksFormatter() {\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="wikiLink"; i++);\n config.formatters[i].coreHandler=config.formatters[i].handler;\n config.formatters[i].handler=function(w) {\n // supress any leading "~" (if present)\n var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;\n var title=w.matchText.substr(skip);\n var exists=store.tiddlerExists(title);\n var inShadow=w.tiddler && store.isShadowTiddler(w.tiddler.title);\n\n // check for excluded Tiddler\n if (w.tiddler && w.tiddler.isTagged(config.options.txtDisableWikiLinksTag))\n { w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }\n \n // check for specific excluded wiki words\n var t=store.getTiddlerText(config.options.txtDisableWikiLinksList)\n if (t && t.length && t.indexOf(w.matchText)!=-1)\n { w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }\n\n // if not disabling links from shadows (default setting)\n if (config.options.chkAllowLinksFromShadowTiddlers && inShadow)\n return this.coreHandler(w);\n\n // check for non-existing non-shadow tiddler\n if (config.options.chkDisableNonExistingWikiLinks && !exists)\n { w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }\n\n // if not enabled, just do standard WikiWord link formatting\n if (!config.options.chkDisableWikiLinks)\n return this.coreHandler(w);\n\n // just return text without linking\n w.outputText(w.output,w.matchStart+skip,w.nextMatch)\n }\n}\n\nTiddler.prototype.coreAutoLinkWikiWords = Tiddler.prototype.autoLinkWikiWords;\nTiddler.prototype.autoLinkWikiWords = function()\n{\n // DEBUG alert("processing: "+this.title);\n // if all automatic links are not disabled, just return results from core function\n if (!config.options.chkDisableWikiLinks)\n return this.coreAutoLinkWikiWords.apply(this,arguments);\n return false;\n}\n//}}}
Blah blah blah\n* blah\n* bleh\n* bluh
/***\nDropDownTagChooser\nhttp://simonbaird.com/mptw/#DropDownTagChooser\nRequires TagUtils\nExample:\n{{{<<selectUniqueTag Importance>>}}}\n<<selectUniqueTag Importance>>\nSee also ExampleTask (uses ViewTemplate to put a couple of these in the toolbar).\n***/\n//{{{\nvar selectUniqueTagOnChange = function(tiddler,newTag,tagGroup) {\n\n // can I do this a better way, ie not have to use store.getTiddler???\n // just use macro handler scope ???\n\n var t = store.getTiddler(tiddler);\n t.setUniqueTagFromGroup(newTag,tagGroup);\n\n // refresh visible tiddlers\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n\n return false;\n}\n\nconfig.macros.selectUniqueTag = {};\nconfig.macros.selectUniqueTag.handler =\n function(place,macroName,params,wikifier,paramString,tiddler) {\n\n var tagGroup = params[0];\n var label = params[1]?params[1]:params[0]+": ";\n\n var tagsInGroup = getTitles(store.getTaggedTiddlers(params[0]));\n\n var select = document.createElement("select");\n\n /*\n // dont know how to make this work..\n var update = function(e) {\n if (!e) var e = window.event;\n alert("here");\n return false;\n };\n select.onchange = update;\n */\n\n select.setAttribute("onchange","selectUniqueTagOnChange('"+\n tiddler.title+"',this.options[this.selectedIndex].text,'"+tagGroup+"');");\n\n select.setAttribute("style","font-size:90%;"); // evil. should use a class!\n\n // in case there is currently none of them\n if (!tiddler.hasAnyTag(tagsInGroup)) {\n var opt = document.createElement("option");\n opt.text = "-";\n opt.selected = true;\n try {\n // for IE\n select.add(opt);\n }\n catch(e) {\n select.appendChild(opt)\n };\n }\n\n for (var i=0;i<tagsInGroup.length;i++) {\n var opt = document.createElement("option");\n opt.text = tagsInGroup[i];\n if (tiddler.hasTag(tagsInGroup[i]))\n opt.selected = true;\n try {\n // for IE\n select.add(opt);\n }\n catch(e) {\n select.appendChild(opt)\n };\n }\n\n wikify(label,place,null,tiddler);\n place.appendChild(select);\n}\n\n//}}}
[[MptwEditTemplate]]
/***\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//}}}
Some final things about this TiddlyWiki:\n* See the site title "Things to Do"? Notice the little dashes on either side of it? Sometimes if you delete a bunch of tiddlers, the HoverMenu on the side disappears. Click the dashes on either side of the title to save and reload the file.\n* The HoverMenu on the right has a link to //See All Tiddlers// which will show you all tiddlers in this file. However, [[A-Z Tiddlers|Alphabetical_List_of_Tiddlers]] will show just the ones you create and a few others. Sometimes it makes it easier to find a tiddler you forgot about.\n* Search by entering your term in the search box and hitting the "Enter" key - I have turned off Incremental key-by-key searching by default, but you can enable it using the "backstage" and "tweak" menu.\n* I turned off animations as well, but you can enable them using the "backstage" and "tweak" menu.
/***\n|Name|FoldHeadingsPlugin|\n|Source|http://www.TiddlyTools.com/#FoldHeadingsPlugin|\n|Version|1.0.2|\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|automatically turn headings into slider-like panels that can be folded/unfolded with a single click|\nThis plugin defines a macro that automatically converts heading-formatted content into sliders that let you expand/collapse their content by clicking on individual headings.\n!!!!!Usage\n<<<\n{{{\n<<foldHeadings opened|closed tag tag tag...>>\n}}}\nwhere: ''opened'' or ''closed'' is a keyword indicating the initial state of the sections (default: opened), and ''tag tag tag...'' is an optional list of tags to match, so that the foldable effect is only applied to tiddlers that contain one (or more) of the indicated tags. \n\nWhen you place the macro in a tiddler, any heading-formatted content (i.e, "!" through "!!!!!") in that tiddler will automatically become //'fold-able'//, allowing you to expand/collapse the content that follows each heading simply by clicking on that heading. Each content section begins with the first element following a heading, and continues until either another heading is found or the end of the tiddler is reached. For example:\n{{{\n<<foldHeadings closed>>\n}}}\nis embedded in ''this'' tiddler in order to make all the headings it contains 'fold-able'. Note that the macro has been placed at the //end// of the tiddler because it only operates on *rendered* content. Thus, only headings that //precede// it in the same tiddler will become fold-able, as any headings that //follow// it are not actually rendered until //after// the macro has been processed.\n\nYou can further limit the effect of the macro within the tiddler by surrounding several headings in a "CSS class wrapper" ("""{{classname{...}}}""") or other containing DOM element (e.g., """@@display:inline;...@@""") and then embedding the {{{<<foldHeadings>>}}} macro inside that container (at the end)... only those headings that are also within that container will be made fold-able, instead of converting ''all'' the headings in that tiddler.\n\nConversely, if you want the fold-able ability to apply to the headings in //all// tiddlers, ''without having to alter //any// of those individual tiddlers'', you can add the macro to the end of your [[ViewTemplate]], so that it will be invoked after the content in each tiddler has been rendered, causing all headings they contain to automatically become fold-able. For example:\n{{{\n<span macro="foldHeadings closed"></span>\n}}}\nYou can also limit this effect to selected tiddlers by specifying one or more tags as additional macro parameters. For example:\n{{{\n<span macro="foldHeadings closed systemConfig"></span>\n}}}\nis only applied to headings contained in //plugin tiddlers// (i.e., tiddlers tagged with <<tag systemConfig>>), while headings in other tiddlers remain unaffected by the macro, even though it is embedded in the common [[ViewTemplate]] definition.\n<<<\n!!!!!Revisions\n<<<\n2007.12.06 [1.0.2] fix handling for empty sections when checking for sliderPanel/floatingPanel\n2007.12.02 [1.0.1] fix handling when content following a heading is already a sliderPanel/floatingPanel\n2007.12.01 [1.0.0] initial release\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.FoldHeadings= {major: 1, minor: 0, revision: 2, date: new Date(2007,12,6)};\n\nconfig.macros.foldHeadings = {\n guideText: "opened|closed className",\n showtip: "expand '%0'",\n hidetip: "hide '%0'",\n showlabel: "",\n hidelabel: "",\n html: "<span style='float:right;text-weight:normal;font-size:80%;' class='TiddlyLinkExisting'>%0 </span>",\n handler: function(place,macroName,params) {\n var show=params[0] && params.shift().toLowerCase()!="closed";\n if (params.length) { // if filtering by tag(s)\n var here=story.findContainingTiddler(place);\n if (here) var tid=store.getTiddler(here.getAttribute("tiddler"));\n if (!tid || !tid.tags.containsAny(params)) return; // in a tiddler and not tagged... do nothing...\n }\n var elems=place.parentNode.getElementsByTagName("*");\n var heads=[]; for (var i=0; i<elems.length; i++) { // get non-foldable heading elements\n var n=elems[i].nodeName; var foldable=hasClass(elems[i],"foldable");\n if ((n=="H1"||n=="H2"||n=="H3"||n=="H4"||n=="H5")&&!foldable)\n heads.push(elems[i]);\n }\n for (var i=0; i<heads.length; i++) { var h=heads[i]; // for each heading element...\n // find start/end of section content (up to next heading or end of content)\n var start=end=h.nextSibling; while (end && end.nextSibling) {\n var n=end.nextSibling.nodeName.toUpperCase();\n if (n=="H1"||n=="H2"||n=="H3"||n=="H4"||n=="H5") break;\n end=end.nextSibling;\n }\n if (start && hasClass(start,"sliderPanel")||hasClass(start,"floatingPanel")) continue; // heading is already a slider!\n var span=createTiddlyElement(null,"span",null,"sliderPanel"); // create container\n span.style.display=show?"inline":"none"; // set initial display state\n h.parentNode.insertBefore(span,start); // and insert it following the heading element\n // move section elements into container...\n var e=start; while (e) { var next=e.nextSibling; span.insertBefore(e,null); if (e==end) break; e=next; }\n // set heading label/tip/cursor...\n h.title=(show?this.hidetip:this.showtip).format([h.textContent])\n h.innerHTML=this.html.format([show?this.hidelabel:this.showlabel])+h.innerHTML;\n h.style.cursor='pointer';\n addClass(h,"foldable"); // so we know it been done (and to add extra styles)\n h.onclick=function() {\n var panel=this.nextSibling; var show=panel.style.display=="none";\n // update panel display state\n if (config.options.chkAnimate) anim.startAnimating(new Slider(panel,show));\n else panel.style.display = show?"inline":"none";\n // update heading label/tip\n this.removeChild(this.firstChild); // remove existing label\n var fh=config.macros.foldHeadings; // abbreviation for readability...\n this.title=(show?fh.hidetip:fh.showtip).format([this.textContent])\n this.innerHTML=fh.html.format([show?fh.hidelabel:fh.showlabel])+this.innerHTML;\n }\n } \n }\n}\n//}}}\n// //<<foldHeadings closed>>
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.8 (2007-04-12)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|\n|''Copyright:''|© 2005-2007 [[abego Software|http://www.abego-software.de]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.8 (2007-04-12)\n** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)\n* v1.0.7 (2007-03-28)\n** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)\n* v1.0.6 (2006-09-16)\n** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.\n** Support "begin", "end" and "none" expressions in "write" action\n* v1.0.5 (2006-02-05)\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox 1.5.0.1\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nif (!window.abego) window.abego = {};\n\nversion.extensions.ForEachTiddlerPlugin = {\n major: 1, minor: 0, revision: 8, \n date: new Date(2007,3,12), \n source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",\n licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",\n copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"\n};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {\n major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\nabego.parseNamedParameter = function(name, parameter, i) {\n var beginExpression = null;\n if ((i < parameter.length) && parameter[i] == name) {\n i++;\n if (i >= parameter.length) {\n throw "Missing text behind '%0'".format([name]);\n }\n \n return config.macros.forEachTiddler.paramEncode(parameter[i]);\n }\n return null;\n}\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "begin" option\n var beginExpression = abego.parseNamedParameter("begin", parameter, p);\n if (beginExpression !== null) \n p += 2;\n var endExpression = abego.parseNamedParameter("end", parameter, p);\n if (endExpression !== null) \n p += 2;\n var noneExpression = abego.parseNamedParameter("none", parameter, p);\n if (noneExpression !== null) \n p += 2;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n if (count > 0 && beginExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);\n \n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (count > 0 && endExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);\n\n if (count == 0 && noneExpression) \n text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);\n \n\n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.\n viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n var tiddlyWiki = new TiddlyWiki();\n\n // Starting with TW 2.2 there is a helper function to import the tiddlers\n if (tiddlyWiki.importTiddlyWiki) {\n if (!tiddlyWiki.importTiddlyWiki(content))\n throw "File '"+path+"' is not a TiddlyWiki.";\n tiddlyWiki.dirty = false;\n return tiddlyWiki;\n }\n \n // The legacy code, for TW < 2.2\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s"); \n return localPath;\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[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***/
TiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.\n\n!Header\n!!Header\n!!!Header\nHeaders are created with an exclamation point like this\n!Header 1 \n!!Header 2 \n!!!Header 3\n----\n{{cleartablethree{\n''Unordered Lists'' \n* Make bulleted lists with asterisks\n** To indent, just add more asterisks...\nThese were created by typing\n * Make bulleted lists with asterisks \n**To indent, just add more asterisks...\n----\n|''Links'' ||\n|You can include a link to ||\n|[[a specific file|file://c:/autoexec.bat]] |[[a specific file¦ file://c:/autoexec.bat ]] |\n|[[a Windows folder|file:///c:/windows/]] |[[a Windows folder¦ file:///c:/windows/ ]] |\n|[[a web site|http://google.com]] |[[a web site¦ http://google.com ]] |\n----\n''Images''\n[img[http://www.thechicagoschool.edu/resources/content/1/4/9/3/images/aba_cover_sm.jpg]]\n[img[http://www.thechicagoschool.edu/resources/content/1/4/9/3/images/aba_cover_sm.jpg ]]\n----\n|''Horizontal Lines'' |---- (4 dashes)|\n----\n| ||\n|''Other Formatting'' |These were created by typing|\n|''Bold'' |"Bold" (two single quotes next to each other)|\n|__Underline__ |__Underline__|\n|//Italic// |\\Italic\\|\n|@@highlight@@ |@ @ highlight@ @ |\n----\n{{justifyright{\nThis line will be right-aligned.\n}}}\n| |This was done by typing|\n| |{{justifyright{|\n| |This line will be right-aligned.|\n| |}}}|\n----\n{{boxone{\nSomething here\n\n{{boxone{ \nSomething here \n}}} \n}}}\n{{boxtwo{\nSomething here\n\n{{boxtwo{ \nSomething here \n}}} \n}}}\n{{boxthree{\nSomething here\n\n\n{{boxthree{ \nSomething here \n}}} \n}}}
/***\n|Name|FlickrGreetingMacro|\n|Created by|PeterKirkland|\n|Version|1.0.1|\n|Requires|~TW2.x|\n!Description\nIt replicates the random greeting messages from\n[[Flickr|http://www.flickr.com/]] in a TiddlyWiki macro.\n\n!Examples\n|!Source|!Output|h\n|{{{<<flickrGreeting>>}}}|<<flickrGreeting>>|\n(You can use (single or double) quotes or double square brackets for params with spaces)\n\n!Code\n***/\n//{{{\n\n// this part is not actually required but useful to other people using your plugin\nversion.extensions.FlickrGreetingMacro = { major: 1, minor: 0, revision: 1, date: new Date(2006,3,24) };\n\nconfig.macros.flickrGreetingCookie = {};\nconfig.macros.flickrGreetingCookie.handler = function (place,name,params) {\n wikify("<<flickrGreeting " + config.options.txtUserName + ">>", place);\n}\n\nconfig.macros.flickrGreeting = {};\nconfig.macros.flickrGreeting.handler = function (place,name,params) {\n //List of greetings:\n var WelcomeMessage = [\n "Identify and nurture winners",\n "Cultivate empathy and trust",\n "Read between the lines to understand what worries people",\n "Know when to engage conflict, seeking either the win for today, or the win for tomorrow.",\n "Motivation requires enthusiasm and empowerment. Delegate and empower. Follow up to make sure progress stays on track.",\n "Keep your head when all about you are losing theirs... and blaming it on you",\n "Bear it to hear the truth you've spoken twisted by knaves",\n "Fill the unforgiving minute with sixty seconds' worth of distance run",\n "Talk with crowds and keep your virtue, walk with kings but remember the common touch",\n "I never met a bar-b-q'ed chicken I didn't like"\n ];\n //randomness:\n var index = Math.floor(Math.random() * WelcomeMessage.length);\n //output:\n var who = params.length > 0 ? (" "+params[0]) : "";\n wikify(WelcomeMessage[index] + who /* + "!" */, place);\n}\n\n//}}}
/***\n|Name|HTMLFormattingPlugin|\n|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|\n|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|\n|Version|2.3.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|'HTML' formatter|\n|Description|embed wiki syntax formatting inside of HTML content|\nThe ~HTMLFormatting plugin allows you to ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.\n!!!!!Documentation\n>see [[HTMLFormattingPluginInfo]]\n!!!!!Revisions\n<<<\n2008.10.02 [2.3.0] added use of {{{<nowiki>}}} marker to bypass all wikification inside a specific HTML block\n2008.09.19 [2.2.0] in wikifyTextNodes(), don't wikify the contents of STYLE nodes (thanks to MorrisGray for bug report)\n| see [[HTMLFormattingPluginInfo]] for additional revision details |\n2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.HTMLFormattingPlugin= {major: 2, minor: 3, revision: 0, date: new Date(2008,10,2)};\n\n// find the formatter for HTML and replace the handler\ninitHTMLFormatter();\nfunction initHTMLFormatter()\n{\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n var html=lookaheadMatch[1];\n // if <nowiki> is present, just let browser handle it!\n if (html.indexOf('<nowiki>')!=-1)\n createTiddlyElement(w.output,"span").innerHTML=html;\n else {\n // if <hide linebreaks> is present, suppress wiki-style literal handling of newlines\n if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(/\sn/g,' ');\n // remove all \sr's added by IE textarea and mask newlines and macro brackets\n html=html.replace(/\sr/g,'').replace(/\sn/g,'\s\sn').replace(/<</g,'%%(').replace(/>>/g,')%%');\n // create span, let browser parse HTML\n var e=createTiddlyElement(w.output,"span"); e.innerHTML=html;\n // then re-render text nodes as wiki-formatted content\n wikifyTextNodes(e);\n }\n w.nextMatch = this.lookaheadRegExp.lastIndex; // continue parsing\n }\n }\n}\n\n// wikify #text nodes that remain after HTML content is processed (pre-order recursion)\nfunction wikifyTextNodes(theNode)\n{\n function unmask(s) { return s.replace(/\s%%\s(/g,'<<').replace(/\s)\s%%/g,'>>').replace(/\s\sn/g,'\sn'); }\n switch (theNode.nodeName.toLowerCase()) {\n case 'style': case 'option': case 'select':\n theNode.innerHTML=unmask(theNode.innerHTML);\n break;\n case 'textarea':\n theNode.value=unmask(theNode.value);\n break;\n case '#text':\n var txt=unmask(theNode.nodeValue);\n var newNode=createTiddlyElement(null,"span");\n theNode.parentNode.replaceChild(newNode,theNode);\n wikify(txt,newNode);\n break;\n default:\n for (var i=0;i<theNode.childNodes.length;i++)\n wikifyTextNodes(theNode.childNodes.item(i)); // recursion\n break;\n }\n}\n//}}}
/***\n| Name:|HideWhenPlugin|\n| Description:|Allows conditional inclusion/exclusion in templates|\n| Version:|1.0.2|\n| Date:|19-Sep-2006|\n| Source:|http://mptw.tiddlyspot.com/#HideWhenMacro|\n| Author:|Simon Baird <simon.baird@gmail.com>|\nFor use in ViewTemplate and EditTemplate. Eg\n{{{<div macro="showWhen tiddler.tags.contains('Task')">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\nmerge(config.macros,{\n hideWhen: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n if (eval(paramString)) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n }},\n showWhen: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n config.macros.hideWhen.handler(place,macroName,params,wikifier,'!('+paramString+')',tiddler);\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//}}}
|[[MainMenu]] | <<top>>|\n|[[Instructions]] | <<closeAll>>|\n|[[Your Menu|TheMainMenu]] | <<newTiddler>>|\n|[[Task Planner]] | [[Options]]|\n\n|[[A-Z Tiddlers|Alphabetical_List_of_Tiddlers]] |[[See All Tiddlers|SideBarTabs]]|\n\n<<search>>\n\n<<saveChanges>>
/***\n|Name|HoverMenuPlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#HoverMenuPlugin|\n|Version|1.11|\n|Requires|~TW2.x|\n!Description:\nProvides a hovering menu on the edge of the screen for commonly used commands, that scrolls with the page.\n\n!Demo:\nObserve the hovering menu on the right edge of the screen.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nTo customize your HoverMenu, edit the HoverMenu shadow tiddler.\n\nTo customize whether the menu sticks to the right or left edge of the screen, and its start position, edit the HoverMenu configuration settings part of the code below. It's well documented, so don't be scared!\n\nThe menu has an id of hoverMenu, in case you want to style the buttons in it using css.\n\n!Notes:\nSince the default HoverMenu contains buttons for toggling the side bar and jumping to the top of the screen and to open tiddlers, the ToggleSideBarMacro, JumpMacro and the JumpToTopMacro are included in this tiddler, so you dont need to install them separately. Having them installed separately as well could lead to complications.\n\nIf you dont intend to use these three macros at all, feel free to remove those sections of code in this tiddler.\n\n!To Do:\n* rework code to allow multiple hovering menus in different positions, horizontal etc.\n* incorporate code for keyboard shortcuts that correspond to the buttons in the hovermenu\n\n!History:\n*03-08-06, ver 1.1.2: compatibility fix with SelectThemePlugin\n*03-08-06, ver 1.11: fixed error with button tooltips\n*27-07-06, ver 1.1 : added JumpMacro to hoverMenu\n*23-07-06\n\n!Code\n***/\n\n/***\nstart HoverMenu plugin code\n***/\n//{{{\nconfig.hoverMenu={};\n//}}}\n\n/***\nHoverMenu configuration settings\n***/\n//{{{\nconfig.hoverMenu.settings={\n align: 'right', \n x: 10, \n y: 50 \n };\n//}}}\n\n//{{{\n//continue HoverMenu plugin code\nconfig.hoverMenu.handler=function()\n{ \n if (!document.getElementById("hoverMenu"))\n {\n var theMenu = createTiddlyElement(document.getElementById("contentWrapper"), "div","hoverMenu");\n theMenu.setAttribute("refresh","content");\n theMenu.setAttribute("tiddler","HoverMenu");\n var menuContent = store.getTiddlerText("HoverMenu");\n wikify(menuContent,theMenu);\n }\n\n var Xloc = this.settings.x;\n Yloc =this.settings.y;\n var ns = (navigator.appName.indexOf("Netscape") != -1);\n function SetMenu(id)\n {\n var GetElements=document.getElementById?document.getElementById(id):document.all?document.all[id]:document.layers[id];\n if(document.layers)GetElements.style=GetElements;\n GetElements.sP=function(x,y){this.style[config.hoverMenu.settings.align]=x +"px";this.style.top=y +"px";};\n GetElements.x = Xloc;\n GetElements.y = findScrollY();\n GetElements.y += Yloc;\n return GetElements;\n }\n window.LoCate_XY=function()\n {\n var pY = findScrollY();\n ftlObj.y += (pY + Yloc - ftlObj.y)/15;\n ftlObj.sP(ftlObj.x, ftlObj.y);\n setTimeout("LoCate_XY()", 10);\n }\n ftlObj = SetMenu("hoverMenu");\n LoCate_XY();\n};\n\nwindow.old_lewcid_hovermenu_restart = restart;\nrestart = function()\n{\n window.old_lewcid_hovermenu_restart();\n config.hoverMenu.handler();\n};\n\nsetStylesheet();\n\n\nconfig.macros.renameButton={};\nconfig.macros.renameButton.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n\n if (place.lastChild.tagName!="BR")\n {\n place.lastChild.firstChild.data = params[0];\n if (params[1]) {place.lastChild.title = params[1];}\n }\n};\n\nconfig.shadowTiddlers["HoverMenu"]="<<top>>\sn<<toggleSideBar>><<renameButton '>' >>\sn<<jump j '' top>>\sn<<saveChanges>><<renameButton s 'Save TiddlyWiki'>>\sn<<newTiddler>><<renameButton n>>\sn";\n//}}}\n//end HoverMenu plugin code\n\n//Start ToggleSideBarMacro code\n//{{{\nconfig.macros.toggleSideBar={};\n\nconfig.macros.toggleSideBar.settings={\n styleHide : "#sidebar { display: none;}\sn"+"#contentWrapper #displayArea { margin-right: 1em;}\sn"+"",\n styleShow : " ",\n arrow1: "«",\n arrow2: "»"\n};\n\nconfig.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var tooltip= params[1]||'toggle sidebar';\n var mode = (params[2] && params[2]=="hide")? "hide":"show";\n var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;\n var label= (params[0]&¶ms[0]!='.')?params[0]+" "+arrow:arrow;\n var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");\n if (mode == "hide")\n { \n (document.getElementById("sidebar")).setAttribute("toggle","hide");\n setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");\n }\n};\n\nconfig.macros.toggleSideBar.onToggleSideBar = function(){\n var sidebar = document.getElementById("sidebar");\n var settings = config.macros.toggleSideBar.settings;\n if (sidebar.getAttribute("toggle")=='hide')\n {\n setStylesheet(settings.styleShow,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","show");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);\n }\n else\n { \n setStylesheet(settings.styleHide,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","hide");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);\n }\n\n return false;\n}\n\nsetStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\sn","ToggleSideBarButtonStyles");\n//}}}\n//end ToggleSideBarMacro code\n\n//start JumpToTopMacro code\n//{{{\nconfig.macros.top={};\nconfig.macros.top.handler=function(place,macroName)\n{\n createTiddlyButton(place,"Top","Jump to Top",this.onclick);\n}\nconfig.macros.top.onclick=function()\n{\n window.scrollTo(0,0);\n};\n\nconfig.commands.top =\n{\n text:" Top ",\n tooltip:"Jump to the top of the screen"\n};\n\nconfig.commands.top.handler = function(event,src,title)\n{\n window.scrollTo(0,0);\n}\n//}}}\n//end JumpToStartMacro code\n\n//start JumpMacro code\n//{{{\nconfig.macros.jump= {};\nconfig.macros.jump.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = (params[0] && params[0]!=".")? params[0]: 'jump';\n var tooltip = (params[1] && params[1]!=".")? params[1]: 'Jump to an open tiddler';\n var top = (params[2] && params[2]=='top') ? true: false; \n\n var btn =createTiddlyButton(place,label,tooltip,this.onclick);\n if (top==true)\n btn.setAttribute("top","true")\n}\n\nconfig.macros.jump.onclick = function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var top = theTarget.getAttribute("top");\n var popup = Popup.create(this);\n if(popup)\n {\n if(top=="true")\n {createTiddlyButton(createTiddlyElement(popup,"li"),'Top ↑','Top of TW',config.macros.jump.top);\n createTiddlyElement(popup,"hr");}\n \n story.forEachTiddler(function(title,element) {\n createTiddlyLink(createTiddlyElement(popup,"li"),title,true);\n });\n }\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nconfig.macros.jump.top = function()\n{\n window.scrollTo(0,0);\n}\n//}}}\n//end JumpMacro code\n\n//utility functions\n//{{{\nPopup.show = function(unused,slowly)\n{\n var curr = Popup.stack[Popup.stack.length-1];\n var rootLeft = findPosX(curr.root);\n var rootTop = findPosY(curr.root);\n var rootHeight = curr.root.offsetHeight;\n var popupLeft = rootLeft;\n var popupTop = rootTop + rootHeight;\n var popupWidth = curr.popup.offsetWidth;\n var winWidth = findWindowWidth();\n if (isChild(curr.root,'hoverMenu'))\n var x = config.hoverMenu.settings.x;\n else\n var x = 0;\n if(popupLeft + popupWidth+x > winWidth)\n popupLeft = winWidth - popupWidth -x;\n if (isChild(curr.root,'hoverMenu'))\n {curr.popup.style.right = x + "px";}\n else\n curr.popup.style.left = popupLeft + "px";\n curr.popup.style.top = popupTop + "px";\n curr.popup.style.display = "block";\n addClass(curr.root,"highlight");\n if(config.options.chkAnimate)\n anim.startAnimating(new Scroller(curr.popup,slowly));\n else\n window.scrollTo(0,ensureVisible(curr.popup));\n}\n\nwindow.isChild = function(e,parentId) {\n while (e != null) {\n var parent = document.getElementById(parentId);\n if (parent == e) return true;\n e = e.parentNode;\n }\n return false;\n};\n//}}}
<<importTiddlers>>
/***\n|''Name:''|InLine Tabs Plugin|\n|''Author:''|Saq Imtiaz|\n|''Source:''|[[Lewcid TW|http://tw.lewcid.org/sandbox/]]|\n\n[[Example InLine Tabs]]\n\n!Code\n***/\n\n//{{{\nconfig.formatters.unshift( {\n name: "inlinetabs",\n match: "\s\s<tabs",\n lookaheadRegExp: /(?:<tabs (.*)>\sn)((?:.|\sn)*?)(?:\sn<\s/tabs>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var cookie = lookaheadMatch[1];\n var wrapper = createTiddlyElement(null,"div",null,cookie);\n var tabset = createTiddlyElement(wrapper,"div",null,"tabset");\n tabset.setAttribute("cookie",cookie);\n var validTab = false;\n var firstTab = '';\n var tabregexp = /(?:<tab (.*)>)(?:(?:\sn)?)((?:.|\sn)*?)(?:<\s/tab>)/mg;\n while((m = tabregexp.exec(lookaheadMatch[2])) != null)\n {\n if (firstTab == '') firstTab = m[1];\n var tab = createTiddlyButton(tabset,m[1],m[1],story.onClickInlineTab,"tab tabUnselected");\n tab.setAttribute("tab",m[1]);\n tab.setAttribute("content",m[2]);\n tab.title = m[1];\n if(config.options[cookie] == m[1])\n validTab = true;\n }\n if(!validTab)\n config.options[cookie] = firstTab;\n w.output.appendChild(wrapper);\n story.switchInlineTab(tabset,config.options[cookie]);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n})\n\nStory.prototype.switchInlineTab = function(tabset,tab)\n{\n var cookie = tabset.getAttribute("cookie");\n var theTab = null\n var nodes = tabset.childNodes;\n for(var t=0; t<nodes.length; t++)\n if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)\n {\n theTab = nodes[t];\n theTab.className = "tab tabSelected";\n }\n else\n nodes[t].className = "tab tabUnselected"\n if(theTab)\n {\n if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")\n tabset.parentNode.removeChild(tabset.nextSibling);\n var tabContent = createTiddlyElement(null,"div",null,"tabContents");\n tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);\n wikify(theTab.getAttribute("content"),tabContent);\n if(cookie)\n {\n config.options[cookie] = tab;\n saveOptionCookie(cookie);\n }\n }\n}\n \nStory.prototype.onClickInlineTab = function(e)\n{\n story.switchInlineTab(this.parentNode,this.getAttribute("tab"));\n return false;\n}\n//}}}
I'll assume you know the basics of using a TiddlyWiki, and go from there.\n\n![[TheMainMenu]]\n\n{{justifycenter{\n[img[http://www.psychpage.com/wiki/rniolon_images/explain01.gif]] \n}}}\nClick [[TheMainMenu]] from here or the hovering menu on the right. This shows active projects and tasks for you. [[Reminders]] will show you important dates you've set reminders for and let you add new ones. [[Projects by Month]]... we'll come back to.\n\n\n!Creating Tasks\nEvery task should have three things: a //context// for where you do it, a //priority//, and a //person// responsible for it. Each task is assigned to a tiddler, and the //context//, //priority//, and //person// are recorded using the tags.\n\n*Let's start with the //context//. There's already one context tag included called [[at Computer]]. Click [[New Tiddler]], give it a name for your context (like "while Running Errands" or "at Meeting with Barb"), and tag it "Context" to create a new one. The description for the context is optional.\n\n*Next is //priority//. You should tag tasks with "MIT" only when they are the most important tasks for the day. Start each day with a morning ''Daily Review'' to review all your tasks and decide what is ''MIT'' then. End each day with an evening ''Daily Review'' and you will know what you accomplished, and what MIT must be on the list for tomorrow.\n\n*Finally is //person//. There's already one person tag included called [[Led by Rich]]. That's me. Click [[New Tiddler]], rename it "Led by //Name//" (//Name// could be "Me", your name, or the name of someone you supervise), and tag it "Project is" (I know it may seem odd, but put them together - "Project is" and "Led by //Name//". The description for the person is optional, but if it is someone else, this might be a good place to put their contact information or job description, for example. \n\nNext, you need a way to track all tasks assigned to that person. That's what [[TheMainMenu]] is for. You should click the "edit" button to personalize the [[TheMainMenu]] for the "Led by" person ("Me", your name, or the name of someone you supervise). If there are several people you want to do this for, just open a [[New Tiddler]], copy and paste the contexts of [[TheMainMenu]] into it, and personalize it for the new person. \n\n{{justifycenter{\n[img[http://www.psychpage.com/wiki/rniolon_images/explain02.gif]] \n}}}\n\n!Next - [[Managing Projects]]
/***\n|Launch Application Plugin|\n|Authors: Lyall Pearce, modified by Bradley Meck|\n|Bug Finders: HarryC|\n|Source: http://bradleymeck.tiddlyspot.com/#LaunchApplicationPlugin|\n|License: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|Version: 1.1.0|\n|Description: Launch an application from within TiddlyWiki using a button|\n|Usage: {{{<<LaunchApplication "buttonLabel" "tooltip" "application" "argument1" "argument2"...>>}}}|\n\n!Example\n@@PLEASE DO NOT USE THIS IF YOU ARE WORRIED ABOUT SECURITY,\nTIDDLYSPOT, LYALL PEARCE AND MYSELF ARE NOT RESPONSIBLE FOR ANY MIS-USE OF THIS PLUGIN@@\n{{{\n<<LaunchApplication "Open Notepad" "Text Editing"\n"file:///c:/Windows/notepad.exe">>\n}}}\n<<LaunchApplication "Open Notepad" "Text Editing"\n"file:///c:/Windows/notepad.exe">>\n\n{{{\n<<LaunchApplication "C Drive" "Folder" "file:///c:/">>\n}}}\n<<LaunchApplication "C Drive" "Folder" "file:///c:/">>\n\n!To Do\n*Support true XPaths\n**relative paths\n***{{{..}}} : parent-directory\n***{{{/}}} : root-directory\n**wild-cards\n***{{{*}}} : unknown-name\n\n!Revisions\n*11/07/2006 : Problem with application parameters was fixed in IE.\n*11/06/2006 : Problem with application parameters appeared again. Fixed in Firefox for now. Thanks to HarryC for bringing up the bug.\n*11/04/2006 : Problem with application parameters was fixed so that they work now.\n*10/29/2006 : Removed Alert of the address being launched and added support for non-application files in Firefox. Fixed a problem from the current directory being recieved by the W.Shell object by using decodeURI. Added absolute paths if the URL has "file:///" as its beginning. Clicking did not return false and was firing beforeUnLoad(), fixed that.\n*10/28/2006 : Added Support for Firefox in Windows (changes how nsILocalFile is recieved) and changes the functions to use decodeURI for more compatibility.\n\n***/\n//{{{\nversion.extensions.LaunchApplication = {major: 1, minor: 1, revision: 0, date: new Date(2006,11,07)};\nconfig.macros.LaunchApplication = {};\n\nfunction LaunchApplication(appToLaunch,appParams) {\n if(! appToLaunch)\n return;\n if(config.browser.isIE) {\n // want where the tiddly is actually located, excluding tiddly html file\n var tiddlyBaseDir = self.location.pathname.substring(0,self.location.pathname.lastIndexOf("\s\s")+1);\n if(!tiddlyBaseDir || tiddlyBaseDir == "") {\n tiddlyBaseDir = self.location.pathname.substring(0,self.location.pathname.lastIndexOf("/")+1);\n }\n // if Returns with a leading slash, we don't want that.\n if(tiddlyBaseDir.substring(0,1) == "/") {\n tiddlyBaseDir = tiddlyBaseDir.substring(1);\n }\n var theShell = new ActiveXObject("WScript.Shell");\n if(theShell) {\n // the app name may have a directory component, need that too\n // as we want to start with current working dir as the location\n // of the app.\n if(appToLaunch.indexOf("file:///") == 0)\n {\n tiddlyBaseDir = "";\n appToLaunch = appToLaunch.substring(8);\n }\n var appDir = appToLaunch.substring(0, appToLaunch.lastIndexOf("\s\s"));\n if(! appDir || appDir == "") {\n appDir = appToLaunch.substring(0, appToLaunch.lastIndexOf("/"));\n }\n appParams = appParams.length>0?" \s""+appParams.join("\s" \s"")+"\s"":"";\n theShell.CurrentDirectory = decodeURI(tiddlyBaseDir + appDir);\n var commandString = ('"' +decodeURI(tiddlyBaseDir+appToLaunch) + '" ' + appParams);\n pluginInfo.log.push(commandString);\n theShell.run(commandString);\n } else {\n pluginInfo.log.push("WScript.Shell object not created");\n }\n } else {\n // want where the tiddly is actually located, excluding tiddly html file\n var tiddlyBaseDir = self.location.href.substring(0,self.location.href.lastIndexOf("\s\s")+1);\n if(!tiddlyBaseDir || tiddlyBaseDir == "") {\n tiddlyBaseDir = self.location.href.substring(0,self.location.href.lastIndexOf("/")+1);\n }\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);\n if(appToLaunch.indexOf("file:///") == 0)\n {\n tiddlyBaseDir = "";\n appToLaunch = appToLaunch.substring(8);\n }\n file.initWithPath(decodeURI(tiddlyBaseDir+appToLaunch).replace(/\s//g,"\s\s"))\n if (file.isFile() && file.isExecutable()) {\n var process = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);\n process.init(file);\n process.run(false, appParams, appParams.length);\n }\n else\n {\n file.launch();\n }\n }\n};\n\nconfig.macros.LaunchApplication.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n // 0=ButtonText, 1=toolTop, 2=AppToLaunch, 3...AppParameters\n if (params[0] && params[1] && params[2]) {\n var theButton = createTiddlyButton(place, params[0], params[1], onClickLaunchApplication);\n theButton.setAttribute("appToLaunch", params[2]);\n var appParams = [];\n for (var i = 3; i <params.length; i++) {\n appParams.push(params[i]);\n }\n theButton.appParameters = appParams;\n return;\n }\n}\n\nfunction onClickLaunchApplication(e) {\n var theAppToLaunch = this.getAttribute("appToLaunch");\n\n var theAppParams = this.appParameters ;\n LaunchApplication(theAppToLaunch,theAppParams);\n return false;\n }\n\n//}}}
These are tasks I'm responsible for... which is most everything I track...
<<forEachTiddler\n where \n 'tiddler.tags.contains("Priority 0 - MIT")\n && !tiddler.tags.contains("Done")\n '\n\nsortBy \n 'tiddler.title' \n ascending\n>>
Welcome to my [["Things To Do" TiddlyWiki|TiddlyWiki]]. I got the idea from [[Simon Baird's GTD Wiki|http://monkeygtd.tiddlyspot.com/#Demo]]. I wanted a newer version (though he has one up now) and one that would work more like I do. More specifically:\n* some tasks are "one time" tasks, while other tasks are part of a project I do more than once a year (like prepare for student registration each semester) which means they are never really "Done" \n* I spend a lot of time in meetings and moving around, and so need an "updateable" task list to take with me\n* I wanted to be able to assign tasks to others and track them separately\n\nSo, after a year or so of creating and using and tweaking and using ... here it is! \n\n[[Right click here|thingstodo.html]] and choose "Save/Save Link As" to download your own copy.\n\n* See [[Instructions]] on using it, information on [[Managing Projects]], [[Managing Tasks]], and [[Using The Task Planner]] (though remember that while testing it online you can't add new tasks or edit existing ones)\n* See [[Final Points]] about using this tiddler\n* After you rename [[TheMainMenu]], change the DefaultTiddlers so it opens to your task list every time\n* See [[Formatting and Editing]] options\n* Change the [[SiteTitle]]\n* Set [[Options]] including adding your name so that every tiddler you edit will show you as the editor
In this next step we'll discuss Projects. Projects are collections of related tasks. Click "Create a New Project" from your new ~TheMainMenu to start a blank one. All projects must begin with "Project: " (notice the space after the colon) but the rest can be whatever you like (like "Department Tasks" or "Home Repairs"...). \n\n{{justifycenter{\n[img[http://www.psychpage.com/wiki/rniolon_images/explain03.gif]] \n}}}\n\nI named this one "Project: Department Tasks" and saved it.\n\n{{justifycenter{\n[img[http://www.psychpage.com/wiki/rniolon_images/explain04.gif]] \n}}}\n\nRemember I mentioned [[Projects by Month]], and said we'd come back to it? If you tag projects as being due in a certain month or months, they will show up in this tiddler, organized by month.\n\n!Next [[Managing Tasks]]
!Creating A Task\n\n{{justifycenter{\n[img[http://www.psychpage.com/wiki/rniolon_images/explain05.gif]] \n}}}\n\nYou can click "Create a New Task" to create one, or go to the priority level and save yourself a step by creating it there. After you create a task, you can add change Priorities, Contexts, or Status (Done, Active, Pending). The task will show up on TheMainMenu under the matching Priority tab, and on the Project tiddler. \n\n!Creating a Reminder\nThe [[Reminders]] feature is based on the [[ReminderPlugin]] by Jeremy Sheeley. Click [[Reminders]] on TheMainMenu and you'll see what's Overdue on one side, and what's Upcoming on the other. I have it set to show you what's 120 past due or due in the next 120 days. Edit it to change the 120 to another time frame.\n\nYou can [[Add a Reminder|Reminder]] here as well. The reminder gets stored in the [[Add a Reminder|Reminder]] tiddler, so you can edit this tiddler and change or delete it if you want later. You can click the reminder title to add notes to it, or click the "Done" box to change it to "Done" status.\n\n!Last [[Using The Task Planner]]
[[MonkeyPirateTiddlyWiki|http://mptw.tiddlyspot.com]] is a distribution of [[TiddlyWiki|http://www.tiddlywiki.com/]] created by Simon Baird. See [[the web site|http://mptw.tiddlyspot.com/]] for more information.\n!!Upgrading ~MonkeyPirateTiddlyWiki\nThis "empty" ~MonkeyPirateTiddlyWiki file comes pre-installed with the core ~MonkeyPirateTiddlyWiki plugins. You can upgrade these core plugins to the latest version by doing the following:\n* Click ImportTiddlers\n* Click "Choose..." and select "~MptwUpgradeURL"\n* Click "fetch"\n* Click the checkbox in the first column heading to select all tiddlers\n* Click "More actions..." and select "Import these tiddlers"\n* Click "OK" to confirm you want to overwrite the tiddlers\n* Save and reload
<!--{{{-->\n<!--- http://mptw.tiddlyspot.com/#MptwEditTemplate ($Rev: 1829 $) --->\n<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>\n<div class="title" macro="view title"></div>\n<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>\n<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>\n<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>\n<div macro="showWhenExists EditPanelTemplate">[[EditPanelTemplate]]</div>\n<div class="editor" macro="edit text"></div>\n<div macro="showWhen tiddler.title.contains('Project: ')"><strong>Remember:</strong> Project names must begin with "Project: "</div>\n<div macro="showWhen tiddler.tags.contains('at ')"><strong>Remember:</strong> Contexts must begin with "at"</div>\n<!--}}}-->
/***\n| Name|MptwLayoutPlugin|\n| Description|A package containing templates and css for the MonkeyPirateTiddlyWiki layout|\n| Version|3.0 ($Rev: 1845 $)|\n| Source|http://mptw.tiddlyspot.com/#MptwLayoutPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n!Notes\nPresumes you have TagglyTaggingPlugin installed. To enable this you should have a PageTemplate containing {{{[[MptwPageTemplate]]}}} and similar for ViewTemplate and EditTemplate.\n***/\n//{{{\n// used in MptwViewTemplate\nconfig.mptwDateFormat = 'MM/DD/YY';\nconfig.mptwJournalFormat = 'Journal MM/DD/YY';\n\nconfig.shadowTiddlers.GettingStarted += "\sn\snSee also MonkeyPirateTiddlyWiki.";\n\n//}}}\n\n//{{{\nmerge(config.shadowTiddlers,{\n\n'MptwEditTemplate':[\n "<!--{{{-->",\n "<!--- http://mptw.tiddlyspot.com/#MptwEditTemplate ($Rev: 1829 $) --->",\n "<div class=\s"toolbar\s" macro=\s"toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler\s"></div>",\n "<div class=\s"title\s" macro=\s"view title\s"></div>",\n "<div class=\s"editLabel\s">Title</div><div class=\s"editor\s" macro=\s"edit title\s"></div>",\n "<div class=\s"editLabel\s">Tags</div><div class=\s"editor\s" macro=\s"edit tags\s"></div>",\n "<div class=\s"editorFooter\s"><span macro=\s"message views.editor.tagPrompt\s"></span><span macro=\s"tagChooser\s"></span></div>",\n "<div macro=\s"showWhenExists EditPanelTemplate\s">[[EditPanelTemplate]]</div>",\n "<div class=\s"editor\s" macro=\s"edit text\s"></div>",\n "<!--}}}-->"\n].join("\sn"),\n\n'MptwPageTemplate':[\n "<!--{{{-->",\n "<!-- http://mptw.tiddlyspot.com/#MptwPageTemplate ($Rev: 1829 $) -->",\n "<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>",\n " <div class='headerShadow'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> ",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n " <div class='headerForeground'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> ",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n "</div>",\n "<!-- horizontal MainMenu -->",\n "<div id='topMenu' refresh='content' tiddler='MainMenu'></div>",\n "<!-- original MainMenu menu -->",\n "<!-- <div id='mainMenu' 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].join("\sn"),\n\n'MptwStyleSheet':[\n "/*{{{*/",\n "/* http://mptw.tiddlyspot.com/#MptwStyleSheet ($Rev: 2246 $) */",\n "",\n "/* a contrasting background so I can see where one tiddler ends and the other begins */",\n "body {",\n " background: [[ColorPalette::TertiaryLight]];",\n "}",\n "",\n "/* sexy colours and font for the header */",\n ".headerForeground {",\n " color: [[ColorPalette::PrimaryPale]];",\n "}",\n ".headerShadow, .headerShadow a {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n "",\n "/* separate the top menu parts */",\n ".headerForeground, .headerShadow {",\n " padding: 1em 1em 0;",\n "}",\n "",\n ".headerForeground, .headerShadow {",\n " font-family: 'Trebuchet MS' sans-serif;",\n " font-weight:bold;",\n "}",\n ".headerForeground .siteSubtitle {",\n " color: [[ColorPalette::PrimaryLight]];",\n "}",\n ".headerShadow .siteSubtitle {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n "",\n "/* make shadow go and down right instead of up and left */",\n ".headerShadow {",\n " left: 1px;",\n " top: 1px;",\n "}",\n "",\n "/* prefer monospace for editing */",\n ".editor textarea {",\n " font-family: 'Consolas' monospace;",\n "}",\n "",\n "/* sexy tiddler titles */",\n ".title {",\n " font-size: 250%;",\n " color: [[ColorPalette::PrimaryLight]];",\n " font-family: 'Trebuchet MS' sans-serif;",\n "}",\n "",\n "/* more subtle tiddler subtitle */",\n ".subtitle {",\n " padding:0px;",\n " margin:0px;",\n " padding-left:0.5em;",\n " font-size: 90%;",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n ".subtitle .tiddlyLink {",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n "",\n "/* a little bit of extra whitespace */",\n ".viewer {",\n " padding-bottom:3px;",\n "}",\n "",\n "/* don't want any background color for headings */",\n "h1,h2,h3,h4,h5,h6 {",\n " background: [[ColorPalette::Background]];",\n " color: [[ColorPalette::Foreground]];",\n "}",\n "",\n "/* give tiddlers 3d style border and explicit background */",\n ".tiddler {",\n " background: [[ColorPalette::Background]];",\n " border-right: 2px [[ColorPalette::TertiaryMid]] solid;",\n " border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;",\n " margin-bottom: 1em;",\n " padding-bottom: 1em;",\n " padding-top: 0.75em;",\n "}",\n "",\n "/* make options slider look nicer */",\n "#sidebarOptions .sliderPanel {",\n " border:solid 1px [[ColorPalette::PrimaryLight]];",\n "}",\n "",\n "/* the borders look wrong with the body background */",\n "#sidebar .button {",\n " border-style: none;",\n "}",\n "",\n "/* this means you can put line breaks in SidebarOptions for readability */",\n "#sidebarOptions br {",\n " display:none;",\n "}",\n "/* undo the above in OptionsPanel */",\n "#sidebarOptions .sliderPanel br {",\n " display:inline;",\n "}",\n "",\n "/* horizontal main menu stuff */",\n "#displayArea {",\n " margin: 1em 15.7em 0em 1em; /* use the freed up space */",\n "}",\n "#topMenu br {",\n " display: none;",\n "}",\n "#topMenu {",\n " background: [[ColorPalette::PrimaryMid]];",\n " color:[[ColorPalette::PrimaryPale]];",\n "}",\n "#topMenu {",\n " padding:2px;",\n "}",\n "#topMenu .button, #topMenu .tiddlyLink, #topMenu a {",\n " margin-left: 0.5em;",\n " margin-right: 0.5em;",\n " padding-left: 3px;",\n " padding-right: 3px;",\n " color: [[ColorPalette::PrimaryPale]];",\n " font-size: 115%;",\n "}",\n "#topMenu .button:hover, #topMenu .tiddlyLink:hover {",\n " background: [[ColorPalette::PrimaryDark]];",\n "}",\n "",\n "/* make 2.2 act like 2.1 with the invisible buttons */",\n ".toolbar {",\n " visibility:hidden;",\n "}",\n ".selected .toolbar {",\n " visibility:visible;",\n "}",\n "",\n "/* experimental. this is a little borked in IE7 with the button ",\n " * borders but worth it I think for the extra screen realestate */",\n ".toolbar { float:right; }",\n "",\n "/* for Tagger Plugin, thanks sb56637 */",\n ".popup li a {",\n " display:inline;",\n "}",\n "",\n "/* make it print a little cleaner */",\n "@media print {",\n " #topMenu {",\n " display: none ! important;",\n " }",\n " /* not sure if we need all the importants */",\n " .tiddler {",\n " border-style: none ! important;",\n " margin:0px ! important;",\n " padding:0px ! important;",\n " padding-bottom:2em ! important;",\n " }",\n " .tagglyTagging .button, .tagglyTagging .hidebutton {",\n " display: none ! important;",\n " }",\n " .headerShadow {",\n " visibility: hidden ! important;",\n " }",\n " .tagglyTagged .quickopentag, .tagged .quickopentag {",\n " border-style: none ! important;",\n " }",\n " .quickopentag a.button, .miniTag {",\n " display: none ! important;",\n " }",\n "}",\n "/*}}}*/"\n].join("\sn"),\n\n'MptwViewTemplate':[\n "<!--{{{-->",\n "<!--- http://mptw.tiddlyspot.com/#MptwViewTemplate ($Rev: 2247 $) --->",\n "",\n "<div class='toolbar'>",\n " <span macro=\s"showWhenTagged systemConfig\s">",\n " <span macro=\s"toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'\s"></span>",\n " </span>",\n " <span macro=\s"showWhenTagged palette\s">",\n " <span macro=\s"setPalette\s"></span>",\n " </span>",\n " <span style=\s"padding:1em;\s"></span>",\n " <span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:\s"new here\s"'></span>",\n " <span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:\s"MM/0DD/YY\s"}}'></span>",\n "</div>",\n "",\n "<div class=\s"tagglyTagged\s" macro=\s"tags\s"></div>",\n "",\n "<div class='titleContainer'>",\n " <span class='title' macro='view title'></span>",\n " <span macro=\s"miniTag\s"></span>",\n "</div>",\n "",\n "<div class='subtitle'>",\n " <span macro='view modifier link'></span>,",\n " <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:\s"MM/0DD/YY\s"}}'></span>",\n " (<span macro='message views.wikified.createdPrompt'></span>",\n " <span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:\s"MM/0DD/YY\s"}}'></span>)",\n "</div>",\n "",\n "<div macro=\s"showWhenExists ViewPanelTemplate\s">[[ViewPanelTemplate]]</div>",\n "",\n "<div macro=\s"hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer' macro='view text wikified'></div>",\n "</div>",\n "<div macro=\s"showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer'><pre macro='view text'></pre></div>",\n "</div>",\n "",\n "<div macro=\s"showWhenExists ViewDashboardTemplate\s">[[ViewDashboardTemplate]]</div>",\n "",\n "<div class=\s"tagglyTagging\s" macro=\s"tagglyTagging\s"></div>",\n "",\n "<!--}}}-->"\n].join("\sn")\n\n});\n//}}}
<!--{{{-->\n<!-- http://mptw.tiddlyspot.com/#MptwPageTemplate ($Rev: 1829 $) -->\n<div class='header'>\n <div class='headerShadow'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n <div class='headerForeground'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n</div>\n<!-- horizontal MainMenu -->\n<div id='topMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n</div>\n<div id='displayArea'>\n <div id='messageArea'></div>\n <div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->
For upgrading directly from tiddlyspot. See [[ImportTiddlers]].\nURL: /proxy/mptw.tiddlyspot.com/upgrade.html
For upgrading. See [[ImportTiddlers]].\nURL: http://mptw.tiddlyspot.com/upgrade.html
<!--{{{-->\n<div class='toolbar'>\n<span macro="showWhenTagged palette"><span macro="setPalette"></span></span>\n <span macro='toolbar closeTiddler closeOthers +editTiddler permalink deleteTiddler'></span> \n</div>\n<div macro="showWhen tiddler.tags.contains('Project')" align="left">\n<div macro="showWhen !tiddler.tags.contains('13 Never')" align="left">\n<table width="100%" class="cleantable">\n<tr><td align="left" class="smallerclass"><span macro="selectUniqueTag 'due in'"></span></td><td align="left" class="smallerclass"><span macro="selectUniqueTag 'and'"></span></td><td align="left" class="smallerclass"> <span macro="selectUniqueTag 'and then'"></span></td></tr></table>\n</div></div>\n<div macro="showWhen tiddler.tags.contains('Task')"><div class="title" macro="WhatsMyProject"></div><div align="right"><span macro="selectUniqueTag Importance"></span> <span macro="selectUniqueTag Context"></span> <span macro="selectUniqueTag Status"></span></div>\n</div>\n<div class='titleContainer'>\n<div macro="showWhen tiddler.tags.contains('Project')" align="left">\n <div class="projecttitle"><span class='title' macro='view title'></span></div>\n</div>\n<div macro="showWhen !tiddler.tags.contains('Project')" align="left">\n <span class='title' macro='view title'></span>\n <span macro="miniTag"></span>\n</div>\n</div>\n<div macro="showWhen tiddler.tags.contains('Task')">\n<div class='viewer' macro='view text wikified' style="background:white;"></div>\n</div>\n<div macro="showWhen !tiddler.tags.contains('Task')">\n<div class='viewer' macro='view text wikified'></div>\n</div>\n<br>\n<hr>\n<!--}}}-->
{{justifyright{\n<<newTiddler label:"Create a New Project" prompt:"Create a New Project" title:"Project: " text:{{store.getTiddlerText("ProjectTemplate","")}} tag:"Led by $1" tag:"Project">>}}}\n<tabs mytabs>\n<tab Active Projects>\n{{largerclass{\n<<forEachTiddler \n where \n 'tiddler.tags.containsAll(["Led by "+"$1","Project"])'\n\n sortBy \n 'tiddler.title'\n\nwrite '"*[["+tiddler.title.slice(9)+"|"+tiddler.title+"]]\sn"' \n\n>>}}}\n</tab>\n<tab MITs><<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Priority 0 - MIT","Led by "+"$1"]) && !tiddler.tags.containsAny(["Done", "Project", "Pending"])\n ' \n sortBy \n 'getSortedTagsText(tiddler)+"###"+tiddler.title'\n\n script \n 'function getSortedTagsText(tiddler) { \n var tags = tiddler.tags; \n if (!tags) return ""; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Priority 1 - Top")){ \n result += tags[i]+ " "; \n } \n } \n return result; \n } \n\nfunction getGroupTitle(tiddler, context) { \n if (!context.lastGroup || context.lastGroup != getSortedTagsText(tiddler)) { \n context.lastGroup = getSortedTagsText(tiddler); \n return ""+(context.lastGroup?context.lastGroup:"")+" ";} else return "";\n }\n\nfunction whatProject(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = "";\n \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Project:")) { \n shortname = tags[i].replace("Project: ","");\n\n if(result.length>35){\n var thebreak=result.indexOf("|");\n result = result.substr(0, 15) +"..." + result.substr(thebreak, result.length) ;\n\n if(shortname.length >15){\n shortname = shortname.substr(0, 15);\n shortname +="...";\n }\n result += " [["+shortname +"|"+ tags[i] + "]]"; \n }\n else {\n result += "[["+shortname +"|"+ tags[i] + "]]"; \n }\n } \n } \n return result;\n }\n ' \n\nwrite '"{{mycolumnone{<<toggleTag Done \s"" + tiddler.title + "\s" \s>\s> [[" + tiddler.title + "]]}}} {{mycolumntwo{( "+whatProject(tiddler)+" )}}}\sn"'>></tab>\n<tab Priority 1><<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Priority 1 - Top","Led by "+"$1"]) && !tiddler.tags.containsAny(["Done", "Project", "Pending"])\n ' \n sortBy \n 'getSortedTagsText(tiddler)+"###"+tiddler.title'\n\n script \n 'function getSortedTagsText(tiddler) { \n var tags = tiddler.tags; \n if (!tags) return ""; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Priority 1 - Top")){ \n result += tags[i]+ " "; \n } \n } \n return result; \n } \n\nfunction getGroupTitle(tiddler, context) { \n if (!context.lastGroup || context.lastGroup != getSortedTagsText(tiddler)) { \n context.lastGroup = getSortedTagsText(tiddler); \n return ""+(context.lastGroup?context.lastGroup:"")+" ";} else return "";\n }\n\nfunction whatProject(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = "";\n \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Project:")) { \n shortname = tags[i].replace("Project: ","");\n\n if(result.length>35){\n var thebreak=result.indexOf("|");\n result = result.substr(0, 15) +"..." + result.substr(thebreak, result.length) ;\n\n if(shortname.length >15){\n shortname = shortname.substr(0, 15);\n shortname +="...";\n }\n result += " [["+shortname +"|"+ tags[i] + "]]"; \n }\n else {\n result += "[["+shortname +"|"+ tags[i] + "]]"; \n }\n } \n } \n return result;\n }\n ' \n\nwrite '"{{mycolumnone{<<toggleTag Done \s"" + tiddler.title + "\s" \s>\s> [[" + tiddler.title + "]]}}} {{mycolumntwo{( "+whatProject(tiddler)+" )}}}\sn"'>></tab>\n<tab Priority 2><<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Priority 2 - Middle","Led by "+"$1"]) && !tiddler.tags.containsAny(["Done", "Project", "Pending"])\n ' \n sortBy \n 'getSortedTagsText(tiddler)+"###"+tiddler.title'\n\n script \n 'function getSortedTagsText(tiddler) { \n var tags = tiddler.tags; \n if (!tags) return ""; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Priority 2 - Middle")){ \n result += tags[i]+ " "; \n } \n } \n return result; \n } \n\nfunction getGroupTitle(tiddler, context) { \n if (!context.lastGroup || context.lastGroup != getSortedTagsText(tiddler)) { \n context.lastGroup = getSortedTagsText(tiddler); \n return ""+(context.lastGroup?context.lastGroup:"")+" ";} else return "";\n }\n\nfunction whatProject(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = "";\n \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Project:")) { \n shortname = tags[i].replace("Project: ","");\n\n if(result.length>35){\n var thebreak=result.indexOf("|");\n result = result.substr(0, 15) +"..." + result.substr(thebreak, result.length) ;\n\n if(shortname.length >15){\n shortname = shortname.substr(0, 15);\n shortname +="...";\n }\n result += " [["+shortname +"|"+ tags[i] + "]]"; \n }\n else {\n result += "[["+shortname +"|"+ tags[i] + "]]"; \n }\n } \n } \n return result;\n }\n ' \n\nwrite '"{{mycolumnone{<<toggleTag Done \s"" + tiddler.title + "\s" \s>\s> [[" + tiddler.title + "]]}}} {{mycolumntwo{( "+whatProject(tiddler)+" )}}}\sn"'>></tab>\n<tab Priority 3><<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Priority 3 - Low","Led by "+"$1"]) && !tiddler.tags.containsAny(["Done", "Project", "Pending"])\n ' \n sortBy \n 'getSortedTagsText(tiddler)+"###"+tiddler.title'\n\n script \n 'function getSortedTagsText(tiddler) { \n var tags = tiddler.tags; \n if (!tags) return ""; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Priority 3 - Low")){ \n result += tags[i]+ " "; \n } \n } \n return result; \n } \n\nfunction getGroupTitle(tiddler, context) { \n if (!context.lastGroup || context.lastGroup != getSortedTagsText(tiddler)) { \n context.lastGroup = getSortedTagsText(tiddler); \n return ""+(context.lastGroup?context.lastGroup:"")+" ";} else return "";\n }\n\nfunction whatProject(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = "";\n \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Project:")) { \n shortname = tags[i].replace("Project: ","");\n\n if(result.length>35){\n var thebreak=result.indexOf("|");\n result = result.substr(0, 15) +"..." + result.substr(thebreak, result.length) ;\n\n if(shortname.length >15){\n shortname = shortname.substr(0, 15);\n shortname +="...";\n }\n result += " [["+shortname +"|"+ tags[i] + "]]"; \n }\n else {\n result += "[["+shortname +"|"+ tags[i] + "]]"; \n }\n } \n } \n return result;\n }\n ' \n\nwrite '"{{mycolumnone{<<toggleTag Done \s"" + tiddler.title + "\s" \s>\s> [[" + tiddler.title + "]]}}} {{mycolumntwo{ ("+whatProject(tiddler)+" )}}}\sn"'>></tab>\n<tab Completed>\n<<tiddler WhatsDone with:"$1">>\n</tab>\n<tab Pending><<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Pending","Led by "+"$1"]) && !tiddler.tags.containsAny(["Done", "Project","Active"])\n ' \n sortBy \n 'getSortedTagsText(tiddler)+"###"+tiddler.title'\n\n script \n 'function getSortedTagsText(tiddler) { \n var tags = tiddler.tags; \n if (!tags) return ""; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Priority 3 - Low")){ \n result += tags[i]+ " "; \n } \n } \n return result; \n } \n\nfunction getGroupTitle(tiddler, context) { \n if (!context.lastGroup || context.lastGroup != getSortedTagsText(tiddler)) { \n context.lastGroup = getSortedTagsText(tiddler); \n return ""+(context.lastGroup?context.lastGroup:"")+" ";} else return "";\n }\n\nfunction whatProject(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = "";\n \n for (var i = 0; i < tags.length;i++) { \n if(tags[i].contains("Project:")) { \n shortname = tags[i].replace("Project: ","");\n\n if(result.length>35){\n var thebreak=result.indexOf("|");\n result = result.substr(0, 15) +"..." + result.substr(thebreak, result.length) ;\n\n if(shortname.length >15){\n shortname = shortname.substr(0, 15);\n shortname +="...";\n }\n result += " [["+shortname +"|"+ tags[i] + "]]"; \n }\n else {\n result += "[["+shortname +"|"+ tags[i] + "]]"; \n }\n } \n } \n return result;\n }\n ' \n\nwrite '"{{mycolumnone{<<toggleTag Done \s"" + tiddler.title + "\s" \s>\s> [[" + tiddler.title + "]]}}} {{mycolumntwo{( "+whatProject(tiddler)+" )}}}\sn"'>></tab>\n</tabs>
/***\n|Name|NewDocumentPlugin|\n|Source|http://www.TiddlyTools.com/#NewDocumentPlugin|\n|Version|1.7.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|Quickly create new TiddlyWiki documents from your existing document, with just one click|\n\nUse the {{{<<newDocument>>}}} macro to place a "new document" link into your sidebar/mainmenu/any tiddler (wherever you like). Select this command to automatically create a "new.html" document containing a specific set of tagged tiddlers. Optional parameters let you specify an alternate path/filename for the new file, or different tags to match. You can also indicate "ask" for either parameter, which will trigger a prompt for input when the command is selected.\n\n!!!!!Usage\n<<<\n{{{<<newDocument label:text prompt:text filename tag tag tag...>>}}}\n{{{<<newDocument label:text prompt:text filename all>>}}}\n{{{<<newDocument label:text prompt:text filename snap ID>>}}}\n{{{<<newDocument label:text prompt:text filename snap here>>}}}\n{{{<<newDocument label:text prompt:text nofile print ID>>}}}\n{{{<<newDocument label:text prompt:text nofile print here>>}}}\n where:\n* ''label:text'' defines //optional// alternative link text (replaces default "new document" display)\n* ''prompt:text'' defines //optional// alternative tooltip text for 'mouseover' prompting (replaces default hard-coded tooltip text)\n* ''filename'' is any local path-and-filename. If no parameters are provided, the default is to create the file "new.html" in the current directory. If a filename is provided without a path (i.e., there is no "/" in the input), then the current directory is also assumed. Otherwise, this parameter is expected to contain the complete path and filename needed to write the file to your local hard disk. If ''ask'' is used in place of the filename parameter then, when the command link is selected, a message box will be automatically displayed so you can select/enter the path and filename.\n* ''tag tag tag...'' is a list of one or more space-separated tags (use quotes or {{{[[]]}}} around tags that contain spaces). The new document will include all tiddlers that match at least one of the tags in the list. The default is to include tiddlers tagged with <<tag includeNew>>. The special value ''all'' may be used to match every tiddler (even those without tags). If ''ask'' is used in place of the tags then, when the command link is selected, a message box will be automatically displayed so you can enter the desired tags at that time.\n* When you use the keyword ''snap'' in place of the tags, you can generate a file containing the //rendered// CSS-and-HTML that is currently being displayed in browser. By default, the snapshop uses the 'contentWrapper' DOM element ID to automatically include all the TiddlyWiki elements, such as the sidebars and header, in addition to the center 'story' column containing the tiddler content.\n* When you use the keyword ''print'' in place of the tags, a snapshot is generated, but the contents are not written to a file. Instead, they are displayed in a separate browser tab/window, and the print dialog for that tab/window is automatically invoked.\n* You can limit the snapshot to capture only a portion of the rendered TiddlyWiki elements by specifiying an optional alternate DOM element ID, such as "displayArea" (the entire center 'story' column) or even just a single tiddler (e.g., "tidderMyTiddlerTitle", assuming that "MyTiddlerTitle" is currently displayed). Only the portions of the document that are contained //within// the specified DOM element will be transcribed to the resulting snapshot file. If ''ask'' is used in place of a DOM element ID, you will be prompted to enter the ID (default is "contentWrapper") when the snapshot is being taken. This allows you to easily enter the ID of any currently displayed tiddler to make quick snapshots of specific tiddlers. If ''here'' is used in place of a DOM element ID, the current tiddler id is used.\n\nNote: as of version 1.4.0 of this plugin, support for selecting tiddlers by using tag *expressions* has been replaced with simpler, more efficient "containsAny()" logic. To create new ~TiddlyWiki documents that contain only those tiddlers selected with advanced AND/OR/NOT Boolean expressions, you can use the filtering features provided by the ExportTiddlersPlugin (see www.TiddlyTools.com/#ExportTiddlersPlugin).\n<<<\n!!!!!Examples:\n<<<\n{{{<<newDocument>>}}}\nequivalent to {{{<<newDocument new.htm includeNew systemTiddlers>>}}}\ncreates default "new.html" containing tiddlers tagged with either<<tag includeNew>>or<<tag systemTiddlers>>\ntry it: <<newDocument>>\n\n{{{<<newDocument empty.html systemTiddlers>>}}}\ncreates "empty.html" containing only tiddlers tagged with<<tag systemTiddlers>>\n//(reproduces old-style (pre 2.0.2) empty file)//\ntry it: <<newDocument empty.html systemTiddlers>>\n\n{{{<<newDocument "label:create Import/Export starter" ask importexport>>}}}\nsave importexport tiddlers to a new file, prompts for path/file\ntry it: <<newDocument "label:create Import/Export starter" ask importexport>>\n\n{{{<<newDocument ask ask>>}}}\nprompts for path/file, prompts for tags to match\ntry it: <<newDocument ask ask>>\n\n{{{<<newDocument ask all>>}}}\nsave all current TiddlyWiki contents to a new file, prompts for path/file\ntry it: <<newDocument ask all>>\n\n{{{<<newDocument ask snap>>}}}\ngenerates snapshot of currently displayed document, prompts for path/file\ntry it: <<newDocument ask snap>>\n\n{{{<<newDocument ask snap here>>}}}\ngenerates snapshot of this tiddler ONLY, prompts for path/file\ntry it: <<newDocument ask snap here>>\n\n{{{<<newDocument ask print here>>}}}\nprints a snapshot of this tiddler ONLY\ntry it: <<newDocument nofile print here>>\n\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''NewDocumentPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.03.30 [1.7.0]'' added support for "print" param as alternative for "snap". When "print" is used, the filename is ignored and ouput is directed to another browser tab/window, where the print dialog is then automatically triggered.\n''2007.03.30 [1.6.1]'' added support for "here" keyword for current tiddler elementID and "prompt:text" param for specifying tooltip text\n''2007.02.12 [1.6.0]'' in onClickNewDocument(), reset HTML source 'markup'\n''2006.10.23 [1.5.1]'' in onClickNewDocument(), get saved parameter value for snapID instead of using default "contentWrapper" (oops!)\n''2006.10.18 [1.5.0]'' new optional param for 'snap'... specify alternative DOM element ID (default is still "contentWrapper"). Based on a suggestion from Xavier Verges.\n''2006.08.03 [1.4.3]'' in promptForFilename(), for IE (WinXP only), added handling for UserAccounts.CommonDialog\n''2006.07.29 [1.4.2]'' in onClickNewDocument(), okmsg display is now linked to newly created file\n''2006.07.24 [1.4.1]'' in promptForFilename(), check for nsIFilePicker.returnCancel to allow nsIFilePicker.returnOK **OR** nsIFilePicker.returnReplace to be processed.\n''2006.05.23 [1.4.0]'' due to very poor performance, support for tag *expressions* has been removed, in favor of a simpler "containsAny()" scan for tags.\n''2006.04.09 [1.3.6]'' in onClickNewDocument, added call to convertUnicodeToUTF8() to better handle international characters.\n''2006.03.15 [1.3.5]'' added nsIFilePicker() handler for selecting filename in moz-based browsers. IE and other non-moz browsers still use simple prompt() dialog\n''2006.03.15 [1.3.0]'' added "label:text" param for custom link text. added special "all" filter parameter for "save as..." handling (writes all tiddlers to output file)\n''2006.03.09 [1.2.0]'' added special "snap" filter parameter to generate and write "snapshot" files containing static HTML+CSS for currently rendered document.\n''2006.02.24 [1.1.2]'' Fix incompatiblity with TW 2.0.5 by removing custom definition of getLocalPath() (which is now part of TW core)\n''2006.02.03 [1.1.1]'' concatentate 'extra' params so that tag expressions don't have to be quoted. moved all text to 'formatted' string definitions for easier translation.\n''2006.02.03 [1.1.0]'' added support for tag EXPRESSIONS. plus improved documentation and code cleanup\n''2006.02.03 [1.0.0]'' Created.\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.newDocument = {major: 1, minor: 7, revision: 0, date: new Date(2007,3,30)};\n\nconfig.macros.newDocument = {\n newlabel: "new document",\n newprompt: "Create a new TiddlyWiki 'starter' document",\n newdefault: "new.html",\n allparam: "all",\n saveaslabel: "save as...",\n saveasprompt: "Save current TiddlyWiki to a different file",\n printparam: "print",\n snapparam: "snap",\n snaplabel: "Easy Print",\n snapprompt: "Create a 'snapshot' of the current TiddlyWiki display",\n snapdefault: "snapshot.html",\n snapID: "contentWrapper",\n snapIDprompt: "Please enter a DOM element ID for the desired content",\n snapIDerrmsg: "Unrecognized document element ID: '%0'",\n askparam: "ask",\n hereparam: "here",\n labelparam: "label:",\n promptparam: "prompt:",\n fileprompt: "Please enter a filename",\n filter: "includeNew",\n filterprompt: "Match one or more tags:\sn(space-separated, use [[...]] around tags containing spaces)",\n filtererrmsg: "Error in tag filter '%0'",\n snapmsg: "Document snapshot written to %1",\n okmsg: "%0 tiddlers written to %1",\n failmsg: "An error occurred while creating %0"\n};\n\nconfig.macros.newDocument.handler = function(place,macroName,params) {\n\n var path=getLocalPath(document.location.href);\n var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\s\s"); \n if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash\n\n if (params[0] && params[0].substr(0,config.macros.newDocument.labelparam.length)==config.macros.newDocument.labelparam)\n var label=params.shift().substr(config.macros.newDocument.labelparam.length)\n if (params[0] && params[0].substr(0,config.macros.newDocument.promptparam.length)==config.macros.newDocument.promptparam)\n var prompt=params.shift().substr(config.macros.newDocument.promptparam.length)\n var filename=params.shift(); if (!filename) filename=config.macros.newDocument.newdefault;\n if (params[0]==config.macros.newDocument.snapparam || params[0]==config.macros.newDocument.printparam) {\n var printmode=(params[0]==config.macros.newDocument.printparam);\n params.shift();\n if (!label) var label=config.macros.newDocument.snaplabel;\n if (!prompt) var prompt=config.macros.newDocument.snapprompt;\n var defaultfile=config.macros.newDocument.snapdefault;\n var snapID=config.macros.newDocument.snapID;// default to "contentWrapper"\n if (params[0]) var snapID=params.shift(); // alternate DOM element for snapshot\n }\n if (params[0]==config.macros.newDocument.allparam) {\n if (!label) var label=config.macros.newDocument.saveaslabel;\n if (!prompt) var prompt=config.macros.newDocument.saveasprompt;\n var defaultfile=getLocalPath(document.location.href);\n var slashpos=defaultfile.lastIndexOf("/"); if (slashpos==-1) slashpos=defaultfile.lastIndexOf("\s\s");\n if (slashpos!=-1) defaultfile=defaultfile.substr(slashpos+1); // get filename only\n }\n if (!prompt) var prompt=config.macros.newDocument.newprompt;\n if (!label) var label=config.macros.newDocument.newlabel;\n if (!defaultfile) var defaultfile=config.macros.newDocument.newdefault;\n\n var btn=createTiddlyButton(place,label,prompt,onClickNewDocument);\n btn.path=path;\n btn.file=filename;\n btn.defaultfile=defaultfile;\n btn.snapID=snapID; // NULL unless snapshot is being taken\n btn.printmode=printmode;\n btn.filter=params.length?params:[config.macros.newDocument.filter]; \n}\n\n// IE needs explicit global scoping for functions called by browser events\nwindow.onClickNewDocument=function(e)\n{\n if (!e) var e = window.event; var btn=resolveTarget(e);\n\n // assemble document content, write file, report result\n var okmsg=config.macros.newDocument.okmsg;\n var failmsg=config.macros.newDocument.failmsg;\n var count=0;\n var out="";\n if (btn.snapID) { // HTML+CSS snapshot\n var snapID=btn.snapID;\n if (btn.snapID==config.macros.newDocument.askparam)\n snapID=prompt(config.macros.newDocument.snapIDprompt,config.macros.newDocument.snapID);\n if (btn.snapID==config.macros.newDocument.hereparam)\n { var here=story.findContainingTiddler(btn); if (here) snapID=here.id; }\n if (!document.getElementById(snapID)) { // if specified element does not exist\n if (snapID) // ID=null if prompt was cancelled by user\n displayMessage(config.macros.newDocument.snapIDerrmsg.format([snapID]));\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); return(false);\n }\n var styles=document.getElementsByTagName("style");\n out+="<html>\sn<head>\sn<style>\sn";\n for(var i=0; i < styles.length; i++)\n out +="/* stylesheet from tiddler:"+styles[i].getAttribute("id")+" */\sn"+styles[i].innerHTML+"\sn\sn";\n out+="</style>\sn</head>\sn<body>\sn\sn"+document.getElementById(snapID).innerHTML+"\sn\sn</body>\sn</html>";\n okmsg=config.macros.newDocument.snapmsg;\n } else { // TW starter document\n // get the TiddlyWiki core code source\n var sourcefile=getLocalPath(document.location.href);\n var source=loadFile(sourcefile);\n if(source==null) { alert(config.messages.cantSaveError); return null; }\n // reset existing HTML source markup\n source=updateMarkupBlock(source,"PRE-HEAD");\n source=updateMarkupBlock(source,"POST-HEAD");\n source=updateMarkupBlock(source,"PRE-BODY");\n source=updateMarkupBlock(source,"POST-BODY");\n // find store area\n var posOpeningDiv=source.indexOf(startSaveArea);\n var posClosingDiv=source.lastIndexOf(endSaveArea);\n if((posOpeningDiv==-1)||(posClosingDiv==-1)) { alert(config.messages.invalidFileError.format([sourcefile])); return; }\n // get the matching tiddler divs\n var match=btn.filter;\n if (match[0]==config.macros.newDocument.askparam) { // ask user for tags\n var newfilt=prompt(config.macros.newDocument.filterprompt,config.macros.newDocument.filter);\n if (!newfilt) return; // cancelled by user\n match=newfilt.readMacroParams();\n }\n var storeAreaDivs=[];\n var tiddlers=store.getTiddlers('title');\n for (var i=0; i<tiddlers.length; i++)\n if (match[0]==config.macros.newDocument.allparam || (tiddlers[i].tags && tiddlers[i].tags.containsAny(match)) )\n storeAreaDivs.push(tiddlers[i].saveToDiv());\n out+=source.substr(0,posOpeningDiv+startSaveArea.length);\n out+=convertUnicodeToUTF8(storeAreaDivs.join("\sn"))+"\sn\st\st";\n out+=source.substr(posClosingDiv);\n count=storeAreaDivs.length;\n }\n if (btn.printmode) {\n var win=window.open("","_blank","");\n win.document.open();\n win.document.writeln(out);\n win.document.close();\n win.focus(); // bring to front\n win.print(); // trigger print dialog\n } else {\n // get output path/filename\n var filename=btn.file;\n if (filename==config.macros.newDocument.askparam)\n filename=promptForFilename(config.macros.newDocument.fileprompt,btn.path,btn.defaultfile);\n if (!filename) return; // cancelled by user\n // if specified file does not include a path, assemble fully qualified path and filename\n var slashpos=filename.lastIndexOf("/"); if (slashpos==-1) slashpos=filename.lastIndexOf("\s\s");\n if (slashpos==-1) filename=btn.path+filename;\n var ok=saveFile(filename,out);\n var msg=ok?okmsg.format([count,filename]):failmsg.format([filename]);\n var link=ok?"file:///"+filename.replace(regexpBackSlash,'/'):""; // change local path to link text\n clearMessage(); displayMessage(msg,link);\n }\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); return(false);\n}\n//}}}\n\n//{{{\nfunction promptForFilename(msg,path,file)\n{\n if(window.Components) { // moz\n try {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\n var nsIFilePicker = window.Components.interfaces.nsIFilePicker;\n var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);\n picker.init(window, msg, nsIFilePicker.modeSave);\n var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);\n thispath.initWithPath(path);\n picker.displayDirectory=thispath;\n picker.defaultExtension='html';\n picker.defaultString=file;\n picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);\n if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;\n }\n catch(e) { alert('error during local file access: '+e.toString()) }\n }\n else { // IE\n try { // XP only\n var s = new ActiveXObject('UserAccounts.CommonDialog');\n s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';\n s.FilterIndex=3; // default to HTML files;\n s.InitialDir=path;\n s.FileName=file;\n if (s.showOpen()) var result=s.FileName;\n }\n catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE\n }\n return result;\n}\n//}}}
/***\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| Name:|NewMeansNewPlugin|\n| Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|\n| Version:|1.0 ($Rev: 2263 $)|\n| Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|\n| Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\n\nString.prototype.getNextFreeName = function() {\n var numberRegExp = / \s(([0-9]+)\s)$/;\n var match = numberRegExp.exec(this);\n if (match) {\n var num = parseInt(match[1]) + 1;\n return this.replace(numberRegExp," ("+num+")");\n }\n else {\n return this + " (1)";\n }\n}\n\nconfig.macros.newTiddler.getName = function(newName) {\n while (store.getTiddler(newName))\n newName = newName.getNextFreeName();\n return newName;\n}\n\n\nconfig.macros.newTiddler.onClickNewTiddler = function()\n{\n var title = this.getAttribute("newTitle");\n if(this.getAttribute("isJournal") == "true") {\n var now = new Date();\n title = now.formatString(title.trim());\n }\n\n title = config.macros.newTiddler.getName(title); // <--- only changed bit\n\n var params = this.getAttribute("params");\n var tags = params ? params.split("|") : [];\n var focus = this.getAttribute("newFocus");\n var template = this.getAttribute("newTemplate");\n var customFields = this.getAttribute("customFields");\n story.displayTiddler(null,title,template,false,null,null);\n var tiddlerElem = document.getElementById(story.idPrefix + title);\n if(customFields)\n story.addCustomFields(tiddlerElem,customFields);\n var text = this.getAttribute("newText");\n if(typeof text == "string")\n story.getTiddlerField(title,"text").value = text.format([title]);\n for(var t=0;t<tags.length;t++)\n story.setTiddlerTag(title,tags[t],+1);\n story.focusTiddler(title,focus);\n return false;\n};\n\n//}}}
<<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>\nAlso see [[Settings]]
<!--{{{-->\n<div class='header'>\n <div class='titleLine'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n</div>\n<div id='displayArea'>\n <div id='messageArea'></div>\n <div id='tiddlerDisplay'></div>\n</div>\n<div id='contentFooter'></div>\n<!--}}}-->
/***\n|''Name:''|PlasticCalendarPlugin|\n|''Description:''|This plugin creates a custom Gregorian calendar|\n|''Version:''|1.3.1|\n|''Date:''|Mar 13, 2007|\n|''Source:''|http://www.math.ist.utl.pt/~psoares/addons.html|\n|''Documentation:''|[[PlasticCalendarPlugin Documentation|PlasticCalendarPluginDoc]]|\n|''Author:''|Paulo Soares|\n|''License:''|[[Creative Commons Attribution-Share Alike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.1.0|\n***/\n{{{\n// --------------------------------------------------------------------\n// Calendar\n// --------------------------------------------------------------------\n\nconfig.macros.calendar = {holidays: []};\nconfig.macros.calendar.options = {\n // day week starts from (normally 0-Su or 1-Mo)\n calendarWeekStart: 0,\n calendarToday: "Today",\n calendarHoliday: "Holiday: ",\n calendarLongDateFormat: "0DD/0MM/YYYY",\n calendarShortDateFormat: "0DD/0MM",\n calendarTag: ["schedule"]\n};\n\n/***************************************************************************\n** Internal functions\n***************************************************************************/\n\nvar cldTag;\n\nconfig.macros.calendar.calendarIsHoliday = function(date) {\n var cm = config.macros.calendar;\n var longHoliday = date.formatString(cm.options.calendarLongDateFormat);\n var shortHoliday = date.formatString(cm.options.calendarShortDateFormat);\n for(var i = 0; i < cm.holidays.length; i++) {\n if(cm.holidays[i][0] == longHoliday || cm.holidays[i][0] == shortHoliday) {\n return cm.holidays[i];\n }\n }\n return null;\n}\n\nconfig.macros.calendar.onClickOtherDay = function(e) {\n var day = this.getAttribute('tiddlylink');\n story.displayTiddler(null,day,DEFAULT_EDIT_TEMPLATE);\n for(var i=0; i<cldTag.length;i++){\n story.setTiddlerTag(day, cldTag[i], 0);\n }\n story.focusTiddler(day,"text");\n}\n\nconfig.macros.calendar.getPopupText = function(title) {\n var popup_entries = store.getTiddlerText(title).split("\sn");\n var popup = popup_entries[0];\n if(popup_entries.length>1) popup += " ...";\n return popup;\n}\n\nconfig.macros.calendar.findCalendar = function(child) {\n var parent;\n while (child && child.parentNode) {\n parent = child.parentNode;\n if (parent.id == "calendarWrapper") {\n return parent;\n }\n child = parent;\n }\n return null;\n}\n\nconfig.macros.calendar.selectDate = function(e) {\n if (!e) var e = window.event;\n var cm = config.macros.calendar;\n var calendar = cm.findCalendar(this);\n if (calendar) {\n var d = this.getAttribute("date");\n if (d != null) cm.makeCalendar(calendar, new Date(new Number(d)));\n }\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nconfig.macros.calendar.makeCalendar = function(calendar, dt_current) {\n var cm = config.macros.calendar;\n var currentDay = new Date(new Number(calendar.getAttribute("currentDay")));\n var setControls = calendar.getAttribute("setControls");\n calendar.setAttribute("date", dt_current.valueOf());\n\n while (calendar.hasChildNodes())\n calendar.removeChild(calendar.firstChild);\n\nif(setControls==1){\n // get same date in the previous year\n var dt_prev_year = new Date(dt_current);\n dt_prev_year.setFullYear(dt_prev_year.getFullYear() - 1);\n if (dt_prev_year.getDate() != dt_current.getDate())\n dt_prev_year.setDate(0);\n\n // get same date in the next year\n var dt_next_year = new Date(dt_current);\n dt_next_year.setFullYear(dt_next_year.getFullYear() + 1);\n if (dt_next_year.getDate() != dt_current.getDate())\n dt_next_year.setDate(0);\n\n // get same date in the previous month\n var dt_prev_month = new Date(dt_current);\n dt_prev_month.setMonth(dt_prev_month.getMonth() - 1);\n if (dt_prev_month.getDate() != dt_current.getDate())\n dt_prev_month.setDate(0);\n\n // get same date in the next month\n var dt_next_month = new Date(dt_current);\n dt_next_month.setMonth(dt_next_month.getMonth() + 1);\n if (dt_next_month.getDate() != dt_current.getDate())\n dt_next_month.setDate(0);\n}\n\n // get first day to display in the grid for current month\n var dt_firstday = new Date(dt_current);\n dt_firstday.setDate(1);\n dt_firstday.setDate(1 - (7 + dt_firstday.getDay() - cm.options.calendarWeekStart) % 7);\n\n var area, header;\n var line, cell, i;\n\n // 1 - calendar header table\n // 2 - print weekdays titles\n // 3 - calendar days table \ncalendar.cellPadding = 0;\ncalendar.cellSpacing = 0;\narea = createTiddlyElement(calendar, "tbody");\n\n // 1 - calendar header table\n header = createTiddlyElement(area,"tr", "calendarHeader");\n header.cellPadding = 0;\n header.cellSpacing = 0;\n\nif(setControls==1){ \nvar headerValues = [\n [ config.messages.dates.months[dt_current.getMonth()] + ' ' + dt_current.getFullYear(),\n "selectToday", currentDay.valueOf() ]\n ];\n\n for (i = 0; i < headerValues.length; ++i) {\n var link = createTiddlyElement(header,"td", null, null, headerValues[i][0]);\n if(i==0) link.colSpan=7;\n link.onclick = cm.selectDate;\n link.setAttribute("date", headerValues[i][0]);\n }\n} else {\n var link = createTiddlyElement(header,"td", null, null, \nconfig.messages.dates.months[dt_current.getMonth()] + ' ' + dt_current.getFullYear());\nlink.colSpan=7;\n}\n\n\n // 2 - print weekdays titles\n line = createTiddlyElement(area, "tr", "weekNames");\n createTiddlyElement(line, "td", null, null, "S");\n createTiddlyElement(line, "td", null, null, "M");\n createTiddlyElement(line, "td", null, null, "T");\n createTiddlyElement(line, "td", null, null, "W");\n createTiddlyElement(line, "td", null, null, "T");\n createTiddlyElement(line, "td", null, null, "F");\n createTiddlyElement(line, "td", null, null, "S");\n\n\n // 3 - calendar days table\n var dt_current_day = new Date(dt_firstday);\n var day_class;\n var title;\n var holiday;\n var popup;\n var clickHandler;\n\n while (dt_current_day.getMonth() == dt_current.getMonth() ||\n dt_current_day.getMonth() == dt_firstday.getMonth()) {\n\n // print row header\n line = createTiddlyElement(area, "tr", "calendarLine", null, null);\n for (var n_current_wday = 0; n_current_wday < 7; ++n_current_wday) {\n title = dt_current_day.formatString(cm.options.calendarLongDateFormat);\n clickHandler = cm.onClickOtherDay;\n popup = null;\n holiday = cm.calendarIsHoliday(dt_current_day);\n\n if (holiday != null) {\n // holidays\n day_class = (holiday.length==3)? holiday[2]: "holiDay";\n popup = cm.options.calendarHoliday + holiday[1];\n } else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6) {\n // weekend days\n day_class = "weekDay";\n } else {\n // print working days of current month\n day_class = "workingDay";\n }\n\nif(dt_current_day.getMonth() == dt_current.getMonth()){\n if (currentDay.valueOf() == dt_current_day.valueOf()) {\n // print current date\n if (store.tiddlerExists(title)){\n // day has a tiddler associated with it\n day_class += " currentscheduledDay";\n clickHandler = onClickTiddlerLink;\n popup = cm.options.calendarToday + ": "+ cm.getPopupText(title);\n } else {\n day_class += " currentDay";\n popup = cm.options.calendarToday;\n}\n}\n\n\n if (store.tiddlerExists(title) && store.getTiddler(title).isTagged(cldTag[0])) {\n // day has a tiddler associated with it\n day_class += " scheduledDay";\n clickHandler = onClickTiddlerLink;\n popup = cm.getPopupText(title);\n }\n}\n\n // extra formatting for days of previous or next month\n if (dt_current_day.getMonth() != dt_current.getMonth()) {\n day_class += " otherMonthDay";\n }\n\n var text = dt_current_day.getDate();\n var cell = createTiddlyElement(line, "td", null, day_class, text);\n cell.onclick=clickHandler;\n cell.setAttribute("date", dt_current_day.valueOf());\n cell.setAttribute("tiddlyLink", title);\n if(popup) cell.setAttribute("title", popup);\n dt_current_day.setDate(dt_current_day.getDate()+1);\n }\n }\n}\n\nconfig.macros.calendar.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var start_date = new Array();\n var date = new Date();\n var cldParams = paramString.parseParams('calendarParams', null, true);\n var cldYear = (cldParams[0].year)?parseFloat(cldParams[0].year[0]): date.getFullYear();\n var cldMonth = (cldParams[0].month)?parseFloat(cldParams[0].month[0]): date.getMonth();\n\n\n if (cldParams[0].richvar=="+1"){\n cldMonth = date.getMonth()+1;\n };\n\n if (cldParams[0].richvar=="+2"){\n cldMonth = date.getMonth()+2;\n };\n\n var n_months = (cldParams[0].numberMonths)?parseFloat(cldParams[0].numberMonths[0]): 1;\n var n_cols = (cldParams[0].numberColumns)?parseFloat(cldParams[0].numberColumns[0]): 3;\n cldTag = (cldParams[0].tag)?cldParams[0].tag[0].split("#"): config.macros.calendar.options.calendarTag;\n for(var i = 0; i < n_months; i++){\n start_date[i] = new Date(cldYear, cldMonth+i, 1);\n }\n var n_rows = Math.max(1,Math.ceil(n_months/n_cols));\n n_cols = Math.min(n_cols,n_months);\n var setControls=(n_months>1)? 0: 1;\n var currentDay = new Date();\n currentDay = new Date(currentDay.getFullYear(), currentDay.getMonth(), currentDay.getDate());\n var holder = createTiddlyElement(place, "table", null,"calendarHolder");\n var holderTable = createTiddlyElement(holder, "tbody");\n for(var i = 0; i < n_rows; i++){\n var holderLine = createTiddlyElement(holderTable, "tr");\n for(var j = 0; j < n_cols; j++){\n var holderCell = createTiddlyElement(holderLine, "td");\n if(n_cols*i+j+1<=n_months){\n var calendar = createTiddlyElement(holderCell, "table", "calendarWrapper");\n calendar.setAttribute("name", "calendarWrapper");\n calendar.setAttribute("setControls", setControls);\n calendar.setAttribute("currentDay", currentDay.valueOf());\n config.macros.calendar.makeCalendar(calendar, start_date[n_cols*i+j]);\n }\n }\n }\n}\n\nfunction refreshCalendars(hint) {\n var calendars = document.getElementsByName("calendarWrapper");\n var i, c;\n for (i = 0; i < calendars.length; ++i) {\n c = calendars.item(i);\n if (c.id == "calendarWrapper") {\n config.macros.calendar.makeCalendar(c, new Date(new Number(c.getAttribute("date"))));\n }\n }\n}\n\nstore.addNotification(null, refreshCalendars);\n\nsetStylesheet("/***\sn!Calendar Styles\sn***/\sn/*{{{*/\sn .viewer .calendarHolder {\sn margin-left: auto;\sn margin-right: auto;\sn border: none; \sn}\sn\sn .viewer .calendarHolder table {\sn border: none;\sn margin: 0;\sn}\sn\sn .viewer .calendarHolder tr {\sn border: none;\sn vertical-align: top;\sn}\sn\sn .viewer .calendarHolder td {\sn border: 0;\sn vertical-align: top;\sn}\sn\sn .viewer #calendarWrapper {\sn width: 1em;\sn border: 0px solid #000000;\sn cursor: pointer;\sn margin-left:-40px; margin-bottom:0px; }\sn\sn #calendarWrapper #calendarLine td {\sn height: 1em;\sn}\sn\sn #calendarWrapper tr {\sn border:none;\sn}\sn\sn #calendarWrapper td {\sn text-align: center;\sn vertical-align: middle;\sn width: 20px;\sn border:none;\sn}\sn\sn #calendarWrapper #calendarHeader td{\sn color: navy;\sn background-color: #ffffff;\sn height: 1em;\sn}\sn\sn #calendarWrapper #weekNames td {\sn color: #ffffff;\sn background-color: #38395E;\sn height: 1em;\sn}\sn\sn #calendarWrapper .weekDay {\sn background-color: #FFFFC0;\sn}\sn\sn #calendarWrapper .holiDay {\sn background-color: #FFFFC0;\sn}\sn\sn #calendarWrapper .currentDay {\sn border: solid #38395E 2px;\sn font-weight: bold;\sn}\sn\sn #calendarWrapper .workingDay {\sn background-color: #ffffff;\sn}\sn\sn #calendarWrapper .scheduledDay {\sn border: solid orange 0px; background-color: #38395E;\sn }\sn\sn #calendarWrapper .otherMonthDay {\sn background-color: #DDDDDD;\sn}\sn\sn/*}}}*/","CalendarStyles");\n\nconfig.shadowTiddlers.PlasticCalendarPluginDoc="The documentation is missing. It is available [[here|http://www.math.ist.utl.pt/~psoares/addons.html#PlasticCalendarPluginDoc]].";\n}}}
!Description\nThis plugin creates a custom Gregorian calendar. A single month calendar has navigation buttons at the top line in order to change month and year. With multiple months the calendar is static. Different categories of holidays can be defined in a configuration tiddler and those categories can be styled by the user. There's also a simple scheduling mechanism.\nThis plugin is based on previous work by [[TiagoDionÃzio|http://mega.ist.utl.pt/~tngd/twiki/twiki.cgi/]]'s.\n!Usage\nCopy this tiddler to your TW, tag it with 'systemConfig', save your TW, refresh your browser and drop {{{<<calendar>>}}} in a tiddler to get a calendar for the current month. You can also use any of the following options {{{<<calendar year:2007 month:6 numberMonths:6 numberColumns:2 tag:'work'>>}}}.\n\nYou can also label the schedules with multiple tags separating them with {{{#}}} such as {{{tag:'work#excludeLists'}}}. However only the first tag is used to display scheduled days in the calendar.\n!Revision history\n1.3.1 - 19/03/2006\n*fixed missing schedules at the first day of any month (bug reported and fixed by Michael Lin)\n1.3.0 - 18/09/2006\n*small changes to work with TW2.1\n1.2.1 - 04/06/2006\n*restored the use of multiple tags\n1.2.0 - 18/05/2006\n*plugin name changed to PlasticCalendarPlugin (because there are other ~CalendarPlugin's out there...)\n*now using named parameters\n*added categories of holidays (suggested by Paco Rivière)\n1.1.0 - 02/10/2005\n*initial release
{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n }\n }\n return result;\n }'\n \n write\n '"<<newTiddler label:\s"Create a New Task\s" prompt:\s"Create a New Task\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" \s>\s>"'\n>>}}}\n{{boxtwo{\n![img[http://www.psychpage.com/wiki/rniolon_images/prior0.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n sortBy \n 'tiddler.title' \n\n write\n '"<<tiddler ShowMyMITTasks with:\s""+context.inTiddler.title+"\s" \s"Task\s" \s"Pending\s" \s"Done\s" \s"Priority\s"\s>\s>"'\n>>{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n } } return result; }'\nwrite\n '"<<newTiddler label:\s"New MIT Task\s" prompt:\s"Create new MIT task for this Project\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" tag:\s"Priority 0 - MIT\s" \s>\s>"'\n>>}}}\n}}}{{boxtwo{\n![img[http://www.psychpage.com/wiki/rniolon_images/prior1.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n sortBy \n 'tiddler.title' \n\n write\n '"<<tiddler ShowTasksByPriority1 with:\s""+context.inTiddler.title+"\s"\s>\s>"'\n>>{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n } } return result; }'\nwrite\n '"<<newTiddler label:\s"New Top Task\s" prompt:\s"Create new Top task for this Project\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" tag:\s"Priority 1 - Top\s" \s>\s>"'\n>>}}}\n}}}{{boxtwo{\n![img[http://www.psychpage.com/wiki/rniolon_images/prior2.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n sortBy \n 'tiddler.title' \n\n write\n '"<<tiddler ShowTasksByPriority2 with:\s""+context.inTiddler.title+"\s"\s>\s>"'\n>>{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n } } return result; }'\nwrite\n '"<<newTiddler label:\s"New Middle Task\s" prompt:\s"Create new Middle task for this Project\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" tag:\s"Priority 2 - Middle\s" \s>\s>"'\n>>}}}\n}}}{{boxtwo{\n![img[http://www.psychpage.com/wiki/rniolon_images/prior3.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n sortBy \n 'tiddler.title' \n\n write\n '"<<tiddler ShowTasksByPriority3 with:\s""+context.inTiddler.title+"\s"\s>\s>"'\n>>{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n } } return result; }'\nwrite\n '"<<newTiddler label:\s"New Low Task\s" prompt:\s"Create new Low task for this Project\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" tag:\s"Priority 3 - Low\s" \s>\s>"'\n>>}}}\n}}}{{boxtwo{\n![img[http://www.psychpage.com/wiki/rniolon_images/context.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n write\n '"<<tiddler ShowTasksByContext with:\s""+context.inTiddler.title+"\s"\s>\s>"'\n>>\n}}}{{boxtwo{\n![img[http://www.psychpage.com/wiki/rniolon_images/settings.gif]]\n{{newcolumnone{<<forEachTiddler\n where 'tiddler.title.contains([context.inTiddler.title])'\n write '" <<resetProject \s""+context.inTiddler.title+"\s"\s>\s>"'\n>>}}}\n{{newcolumnone{<<toggleTag '13 Never' '.' 'Un/Hide Due Dates'>>\n}}}\n\n\n}}}\n<<foldHeadings closed>>
<<forEachTiddler \n where \n 'tiddler.tags.containsAny(["$2 $1","again in $2 $1","in $2 $1"])'\n\n script\n '\n function trimName(tiddler) {\n var bob = tiddler.title;\n bob = bob.replace("Project: ","")\n return bob;\n } \n '\n write\n '"[[" + trimName(tiddler) + "|" + tiddler.title + "]] \sn"'\n>>
//{{{\nconfig.macros.projectTasks = {};\nconfig.macros.projectTasks.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n\n wikify('<<tiddler ShowTasksByPriority with:"'+tiddler.title+'">>\sn<<tiddler ShowTasksByContext with:"'+tiddler.title+'">>\sn', place);\n}\n\n//}}}
{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n }\n }\n return result;\n }'\n \n write\n '"<<newTiddler label:\s"Create a New Task\s" prompt:\s"Create a New Task\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" \s>\s>"'\n>>}}}\n{{boxtwo{\n![img[rniolon_images/prior0.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n sortBy \n 'tiddler.title' \n\n write\n '"<<tiddler ShowMyMITTasks with:\s""+context.inTiddler.title+"\s" \s"Task\s" \s"Pending\s" \s"Done\s" \s"Priority\s"\s>\s>"'\n>>{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n } } return result; }'\nwrite\n '"<<newTiddler label:\s"New MIT Task\s" prompt:\s"Create new MIT task for this Project\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" tag:\s"Priority 0 - MIT\s" \s>\s>"'\n>>}}}\n}}}{{boxtwo{\n![img[rniolon_images/prior1.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n sortBy \n 'tiddler.title' \n\n write\n '"<<tiddler ShowTasksByPriority1 with:\s""+context.inTiddler.title+"\s"\s>\s>"'\n>>{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n } } return result; }'\nwrite\n '"<<newTiddler label:\s"New Top Task\s" prompt:\s"Create new Top task for this Project\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" tag:\s"Priority 1 - Top\s" \s>\s>"'\n>>}}}\n}}}{{boxtwo{\n![img[rniolon_images/prior2.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n sortBy \n 'tiddler.title' \n\n write\n '"<<tiddler ShowTasksByPriority2 with:\s""+context.inTiddler.title+"\s"\s>\s>"'\n>>{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n } } return result; }'\nwrite\n '"<<newTiddler label:\s"New Middle Task\s" prompt:\s"Create new Middle task for this Project\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" tag:\s"Priority 2 - Middle\s" \s>\s>"'\n>>}}}\n}}}{{boxtwo{\n![img[rniolon_images/prior3.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n\n sortBy \n 'tiddler.title' \n\n write\n '"<<tiddler ShowTasksByPriority3 with:\s""+context.inTiddler.title+"\s"\s>\s>"'\n>>{{justifyright{\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Led by ")){\n result += tags[i];\n } } return result; }'\nwrite\n '"<<newTiddler label:\s"New Low Task\s" prompt:\s"Create new Low task for this Project\s" tag:\s"" + getSortedTagsText(tiddler) + "\s" tag:\s""+ context.inTiddler.title + "\s" tag:\s"\s" tag:\s"Active\s" tag:\s"Task\s" tag:\s"Priority 3 - Low\s" \s>\s>"'\n>>}}}\n}}}{{boxtwo{\n![img[rniolon_images/context.gif]]\n<<forEachTiddler\n where \n 'tiddler.title.contains([context.inTiddler.title])'\n write\n '"<<tiddler ShowTasksByContext with:\s""+context.inTiddler.title+"\s"\s>\s>"'\n>>\n}}}{{boxtwo{\n![img[rniolon_images/settings.gif]]\n{{newcolumnone{<<forEachTiddler\n where 'tiddler.title.contains([context.inTiddler.title])'\n write '" <<resetProject \s""+context.inTiddler.title+"\s"\s>\s>"'\n>>}}}\n{{newcolumnone{<<toggleTag '13 Never' '.' 'Un/Hide Due Dates'>>\n}}}\n\n\n}}}\n<<foldHeadings closed>>
<html><table cellpadding=5 width="100%"><tr><td valign="top" width="10%">January</td><td valign="top" width="23%"><<tiddler ProjectByMonth with:"January" "01">></td><td valign="top">May</td><td valign="top"><<tiddler ProjectByMonth with:"May" "05">></td><td valign="top">September</td><td valign="top"><<tiddler ProjectByMonth with:"September" "09">></td></tr><tr><td valign="top">February</td><td valign="top"><<tiddler ProjectByMonth with:"February" "02">></td><td valign="top" width="10%">June</td><td valign="top" width="23%"><<tiddler ProjectByMonth with:"June" "06">><td valign="top">October</td><td valign="top"><<tiddler ProjectByMonth with:"October" "10">></td></td></tr><tr><td valign="top">March</td><td valign="top"><<tiddler ProjectByMonth with:"March" "03">></td><td valign="top">July</td><td valign="top"><<tiddler ProjectByMonth with:"July" "07">></td><td valign="top">November</td><td valign="top"><<tiddler ProjectByMonth with:"November" "11">></td></tr><tr><td valign="top">April</td><td valign="top"><<tiddler ProjectByMonth with:"April" "04">></td><td valign="top width="10%"">August</td><td valign="top" width="23%"><<tiddler ProjectByMonth with:"August" "08">></td><td valign="top">December</td><td valign="top"><<tiddler ProjectByMonth with:"December" "12">></td></tr></table></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//}}}
<<forEachTiddler\n where\n 'tiddler.title.contains(store.getTiddler("TiddlerToRefresh").tags)'\n\n script \n ' function refreshMe(tiddler) {\n story.refreshTiddler(tiddler.title,1,true);\n return "";\n } \n function closeMe(){\n story.closeTiddler("Refresh",true);}\n '\n\nwrite 'refreshMe(tiddler)+closeMe()' \n >>
<<newReminder>>\n\n{{columnone{<<reminder year:2008 month:11 day:28 title:"Don't forget this..." >>}}} {{columntwo{<<toggleTag Done "Don't forget this..." >>}}}
/***\n|''Name:''|ReminderPlugin|\n|''Version:''|2.3.10 (Jun 28, 2007)|\n|''Source:''|http://remindermacros.tiddlyspot.com|\n|''Author:''|Jeremy Sheeley(pop1280 [at] excite [dot] com)<br>Maintainer: simon.baird@gmail.com|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|reminder, showreminders, displayTiddlersWithReminders, newReminder|\n|''TiddlyWiki:''|2.0+|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n\n!Description\nThis plugin provides macros for tagging a date with a reminder. Use the {{{reminder}}} macro to do this. The {{{showReminders}}} and {{{displayTiddlersWithReminder}}} macros automatically search through all available tiddlers looking for upcoming reminders.\n\n!Installation\n* Create a new tiddler in your tiddlywiki titled ReminderPlugin and give it the {{{systemConfig}}} tag. The tag is important because it tells TW that this is executable code.\n* Double click this tiddler, and copy all the text from the tiddler's body.\n* Paste the text into the body of the new tiddler in your TW.\n* Save and reload your TW.\n* You can copy some examples into your TW as well. See [[Simple examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]\n\n!Syntax:\n|>|See [[ReminderSyntax]] and [[showRemindersSyntax]]|\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// ReminderPlugin\n//============================================================================\n//============================================================================\n\nversion.extensions.ReminderPlugin = {major: 2, minor: 3, revision: 8, date: new Date(2006,3,9), source: "http://remindermacros.tiddlyspot.com/"};\n\n//============================================================================\n// Configuration\n// Modify this section to change the defaults for \n// leadtime and display strings\n//============================================================================\n\nconfig.macros.reminders = {};\nconfig.macros["reminder"] = {};\nconfig.macros["newReminder"] = {};\nconfig.macros["showReminders"] = {};\nconfig.macros["displayTiddlersWithReminders"] = {};\n\n\nconfig.macros.reminders["defaultLeadTime"] = [0,6000];\nconfig.macros.reminders["defaultReminderMessage"] = "DATE TITLE";\nconfig.macros.reminders["defaultShowReminderMessage"] = "DATE [[TITLE]]";\n\nconfig.macros.reminders["defaultAnniversaryMessage"] = "";\nconfig.macros.reminders["untitledReminder"] = "No Title";\nconfig.macros.reminders["noReminderFound"] = "Due DATE - OVERDUE"\nconfig.macros.reminders["todayString"] = "Today";\nconfig.macros.reminders["tomorrowString"] = "Tomorrow";\nconfig.macros.reminders["ndaysString"] = "DIFF days";\nconfig.macros.reminders["emtpyShowRemindersString"] = "Nothing is overdue";\n\n\n//============================================================================\n// Code\n// You should not need to edit anything \n// below this. Make sure to edit this tiddler and copy \n// the code from the text box, to make sure that \n// tiddler rendering doesn't interfere with the copy \n// and paste.\n//============================================================================\n\n//this object will hold the cache of reminders, so that we don't\n//recompute the same reminder over again.\nvar reminderCache = {};\n\nconfig.macros.showReminders.handler = function showReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the \n //leadtime a few lines down.\n paramHash["leadtime"] = [-10000, 10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = "";\n if (arr.length == 0)\n {\n mess += config.macros.reminders.emtpyShowRemindersString; \n }\n for (var j = 0; j < arr.length; j++)\n {\n if (paramHash["format"] != null)\n {\n arr[j]["params"]["format"] = paramHash["format"];\n }\n else\n {\n arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];\n }\n mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);\n mess += "\sn";\n }\n wikify(mess, elem, null, null);\n};\n\n\nconfig.macros.displayTiddlersWithReminders.handler = function displayTiddlersWithReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the leadtime \n //a few lines down.\n paramHash["leadtime"] = [-10000,10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n for (var j = 0; j < arr.length; j++)\n {\n displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false);\n }\n};\n\nconfig.macros.reminder.handler = function reminder(place,macroName,params)\n{\n var dateHash = getParamsForReminder(params);\n if (dateHash["hidden"] != null)\n {\n return;\n }\n var leadTime = dateHash["leadtime"];\n if (leadTime == null)\n {\n leadTime = config.macros.reminders["defaultLeadTime"]; \n }\n var leadTimeLowerBound = new Date().getMidnight().addDays(leadTime[0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(leadTime[1]);\n var matchedDate = findDateForReminder(dateHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound);\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(place).id.substr(7);\n if (matchedDate != null)\n {\n var diff = matchedDate.getDifferenceInDays(new Date().getMidnight());\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate, title);\n wikify(mess, elem, null, null);\n }\n else\n {\n createTiddlyElement(place,"span",null,null, config.macros.reminders["noReminderFound"].replace("TITLE", dateHash["title"]).replace("LEADTIMEUPPER", leadTime[1]).replace("LEADTIMELOWER", leadTime[0]).replace("TIDDLERNAME", title).replace("TIDDLER", "[[" + title + "]]") );\n }\n};\n\nconfig.macros.newReminder.handler = function newReminder(place,macroName,params)\n{\n var today=new Date().getMidnight();\n var formstring = '<html><form>';\n\n formstring += 'Reminder: <input type="text" size="40" name="title" value="" onfocus="this.select();">';\n\n formstring += ' <select name="month"><option value="">Every month</option>';\n for (i = 0; i < 12; i++)\n {\n formstring += '<option' + ((i == today.getMonth()) ? ' selected' : '') + ' value="' + (i+1) + '">' + config.messages.dates.months[i] + '</option>';\n }\n\n formstring += '</select> <select name="day"><option value="">Every day</option>';\n for (i = 1; i < 32; i++)\n {\n formstring += '<option' + ((i == (today.getDate() )) ? ' selected' : '') + ' value="' + i + '">' + i + '</option>';\n }\n\n formstring += '</select> <select name="year"><option value="">Every year</option>';\n for (var i = 0; i < 5; i++)\n {\n formstring += '<option' + ((i == 0) ? ' selected' : '') + ' value="' + (today.getFullYear() +i) + '">' + (today.getFullYear() + i) + '</option>';\n }\n\n formstring += '</select> ';\n\n formstring += '<input type="button" value="Save Reminder" onclick="addReminderToTiddler(this.form)"></form></html>';\n\n var panel = config.macros.slider.createSlider(place,null,"New Reminder","Open a form to add a new reminder to this tiddler");\n wikify(formstring ,panel,null,store.getTiddler(params[1]));\n};\n\n// onclick: process input and insert reminder at 'marker'\nwindow.addReminderToTiddler = function(form) {\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(form).id.substr(7);\n var tiddler=store.getTiddler(title);\n\n var txt='\sn{{columnone{<<reminder ';\n\n if (form.year.value != "")\n txt += 'year:'+form.year.value + ' ';\n if (form.month.value != "")\n txt += 'month:'+form.month.value + ' ';\n if (form.day.value != "")\n txt += 'day:'+form.day.value + ' ';\n txt += 'title:"'+form.title.value+'" ';\n txt +='>>}}} ';\n\n\n// store.saveTiddler(form.title.value,form.title.value,"",config.options.txtUserName,new Date(),"areminder");\n txt +=' {{columntwo{<<toggleTag Done "'+form.title.value+'" >>}}}';\n\n tiddler.set(null,tiddler.text + txt);\n\n window.story.refreshTiddler(title,1,true);\n store.setDirty(true);\n};\n\nfunction hasTag(tiddlerTags, tagFilters)\n{\n //Make sure we respond well to empty tiddlerTaglists or tagFilterlists\n if (tagFilters.length==0 || tiddlerTags.length==0)\n {\n return true;\n }\n\n var bHasTag = false;\n \n /*bNoPos says: "'till now there has been no check using a positive filter"\n Imagine a filterlist consisting of 1 negative filter:\n If the filter isn't matched, we want hasTag to be true.\n Yet bHasTag is still false ('cause only positive filters cause bHasTag to change)\n \n If no positive filters are present bNoPos is true, and no negative filters are matched so we have not returned false\n Thus: hasTag returns true.\n \n If at any time a positive filter is encountered, we want at least one of the tags to match it, so we turn bNoPos to false, which\n means bHasTag must be true for hasTag to return true*/\n var bNoPos=true;\n \nfor (var t3 = 0; t3 < tagFilters.length; t3++)\n {\n for(var t2=0; t2<tiddlerTags.length; t2++)\n {\n if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!') \n {\n if (tiddlerTags[t2] == tagFilters[t3].substring(1))\n {\n //If at any time a negative filter is matched, we return false\n return false;\n }\n }\n else \n {\n if (bNoPos)\n {\n //We encountered the first positive filter\n bNoPos=false;\n }\n if (tiddlerTags[t2] == tagFilters[t3])\n {\n //A positive filter is matched. As long as no negative filter is matched, hasTag will return true\n bHasTag=true;\n }\n }\n }\n }\n return (bNoPos || bHasTag);\n};\n\n//This function searches all tiddlers for the reminder //macro. It is intended that other plugins (like //calendar) will use this function to query for \n//upcoming reminders.\n//The arguments to this function filter out reminders //based on when they will fire.\n//\n//ARGUMENTS:\n//baseDate is the date that is used as "now". \n//leadtime is a two element int array, with leadtime[0] \n// as the lower bound and leadtime[1] as the\n// upper bound. A reasonable default is [0,14]\n//tags is a space-separated list of tags to use to filter \n// tiddlers. If a tag name begins with an !, then \n// only tiddlers which do not have that tag will \n// be considered. For example "examples holidays" \n// will search for reminders in any tiddlers that \n// are tagged with examples or holidays and \n// "!examples !holidays" will search for reminders \n// in any tiddlers that are not tagged with \n// examples or holidays. Pass in null to search \n// all tiddlers.\n//limit. If limit is null, individual reminders can \n// override the leadtime specified earlier. \n// Pass in 1 in order to override that behavior.\n\nwindow.findTiddlersWithReminders = function findTiddlersWithReminders(baseDate, leadtime, tags, limit)\n{\n//function(searchRegExp,sortField,excludeTag)\n// var macroPattern = "<<([^>\s\s]+)(?:\s\s*)([^>]*)>>";\n var macroPattern = "<<(reminder)(.*)>>";\n var macroRegExp = new RegExp(macroPattern,"mg");\n var matches = store.search(macroRegExp,"title","");\n var arr = [];\n var tagsArray = null;\n if (tags != null)\n {\n // tagsArray = tags.split(" ");\n tagsArray = tags.readBracketedList(); // allows tags with spaces. thanks Robin Summerhill, 4-Oct-06.\n }\n for(var t=matches.length-1; t>=0; t--)\n {\n if (tagsArray != null)\n {\n //If they specified tags to filter on, and this tiddler doesn't \n //match, skip it entirely.\n if ( ! hasTag(matches[t].tags, tagsArray))\n {\n continue;\n }\n }\n\n var targetText = matches[t].text;\n do {\n // Get the next formatting match\n var formatMatch = macroRegExp.exec(targetText);\n if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")\n {\n //Find the matching date.\n \n var params = formatMatch[2] != null ? formatMatch[2].readMacroParams() : {};\n var dateHash = getParamsForReminder(params);\n if (limit != null || dateHash["leadtime"] == null)\n {\n if (leadtime == null)\n dateHash["leadtime"] = leadtime;\n else\n {\n dateHash["leadtime"] = [];\n dateHash["leadtime"][0] = leadtime[0];\n dateHash["leadtime"][1] = leadtime[1];\n }\n }\n if (dateHash["leadtime"] == null)\n dateHash["leadtime"] = config.macros.reminders["defaultLeadTime"]; \n var leadTimeLowerBound = baseDate.addDays(dateHash["leadtime"][0]);\n var leadTimeUpperBound = baseDate.addDays(dateHash["leadtime"][1]);\n var matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n while (matchedDate != null)\n {\n var hash = {};\n hash["diff"] = matchedDate.getDifferenceInDays(baseDate);\n hash["matchedDate"] = new Date(matchedDate.getFullYear(), matchedDate.getMonth(), matchedDate.getDate(), 0, 0);\n hash["params"] = cloneParams(dateHash);\n hash["tiddler"] = matches[t].title;\n hash["tags"] = matches[t].tags;\n arr.pushUnique(hash);\n if (dateHash["recurdays"] != null || (dateHash["year"] == null))\n {\n leadTimeLowerBound = leadTimeLowerBound.addDays(matchedDate.getDifferenceInDays(leadTimeLowerBound)+ 1);\n matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n }\n else matchedDate = null;\n }\n }\n }while(formatMatch);\n }\n if(arr.length > 1) //Sort the array by number of days remaining.\n {\n arr.sort(function (a,b) {if(a["diff"] == b["diff"]) {return(0);} else {return (a["diff"] < b["diff"]) ? -1 : +1; } });\n }\n return arr;\n};\n\n//This function takes the reminder macro parameters and\n//generates the string that is used for display.\n//This function is not intended to be called by \n//other plugins.\n window.getReminderMessageForDisplay= function getReminderMessageForDisplay(diff, params, matchedDate, tiddlerTitle)\n{\n var anniversaryString = "";\n var reminderTitle = params["title"];\n if (reminderTitle == null)\n {\n reminderTitle = config.macros.reminders["untitledReminder"];\n }\n if (params["firstyear"] != null)\n {\n// anniversaryString = \n// config.macros.reminders["defaultAnniversaryMessage"]\n// .replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));\n\n anniversaryString = "anniversarystring";\n }\n var mess = "";\n var diffString = "";\n if (diff == 0)\n {\n diffString = config.macros.reminders["todayString"];\n }\n else if (diff == 1)\n {\n diffString = config.macros.reminders["tomorrowString"];\n }\n else\n {\n diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);\n }\n var format = config.macros.reminders["defaultReminderMessage"];\n if (params["format"] != null)\n {\n format = params["format"];\n }\n mess = format;\n//HACK! -- Avoid replacing DD in TIDDLER with the date\n mess = mess.replace(/TIDDLER/g, "TIDELER");\n mess = matchedDate.formatStringDateOnly(mess);\n mess = mess.replace(/TIDELER/g, "TIDDLER");\n if (tiddlerTitle != null)\n {\n mess = mess.replace(/TIDDLERNAME/g, tiddlerTitle);\n mess = mess.replace(/TIDDLER/g, "[[" + tiddlerTitle + "]]");\n }\n \n mess = mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("0MM/0DD/YY")).replace("ANNIVERSARY", anniversaryString);\n return mess;\n};\n\n// Parse out the macro parameters into a hashtable. This\n// handles the arguments for reminder, showReminders and \n// displayTiddlersWithReminders.\nwindow.getParamsForReminder = function getParamsForReminder(params)\n{\n var dateHash = {};\n var type = "";\n var num = 0;\n var title = "";\n for(var t=0; t<params.length; t++)\n {\n var split = params[t].split(":");\n type = split[0].toLowerCase();\n var value = split[1];\n for (var i=2; i < split.length; i++)\n {\n value += ":" + split[i];\n }\n if (type == "nolinks" || type == "limit" || type == "hidden")\n {\n num = 1;\n }\n else if (type == "leadtime")\n {\n var leads = value.split("...");\n if (leads.length == 1)\n {\n leads[1]= leads[0];\n leads[0] = 0;\n }\n leads[0] = parseInt(leads[0], 10);\n leads[1] = parseInt(leads[1], 10);\n num = leads;\n }\n else if (type == "offsetdayofweek")\n {\n if (value.substr(0,1) == "-")\n {\n dateHash["negativeOffsetDayOfWeek"] = 1;\n value = value.substr(1);\n }\n num = parseInt(value, 10);\n }\n else if (type != "title" && type != "tag" && type != "format")\n {\n num = parseInt(value, 10);\n }\n else\n {\n title = value;\n t++;\n while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"' && params[t] != undefined)\n {\n title += " " + params[t++];\n }\n //Trim off the leading and trailing quotes\n if (title.substr(0,1) == "\s"" && title.substr(title.length - 1,1)== "\s"")\n {\n title = title.substr(1, title.length - 2);\n t--;\n }\n num = title;\n }\n dateHash[type] = num;\n }\n //date is synonymous with day\n if (dateHash["day"] == null)\n {\n dateHash["day"] = dateHash["date"];\n }\n return dateHash;\n};\n\n//This function finds the date specified in the reminder \n//parameters. It will return null if no match can be\n//found. This function is not intended to be used by\n//other plugins.\nwindow.findDateForReminder= function findDateForReminder( dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound)\n{\n if (baseDate == null)\n {\n baseDate = new Date().getMidnight();\n }\n var hashKey = baseDate.convertToYYYYMMDDHHMM();\n for (var k in dateHash)\n {\n hashKey += "," + k + "|" + dateHash[k];\n }\n hashKey += "," + leadTimeLowerBound.convertToYYYYMMDDHHMM();\n hashKey += "," + leadTimeUpperBound.convertToYYYYMMDDHHMM();\n if (reminderCache[hashKey] == null)\n {\n //If we don't find a match in this run, then we will\n //cache that the reminder can't be matched.\n reminderCache[hashKey] = false;\n }\n else if (reminderCache[hashKey] == false)\n {\n //We've already tried this date and failed\n return null;\n }\n else\n {\n return reminderCache[hashKey];\n }\n \n var bOffsetSpecified = dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null || \n dateHash["recurdays"] != null;\n \n // If we are matching the base date for a dayofweek offset, look for the base date a \n //little further back.\n var tmp1leadTimeLowerBound = leadTimeLowerBound; \n if ( dateHash["offsetdayofweek"] != null)\n {\n tmp1leadTimeLowerBound = leadTimeLowerBound.addDays(-6); \n }\n var matchedDate = baseDate.findMatch(dateHash, tmp1leadTimeLowerBound, leadTimeUpperBound);\n if (matchedDate != null)\n {\n var newMatchedDate = matchedDate;\n if (dateHash["recurdays"] != null)\n {\n while (newMatchedDate.getTime() < leadTimeLowerBound.getTime())\n {\n newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);\n }\n }\n else if (dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null)\n {\n var tmpdateHash = cloneParams(dateHash);\n tmpdateHash["year"] = dateHash["offsetyear"];\n tmpdateHash["month"] = dateHash["offsetmonth"];\n tmpdateHash["day"] = dateHash["offsetday"];\n tmpdateHash["dayofweek"] = dateHash["offsetdayofweek"];\n var tmpleadTimeLowerBound = leadTimeLowerBound;\n var tmpleadTimeUpperBound = leadTimeUpperBound;\n if (tmpdateHash["offsetdayofweek"] != null)\n {\n if (tmpdateHash["negativeOffsetDayOfWeek"] == 1)\n {\n tmpleadTimeLowerBound = matchedDate.addDays(-6);\n tmpleadTimeUpperBound = matchedDate;\n\n }\n else\n {\n tmpleadTimeLowerBound = matchedDate;\n tmpleadTimeUpperBound = matchedDate.addDays(6);\n }\n\n }\n newMatchedDate = matchedDate.findMatch(tmpdateHash, tmpleadTimeLowerBound, tmpleadTimeUpperBound);\n //The offset couldn't be matched. return null.\n if (newMatchedDate == null)\n {\n return null;\n }\n }\n if (newMatchedDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n reminderCache[hashKey] = newMatchedDate;\n return newMatchedDate;\n }\n }\n return null;\n};\n\n//This does much the same job as findDateForReminder, but\n//this one doesn't deal with offsets or recurring \n//reminders.\nDate.prototype.findMatch = function findMatch(dateHash, leadTimeLowerBound, leadTimeUpperBound)\n{\n\n var bSpecifiedYear = (dateHash["year"] != null);\n var bSpecifiedMonth = (dateHash["month"] != null);\n var bSpecifiedDay = (dateHash["day"] != null);\n var bSpecifiedDayOfWeek = (dateHash["dayofweek"] != null);\n if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)\n {\n return new Date(dateHash["year"], dateHash["month"]-1, dateHash["day"], 0, 0);\n }\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)\n {\n\n //Shortcut -- First try this year. If it's too small, try next year.\n var tmpMidnight = this.getMidnight();\n var tmpDate = new Date(this.getFullYear(), dateHash["month"]-1, dateHash["day"], 0,0);\n if (tmpDate.getTime() < leadTimeLowerBound.getTime())\n {\n tmpDate = new Date((this.getFullYear() + 1), dateHash["month"]-1, dateHash["day"], 0,0);\n }\n if ( tmpDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n return tmpDate;\n }\n else\n {\n return null;\n }\n }\n\n var newDate = leadTimeLowerBound; \n while (newDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n var tmp = testDate(newDate, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek);\n if (tmp != null)\n return tmp;\n newDate = newDate.addDays(1);\n }\n};\n\nfunction testDate(testMe, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek)\n{\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedYear)\n {\n bMatchedYear = (dateHash["year"] == testMe.getFullYear());\n }\n if (bSpecifiedMonth)\n {\n bMatchedMonth = ((dateHash["month"] - 1) == testMe.getMonth() );\n }\n if (bSpecifiedDay)\n {\n bMatchedDay = (dateHash["day"] == testMe.getDate());\n }\n if (bSpecifiedDayOfWeek)\n {\n bMatchedDayOfWeek = (dateHash["dayofweek"] == testMe.getDay());\n }\n\n if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)\n {\n return testMe;\n }\n};\n\n//Returns true if the date is in between two given dates\nDate.prototype.isBetween = function isBetween(lowerBound, upperBound)\n{\n return (this.getTime() >= lowerBound.getTime() && this.getTime() <= upperBound.getTime());\n}\n//Return a new date, with the time set to midnight (0000)\nDate.prototype.getMidnight = function getMidnight()\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0);\n};\n// Add the specified number of days to a date.\nDate.prototype.addDays = function addDays(numberOfDays)\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate() + numberOfDays, 0, 0);\n};\n//Return the number of days between two dates.\nDate.prototype.getDifferenceInDays = function getDifferenceInDays(otherDate)\n{\n//I have to do it this way, because this way ignores daylight savings\n var tmpDate = this.addDays(0);\n if (this.getTime() > otherDate.getTime())\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() > otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(-1);\n }\n return i;\n }\n else\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() < otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(1);\n }\n return i * -1;\n }\n return 0;\n};\nfunction cloneParams(what) {\n var tmp = {};\n for (var i in what) {\n tmp[i] = what[i];\n }\n return tmp;\n}\n// Substitute date components into a string\nDate.prototype.formatStringDateOnly = function formatStringDateOnly(template)\n{\n template = template.replace("YYYY",this.getFullYear());\n template = template.replace("YY",String.zeroPad(this.getFullYear()-2000,2));\n template = template.replace("MMM",config.messages.dates.months[this.getMonth()]);\n template = template.replace("0MM",String.zeroPad(this.getMonth()+1,2));\n template = template.replace("MM",this.getMonth()+1);\n template = template.replace("DDD",config.messages.dates.days[this.getDay()]);\n template = template.replace("0DD",String.zeroPad(this.getDate(),2));\n template = template.replace("DD",this.getDate());\n return template;\n};\n\n//}}}
The reminder macro can take the following arguments.\n\n!!!!date syntax\n* @@{{{year:NUMBER}}}@@ - The four digit representation of the year (for example {{{year:2046}}} or {{{year:1999}}}\n* @@{{{month:NUMBER}}}@@ - The numerical representation of the month (for example {{{month:1}}} for January, {{{month:12}}} for December)\n* @@{{{day:NUMBER}}}@@ - The numerical representation of the day of the month (for example {{{day:15}}} will match the 15th day of the month)\n* @@{{{dayofweek:NUMBER}}}@@ - The numerical representation of the day of the week. Valid values are in the range of 0-6. {{{dayofweek:0}}} will match Sunday, and {{{dayofweek:6}}} will match Saturday.\n\n!!!!offsets\n* @@{{{offsetdayofweek:NUMBER}}}@@ - The numerical representation of a day of the week. Valid values are in the range of 0-6. 0 will match Sunday, and 6 will match Saturday. If offsetdayofweek is specified, the year, month, day and dayofweek will be matched as usual, and the reminder will be set to the next occurence of the day of the week specified by offsetdayofweek. For example, the first Thursday of the month can be specified as {{{day:1 offsetdayofweek:4}}} and the second Thursday can be specified as {{{day:8 offsetdayofweek4}}} If offsetdayofweek is negative, the search will be performed backward. For example, the last Thursday in August can be found by {{{month:8 day:31 offsetdayofweek:-4}}}\n* @@{{{recurdays:NUMBER}}}@@ - If recurdays is set, then the reminder will fire on the base date specified by year, month, day, and dayofweek and also every N days afterward. For example, if the reminder is specified with {{{year:2005 month:8 day:16 recurdays:2}}} it will match August 16, 18, 20, etc. Please make sure that you fully specify year, month and day in any recurring reminder.\n\n!!!!leadtime\n* @@{{{leadtime:NUMBER}}}@@ - Use this to specify when this reminder will appear in [[showReminders]]. If a reminder has a leadtime of 2, it will only show up in showReminders if it will be matched in the next two days. Likewise, a reminder with a leadtime of 60 will show up in showReminders even if showReminders has a lower leadtime. showReminders can override this behavior with the limit argument.\n\n!!!!Reminder display options\n* @@{{{title:"STRING"}}}@@ - A string used to identify this reminder when it is shown in a list of reminders. For example, {{{title:"New Year's Day"}}} or {{{title:"Elvis' Birthday"}}}. You can put standard TiddlyWiki formatting in the title.\n* @@{{{format:"STRING"}}}@@ - Use this argument to override the default string used for display. You can put standard TiddlyWiki formatting in the format. The following substitutions will be made in the string before it is displayed.\n** DIFF will be replaced with the one of the strings "Today", "Tommorrow", or "N days", where N is the number of days between now and the date of the reminder. \n** TITLE will be replaced with the title of the reminder\n** DATE will be replaced with the matched date of the reminder.\n** ANNIVERSARY will be replaced with the number of years since between the matched date and firstyear\nThe default string is "DIFF: TITLE on DATE ANNIVERSARY"\n* @@{{{firstyear:NUMBER}}}@@ - The first year that a reminder occurred, in four digit format. For example {{{firstyear:2001}}}. This is used when calculating the number of years that a reminder has happened.\n* @@{{{hidden}}}@@ - If this option is present, the reminder will not be displayed in the regular view of the tiddler. You can use this to have reminders for [[displayTiddlersWithReminders]] to find, without having the countdown appear. See [[Season's Greetings example]] for an example.
[[Add a Reminder|Reminder]] \n{{deadlines {\n|''Overdue''|<<showReminders leadtime:-120...-1 >>|''Upcoming''|<<showReminders leadtime:0...120 >>|\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|Name|SaveAndReloadMacro|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#SaveAndReloadMacro|\n|Version|1.0|\n|Requires|~TW2.x|\n!Description:\nProvides a button to save and reload TW. Useful if you are testing code and dont have AutoSave enabled.\n\n!Demo:\n{{{<<saveAndReload>>}}}<<saveAndReload>>\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\n\n!History:\n*24-07-06: ver 1.0\n\n!Code\n***/\n//{{{\nconfig.macros.saveAndReload={};\nconfig.macros.saveAndReload.handler= function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = params[0]||"-";\n var tooltip = params[1]||"Save & reload";\n createTiddlyButton(place,label,tooltip,this.onclick);\n}\nconfig.macros.saveAndReload.onclick= function()\n{\n saveChanges();\n window.location.reload( false );\n}\n//}}}
/***\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//}}}
These InterfaceOptions for customising TiddlyWiki are saved in your browser\n\n<<option chkOpenInNewWindow>> OpenLinksInNewWindow\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 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>>
<<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Task","$1","$2"]) \n && ! tiddler.tags.contains("$3") \n && ! tiddler.tags.contains("$4")'\n\n sortBy\n 'getPriority(tiddler)+"###"+tiddler.title'\n ascending\n \n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("$5")){\n result += tags[i]+" ";\n }\n }\n return result;\n }\n\n function getPriority(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Priority ")){\n result += tags[i]+" ";\n }\n }\n return result;\n }\n\n function getGroupTitle(tiddler, context) {\n if (!context.lastGroup || context.lastGroup != getSortedTagsText(tiddler)) { \n context.lastGroup = getSortedTagsText(tiddler); \n return "\sn{{contextcolumnone{"+(context.lastGroup?context.lastGroup:"no tags")+"}}}";\n } \n else return "";\n } \n'\n \nwrite\n 'getGroupTitle(tiddler, context)+"\sn{{contextcolumntwo{<<toggleTag Done \s"" + tiddler.title + "\s" - \s>\s> [["+ tiddler.title + "]] }}}"\n' \n>>
<<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Task","$1","$2","Priority 0 - MIT"]) \n && ! tiddler.tags.contains("$3") \n && ! tiddler.tags.contains("$4")'\n\n sortBy\n 'getSortedTagsText(tiddler)+"###"+tiddler.title'\n ascending\n \n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("$5")){\n result += tags[i];\n }\n }\n return result;\n } \n\n'\n \n write\n '"{{newcolumnone{<<toggleTag Done \s"" + tiddler.title + "\s" - \s>\s> [["+ tiddler.title + "]] }}}\sn"' \n>>
<<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Task","$1","$2","$5"]) \n && ! tiddler.tags.contains("$3") \n && ! tiddler.tags.contains("$4")'\n\n sortBy\n 'getSortedTagsText(tiddler)+"###"+tiddler.title'\n ascending\n \n script\n 'function getSortedTagsText(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("$5")){\n result += tags[i];\n }\n }\n return result;\n }\n'\n \nwrite\n '"{{newcolumnone{<<toggleTag Done \s"" + tiddler.title + "\s" - \s>\s> [["+ tiddler.title + "]] }}}\sn"' \n>>
<<forEachTiddler \n where \n 'tiddler.tags.containsAll(["Project"])'\n\n sortBy \n 'tiddler.title'\n\nwrite '"{{sectiontitle{\sn "+tiddler.title.slice(9) +" }}} {{boxone{\sn <<tiddler TP-MIT with:\s""+tiddler.title+"\s"\s>\s>\sn<<tiddler TP-Top with:\s""+tiddler.title+"\s"\s>\s>}}}\sn"' \n>>\n\n
{{contextcolumnzero{Active}}}<<tiddler ShowMyContexts with:"$1" "Task" "Pending" "Done" "at " "Priority:">>\n{{contextcolumnzero{Pending}}}<<tiddler ShowMyContexts with:"$1" "Pending" "Done" "Done" "at " "Priority:">>
<<tiddler ShowMyTasks with:"$1" "Task" "Pending" "Done" "Priority 1 - Top">>
<<tiddler ShowMyTasks with:"$1" "Task" "Pending" "Done" "Priority 2 - Middle">>
<<tiddler ShowMyTasks with:"$1" "Task" "Pending" "Done" "Priority 3 - Low">>
<<search>>\n<<closeAll>>\n<<permaview>>\n<<newTiddler>>\n<<saveChanges>>
<<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Task","Active"]) \n && ! tiddler.tags.contains("Pending") \n && ! tiddler.tags.contains("Done")\n && ! tiddler.tags.contains("Priority 1 - Top")\n && ! tiddler.tags.contains("Priority 2 - Middle")\n && ! tiddler.tags.contains("Priority 3 - Low")\n && ! tiddler.tags.contains("Project")'\n\n sortBy\n 'getGroupCaption(tiddler)+tiddler.title'\n ascending\n \n script\n 'function getGroupCaption(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Priority")){\n if(tags[i].contains("Priority 0 - MIT")){\n result += "1";\n } else {\n if(tags[i].contains("Priority 1 - Top")){\n result += "2";\n } else {\n if(tags[i].contains("Priority 2 - Middle")){\n result += "3";\n } else {\n if(tags[i].contains("Priority 3 - Low")){\n result += "4";\n } else {\n result += tags[i];\n }\n }\n }\n }\n }\n }\n return result;\n }\n\n\n function getGroupTitle(tiddler, context) {\n if (!context.lastGroup || context.lastGroup != getGroupCaption(tiddler)) {\n context.lastGroup = getGroupCaption(tiddler); \n\n if(context.lastGroup.contains("1")){\n return "";\n } else {\n return " \sn";\n }\n } else \n return "";\n }\n\n '\n \n write\n '"{{simplestyle{"+getGroupTitle(tiddler, context)+"[[" + tiddler.title+"]]}}}\sn"'\n>>
<<forEachTiddler where 'tiddler.tags.containsAll(["Task","Active"]) && ! tiddler.tags.containsAny(["Pending","Done","Project","Priority 0 - MIT","Priority 2 - Middle","Priority 3 - Low"])' \n sortBy 'getGroupCaption(tiddler)+tiddler.title' ascending\n \n script\n 'function getGroupCaption(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Priority")){\n if(tags[i].contains("Priority 0 - MIT")){\n result += "1";\n } else {\n if(tags[i].contains("Priority 1 - Top")){\n result += "2";\n } else {\n if(tags[i].contains("Priority 2 - Middle")){\n result += "3";\n } else {\n if(tags[i].contains("Priority 3 - Low")){\n result += "4";\n } else {\n result += tags[i];\n }\n }\n }\n }\n }\n }\n return result;\n }\n\n\n function getGroupTitle(tiddler, context) {\n if (!context.lastGroup || context.lastGroup != getGroupCaption(tiddler)) {\n context.lastGroup = getGroupCaption(tiddler); \n\n if(context.lastGroup.contains("1")){\n return "";\n } else {\n return "";\n }\n } else \n return " ";\n } '\n \n write\n '"{{simplestyle{ "+getGroupTitle(tiddler, context)+" [["+ tiddler.title+"]]}}}\sn"'\n>>
<<forEachTiddler\n where \n 'tiddler.tags.containsAll(["Task","Active"]) \n && ! tiddler.tags.contains("Pending") \n && ! tiddler.tags.contains("Done") \n && ! tiddler.tags.contains("Project")\n && tiddler.tags.contains("Priority 2 - Middle")'\n\n sortBy\n 'getGroupCaption(tiddler)+tiddler.title'\n ascending\n \n script\n 'function getGroupCaption(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n if(tags[i].contains("Priority")){\n if(tags[i].contains("Priority 0 - MIT")){\n result += "1";\n } else {\n if(tags[i].contains("Priority 1 - Top")){\n result += "2";\n } else {\n if(tags[i].contains("Priority 2 - Middle")){\n result += "3";\n } else {\n if(tags[i].contains("Priority 3 - Low")){\n result += "4";\n } else {\n result += tags[i];\n }\n }\n }\n }\n }\n }\n return result;\n }\n\n\n function getGroupTitle(tiddler, context) {\n if (!context.lastGroup || context.lastGroup != getGroupCaption(tiddler)) {\n context.lastGroup = getGroupCaption(tiddler); \n return "";\n } else {\n return "";\n }\n }\n '\n \n write\n '"{{simplestyle{"+getGroupTitle(tiddler, context)+"[[" + tiddler.title+"]]}}}\sn"'\n>>
{{simplestyle{\n''Overdue''\n<<showReminders leadtime:-30...-1 >> \n\n''Upcoming''\n<<showReminders leadtime:0...60 >> \n}}}
/***\n|Name||\n|Created by|Simon Baird|\n|Location|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/c61b9b0e2f639684/655c866fbd66f511?lnk=gst&q=tsuser&rnum=1#655c866fbd66f511|\n|Version|1.0|\n|Requires|~TW2.x|\n!Description:\nThis is based on BlogUserPlugin by Simon Baird. His macro provided a quick way to create a pretty link to a desired website, like ~MySpace. I modified it to insert the syntax for my favorite plugins more easily.\n\n\n!Demo:\n''Link to File'' \n{{{<<linktofile "Link" "Filename">>}}} produces <<linktofile Link Filename>> \n\n\n''Notice'' \n{{{<<notice "something important">>}}} produces <<notice "something important">>\n\n!Installation:\nCopy the contents of this tiddler to a new tiddler in your TW, tag with systemConfig, save and reload your TW.\n\n!Code\n\n!!Link to File\n***/\n//{{{\nconfig.macros.linktofile = { handler: function(place,name,params) {\n wikify('<<LaunchApplication "' + params[0] + '" "file" "'+ config.options.filedirectory + params[1]+'">>',\n place);\n}}; \n//}}}\n\n\n/***\n!!Easy Printing\n***/\n//{{{\nconfig.macros.easyprint = { handler: function(place,name,params) {\n wikify("{{justifyright{\sn<<newDocument nofile print here>>\sn}}}",\n place);\n}}; \n//}}}\n\n\n\n\n/***\n!!Notice\n***/\n//{{{\nconfig.macros.notice = { handler: function(place,name,params) {\n wikify("{{boxfour {\sn''Note: '' "+ params[0]+ "\sn}}}",\n place);\n}}; \n//}}}
<<saveAndReload>> Things To Do <<saveAndReload>>
/***\n!My Additions\n***/\n/*{{{*/\n\n\n.boxone {\n background: #EBF0F3;\n padding: 0.5em 0.5em 0.5em 0.6em;\n border-top:solid #e8ffd2 1px;\n border-left:solid #e8ffd2 1px;\n border-bottom:solid #404040 2px;\n border-right:solid #404040 2px;\n -moz-border-radius: 1.0em;\n color: #384F6E;\n}\n\n.boxthree {\n background: #384F6E;\n padding: 0.5em 0.5em 0.5em 0.6em;\n border-top:solid #e8ffd2 1px;\n border-left:solid #e8ffd2 1px;\n border-bottom:solid #404040 2px;\n border-right:solid #404040 2px;\n -moz-border-radius: 1.0em;\n color: white;\n}\n\n.boxtwo {\n background: #FFFFFF;\n padding: 0.5em 0.5em 0.5em 0.6em;\n border-top:solid #e8ffd2 1px;\n border-left:solid #e8ffd2 1px;\n border-bottom:solid #404040 2px;\n border-right:solid #404040 2px;\n -moz-border-radius: 1.0em;\n color: black;\n}\n\n.boxtwo h4{\n background: #E3F1F9;\n padding: 0.5em 0.5em 0.5em 0.6em;\n border-top:solid #e8ffd2 1px;\n border-left:solid #e8ffd2 1px;\n border-bottom:solid #404040 2px;\n border-right:solid #404040 2px;\n -moz-border-radius: 1.0em;\n}\n\n.quotes {\n width:75%;\n text-align: left;\n}\n\n.deadlines table {\n border: 1px solid #fff;\n width: 100%;\n}\n.deadlines table td {\n border: 1px solid #fff;\n vertical-align: top;\n}\n.deadlines .taskdone{\n visibility: hidden;\n display: none;\n}\n\n.cleantable table {\n border: 0px ;\n width: 100%;\n cellpadding: 0;\n cellspacing: 0;\n}\n.cleantable table td {\n border: 0px;\n vertical-align: top;\n}\n\n\n.mycolumnone{\n position:absolute;\n left: 60px;\n width:280px;\n}\n.mycolumntwo{\n position:absolute;\n left: 350px;\n width:350px;\n}\n\n\n.justifyright {\ntext-align: right;\n}\n.justifycenter {\ntext-align: center;\n}\n\n\n\n.newcolumnzero{\n position: absolute;\n font-weight: bold;\n left: 50px;\n width:600px;\n}\n.newcolumnone{\n position: absolute;\n font-weight: bold;\n left: 100px;\n width:500px;\n}\n\n\n\n.contextcolumnone{\n position: absolute;\n font-weight: bold;\n left: 150px;\n width:300px;\n color:black;\n}\n.contextcolumnzero{\n color:black;\n font-size: 140%; \n font-weight: bold;\n margin-left:5px;\n padding-top:-15px;\n}\n.contextcolumntwo{\n position:absolute;\n left: 170px;\n width:300px;\n}\n\n.projectcolumnone{\n position: absolute;\n font-weight: bold;\n left: 60px;\n width:125px;\n}\n.projectcolumntwo{\n position:absolute;\n left: 195px;\n width:30px;\n}\n.projectcolumnthree{\n position:absolute;\n left: 235px;\n width:300px;\n}\n.projectcolumnfour{\n position:absolute;\n left: 275px;\n width:30px;\n}\n.projectcolumnfive{\n position:absolute;\n left: 315px;\n width:300px; \n color: maroon;\n}\n.projectcolumnsix{\n position:absolute;\n left: 575px;\n width:130px;\n}\n\n\nhr {\n border : thin solid #353C49;\n}\n\n\n.smallerclass {\n font-size: 90%; \n}\n.largerclass {\n font-size: 120%; \n line-height: 30px\n}\n\n\n\n.blueline hr {\n border : thin solid #B5BDCA;\n}\n\n\n.viewer .simplestyle a.tiddlyLinkExisting:link, .viewer .simplestyle a.tiddlyLinkNonExisting:link{\n color: #474D6B;\n font-size: 70%; \n}\n\n.columnone {\n position:absolute;\n left: 60px;\n width:300px;\n}\n.columntwo {\n position:absolute;\n left: 400px;\n width:300px;\n}\n.columntwoa {\n position:absolute;\n left: 350px;\n width:400px;\n text-align: left;\n}\n.columnthree {\n position:absolute;\n left: 510px;\n width:200px;\n}\n\n.sectiontitle {\n font-weight: bold;\n font-size: 150%;\n color:#5B6179;\n}\n\n/*}}}*/\n/***\n!General Rules\n***/\n/*{{{*/\na,.button{\n color: #384F6E;\n font-weight: bold;\n text-decoration: none;\n background: transparent;\n border: 0px;\n margin: -2px;\n}\n\na:hover,.button:hover{\n background: transparent;\n text-decoration: none;\n color: #384F6E;\n}\n\nbody {\n font-size: 90%; \n font-family: 'Trebuchet MS', Verdana, Arial, Sans-Serif;\n color: #666;\n margin: 0 0 0 0;\n background: transparent url(http://www.psychpage.com/wiki/rniolon_images/background.jpg) \n\n}\n\n#contentWrapper{\n background: transparent url(http://www.psychpage.com/wiki/rniolon_images/kubrickbg.gif) repeat-y 0px 0px;\n border: 0;\n margin: 0 0 0 30px;\n width: 744px;\n}\n\n/*}}}*/\n/***\n!Header Rules\n***/\n/*{{{*/\n.titleLine{\n margin: 0px 0 0 0;\n padding-top : 15px;\n width: 744px;\n text-align: center;\n color: white;\n}\n\n.siteTitle{\n font-weight: bold;\n font-size:2em;\n margin: 0 0 0 0;\n\n}\n\n.siteTitle a, .siteSubtitle a{\n color: white;\n text-decoration: none;\n border:0px;\n}\n\n.siteTitle a:hover, .siteSubtitle a:hover{\n text-decoration: none;\n border : none;\n}\n\n.siteSubtitle{\n display: block;\n margin: .5em auto 1em;\n font-size:1.2em;\n}\n\n.header {\n background: transparent url(http://www.psychpage.com/wiki/rniolon_images/kubrickheader.jpg) no-repeat top center; \n border: 0;\n margin: 0 0 0 0;\n width: 744px;\n height: 65px;\n\n}\n\n.projecttitle{\n background: transparent url(http://www.psychpage.com/wiki/rniolon_images/tab.jpg); \n margin: 5 0 0 0;\n width: 675px;\n height: 35px;\n padding-left:5px;\n padding-top:5px;\n font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, Sans-Serif;\n color: white;\n font-size: 1.0em; \n}\n\n.projecttitle .title {\n color: white;\n}\n\n/*}}}*/\n/***\n!Footer Styles\n***/\n/*{{{*/\n#contentFooter {\n background: url(http://www.psychpage.com/wiki/rniolon_images/kubrickfooter.gif) no-repeat bottom center;\n border: 0;\n margin: 0 0 0 0;\n width: 744px;\n height: 59px;\n}\n/*}}}*/\n\n\n/***\n!Sidebar styles /% ============================================== %/\n***/\n/*{{{*/\n#sidebar {\n margin: 0 0 0 0;\n width: 220px;\n font-size:.9em;\n float: right;\n position:absolute; \n right:0px; \n border:1\n}\n\n#hoverMenu {\n margin: 0 0 0 0;\n padding: 0px 0px 0px 0px ;\n color: #000000;\n width: 220px;\n font-size:.9em;\n text-align: left;\n float: right;\n position:absolute; \n right:0px; \n background : url(http://www.psychpage.com/wiki/rniolon_images/sidebar.jpg);\n background-position: right;\n background-repeat: repeat-y;\n background-attachment: scroll;\n border: 2px solid black;\n}\n\n#hoverMenu a, #hoverMenu a:hover {\n color: #474D6B;\n}\n\n#hoverMenu table {\n border: 0px;\n width: 100%;\n padding:0px;\n border-spacing: 0pt;\n}\n\n#sidebar a, #sidebar a:hover, #hoverMenu a, #hoverMenu a:hover{\n border: 0;\n}\n\n#sidebar h1, #hoverMenu h1 {\n font-size: 1.4em;\n font-weight: bold;\n margin: 0;\n background: transparent;\n color: #000;\n}\n\n#sidebar ul, #hoverMenu ul{\n padding: 0;\n margin: 0 0 0 1em;\n}\n\n#sidebar li, #hoverMenu li{\n list-style: none;\n}\n\n#sidebar li:before, #hoverMenu li:before{\n color: #000;\n content: "\s00BB \s0020";\n}\n\n#sidebar, #hoverMenu, #mainMenu, #sideBarOptions{\n width: 200px;\n text-align: left;\n}\n\n#mainMenu{\n\n}\n/*}}}*/\n/***\n!Sidebar search styles /% ======================================== %/\n***/\n/*{{{*/\n#sidebarSearch{\n margin: 0 0 0 10px;\n width: 125px;\n}\n\n#sidebarSearch input{\n font-size: .9em;\n\n}\n\n#sidebarSearch .button{\n float: right;\n margin-top: 1px;\n}\n/*}}}*/\n/***\n!Sidebar option styles\n***/\n/*{{{*/\n#sidebarOptions{\n\n}\n\n#sidebarOptions h1, #hoverMenu h1{\n font-size: 1.0em;\n}\n\n#sidebarOptions a, #hoverMenu a{\n display: inline;\n border: 0;\n}\n\n#sidebarOptions .sliderPanel{\n background-color: transparent;\n font-size: 1em;\n margin: 0;\n}\n\n#sidebarOptions .sliderPanel a:before,\n#sidebarTabs li:before{\n content: "";\n}\n/*}}}*/\n/***\n!Sidebar tab styles\n***/\n/*{{{*/\n\n#sidebartabs {\n height: 400px;\n overflow: auto;\n\n}\n#sidebarTabs .tab,\n#sidebarTabs .tab:hover{\n border: 1px solid #ccc;\n text-decoration: none;\n background-color: transparent;\n}\n\n#sidebarTabs .tabSelected{\n background: #ccc;\n color: #333;\n}\n\n#sidebarTabs .tabUnselected{\n background: #B5BDCA;\n color: #333;\n background-color: transparent;\n}\n\n#sidebarTabs .tabContents{\n background: #ccc;\n color: #333;\n border: 1px solid #ccc;\n width: 95%;\n}\n\n#sidebarTabs .tabContents a{\n color: #384F6E;\n}\n\n#sidebarTabs .tabContents a:hover{\n color: #384F6E;\n\n}\n\n#sidebarTabs a.tabSelected:hover{\n cursor: default;\n}\n\n#sidebarTabs .txtMoreTab .tab{\n border: 1px solid #aaa;\n color: #333;\n}\n\n#sidebarTabs .txtMoreTab .tabSelected{\n background: #aaa;\n color: #333;\n}\n\n#sidebarTabs .txtMoreTab .tabSelected:hover{\n background: #aaa;\n color: #333\n}\n\n#sidebarTabs .txtMoreTab .tabUnselected{\n background: #ccc;\n color: #333;\n}\n\n#contentWrapper #sidebar .txtMoreTab .tabUnselected:hover,#contentWrapper #displayArea .txtMoreTab .tabUnselected:hover{\n color: #333;\n}\n\n#contentWrapper .txtMoreTab .tabContents{\n background: #aaa;\n color: #333;\n border: 1px solid #aaa;\n}\n\n/*}}}*/\n/***\n!Message area styles /% ========================================== %/\n***/\n/*{{{*/\n#messageArea {\nbackground-color: #eee;\n border: 1px solid #ccc;\n color: #bbb;\n margin: 0 1em;\n font-size: .8em;\n}\n\n#messageArea a:link{\n color: #aaa;\n}\n#messageArea a:hover{\n color: #384F6E;\n}\n\n#messageArea .messageToolbar .button{\n border: 1px solid #ccc;\n color: #aaa;\n text-decoration: none;\n}\n#messageArea .messageToolbar .button:hover{\n border: 1px solid #777;\n color: #777;\n}\n/*}}}*/\n/***\n!Popup styles /% ================================================ %/\n***/\n/*{{{*/\n#popup{\n padding: 0;\n background: #eee;\n border: 1px solid #ccc;\n color: #333;\n}\n\n#popup a{\n color: #384F6E;\n font-weight: normal;\n}\n\n#popup a:hover{\n color: #fff;\n background: #aaa;\n text-decoration: none;\n}\n/*}}}*/\n/***\n!Tiddler display styles /% ====================================== %/\n***/\n/*{{{*/\n#displayArea{\n width: 703px;\n text-align: left;\n font-size: 1.0em;\n background: white;\n margin: 0px 0px 0px 10px;\n}\n\nh1 {\n font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, Sans-Serif;\n color: #384F6E;\n background: transparent;\n text-decoration: none;\n margin-top:-0px;\n}\n\n.title{\n font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, Sans-Serif;\n color: #63728F;\n background: transparent;\n text-decoration: none;\n}\n\n.viewer h1,.viewer h2,.viewer h3,.viewer h4,.viewer h5{\n background: transparent;\n text-decoration: none;\n}\n\n\n.title{\n font-size: 1.6em; \n}\n\n.subtitle{\n color: #777;\n font-size: .9em;\n}\n\n.toolbar{\n font-size: .9em;\n}\n\n.toolbar a:link,.toolbar a:visited{\n background: #474D6BA;\n border: 1px solid #ccc;\n color: #aaa;\n padding: 1px 3px;\n margin: 0 .5em 0 0;\n}\n\n.toolbar a.button:hover{\n background: #ccc;\n border-color: #bbb;\n color: #384F6E;\n text-decoration: none;\n}\n\n.taskstyle .viewer {\n background: #fffff;\n}\n\n.viewer a.tiddlyLinkNonExisting:link{\n color: #474D6B;\n font-style: normal;\n}\n.viewer a.tiddlyLinkNonExisting:hover{\n text-decoration: none; \n}\n\n.viewer a.tiddlyLinkExisting:link{\n font-weight: bold;\n color: #474D6B;\n}\n.viewer a.tiddlyLinkExisting:hover{\n color: #474D6B;\n text-decoration: none; \n}\n\n.viewer a.externalLink{\n font-weight: bold;\n color: #474D6B;\n font-style: italic;\n text-decoration: none;\n}\n.viewer a.externalLink:hover{\n color: #384F6E;\n text-decoration: none;\n}\n\n.viewer .button{\n background: transparent url(http://www.psychpage.com/wiki/rniolon_images/icon.gif) repeat-x scroll left;\n border: 0px;\n color: gray;\n font-weight: normal;\n display : inline;\n text-align : left;\n}\n\n.viewer .button .noicon {\n border: 0px;\n color: #384F6E;\n font-weight: normal;\n padding-left: 20px;\n display : inline;\n text-align : left;\n}\n\n.viewer .button:hover{\n color: #4672A3;\n}\n\n.editor {\n font-size: 9pt;\n color: #402c74;\n font-weight: normal;\n}\n\n.editor input, .editor textarea {\n display: block;\n font: 11px/110% "Andale Mono", "Monaco", "Lucida Console", "Courier New", monospace;\n margin: 0 0 10px 0;\n border: 1px inset #333;\n padding: 2px 0;\n}\n\n.footer, .footer a.button,.editorFooter, .footer a.button{\n color: #aaa;\n}\n\n.selected .footer,.selected .footer a{\n color: #777;\n}\n\n.selected .footer a.button,.selected .editorFooter a.button{\n color: #384F6E;\n}\n\n.footer a.button:hover,.editorFooter a.button:hover{\n color: #384F6E;\n background: transparent;\n} \n\n.tagClear{\n clear: none; \n}\n/*}}}*/
/*{{{*/\nbody {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}\n\na {color:[[ColorPalette::PrimaryMid]];}\na:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}\na img {border:0;}\n\nh1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent; border-bottom:0px solid [[ColorPalette::TertiaryLight]];}\n\n.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}\n.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}\n.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}\n\n.header {background:[[ColorPalette::PrimaryMid]];}\n.headerShadow {color:[[ColorPalette::Foreground]];}\n.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}\n.headerForeground {color:[[ColorPalette::Background]];}\n.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}\n\n.tabSelected{color:[[ColorPalette::PrimaryDark]];\n background:[[ColorPalette::TertiaryPale]];\n border-left:1px solid [[ColorPalette::TertiaryLight]];\n border-top:1px solid [[ColorPalette::TertiaryLight]];\n border-right:1px solid [[ColorPalette::TertiaryDark]];\n font-size: 150%; \n}\n.tabUnselected {color:[[ColorPalette::Background]]; background:#384F6E; font-size: 150%; }\n.tabUnselected:hover {color:#ffffff; background:#386CB1; font-size: 150%; }\n\n.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}\n.tabContents .button {border:0;}\n\n#sidebarOptions input, #hoverMenu input {border:1px solid [[ColorPalette::PrimaryMid]];}\n#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}\n#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}\n#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}\n#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}\n\n.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}\n.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}\n.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}\n.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];\n border:1px solid [[ColorPalette::PrimaryMid]];}\n.wizardStep.wizardStepDone {background::[[ColorPalette::TertiaryLight]];}\n.wizardFooter {background:[[ColorPalette::PrimaryPale]];}\n.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}\n.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;\n border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}\n.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}\n.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;\n border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}\n\n#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}\n#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}\n\n.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}\n\n.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}\n.popup hr {color:#353C49; background:#353C49; border-bottom:1px;}\n.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}\n.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}\n.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}\n.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}\n.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}\n.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}\n\n.tiddler .defaultCommand {font-weight:bold;}\n\n.shadow .title {color:[[ColorPalette::TertiaryDark]];}\n\n.title {color:[[ColorPalette::SecondaryDark]];}\n.subtitle {color:[[ColorPalette::TertiaryDark]];}\n\n.toolbar {color:[[ColorPalette::PrimaryMid]];}\n.toolbar a {color:[[ColorPalette::TertiaryLight]];}\n.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}\n.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}\n\n.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}\n.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}\n.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}\n.tagging .button, .tagged .button {border:none;}\n\n.footer {color:[[ColorPalette::TertiaryLight]];}\n.selected .footer {color:[[ColorPalette::TertiaryMid]];}\n\n.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}\n.sparktick {background:[[ColorPalette::PrimaryDark]];}\n\n.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}\n.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}\n.lowlight {background:[[ColorPalette::TertiaryLight]];}\n\n.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}\n\n.imageLink, #displayArea .imageLink {background:transparent;}\n\n.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}\n\n.viewer .listTitle {list-style-type:none; margin-left:-2em;}\n.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}\n.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}\n\n.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}\n.viewer code {color:[[ColorPalette::SecondaryDark]];}\n.viewer hr {\n border: 1;\n border : thin solid #353C49;\n color: #353C49;\n}\n.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}\n\n.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}\n.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}\n.editorFooter {color:[[ColorPalette::TertiaryMid]];}\n\n#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}\n#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}\n#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }\n#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}\n#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}\n#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}\n#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}\n.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}\n.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}\n#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}\n/*}}}*/
/*{{{*/\n* html .tiddler {height:1%;}\n\nbody {font-size:.95em; font-family:"Trebuchet MS",arial,helvetica; margin:0; padding:0;}\n\nh1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}\nh1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}\nh4,h5,h6 {margin-top:1em;}\nh1 {font-size:1.35em;}\nh2 {font-size:1.25em;}\nh3 {font-size:1.1em;}\nh4 {font-size:1em;}\nh5 {font-size:.9em;}\n\nhr {height:1px;}\n\na {text-decoration:none;}\n\ndt {font-weight:bold;}\n\nol {list-style-type:decimal;}\nol ol {list-style-type:lower-alpha;}\nol ol ol {list-style-type:lower-roman;}\nol ol ol ol {list-style-type:decimal;}\nol ol ol ol ol {list-style-type:lower-alpha;}\nol ol ol ol ol ol {list-style-type:lower-roman;}\nol ol ol ol ol ol ol {list-style-type:decimal;}\n\n.txtOptionInput {width:9em;}\n\n#contentWrapper .chkOptionInput {border:0;}\n\n.externalLink {text-decoration:underline;}\n\n.indent {margin-left:3em;}\n.outdent {margin-left:3em; text-indent:-3em;}\ncode.escaped {white-space:nowrap;}\n\n.tiddlyLinkExisting {font-weight:bold;}\n.tiddlyLinkNonExisting {font-style:italic;}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */\na.tiddlyLinkNonExisting.shadow {font-weight:bold;}\n\n#mainMenu .tiddlyLinkExisting,\n #mainMenu .tiddlyLinkNonExisting,\n #sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}\n#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}\n\n.header {position:relative;}\n.header a:hover {background:transparent;}\n\n\n#mainMenuNOT {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}\n\n#sidebarOptions, #hoverMenu {padding-top:0.3em;}\n#sidebarOptions a, #hoverMenu a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}\n#sidebarOptions input , #hoverMenu input {margin:0.2em 0.2em;}\n#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}\n#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}\n#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}\n#sidebarTabs .tabContents {width:15em; height: 400px; overflow:auto;}\n\n.wizard {padding:0.1em 1em 0em 2em;}\n.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}\n.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}\n.wizardStep {padding:1em 1em 1em 1em;}\n.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}\n.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}\n.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}\n.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}\n\n#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}\n.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}\n#messageArea a {text-decoration:none;}\n\n.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}\n.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}\n\n.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}\n.popup .popupMessage {padding:0.4em;}\n.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}\n.popup li.disabled {padding:0.4em;}\n.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}\n.listBreak {font-size:1px; line-height:1px;}\n.listBreak div {margin:2px 0;}\n\n.tabset {padding:.5em .5em 0em 0.5em;}\n.tab {margin:0em .5em 0em -.35em; padding-left:2px; padding-right:2px; padding-bottom:1px;}\n.tabContents {padding:0.5em;}\n.tabContents ul, .tabContents ol {margin:0; padding:0;}\n.txtMainTab .tabContents li {list-style:none;}\n.tabContents li.listLink { margin-left:.75em;}\n\n#contentWrapper {display:block;}\n#splashScreen {display:none;}\n\n#displayArea {margin:1em 17em 2em 14em;}\n\n.toolbar {text-align:right; font-size:.9em;}\n\n.tiddler {padding:0em 1em 1em 1em;}\n\n.missing .viewer,.missing .title {font-style:italic;}\n\n.title {font-size:1.6em; font-weight:bold;}\n\n.missing .subtitle {display:none;}\n.subtitle {font-size:1.1em;}\n\n.tiddler .button {padding:0.2em 0.4em;}\n\n.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}\n.isTag .tagging {display:block;}\n.tagged {margin:0.5em; float:right;}\n.tagging, .tagged {font-size:0.9em; padding:0.25em;}\n.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}\n.tagClear {clear:both;}\n\n.footer {font-size:.9em;}\n.footer li {display:inline;}\n\n.annotation {padding:0.5em; margin:0.5em;}\n\n* html .viewer pre {width:99%; padding:0 0 1em 0;}\n.viewer {line-height:1.4em; padding-top:0em; padding-bottom:0.5em;}\n.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}\n.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}\n.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}\n\ntable {\n border: 1px solid #FFFFFF;\n vertical-align : top;\n padding : 0px 4px 0px 4px;\n}\ntable td {\n vertical-align : top;\n}\n\n\n.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}\ntable.listView { margin:0.8em 1.0em;}\ntable.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}\n\n.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}\n.viewer code {font-size:1em; line-height:1.4em;}\n\n.editor {font-size:1.0em;}\n.editor input, .editor textarea {display:block; width:100%; font:inherit;}\n.editorFooter {padding:0.25em 0em;}\n.editorFooter .button {padding-top:0px; padding-bottom:0px;}\n\n.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}\n\n.sparkline {line-height:1em;}\n.sparktick {outline:0;}\n\n.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}\n.zoomer div {padding:1em;}\n\n* html #backstage {width:99%;}\n* html #backstageArea {width:99%;}\n#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}\n#backstageToolbar {position:relative;}\n#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}\n#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}\n#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}\n#backstage {position:relative; width:100%; z-index:50;}\n#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}\n.backstagePanelFooter {padding-top:0.2em; float:right;}\n.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}\n#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}\n\n.whenBackstage {display:none;}\n.backstageVisible .whenBackstage {display:block;}\n\n/*}}}*/
/*{{{*/\n@media print {\n#mainMenu, #sidebar, #contentFooter, .header, #messageArea, .toolbar, #backstageButton, #hoverMenu, .title, .projecttitle {\n display: none ! important;\n}\n\n#displayArea {\n background: #FFFFFF;\n}\n\nbody {\n background: url() fixed center; \n Color:BLACK;\n}\n\n#contentWrapper{\n background: transparent url() repeat-y 0px 0px;\n}\n\n.tiddler {\n width:8.25in; \n margin-left:-.5in;\n}\n\n/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */\nnoscript {display:none;}\n}\n/*}}}*/
''MIT''\n<<forEachTiddler\n where \n 'tiddler.tags.containsAll(["$1","Task","Active", "Priority 0 - MIT"]) \n && ! tiddler.tags.contains("Done") \n && ! tiddler.tags.contains("Pending")'\n\n sortBy\n 'tiddler.title'\n ascending\n \n write 'tiddler.title+"\sn"' \n>>
''Top''\n<<forEachTiddler\n where \n 'tiddler.tags.containsAll(["$1","Task","Active", "Priority 1 - Top"]) \n && ! tiddler.tags.contains("Done") \n && ! tiddler.tags.contains("Pending")'\n\n sortBy\n 'tiddler.title'\n ascending\n \n write 'tiddler.title + "\sn"' \n>>
<<allTags excludeLists>>
/***\n|Name|TabEditPlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#TabEditPlugin|\n|Version|0.32|\n|Requires|~TW2.x|\n\n!Description\nMakes editing of tabs easier.\n\n!Usage\n*Double click a tab to edit the source tiddler\n*Double click outside the tabset to edit the containing tiddler. \n\n!Demo\nTestTabs\n\n!History\n*28-04-06, v0.32 - fixed previous bug fix!\n*27-04-06, v0.31 - fixed conflicts with tabs created using PartTiddler.\n*26-04-06, v0.30 - first public release\n\n***/\n\n//{{{\n\n//tab on double click event handler\nStory.prototype.onTabDblClick = function(e){\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var title= this.getAttribute("source");\n if ((version.extensions.PartTiddlerPlugin)&&(title.indexOf("/")!=-1))\n {if (!oldFetchTiddler.call(this, [title]))\n {return false;}} \n story.displayTiddler(theTarget,title,2,false,null)\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n }\n\nconfig.macros.tabs.switchTab = function(tabset,tab)\n{\n var cookie = tabset.getAttribute("cookie");\n var theTab = null\n var nodes = tabset.childNodes;\n for(var t=0; t<nodes.length; t++)\n if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)\n {\n theTab = nodes[t];\n theTab.className = "tab tabSelected";\n }\n else\n nodes[t].className = "tab tabUnselected"\n if(theTab)\n {\n if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")\n tabset.parentNode.removeChild(tabset.nextSibling);\n var tabContent = createTiddlyElement(null,"div",null,"tabContents",null);\n tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);\n var contentTitle = theTab.getAttribute("content");\n\n //set source attribute equal to title of tiddler displayed in tab\n tabContent.setAttribute("source",contentTitle);\n //add dbl click event\n tabContent.ondblclick = story.onTabDblClick;\n\n wikify(store.getTiddlerText(contentTitle),tabContent,null,store.getTiddler(contentTitle));\n if(cookie)\n {\n config.options[cookie] = tab;\n saveOptionCookie(cookie);\n }\n }\n}\n\n//}}}
<<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
<<allTags excludeLists [a-z]>>
<<timeline>>
/***\nTagUtils\nhttp://simonbaird.com/mptw/#TagUtils\nDoesn't do anything except provide functions for use in other plugins\nSorry no documentation! RTFC :)\n\n!Update\nAdded some macros. See Examples.\n\n!Todo\nSorting is next\n\n!Example\nNote: you must have spaces between every element including brackets and logical operators\n{{{<<listByTagExpr '( Todo || Tasks ) && ! Done'>>}}}\n<<listByTagExpr '( Todo || Tasks ) && ! Done'>>\n\n{{{<<listByTagExprWithExcerpt '( Todo || Tasks ) && Urgent && ! Done'>>}}}\n<<listByTagExprWithExcerpt '( Todo || Tasks ) && ! Done'>>\n\n***/\n//{{{\n\n// Array methods originally written by Udo\n\nif (!Array.prototype.indexOf)\n Array.prototype.indexOf = function(item) {\n for (var i=0;i<this.length;i++)\n if (this[i] == item)\n return i;\n return -1;\n };\n\nif (!Array.prototype.contains)\n Array.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n };\n\nif (!Array.prototype.containsAny)\n Array.prototype.containsAny = function(items) {\n for (var i=0;i<items.length;i++)\n if (this.contains(items[i]))\n return true;\n return false;\n };\n\nif (!Array.prototype.containsAll)\n Array.prototype.containsAll = function(items) {\n for (var i = 0; i < items.length; i++)\n if (!this.contains(items[i]))\n return false;\n return true;\n };\n\n\nvar allowBracketedList = function(tags) {\n return (typeof(tags) == "string") ? tags.readBracketedList() : tags;\n}\n\nvar getTitles = function(tiddlers) {\n var titles = [];\n for (var i=0;i<tiddlers.length;i++)\n titles[i] = tiddlers[i].title;\n return titles;\n}\n\nTiddler.prototype.hasTag = function(tag) {\n return this.tags.contains(tag)\n}\n\nTiddler.prototype.hasAnyTag = function(tags) {\n return this.tags.containsAny(allowBracketedList(tags));\n}\n\nTiddler.prototype.hasAllTags = function(tags) {\n return this.tags.containsAll(allowBracketedList(tags));\n}\n\nTiddler.prototype.addTag = function(tag) {\n if (!this.hasTag(tag))\n this.tags.push(tag);\n}\n\nTiddler.prototype.addTags = function(tags) {\n var newTags = allowBracketedList(tags);\n for (var i=0;i<newTags.length;i++)\n this.addTag(newTags[i]);\n}\n\nTiddler.prototype.removeTag = function(tag) {\n if (this.hasTag(tag))\n this.tags.splice(this.tags.indexOf(tag),1);\n}\n\nTiddler.prototype.removeTags = function(tags) {\n var deadTags = allowBracketedList(tags);\n for (var i=0;i<deadTags.length;i++)\n this.removeTag(deadTags[i]);\n}\n\nTiddler.prototype.removeTagsFromGroup = function(tagGroup) {\n // the tags are tagged with tagGroup, taggly style\n var tagsInGroup = getTitles(store.getTaggedTiddlers(tagGroup));\n for (var i=0;i<tagsInGroup.length;i++)\n this.removeTag(tagsInGroup[i]);\n}\n\nTiddler.prototype.setUniqueTagFromGroup = function(tag,tagGroup) {\n // used for a single value dropdown\n this.removeTagsFromGroup(tagGroup);\n this.addTag(tag);\n}\n\nTiddler.prototype.setUniqueTagFromList = function(tag,tagList) {\n // will probably never use this since I like setUniqueTagFromGroup\n this.removeTags(tagList);\n this.addTag(tag);\n}\n\nTiddlyWiki.prototype.getTiddlersByTag = function(includeTags,excludeTags,includeMode,excludeMode) {\n includeTags = allowBracketedList(includeTags);\n excludeTags = allowBracketedList(excludeTags);\n if (!includeMode) includeMode = 'all';\n if (!excludeMode) excludeMode = 'any';\n var results = [];\n this.forEachTiddler(function(title,tiddler) {\n var included = (includeMode == 'any') ?\n tiddler.hasAnyTag(includeTags) :\n tiddler.hasAllTags(includeTags);\n var excluded = (excludeMode == 'any') ?\n tiddler.hasAnyTag(excludeTags):\n tiddler.hasAllTags(excludeTags);\n if (included && !excluded)\n results.push(tiddler);\n });\n return results;\n}\n\nTiddlyWiki.prototype.getTiddlersByTagExpression = function(expression) {\n // example expression\n // "( [[A Tag]] || Tag2 ) && ! Tag3"\n // must have spaces between everything\n var splitExpression = expression.readBracketedList(false); // false means not unique. thanks Jeremy!!\n var asIs = ['(',')','||','&&','!']; // better not have any tags called those!\n var translatedExpression = "";\n for (var i=0;i<splitExpression.length;i++)\n if (asIs.contains(splitExpression[i]))\n translatedExpression += splitExpression[i];\n else\n translatedExpression += "tiddler.hasTag('"+splitExpression[i]+"')";\n // alert(translatedExpression);\n var results = [];\n this.forEachTiddler(function(title,tiddler) {\n if (eval('('+translatedExpression+')'))\n results.push(tiddler);\n });\n return results;\n}\n\nArray.prototype.tiddlerList = function(listFormat) {\n var output = "";\n if (!listFormat) listFormat = "'*[['+tiddler.title+']]\s\sn'";\n if (this.length > 0 && this[0] instanceof Tiddler) {\n for (var i=0;i<this.length;i++) {\n var tiddler = this[i];\n output += eval(listFormat);\n }\n }\n return output;\n}\n \nArray.prototype.tiddlerListWithExcerpt = function(listFormat) {\n return this.tiddlerList("'*[['+tiddler.title+']] tiddler.text.trim().substr(20)...\s\sn'");\n}\n\nString.prototype.prettyTrim = function(len,prefix,postfix) {\n var result = this.trim().replace(/\sr\sn/g,' ').replace(/[\sn|\st]/g,' ');\n if (result.length > len - 3)\n return result.trim().substr(0,len) + '...';\n else\n return result;\n}\n\nString.prototype.prettyTrim2 = function(len,prefix,postfix) {\n if (!prefix) prefix = '';\n if (!postfix) postfix = '';\n return prefix + this.prettyTrim(len) + postfix;\n}\n\n \nArray.prototype.tiddlerListWithExcerpt = function(listFormat) {\n return this.tiddlerList("'*[['+tiddler.title+']] ' + tiddler.text.prettyTrim2(60,' - ') + '\s\sn'");\n}\n\nconfig.macros.listByTag = {};\nconfig.macros.listByTag.handler =\n function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify(store.getTiddlersByTag(params[0],params[1],params[2],params[3]).tiddlerList(),place,null,tiddler);\n};\n\nconfig.macros.listByTagWithExcerpt = {};\nconfig.macros.listByTagWithExcerpt.handler =\n function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify(store.getTiddlersByTag(params[0],params[1],params[2],params[3]).tiddlerListWithExcerpt(),place,null,tiddler);\n};\n\nconfig.macros.listByTagExpr = {};\nconfig.macros.listByTagExpr.handler =\n function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify(store.getTiddlersByTagExpression(params[0]).tiddlerList(),place,null,tiddler);\n};\n\nconfig.macros.listByTagExprWithExcerpt = {};\nconfig.macros.listByTagExprWithExcerpt.handler =\n function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify(store.getTiddlersByTagExpression(params[0]).tiddlerListWithExcerpt(),place,null,tiddler);\n};\n\n\n\n//}}}
/***\n| Name|TagglyTaggingPlugin|\n| Description|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version|3.1 ($Rev: 2341 $)|\n| Date|$Date: 2007-07-05 10:02:27 +1000 (Thu, 05 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 open>\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:1px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 0 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//}}}
<html><table width="150%" border=0 cellpadding=0 cellspacing=0 bgcolor="#ffffff"><tr bgcolor="#38395E"><td height="40" colspan="2" valign="middle"><font size="+3" color="#FFFFFF"><strong><i><span style="vertical-align:middle;">Task Planner</span></i></strong></font></td><td colspan="5" align="right" valign="middle"><font size="+2" color="#FFFFFF"><strong><span style="vertical-align:middle;"><<today DDD>> <<today MMM>> <<today DD>>,<<today YYYY>> </span></strong></font></td></tr><tr><td rowspan="12" colspan=3 width="40%" valign="top"><<tiddler "ShowProjectsAndTasks">></td><td rowspan="12" valign="bottom" width="35%"><<calendar>><<calendar richvar:"+1">><br><<tiddler "Simple 04 Reminder">></td><td width="3%">8AM</td><td width="11%" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"> </td></tr><tr><td>9</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr><tr><td>10</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr><tr><td>11</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr><tr><td>12</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></td></tr><tr><td>1</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr><tr><td>2</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr><tr><td>3</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr><tr><td>4</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr><tr><td>5</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr><tr><td>6</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr><tr><td>7</td><td width="53" height="65" background="http://www.psychpage.com/wiki/rniolon_images/image004.jpg"></td></tr></table><br>\n{{quotes{\n<<flickrGreeting>>\n}}}</html>
[[Reminders]] [[Projects by Month]]\n----\n<<tiddler "MyTasksTemplate" with:"TheMainMenu">>
This is wiki based on a project at [[TiddlyWiki.Com|http://www.tiddlywiki.com/]] started by [[Jeremy Ruston|http://www.tiddlywiki.com/#JeremyRuston]]. Google "tiddlywiki" and you'll find a world of things. Jeremy could have made money on this, but turned it over to the public and made no money but an immensely better product.\n\nIt is also based on [[David Alen|http://www.davidco.com/]] and his method for [[Getting Things Done|http://www.amazon.com/s/ref=nb_ss_b_0_12?url=search-alias%3Dstripbooks&field-keywords=david+allen+getting+things+done&sprefix=david+allen+]].\n\nThis resulting ~TiddlyWiki wouldn't be anywhere near as useful were it not for:\n* the [[ToggleTagMacro|http://tiddlyspot.com/mptw/#ToggleTagMacro]], [[QuickOpenTagPlugin| http://mptw.tiddlyspot.com/#QuickOpenTagPlugin]], and [[DropDownTagChooser|http://simonbaird.com/mptw/#DropDownTagChooser]] by Simon Baird... along with that whole [[MonkeyTagging|http://mptw2.tiddlyspot.com/]] thing\n* the [[ReminderPlugin|http://remindermacros.tiddlyspot.com]] by Jeremy Sheeley\n* the [[PlasticCalendarPlugin|http://www.math.ist.utl.pt/~psoares/addons.html]] by Paulo Soares\n* the [[InLine Tabs Plugin|http://tw.lewcid.org/sandbox/#InlineTabsPlugin]] and [[HoverMenuPlugin|http://tw.lewcid.org/#HoverMenuPlugin]] by Saq Imtiaz\n* the [[HTMLFormattingPlugin|http://www.TiddlyTools.com/#HTMLFormattingPlugin]] and [[FoldHeadingsPlugin|http://www.TiddlyTools.com/#FoldHeadingsPlugin]] by Eric Shulman\n* the FlickrGreetingMacro by Peter Kirkland\nAnd the [[ForEachTiddlerPlugin|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin]] by Udo Borkowski... really... almost every tiddler I wrote uses this one\n
/***\n| Name:|ToggleTagMacro|\n| Description:|Makes a checkbox which toggles a tag in a tiddler|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://tiddlyspot.com/mptw/#ToggleTagMacro|\n| Author:|SimonBaird|\n| License:|[[BSD open source license]]|\n| CoreVersion:|2.1|\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'>>|\n(Note if TiddlerName doesn't exist it will be silently created)\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. Should it stick the tag in the edit box?\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.suspendNotifications(); \n store.setTiddlerTag(title,this.checked,tag);\n //refreshDisplay(); \n //store.resumeNotifications();\n return true;\n });\n }\n }\n});\n\n//}}}
<<forEachTiddler\n where\n 'tiddler.tags.contains(store.getTiddler("ProjectToClean").tags)'\n\n script \n ' function UnDoneMe(tiddler) {\n var result = "";\n var tags = tiddler.tags; \n tags.sort(); \n for (var j = 0; j < tags.length;j++) {\n if(tags[j].contains("Done")){\n tags[j] = "";\n result += tiddler.title+" is cleared!\sn";\n }\n if(tags[j].contains("Pending")){\n tags[j] = "";\n }\n } \n return result;\n } '\n\nwrite 'UnDoneMe(tiddler)' \n >>
[<img[http://www.psychpage.com/wiki/rniolon_images/explain06.gif]] \nThe [[Task Planner]] is a daily calendar sheet that you can take with you:\n* it uses a slightly modified version of the [[PlasticCalendarPlugin]] of Paulo Soares to show you this month and the next two\n* it uses the [[FlickrGreetingMacro|Greeting]] by Peter Kirkland to show a thoughtful quote\n* the [[Reminders]] show up below the calendars\n* your MIT and Top Priority tasks show up in the left column, and your Middle Priority tasks show up in the middle column\n* there's room to write in appointments and such and track your activities... sort of like [[The Emergent Task Planner |http://davidseah.com/blog/comments/emergent-task-planner-free-version-2008-updates/]] by David Seah\n\n![[Final Points]]
[[MptwViewTemplate]]
This will clear the "Done" and "Pending" tags from ''all'' tasks associated with the project:\n<<forEachTiddler\n where\n 'tiddler.title.contains("ProjectToClean")'\n\n script\n ' function getProjectName(tiddler) {\n var tags = tiddler.tags; \n tags.sort(); \n var result = ""; \n for (var i = 0; i < tags.length;i++) {\n result += tags[i];\n } \n return result;\n } \n '\n\n write\n '" "+getProjectName(tiddler)'\n>>\nThis is helpful to do when a project will be repeated later. Click below only if you are sure you want to clear this project. \n\n''[[Clear the Project|UndoneAllTemplate]]''
//{{{\nconfig.macros.WhatsMyProject = {};\nconfig.macros.WhatsMyProject.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n\nvar thecommand = "<<forEachTiddler where 'tiddler.title.contains([context.inTiddler.title])' script 'function whatProject(tiddler) {var tags = tiddler.tags; tags.sort(); var result = ";\n\nthecommand += '""; for (var i = 0; i < tags.length;i++) { if(tags[i].contains("Project:")){ result += "[["+tags[i].replace("Project: ","")+"|"+tags[i]+ "]] "; } } return result; } ';\n\n\n\nthecommand += "' write '";\n\nthecommand += '""+whatProject(tiddler)+" "';\n\nthecommand += "'>>"\n\n\nwikify(thecommand, place);\n}\n\n//}}}
<<forEachTiddler \n where \n 'tiddler.tags.containsAll(["Done","Led by $1"])'\n>>
These are things I do at the computer, like Google something, send an email, balance my checkbook...
<<deleteAllTagged>>
//{{{\nconfig.macros.resetProject = {};\nconfig.macros.resetProject.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n\n\nstore.saveTiddler("ProjectToClean","ProjectToClean","",config.options.txtUserName,new Date(),"[["+params[0]+"]]");\n\n wikify(" [[Clear This Project|Warning]] ", place);\n}\n\n//}}}