/*{{{*/\n.accordionEffect .button{ display: block; color: #fff; text-align: left;\nfont-weight: bold; line-height: 120%;\nborder-top: solid 1px #ddd;\nborder-left: solid 1px #ddd;\nborder-right: solid 1px #aaa;\nborder-bottom: solid 1px #aaa;\nbackground: #bbb;\nmargin-left: -0.3em;\npadding: 0 1px 1px 20px;\n}\n\n.accordionEffect .button:hover{\nborder-top: solid 1px #999;\nborder-left: solid 1px #999;\nborder-right: solid 1px #ddd;\nborder-bottom: solid 1px #ddd;\nbackground: #aaa;\npadding: 1px 0 0 21px;\n}\n/*}}}*/\n/*{{{*/\n/*You can modify the code above but please keep this line in the StyleSheet. */\n/*AccordionEffect, CSS by oc ( http://b-oo-k.net/blog/ ). */\n/*}}}*/
/*{{{*/\n.accordionEffect2 .sliderButton {display:block; color:#fff; text-align:left; font-weight:bold; line-height:120%; border-top:solid 1px #ddd; border-left:solid 1px #ddd; border-right:solid 1px #aaa; border-bottom:solid 1px #aaa; background:#bbb; margin-left:-0.3em; padding:0 1px 1px 20px;}\n.accordionEffect2 .sliderButton:hover {border-top:solid 1px #999; border-left:solid 1px #999; border-right:solid 1px #ddd; border-bottom:solid 1px #ddd; background:#aaa; padding:1px 0 0 21px;}\n/*}}}*/\n/*{{{*/\n/*Modified from AccordionEffect, CSS by oc ( http://b-oo-k.net/blog/ )*/\n/*}}}*/
/%\n↓↓↓↓↓↓如何修改第一層按鈕(slider2 語法說明)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓\n<<slider2 accordionEffect2\n先寫tiddler名稱 空一格再寫你想顯示在按鈕上的文字 再空一格寫ToolTips\n>>\n\n上面這個範例就會顯示只有一個按紐的邊欄。而這樣的話:\n\n<<slider2 accordionEffect2\n先寫tiddler名稱 空一格再寫你想顯示在按鈕上的文字 再空一格寫ToolTips\n另一個tiddler名稱 空一格再寫你想顯示在第二個按鈕上的文字 再空一格寫ToolTips\n>>\n\n會顯示兩個按鈕。所以Slider2的語法就是加一行多一個按鈕。\n===========================%/\n<<slider2 accordionEffect2\nMainMenu '1 MainMenu' MainMenu\nSimple2SideBarOptions '2 這些縮放按鈕' SideBarOptions\nViewTemplate '3 都可以自由增減' ViewTemplate\nTabTimeline '4 TabTimeline' TabTimeline\n>>\n~~Edit[[1|MainMenu]][[2|Simple2SideBarOptions]][[3|ViewTemplate]][[4|TabTimeline]]~~
/***\n|Name|CheckboxPlugin|\n|Source|http://www.TiddlyTools.com/#CheckboxPlugin|\n|Version|2.1.3|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Add checkboxes to your tiddler content|\n\nCheckbox states can be preserved in the document by either automatically modifying the tiddler content or setting/removing tags on specified tiddlers, or they may be saved as local cookies by assigning an optional 'chkID' to the checkbox. Add custom javascript for programmatic initialization and onClick handling for any checkbox. Also provides access to checkbox DOM element data and tracks the checkbox state in TiddlyWiki's config.options[] internal data.\n\n!!!!!Usage\n<<<\nThe checkbox syntax, including all optional parameters, is contained inside a matched set of [ and ] brackets.\n{{{ [x=id(title|tag){init_script}{onclick_script}] }}}\n\nAn alternative syntax lets you place the optional parameters ''outside'' the [ and ] brackets, and is provided for backward-compatibility with existing content that may include checkbox definitions based on earlier releases of this plugin:\n{{{ [x]=id(title|tag){init_script}{onclick_script} }}}\n\n//{{{\n[ ]or[_] and [x]or[X]\n//}}}\nSimple checkboxes. The current unchecked/checked state is indicated by the character between the {{{[}}} and {{{]}}} brackets ("_" means unchecked, "X" means checked). When you click on a checkbox, the current state is retained by directly modifying the tiddler content to place the corresponding "_" or "X" character in between the brackets\n//{{{\n[x=id]\n//}}}\nAssign an optional ID to the checkbox so you can use {{{document.getElementByID("id")}}} to manipulate the checkbox DOM element, as well as tracking the current checkbox state in {{{config.options["id"]}}}. If the ID starts with "chk" the checkbox state will also be saved in a cookie, so it can be automatically restored whenever the checkbox is re-rendered (overrides any default {{{[x]}}} or {{{[_]}}} value). If a cookie value is kept, the "_" or "X" character in the tiddler content remains unchanged, and is only applied as the default when a cookie-based value is not currently defined.\n//{{{\n[x(title|tag)] or [x(title:tag)]\n//}}}\nInitializes and tracks the current checkbox state by setting or removing ("TogglyTagging") a particular tag value from a specified tiddler. If you omit the tiddler title (and the | or : separator), the specified tag is assigned to the current tiddler. If you omit the tag value, as in {{{(title|)}}}, the default tag, {{{checked}}}, is assumed. Omitting both the title and tag, {{{()}}}, tracks the checkbox state by setting the "checked" tag on the current tiddler. When tag tracking is used, the "_" or "X" character in the tiddler content remains unchanged, and is not used to set or track the checkbox state. If a tiddler title named in the tag does not exist, the checkbox state defaults to //unselected//. When the checkbox is subsequently changed to //selected//, it will automatically (and silently) create the missing tiddler and then add the tag to it. //''NOTE: beginning with version 2.1.2 of this plugin, the "|" separator is the preferred separator between the title and tag name, as it avoids syntactic ambiguity when ":" is used within tiddler titles or tag names.''//\n//{{{\n[x{javascript}{javascript}]\n//}}}\nYou can define optional javascript code segments to add custom initialization and/or 'onClick' handling to a checkbox. The current checkbox state (and it's other DOM attributes) can be set or read from within these code segments by reference to the default context-object, 'this'.\n\nThe first code segment will be executed when the checkbox is initially displayed, so that you can programmatically determine it's starting checked/unchecked state. The second code segment (if present) is executed whenever the checkbox is clicked, so that you can perform programmed responses or intercept and override the checkbox state based on complex logic using the TW core API or custom functions defined in plugins (e.g. testing a particular tiddler title to see if certain tags are set or setting some tags when the checkbox is clicked).\n\nNote: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: {{{ [x=id{}{javascript}] }}} \n<<<\n!!!!!Configuration\n<<<\nNormally, when a checkbox state is changed, the affected tiddlers are automatically re-rendered, so that any checkbox-dependent dynamic content can be updated. There are three possible tiddlers to be re-rendered, depending upon where the checkbox is placed, and what kind of storage method it is using.\n*''container'': the tiddler in which the checkbox is displayed. (e.g., this tiddler)\n*''tagged'': the tiddler that is being tagged (e.g., "~MyTask" when tagging "~MyTask:done")\n*''tagging'': the "tag tiddler" (e.g., "~done" when tagging "~MyTask:done")\nYou can set the default refresh handling for all checkboxes in your document by using the following javascript syntax either in a systemConfig plugin, or as an inline script. (Substitute true/false values as desired):\n{{{config.checkbox.refresh = { tagged:true, tagging:true, container:true };}}}\n\nYou can also override these defaults for any given checkbox by using an initialization function to set one or more of the refresh options. For example:\n{{{[_{this.refresh.container=false}]}}}\n<<<\n!!!!!Examples\n<<<\n//{{{\n[X] label\n[_] label\n//}}}\n>checked and unchecked static default values\n>[X] label\n>[_] label\n//{{{\n[_=demo] label\n//}}}\n>document-based value (id='demo', no cookie)\n>[_=demo] label\n//{{{\n[_=chkDemo] label\n//}}}\n>cookie-based value (id='chkDemo')\n>[_=chkDemo] label\n//{{{\n[_(CheckboxPlugin|demotag)]\n[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}]\n//}}}\n>tag-based value (TogglyTagging)\n>[_(CheckboxPlugin|demotag)] toggle 'demotag' (and refresh tiddler display)\n>[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}] toggle 'demotag' (no refresh)\n>current tags: <script>return store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString();</script>\n><script label="click to view current tags">alert(store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString());return false</script>\n//{{{\n[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\n//}}}\n>custom init and onClick functions\n>[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\nRetrieving option values:\nconfig.options['demo']=<script>return config.options['demo']?"true":"false";</script>\nconfig.options['chkDemo']=<script>return config.options['chkDemo']?"true":"false";</script>\n\n!!!!!Installation\nimport (or copy/paste) the following tiddlers into your document:\n''CheckboxPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n2006.05.04 - 2.1.3 fix use of findContainingTiddler() to check for a non-null return value, so that checkboxes won't crash when used outside of tiddler display context (such as in header, sidebar or mainmenu)\n2006.03.11 - 2.1.2 added "|" as delimiter to tag-based storage syntax (e.g. "tiddler|tag") to avoid parsing ambiguity when tiddler titles or tag names contain ":". Using ":" as a delimiter is still supported but is deprecated in favor of the new "|" usage. Based on a problem reported by JeffMason.\n2006.02.25 - 2.1.0 added configuration options to enable/disable forced refresh of tiddlers when toggling tags\n2006.02.23 - 2.0.4 when toggling tags, force refresh of the tiddler containing the checkbox.\n2006.02.23 - 2.0.3 when toggling tags, force refresh of the 'tagged tiddler' so that tag-related tiddler content (such as "to-do" lists) can be re-rendered.\n2006.02.23 - 2.0.2 when using tag-based storage, allow use [[ and ]] to quote tiddler or tag names that contain spaces:\n{{{[x([[Tiddler with spaces]]:[[tag with spaces]])]}}}\n2006.01.10 - 2.0.1 when toggling tags, force refresh of the 'tagging tiddler'. For example, if you toggle the "systemConfig" tag on a plugin, the corresponding "systemConfig" TIDDLER will be automatically refreshed (if currently displayed), so that the 'tagged' list in that tiddler will remain up-to-date.\n2006.01.04 - 2.0.0 update for ~TW2.0\n2005.12.27 - 1.1.2 Fix lookAhead regExp handling for {{{[x=id]}}}, which had been including the "]" in the extracted ID. \nAdded check for "chk" prefix on ID before calling saveOptionCookie()\n2005.12.26 - 1.1.2 Corrected use of toUpperCase() in tiddler re-write code when comparing {{{[X]}}} in tiddler content with checkbox state. Fixes a problem where simple checkboxes could be set, but never cleared.\n2005.12.26 - 1.1.0 Revise syntax so all optional parameters are included INSIDE the [ and ] brackets. Backward compatibility with older syntax is supported, so content changes are not required when upgrading to the current version of this plugin. Based on a suggestion by GeoffSlocock\n2005.12.25 - 1.0.0 added support for tracking checkbox state using tags ("TogglyTagging")\nRevised version number for official post-beta release.\n2005.12.08 - 0.9.3 support separate 'init' and 'onclick' function definitions.\n2005.12.08 - 0.9.2 clean up lookahead pattern\n2005.12.07 - 0.9.1 only update tiddler source content if checkbox state is actually different. Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)\n2005.12.07 - 0.9.0 initial BETA release\n<<<\n!!!!!Credits\n<<<\nThis feature was created by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.CheckboxPlugin = {major: 2, minor: 1, revision:3 , date: new Date(2006,5,4)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n//{{{\nconfig.checkbox = { refresh: { tagged:true, tagging:true, container:true } };\nconfig.formatters.push( {\n name: "checkbox",\n match: "\s\s[[xX_ ][\s\s]\s\s=\s\s(\s\s{]",\n lookahead: "\s\s[([xX_ ])(\s\s])?(=[^\s\ss\s\s(\s\s]{]+)?(\s\s([^\s\s)]*\s\s))?({[^}]*})?({[^}]*})?(\s\s])?",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // get params\n var checked=lookaheadMatch[1];\n var id=lookaheadMatch[3];\n var tag=lookaheadMatch[4];\n var fn_init=lookaheadMatch[5];\n var fn_click=lookaheadMatch[6];\n // create checkbox element\n var c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick=onClickCheckbox;\n c.srcpos=w.matchStart+1; // remember location of "X"\n c.container=story.findContainingTiddler(w.output); if (c.container) c.container=c.container.id.substr(7); // tiddler containing checkbox\n c.refresh = { };\n c.refresh.container=config.checkbox.refresh.container;\n c.refresh.tagged=config.checkbox.refresh.tagged;\n c.refresh.tagging=config.checkbox.refresh.tagging;\n w.output.appendChild(c);\n // set default state\n c.checked=(checked.toUpperCase()=="X");\n // get/set state by ID\n if (id) {\n c.id=id.substr(1); // trim off leading "="\n if (config.options[c.id]!=undefined)\n c.checked=config.options[c.id];\n else\n config.options[c.id]=c.checked;\n }\n // get/set state by tag\n if (tag) {\n c.tiddler=c.container;\n c.tag=tag.substr(1,tag.length-2).trim(); // trim off parentheses\n var pos=c.tag.indexOf("|"); if (pos==-1) var pos=c.tag.indexOf(":");\n if (pos==0) { c.tag=tag.substr(1); }\n if (pos>0) { c.tiddler=c.tag.substr(0,pos).replace(/\s[\s[/g,"").replace(/\s]\s]/g,""); c.tag=c.tag.substr(pos+1); }\n c.tag.replace(/\s[\s[/g,"").replace(/\s]\s]/g,"");\n if (!c.tag.length) c.tag="checked";\n var t=store.getTiddler(c.tiddler);\n c.checked = (t && t.tags)?(t.tags.find(c.tag)!=null):false;\n }\n if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters\n if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);\n c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n }\n)\n//}}}\n\n//{{{\nfunction onClickCheckbox()\n{\n if (this.fn_init)\n // custom function hook to set initial state (run only once)\n { try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }\n else if (this.fn_click)\n // custom function hook to override or react to changes in checkbox state\n { try { eval(this.fn_click) } catch(e) { displayMessage("Checkbox click error: "+e.toString()); } }\n if (this.id)\n // save state in config AND cookie (only when ID starts with 'chk')\n { config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }\n if ((!this.id || this.id.substr(0,3)!="chk") && !this.tag) {\n // save state in tiddler content only if not using cookie or tag tracking\n var t=story.findContainingTiddler(this); if (t) {\n var t=store.getTiddler(t.id.substr(7));\n if (this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed\n t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);\n store.setDirty(true);\n }\n }\n }\n if (this.tag) {\n var t=store.getTiddler(this.tiddler);\n if (!t) { t=(new Tiddler()); t.set(this.tiddler,"",config.options.txtUserName,(new Date()),null); store.addTiddler(t); } \n var tagged=(t.tags && t.tags.find(this.tag)!=null);\n if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }\n if (!this.checked && tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }\n // if tag state has been changed, force a display update\n if (this.checked!=tagged) {\n if (this.refresh.tagged) story.refreshTiddler(this.tiddler,null,true); // the TAGGED tiddler\n if (this.refresh.tagging) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler\n }\n }\n // refresh containing tiddler (but not during initial rendering, or we get an infinite loop!)\n if (!this.init && this.refresh.container && this.container!=this.tiddler)\n story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox\n return true;\n}\n//}}}
This tool is a application of many beautiful scripts:\n#The wonderful frame work TiddlyWiki by JeremyRuston\n#The powerful ForEachTiddlerPlugin by UdoBorkowski\n#The interesting CheckboxPlugin by Eric Shulman\n#Inspired by [[TiddlyWikiTasks|http://tiddlywikitips.com/TiddlyWikiTasks.html]] by Jim Barr\nWho did this? ~Ying-Ching Chen (aka. [[老貓|http://b-oo-k.net/blog/]]). You can download and use it freely. If you like, please write a review in your blog. I would be very appreciated. \n\nTiddlyCheckList由[[老貓|http://b-oo-k.net/blog/]]匯整相關程式製作完成,你可以免費下載使用,毋須付費。如果用得滿意,歡迎你寫一篇使用評論,我會非常感謝。
<<forEachTiddler\n where 'tiddler.tags.contains("chkPacking") &&\n tiddler.tags.contains("ok")'\n sortBy 'tiddler.title'\n script \n ' function getFirstLine(s) { var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : ""; } '\n write '"|[X("+tiddler.title+":ok)] |[["+tiddler.title+"]]|\sn"'\n>>
[[打包檢查表]]
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.6 (2006-09-16)|\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-2006 [[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.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: 6, \n date: new Date(2006,8,16), \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-2006 (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: 5, date: new Date(2006,2,5), 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 // 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 tiddlyWiki = new TiddlyWiki();\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***/
// ---------------------------------------------------------------------------------\n// Translateable strings\n// ---------------------------------------------------------------------------------\nversion.extensions.Lingo_zh_TW = {major: 2, minor: 1, revision: 3,\n date: new Date("Nov 4, 2006"),\n author: "BramChen",\n source: "http://sourceforge.net/project/showfiles.php?group_id=150646"\n};\n\nmerge(config.options,{\n txtUserName: "irene"});\n\n// Messages\nmerge(config.messages,{\n customConfigError: "套件載入發生錯誤,詳細請參考 PluginManager",\n pluginError: "發生錯誤: %0",\n pluginDisabled: "未執行,因標籤設為 'systemConfigDisable'",\n pluginForced: "已執行,因標籤設為 'systemConfigForce'",\n pluginVersionError: "未執行,套件需較新版本的 TiddlyWiki",\n nothingSelected: "尚未作任何選擇,至少需選擇一項",\n savedSnapshotError: "此 TiddlyWiki 未正確存檔,詳見 http://www.tiddlywiki.com/#DownloadSoftware",\n subtitleUnknown: "(未知)",\n undefinedTiddlerToolTip: "'%0' 尚無內容",\n shadowedTiddlerToolTip: "'%0' 尚無內容, 但已定義隱藏的預設值",\n tiddlerLinkTooltip: "%0 - %1, %2",\n externalLinkTooltip: "外部連結至 %0",\n noTags: "未設定標籤的文章",\n notFileUrlError: "須先將此 TiddlyWiki 存至檔案,才可儲存變更",\n cantSaveError: "此瀏覽器無法儲存變更,建議使用FireFox;也可能是你的 TiddlyWiki 檔名包含不合法的字元所致。",\n invalidFileError: " '%0' 非有效之 TiddlyWiki",\n backupSaved: "已儲存備份",\n backupFailed: "無法儲存備份",\n rssSaved: "RSS feed 已儲存",\n rssFailed: "無法儲存 RSS feed ",\n emptySaved: "已儲存範本",\n emptyFailed: "無法儲存範本",\n mainSaved: "主要的TiddlyWiki已儲存",\n mainFailed: "無法儲存主要 TiddlyWiki. 所作的改變未儲存",\n macroError: "巨集 <<%0>> 執行錯誤",\n macroErrorDetails: "執行巨集 <<%0>> 時,發生錯誤 :\sn%1",\n missingMacro: "無此巨集",\n overwriteWarning: "'%0' 已存在,[確定]覆寫之",\n unsavedChangesWarning: "注意! 尚未儲存變更\sn\sn[確定]存檔,或[取消]放棄存檔?",\n confirmExit: "--------------------------------\sn\snTiddlyWiki 以更改內容尚未儲存,繼續的話將遺失這些更動\sn\sn--------------------------------",\n saveInstructions: "SaveChanges",\n unsupportedTWFormat: "未支援此 TiddlyWiki 格式:'%0'",\n tiddlerSaveError: "儲存文章 '%0' 時,發生錯誤。",\n tiddlerLoadError: "載入文章 '%0' 時,發生錯誤。",\n wrongSaveFormat: "無法使用格式 '%0' 儲存,請使用標準格式存放",\n invalidFieldName: "無效的欄位名稱:%0",\n fieldCannotBeChanged: "無法變更欄位:'%0'"});\n\nmerge(config.messages.messageClose,{\n text: "關閉",\n tooltip: "關閉此訊息"});\n\nconfig.messages.dates.months = ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"];\nconfig.messages.dates.days = ["日", "一","二", "三", "四", "五", "六"];\nconfig.messages.dates.shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];\nconfig.messages.dates.shortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];\n\nmerge(config.views.wikified.tag,{\n labelNoTags: "未設標籤",\n labelTags: "標籤: ",\n openTag: "開啟標籤 '%0'",\n tooltip: "顯示標籤為 '%0' 的文章",\n openAllText: "開啟以下所有文章",\n openAllTooltip: "開啟以下所有文章",\n popupNone: "僅此文標籤為 '%0'"});\n\nmerge(config.views.wikified,{\n defaultText: "",\n defaultModifier: "(未完成)",\n shadowModifier: "(預設)",\n createdPrompt: "建立於"});\n\nmerge(config.views.editor,{\n tagPrompt: "設定標籤之間以空白區隔,[[標籤含空白時請使用雙中括弧]],或點選現有之標籤加入",\n defaultText: ""});\n\nmerge(config.views.editor.tagChooser,{\n text: "標籤",\n tooltip: "點選現有之標籤加至本文章",\n popupNone: "未設定標籤",\n tagTooltip: "加入標籤 '%0'"});\n\nmerge(config.macros.search,{\n label: " 尋找",\n prompt: "搜尋本 Wiki",\n accessKey: "F",\n successMsg: " %0 篇符合條件: %1",\n failureMsg: " 無符合條件: %0"});\n\nmerge(config.macros.tagging,{\n label: " ",\n labelNotTag: "無引用標籤",\n tooltip: "列出標籤為 '%0' 的文章"});\n\nmerge(config.macros.timeline,{\n dateFormat: "YYYY0MM0DD"});\n\nmerge(config.macros.allTags,{\n tooltip: "顯示文章- 標籤為'%0'",\n noTags: "沒有標籤"});\n\nconfig.macros.list.all.prompt = "依字母排序";\nconfig.macros.list.missing.prompt = "被引用且內容空白的文章";\nconfig.macros.list.orphans.prompt = "未被引用的文章";\nconfig.macros.list.shadowed.prompt = "這些隱藏的文章已定義預設內容";\n\nmerge(config.macros.closeAll,{\n label: "全部關閉",\n prompt: "關閉所有開啟中的 tiddler (編輯中除外)"});\n\nmerge(config.macros.permaview,{\n label: "引用連結",\n prompt: "可存取現有開啟之文章的連結位址"});\n\nmerge(config.macros.saveChanges,{\n label: "儲存變更",\n prompt: "儲存所有文章,產生新的版本",\n accessKey: "S"});\n\nmerge(config.macros.newTiddler,{\n label: "新增文章",\n prompt: "新增 tiddler",\n title: "新增文章",\n accessKey: "N"});\n\nmerge(config.macros.newJournal,{\n label: "新增日誌",\n prompt: "新增 jounal",\n accessKey: "J"});\n\nmerge(config.macros.plugins,{\n skippedText: "(此套件因剛加入,故尚未執行)",\n noPluginText: "未安裝套件",\n confirmDeleteText: "確認是否刪除此文章:\sn\sn%0",\n listViewTemplate : {\n // Fields needing localisation are: title, trueText, falseText and caption\n columns: [\n {name: "Selected", field: "Selected", rowName: "title", type: "Selector"},\n {name: "Title", field: "title", tiddlerLink: "title", title: "標題", type: "TiddlerLink"},\n {name: "Executed", field: "executed", title: "已載入", type: "Boolean", trueText: "是", falseText: "否"},\n {name: "Error", field: "error", title: "載入狀態", type: "Boolean", trueText: "錯誤", falseText: "正常"},\n {name: "Forced", field: "forced", title: "強制執行", tag: "systemConfigForce", type: "TagCheckbox"},\n {name: "Disabled", field: "disabled", title: "停用", tag: "systemConfigDisable", type: "TagCheckbox"},\n {name: "Log", field: "log", title: "紀錄", type: "StringList"}\n ],\n rowClasses: [\n {className: "error", field: "error"},\n {className: 'warning', field: 'warning'}\n ],\n actions: [\n {caption: "執行選項...", name: ""},\n {caption: "移除 'systemConfig' 標籤", name: "移除"},\n {caption: "永遠刪除", name: "刪除"}\n ]}\n });\n\nmerge(config.macros.refreshDisplay,{\n label: "刷新",\n prompt: "刷新此 TiddlyWiki 顯示"\n });\n \nmerge(config.macros.importTiddlers,{\n readOnlyWarning: "TiddlyWiki 於唯讀模式下,不支援匯入文章。請由本機(file://)開啟 TiddlyWiki 文件",\n defaultPath: "http://www.tiddlywiki.com/index.html",\n fetchLabel: "匯入",\n fetchPrompt: "匯入 TiddlyWiki 檔",\n fetchError: "匯入 TiddlyWiki 檔時發生錯誤",\n confirmOverwriteText: "確定要覆寫這些文章:\sn\sn%0",\n wizardTitle: "自其他 TiddlyWiki 檔匯入文章",\n step1: "步驟一:指定欲匯入之檔案",\n step1prompt: "在此輸入 URL 或路徑:",\n step1promptFile: "...或選擇欲匯入之檔案:",\n step1promptFeeds: "...或選擇指定的 feed:",\n step1feedPrompt: "選擇...",\n step2: "步驟二:TiddlyWiki 檔載入中",\n step2Text: "檔案載入中,請稍後:%0",\n step3: "步驟三:選擇欲匯入之文章",\n step4: "已匯入%0 篇文章",\n step5: "Done",\n listViewTemplate: {\n columns: [\n {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},\n {name: 'Title', field: 'title', title: "標題", type: 'String'},\n {name: 'Snippet', field: 'text', title: "Snippet", type: 'String'},\n {name: 'Tags', field: 'tags', title: "標籤", type: 'Tags'}\n ],\n rowClasses: [\n ],\n actions: [\n {caption: "執行選項......", name: ''},\n {caption: "匯入所選文章", name: 'import'}\n ]}\n });\n\nmerge(config.commands.closeTiddler,{\n text: "關閉",\n tooltip: "關閉本文"});\n\nmerge(config.commands.closeOthers,{\n text: "關閉其他",\n tooltip: "關閉其他文章"});\n\nmerge(config.commands.editTiddler,{\n text: "編輯",\n tooltip: "編輯本文",\n readOnlyText: "檢視",\n readOnlyTooltip: "檢視本文之原始內容"});\n\nmerge(config.commands.saveTiddler,{\n text: "完成",\n tooltip: "確定修改"});\n\nmerge(config.commands.cancelTiddler,{\n text: "取消",\n tooltip: "取消修改",\n warning: "確定取消對 '%0' 的修改嗎?",\n readOnlyText: "完成",\n readOnlyTooltip: "返回正常顯示模式"});\n\nmerge(config.commands.deleteTiddler,{\n text: "刪除",\n tooltip: "刪除文章",\n warning: "確定刪除 '%0'?"});\n\nmerge(config.commands.permalink,{\n text: "引用連結",\n tooltip: "本文引用連結"});\n\nmerge(config.commands.references,{\n text: "引用",\n tooltip: "引用本文的文章",\n popupNone: "本文未被引用"});\n\nmerge(config.commands.jump,{\n text: "捲頁",\n tooltip: "捲頁至其他已開啟的文章"});\n\nmerge(config.shadowTiddlers,{\n DefaultTiddlers: "GettingStarted",\n MainMenu: "GettingStarted",\n SiteTitle: "My TiddlyWiki",\n SiteSubtitle: "a reusable non-linear personal web notebook",\n SiteUrl: "http://www.tiddlywiki.com/",\n GettingStarted: "使用此 TiddlyWiki 的空白範本之前,請先修改以下預設文章::\sn* SiteTitle 及 SiteSubtitle:網站的標題和副標題,顯示於頁面上方(在儲存變更後,將顯示於瀏覽器視窗的標題列)。\sn* MainMenu:主選單(通常在頁面左測)。\sn* DefaultTiddlers:內含一些文章的標題,可於載入TiddlyWiki 後的預設開啟。\sn請輸入您的大名,作為所建立/ 編輯的文章署名:<<option txtUserName>>",\n SideBarOptions: "<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal ' YYYY0MM0DD'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel '偏好設定 »' '變更 TiddlyWiki 選項'>>",\n OptionsPanel: "這些設定將暫存於瀏覽器\sn請簽名<<option txtUserName>>\sn (範例:WikiWord)\sn\sn<<option chkSaveBackups>> 儲存備份\sn<<option chkAutoSave>> 自動儲存\sn<<option chkRegExpSearch>> 正規式搜尋\sn<<option chkCaseSensitiveSearch>> 區分大小寫搜尋\sn<<option chkAnimate>> 使用動畫顯示\sn\sn[[進階選項|AdvancedOptions]]\sn[[套件管理|PluginManager]]\sn[[匯入文章|ImportTiddlers]]",\n AdvancedOptions: "<<option chkGenerateAnRssFeed>> 產生 RssFeed\sn<<option chkOpenInNewWindow>> 連結開啟於新視窗\sn<<option chkSaveEmptyTemplate>> 儲存範本\sn<<option chkToggleLinks>> 點擊文章使已開啟者關閉\sn\sn<<option chkHttpReadOnly>> 隱藏編輯功能 ({{{http:}}})\sn<<option chkForceMinorUpdate>> 修改文章不變更日期時間\sn(確認修改同時按 Shift 鍵,或只按 Ctrl-Shift-Enter)\sn<<option chkConfirmDelete>> 刪除文章前確認\sn\sn編輯模式中顯示列數: <<option txtMaxEditRows>>\sn存放備份檔案的資料夾: <<option txtBackupFolder>>\sn<<option chkInsertTabs>> 使用 tab 鍵插入定位字元,而非跳至下一個欄位\sn",\n SideBarTabs: "<<tabs txtMainTab 最近更新 '依更新日期排序' TabTimeline 全部 '所有文章' TabAll 分類 '所有標籤' TabTags 更多 '其他' TabMore>>",\n TabTimeline: "<<timeline>>",\n TabAll: "<<list all>>",\n TabTags: "<<allTags>>",\n TabMore: "<<tabs txtMoreTab 未完成 '內容空白的文章' TabMoreMissing 未引用 '未被引用的文章' TabMoreOrphans 預設文章 '預設的影子文章' TabMoreShadowed>>",\n TabMoreMissing: "<<list missing>>",\n TabMoreOrphans: "<<list orphans>>",\n TabMoreShadowed: "<<list shadowed>>",\n PluginManager: "<<plugins>>", \n ImportTiddlers: "<<importTiddlers>>"});\n\nconfig.options.txtFsEncode = "BIG5";\nconfig.shadowTiddlers["AdvancedOptions"]+="\sn檔案系統編碼:<<option txtFsEncode>>\sn<<<\sn使用Gecko based的瀏覽器(如:Firefox)時,\sn指定正確系統環境編碼(BIG5、GBK、SHIFT-JIS、EUC-KR....等),\sn可支援儲存文件於非 ASCII 路徑及檔名。\sn<<<";\nconfig.shadowTiddlers.ViewTemplate = "<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler permalink references jump'></div>\sn<div class='title' macro='view title'></div>\sn<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date YYYY0MM0DD'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date YYYY0MM0DD'></span>)</div>\sn<div class='tagging' macro='tagging'></div>\sn<div class='tagged' macro='tags'></div>\sn<div class='viewer' macro='view text wikified'></div>\sn<div class='tagClear'></div>";
<!--{{{-->\n<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>\n<!--}}}-->\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b><<tiddler SiteTitle>></b><br> is loading<blink> ...</blink><br><br></div>
Powered by [[TiddlyWiki|http://www.tiddlywiki.com]] <<version>>. [[Theme|Theme: Simple2]] by [[oc|http://b-oo-k.net/blog/]].
<!--{{{-->\n<div id='header' class='header'>\n\n<div class='headerShadow'>\n<span class='searchBar' macro='search'></span>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle' ondblclick="story.displayTiddler(null,'SiteTitle', DEFAULT_EDIT_TEMPLATE)"></span>\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle' ondblclick="story.displayTiddler(null,'SiteSubtitle', DEFAULT_EDIT_TEMPLATE)"></span>\n</div>\n\n<div class='topMenu'>\n<!-- span id='topMenuA' refresh='content' tiddler='Config' ondblclick="story.displayTiddler(null,'Config', DEFAULT_EDIT_TEMPLATE)"></span>\n</div -->\n<div id='topMenu' refresh='content' tiddler='TopMenu' ondblclick="story.displayTiddler(null,'TopMenu', DEFAULT_EDIT_TEMPLATE)">\n</div>\n\n</div>\n\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<div id='pageFooter' refresh='content' tiddler='PageFooter' ondblclick="story.displayTiddler(null,'PageFooter', DEFAULT_EDIT_TEMPLATE)"></div>\n<!--}}}-->
config.options.chkHttpReadOnly=false
[[Theme|Theme: Simple2]]\n[[手風琴特效|AccordionEffect]]\n[[完整下載|DownLoad]]
[[Packing CheckList|SiteTitle]]
/***\n!Metadata:\n|''Name:''|Slider2Plugin|\n|''Description:''||\n|''Version:''|1.5.2|\n|''Date:''|Mar 27, 2007|\n|''Source:''|http://www.sourceforge.net/projects/ptw/|\n|''Author:''|BramChen (bram.chen (at) gmail (dot) com)|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.5+; InternetExplorer 6.0|\n!Usage:\nManually add ''[[AccordionEffectStyle2]]'' or customized {{{[[YourSliderStyles]]}}} to StyleSheet if it's necessary.\n{{{\n<<slider2 sliderClass1\n tiddlerTitle1 sliderTitle1 toolsip1\n tiddlerTitle2 sliderTitle2 toolsip2\n ....>>\nand/ or\n<<slider2 sliderClass2\n tiddlerTitle11 sliderTitle11 toolsip11\n tiddlerTitle12 sliderTitle12 toolsip12\n ...\n buttonClass:'buttonClassName'>>\n}}}\n*Parameters descriptions:\n<<<\n#''sliderClasses'' - the name of slider set and also the className of the set, it could be assigned different styles for each slider set.<br>The param ''sliderButton: //buttonClass//'' need to be used together.\n#''tiddlerTitles'' - the title of tiddler to include in the slider\n#''sliderTitletitles ''- text of the slider\n#''toolsips'' - tooltip text of the slider\n#''buttonClass:''//'buttonClassName'// - a named param, default is //sliderButton// if it's omitted assigning a class name to slider button, for example, <br>as the first param is 'accordionEffect'<br>and 'the last param value is ''buttonClass:'''button'<br>then the original oc's AccordionEffectStyle is used.\n<<<\n!Revision History:\n|''Version''|''Date''|''Note''|\n|1.5.2|Mar 27, 2007|Fixed bugs under IE|\n|1.5.1|Mar 24, 2007|Fixed bugs of customized buttonClass, and typos in AccordionEffectStyle2 and Usgaes section\n|1.5.0|Mar 22, 2007|<html><ol><li>Added feature: ''slider set'' (like 'tab' macro) by using the first param as grouping className but thus it's ''not compatible with previous verions''.</li><li>Included oc's ''AccordionEffect'' but a small bug fixed.</li><li>Added a extra named param: buttonClass</li></ol></html>|\n|1.0.1|Mar 20, 2007|Added animation collapse suggested by oc|\n|1.0.0|Mar 18, 2007|Initial release|\n!Code section:\n***/\n//{{{\n\nconfig.macros.slider2 = {\n buttonClass: "sliderButton",\n lastOpenedSlider: {},\n expandTimeout: null\n};\n\nconfig.macros.slider2.onClickSlider = function(e){\n if (!e) var e = window.event;\n var n = this.nextSibling;\n var isOpen = n.style.display != "none";\n var nodes = this.parentNode.childNodes;\n for(var i=0; i<nodes.length; i++){\n if(nodes[i].title && nodes[i].title != this.title){\n if(nodes[i].nextSibling.className = "sliderPanel"){\n if(config.macros.slider2.lastOpenedSlider[this.parentNode.className] == nodes[i].title){\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(nodes[i].nextSibling,false,null,"none"));\n else \n nodes[i].nextSibling.style.display = "none";\n }\n }\n }\n }\n if (config.options.chkAnimate){\n if (config.macros.slider2.expandTimeout)\n clearTimeout(config.macros.slider2.expandTimeout);\n config.macros.slider2.expandTimeout = setTimeout(function(){anim.startAnimating(new Slider(n,!isOpen,null,"none"));},250);\n// anim.startAnimating(new Slider(n,!isOpen,null,"none"));\n } \n else\n n.style.display = isOpen ? "none" : "block";\n config.macros.slider2.lastOpenedSlider[this.parentNode.className] = isOpen ? "" : this.title;\n return false;\n};\n\nconfig.macros.slider2.createSlider = function(place,title,tooltip,buttonClass){\n var btn = createTiddlyButton(place,title,tooltip,this.onClickSlider,buttonClass);\n var panel = createTiddlyElement(place,"div",null,"sliderPanel",null);\n panel.style.display = "none";\n return panel;\n};\n\nconfig.macros.slider2.handler = function(place,macroName,params,wikifier,paramString,tiddler){\n params = paramString.parseParams("anon",null,true,false,true);\n var buttonClass = (typeof params[0]['buttonClass'] == 'undefined')? this.buttonClass : params[0]['buttonClass'];\n if (params[1] && params[1].name == "anon"){\n if (params[1].name.length < 4){\n wikify('@@Slider2 params error!@@',place);\n return false;\n }\n }\n\n var p = params[0]['anon'];\n\n var sliderset = createTiddlyElement(place,"div",null,p[0],null);\n var numSliders = (params.length-1)/3-1;\n for (var t=0;t<numSliders;t++){\n var content = p[t*3+1];\n var label = p[t*3+2];\n var prompt = p[t*3+3];\n var panel = this.createSlider(sliderset,label,prompt,buttonClass);\n panel.setAttribute("refresh","content");\n panel.setAttribute("tiddler",content);\n panel.style.display = "none";\n var text = store.getTiddlerText(content);\n if(text)\n wikify(text,panel,null,store.getTiddler(content));\n }\n};\nconfig.shadowTiddlers["AccordionEffectStyle2"] = "/*{{{*/\sn.accordionEffect2 .sliderButton {display:block; color:#fff; text-align:left; font-weight:bold; line-height:120%; border-top:solid 1px #ddd; border-left:solid 1px #ddd; border-right:solid 1px #aaa; border-bottom:solid 1px #aaa; background:#bbb; margin-left:-0.3em; padding:-1px 1px 1px 20px;}\sn.accordionEffect2 .sliderButton:hover {border-top:solid 1px #999; border-left:solid 1px #999; border-right:solid 1px #ddd; border-bottom:solid 1px #ddd; background:#aaa; padding:0px 0 0 21px;}\sn/*}}}*/\sn/*{{{*/\sn/*Modified from AccordionEffect, CSS by oc ( http://b-oo-k.net/blog/ )*/\sn/*}}}*/";\nconfig.shadowTiddlers["StyleSheet"] += "[[AccordionEffectStyle2]]";\n//}}}
/***\n\n''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''\n\n|Name|Splash ScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#SplashScreenPlugin|\n|Version|0.21 |\n|Requires|~TW2.08+|\n!Description:\nProvides a simple splash screen that is visible while the TW is loading.\n\n!Installation\nCopy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.\n\n!Customizing\nOnce the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.\n\n!History\n* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.\n* 26-06-06 : version 0.2, first release\n\n!Code\n***/\n//{{{\nvar old_lewcid_splash_restart=restart;\n\nrestart = function()\n{ if (document.getElementById("SplashScreen"))\n document.getElementById("SplashScreen").style.display = "none";\n if (document.getElementById("contentWrapper"))\n document.getElementById("contentWrapper").style.display = "block";\n \n old_lewcid_splash_restart();\n \n if (splashScreenInstall)\n {if(config.options.chkAutoSave)\n {saveChanges();}\n displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");\n }\n}\n\n\nvar oldText = store.getTiddlerText("MarkupPreHead");\nif (oldText.indexOf("SplashScreen")==-1)\n {var siteTitle = store.getTiddlerText("SiteTitle");\n var splasher='\sn\sn<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b><br> is loading<blink> ...</blink><br><br></div>';\n if (! store.tiddlerExists("MarkupPreHead"))\n {var myTiddler = store.createTiddler("MarkupPreHead");}\n else\n {var myTiddler = store.getTiddler("MarkupPreHead");}\n myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);\n store.setDirty(true);\n var splashScreenInstall = true;\n}\n//}}}
/*{{{*/\n\nbody\n{background:#fefef5;}\n.tiddlyLinkNonExisting {\n font-style: normal;\n}\n#contentWrapper {\n font-family: Verdana, Arial, Tahoma, Sans-Serif;\n color: #555555;\nmargin:1.9em auto 1em ; width:860px;}\n\n#header {background:#fefef5;}\n\n.headerShadow { padding: 0 0 0em 1em; }\n\n.siteTitle {\n font-family: Times, MS Serif, MS PMincho, Georgia;\n font-style: normal;\n font-size: 38px;\n color: #2757B7;\n background-color: transparent;\n\n}\n.siteTitle a{ color:#2757B7;}\n.siteTitle a:hover{border-bottom:1px solid #2757B7;}\n\n.siteSubtitle {\n font-size: 1.0em;\n display: block;\n margin: 0em 3em 0.2em 3em; color: #999;\n}\n.siteSubtitle a{ color:#2757B7; font-style: normal;}\n.siteSubtitle a:hover{border-bottom:1px solid #2757B7;}\n\n.clearAll {clear:both;}\n.tagClear {clear:none;}\n#topMenu br {display:none;}\n#topMenu {color:#fefefe; font-size:0.9em; padding:0.2em 0.2em;text-align: center; border: 0px double #999; background:#2757b7; }\n\n#topMenu a, #topMenu .tiddlyLink, #topMenu .button {color:#fefefe; padding:0em 0.2em 0.2em 0.2em; margin:0 3px;font-weight:bold; border:none; background:transparent; }\n\n#topMenu a:hover, #topMenu .tiddlyLink:hover, #topMenu .button:hover, #topMenu .button:active, #topMenu .highlight {color:#fefefe;padding:0em 0.2em 0.2em 0.2em; background:#1747a7; }\n\n#topMenuA {\n float: right; color:#fefefe; font-size:0.9em; padding:0.2em 0.2em;\n}\n\n#topMenuA a, #topMenuA .tiddlyLink, #topMenuA .button {color:#fefefe; padding:0em 0.2em 0.2em 0.2em; margin:0 3px;font-weight:bold; border:none; background:transparent;}\n\n#topMenuA a:hover, #topMenuA .tiddlyLink:hover, #topMenuA .button:hover, #topMenuA .button:active, #topMenuA .highlight {color:#fefefe;padding:0em 0.2em 0.2em 0.2em; background:#1747a7; }\n\n#displayArea{\n margin:0em 6em 2em 8em;\n}\n\n.tiddler {padding-left:0;}\n.title {color:#555; font-size:22px;font-weight:normal;}\n.subtitle, .subtitle a { color: #999999; font-size: 1.0em;margin:0.2em;}\n.shadow .title{color:#999;}\n\n.toolbar {font-size:85%;pedding: 0em;}\n.selected .toolbar a {color:#999999;}\n.selected .toolbar a:hover {color:#333; background:transparent;border:1px solid #fff;}\n\n.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active{color:#333; background:transparent;border:1px solid #fff;}\n\n * html .viewer pre {\nmargin-left: 0em;\n}\n\n * html .editor textarea, * html .editor input {\nwidth: 98%;\n}\n\n#mainMenu{\n position: static;\n text-align: left;\n font-size:15px;\n margin:2em 0em 0 0em;\n padding-left: 1em;\n width: 11em;\n}\n\n#mainMenu a.button, #mainMenu a.tiddlyLink, #mainMenu a.externalLink {\n margin: 0; padding-left:0.7em;\n}\n\n#sidebar {\nposition:relative;float:left; line-height: 1.1em; display:inline; background:#fefef5; left:0; margin-bottom:15em !important;\nwidth: 11em;\n height: 100%;\n}\n\n#sidebar ol, #sidebar ul {\n margin-left: 0em;\n padding-left: 0.4em;\n font-size: .85em;\n line-height: 110%;\n}\n\n#sidebarOptions{\n position: relative;\n text-align: left;\n padding-left:2em;\n width: 11em; font-size:15px;\n}\n\n#sidebarOptions a.button, #sidebarOptions a.tiddlyLink, #sidebarOptions a.externalLink {\n display: block; margin: 0; padding-left:1em; font-size:15px; font-weight:normal;\n}\n\n #messageArea {\n\nborder: 2px solid #bbb;\nbackground: #fefef5;\ncolor: #555;\nfont-size:90%;\n}\n\n #messageArea a:hover { background:#f5f5f5; border:none;}\n #messageArea .button{\ncolor: #666;\nborder: 1px solid #2757B7;\n}\n\n #messageArea .button:hover {\ncolor: #fff;\nbackground: #2757B7;\nborder-color: #2757B7;\n}\n\n #pageFooter {background: transparent;\n color:#000; font-size: 8px; clear: both; padding: 0.3em 1em; \n text-align: center; border: 3px double #999; \nmargin: 2em 0 20em 0; }\n\n#pageFooter a {\ncolor: #555;\nborder-bottom: 1px solid #fff; font-weight:normal;text-decoration:none;\n}\n\n#pageFooter a:hover {\ncolor: #555;\nbackground-color:transparent;\nborder-bottom: 1px solid #555; \n}\n\n.searchBar {float:right;font-size: 0.8em;position:relative; margin-top:1.3em;}\n.searchBar .button {color:#999;display:block;}\n.searchBar .button:hover {border:1px solid #fefef5;color:#4F4B45;}\n.searchBar input { \n background-color: #fefef5;\n color: #999999;\n border: 1px solid #CCC; margin-right:3px;\n}\n\n.viewer {\n color:#000; font-size: 15px; line-height: 160%;\n}\n.viewer blockquote {\nborder-left: 3px solid #2757B7;\n}\n\n.viewer table, .viewer td {\nborder: 1px solid #2757B7;\n}\n\n.viewer th, thead td {\nbackground: #2757B7;\nborder: 1px solid #2757B7;\ncolor: #fff;\n}\n.viewer pre {\n border: 1px solid #ccc;\n background: #f5f5f5;\n}\n\n.viewer code {\ncolor: #111; background:#f5f5f5;\n}\n\n.viewer hr {\n border-top: dashed 1px #555;\n}\n\n.editor input {\nborder: 1px solid #888; margin-top:5px;\n}\n\n.editor textarea {padding-left:2px;font-size:15px;line-height:150%;\nborder: 1px solid #aaa;\n}\n\n[[AccordionEffectStyle]]\n[[AccordionEffectStyle2]]\nh1,h2,h3,h4,h5 { color: #2757B7; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif; }\nh1 {font-size:18px;}\nh2 {font-size:16px;}\nh3 {font-size: 14px;}\na:hover {color: #1747a7; background: transparent;} \n\n/*}}}*/\n/*{{{*/\n/*Theme: Simple2, Designed by oc ( http://b-oo-k.net/blog/ ). */\n/*Inspired by Saq Imtiaz's Haemoglobin Theme.*/\n/*}}}*/
/***\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//}}}
老貓按:這裡的模版已經配合<<tiddler SiteTitle>>調整過,如果你需要原版的兩欄式模版,請看[[Simple2|Simple2.html]]。\n\n*模版名稱:[[Simple2|Theme: Simple2]],版本V1.1.1。\n*設計者:[[oc|http://b-oo-k.net/blog/]]\n*主要特色:簡單的兩欄式版面。設計者的目標,是希望用最少的頁面元素,展現最豐富的架構容量與使用彈性。\n##特別考慮中文易讀性而微調過的CSS設定\n##邊欄使用[[新版手風琴特效|AccordionEffect]]\n##頁面所有區塊都可以點兩下直接編輯\n##將所有系統功能移至上欄\n##已通過FireFox及IE顯示測試(感謝BramChen指導)\n*安裝:請用TW 2.1.3以上版本ImportTiddlers功能匯入所有<<tag Simple2>>標籤的條目,存檔後更新頁面即可。警告:這個模版修改了PageTemplate和StyleSheet,安裝本模版將會覆蓋原有的條目內容。建議安裝前請先備份原檔。\n*修改邊欄:這個邊欄利用手風琴特效完成一個兩層式的選單系統。\n##點兩下可開啟AccordionSideBar直接編輯第一層縮放按鈕\n##按鈕所指的條目可利用邊欄下方「Edit 1 2 3 4」自行指定,方便修改第二層項目\n*著作權聲明:除了Slider2Plugin以外,你可以自由複製、修改、發布本模版,商業或非商業皆可,但PageFooter的作者聲明「[[Theme|Theme: Simple2]] by [[oc|http://b-oo-k.net/blog/]].」必須保留。\n
<<forEachTiddler\n where 'tiddler.tags.contains("version") &&\n tiddler.tags.contains("chkList") '\n sortBy 'tiddler.title' descending\n script \n ' function getFirstLine(s) { var m = s.match(/\ss*(.*)/); return m != null && m.length >= 1 ? m[1] : ""; } '\n write '"#[["+tiddler.title+"]] "+getFirstLine(tiddler.text)+"\sn"'\n>><<newJournal 'YYYY.MM.DD 版本' label:"新增版本" focus:title tag:chkList version>>
<html><a href="javascript:{\nif (story) story.closeAllTiddlers(); else closeAllTiddlers();\nrestart();}">\nCheckList</a></html><<saveChanges>>[[sys]]
<<newJournal 'YYYY.MM.DD' label:"新增項目" focus:title tag:chkPacking xAA>><<forEachTiddler\n where 'tiddler.tags.contains("xAA") &&\n tiddler.tags.contains("chkPacking") &&\n ! tiddler.tags.contains("ok")'\n sortBy 'tiddler.title'\n script ' function getFirstLine(s) { var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : ""; } '\n write '"|[X("+tiddler.title+":ok)] |[["+tiddler.title+"]]"+"|\sn"'\n>>
<<newJournal 'YYYY.MM.DD' label:"新增項目" focus:title tag:chkPacking xBB>><<forEachTiddler\n where 'tiddler.tags.contains("xBB") &&\n tiddler.tags.contains("chkPacking") &&\n ! tiddler.tags.contains("ok")'\n sortBy 'tiddler.title'\n script \n ' function getFirstLine(s) { var m = s.match(/\ss*(.*)/); return m != null && m.length >= 1 ? m[1] : ""; } '\n write '"|[X("+tiddler.title+":ok)] |[["+tiddler.title+"]]|\sn"'\n>>
<<newJournal 'YYYY.MM.DD' label:"新增項目" focus:title tag:chkPacking xCC>><<forEachTiddler\n where 'tiddler.tags.contains("xCC") &&\n tiddler.tags.contains("chkPacking") &&\n ! tiddler.tags.contains("ok")'\n sortBy 'tiddler.title'\n script \n ' function getFirstLine(s) { var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : ""; } '\n write '"|[X("+tiddler.title+":ok)] |[["+tiddler.title+"]]|\sn"'\n>>
<<newJournal 'YYYY.MM.DD' label:"新增項目" focus:title tag:chkPacking xDD>><<forEachTiddler\n where 'tiddler.tags.contains("xDD") &&\n tiddler.tags.contains("chkPacking") &&\n ! tiddler.tags.contains("ok")'\n sortBy 'tiddler.title'\n script \n ' function getFirstLine(s) { var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : ""; } '\n write '"|[X("+tiddler.title+":ok)] |[["+tiddler.title+"]]|\sn"'\n>>
<<newJournal 'YYYY.MM.DD' label:"新增項目" focus:title tag:chkPacking xEE>><<forEachTiddler\n where 'tiddler.tags.contains("xEE") &&\n tiddler.tags.contains("chkPacking") &&\n ! tiddler.tags.contains("ok")'\n sortBy 'tiddler.title'\n script \n ' function getFirstLine(s) { var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : ""; } '\n write '"|[X("+tiddler.title+":ok)] |[["+tiddler.title+"]]|\sn"'\n>>
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date YYYY0MM0DD'></span> updated </div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>
irene
<<tabs txtSysConfig \n功能選項面板 SideBarOptions SideBarOptions\n條目管理面板 '所有條目分類管理顯示' SideBarTabs\n>>\n*SiteTitle:修改網站標題\n*SiteSubtitle:修改網站副標\n*MainMenu:修改主選單\n*SideBarOptions:修改邊欄選單\n*DefaultTiddlers:修改啟動顯示條目\n----\n*StyleSheet:全站樣式表\n**ColorPalette\n**StyleSheetColors\n**StyleSheetLayout\n**StyleSheetPrint\n*PageTemplate:全站顯示時使用的模版\n*EditTemplate:條目在編輯模式時使用的模版\n*ViewTemplate:條目在顯示模式時使用的模版
X5
<<tabs chktravelThings\n財務證件 財務證件 "TravelD"\n日用醫藥 日用醫藥 "TravelA"\n衣物 衣物 "TravelB"\n相機&NB 相機&HD "TravelE"\n其他 其他 "TravelC"\n已打包 已打包 "DONE"\n>>
X5
到期日 2012