Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.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]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {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;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which use a logographic writing system and need larger font sizes.
***/

/*{{{*/
body {font-size:0.8em;}

#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}

.subtitle {font-size:0.8em;}

.viewer table.listView {font-size:0.95em;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
xyzzy設定ファイルを貼っておく。
{{{
;; .xyzzy 2007.02.22
;;
(global-set-key '(#\C-x #\C-n) 'other-window)
(global-set-key '(#\C-x #\C-p) 'prev-window)
(global-set-key '(#\C-x #\C-b) 'select-buffer)
(global-set-key '(#\C-x #\u) 'undo)
(global-set-key #\M-% 'query-replace)
(global-set-key #\C-\\ 'toggle-ime)
(global-set-key '(#\C-x #\C-j) 'toggle-ime)
(global-set-key #\C-Up 'previous-buffer)
(global-set-key #\C-Down 'next-buffer)

;; clipboard sync
(setq sync-kill-ring-with-clipboard t)

(load-library "isearch")

(require "dabbrev")
(global-set-key #\M-/ 'dabbrev-expand)

;; 
(defun prev-window ()
  (interactive)
  (other-window -1))

;; @ http://chez-sugi.net/xyzzy/000950.html
(defun mouse-right-press ()
  (interactive)
  (mouse-left-press)
  (paste-from-clipboard)) 
(global-set-key #\LBtnUp 'copy-selection-to-clipboard) 
;(global-set-key #\RBtnUp 'mouse-right-press)
(global-set-key #\MBtnUp 'mouse-menu-popup)

(define-key ctl-x-map #\C-w 'emacs-write-file)
}}}
!!TiddlySnip をテスト中
これは同じタイトルを付けると、ただ上書きされるわけでなく、append が選べるらしい。いつも日記で使ってる日付タイトルでも問題なく使えるようだ。

ただ、いちいち日付を入れないといけないのがタイヘンかも。

あと、送り先を幾つか指定できるといいなぁ。

!!テスト
というわけで追加されるのかをテスト。
タイトルの日付間違えるとちゃんと他へ書かれたね(アホ)

!!snip からの追加
うまく行った。
ダイアログから Save する時点で、
*Rename
*Append
*Overwrite
が選択できるみたい。いいね。

!!paster
[[ペースター]]を入れてみる。思った以上に良い。
TW のテンプレートを入れておくと楽だろう。
!!正規表現変換
[[ペースター]]の正規表現変換が優秀なことが分かる。
<<<
ああ
いい
うう
<<<
{{{s/(.)(.)/\1ー\2/gmk}}} を指定。
<<<
あー2
いー2
うー2
<<<
!!テーマ
Flickr っぽいテーマに切り替え。
入力の文字がなんかキタないな。StyleSheet イジるか。

!!カウンタ
どうにもカウンタという呪縛から逃れられない。
そういう時代だったの。
新しく設置しました。

!!TiddlyWiki と「ペースター」のコンビが最強であるという件に関して (crosspost)
「[[ペースター|http://homepage2.nifty.com/autumn-soft/paster.htm]]」というツールを見つけた。これがびっくり。
クリップボード拡張的なよくあるツールなのだけれど、拡張性とインタフェースがすごく良い。

shift shift と連続してキーを押すことでメニューが開き。そこから貼りつけたいものを選択するのだけれど。中でさらにショートカットキーが使えるので''キーをポンポンと押すだけ''で目的のことができる。

TiddlyWiki では、リストを作るときに「*」を頭へ付ける。それでよくあるのが、データを他からもってきてペーストしたものの先頭に (だだだ) と * を付けていくという作業。機械的に、とくに考えもしないでやっていたことだが。
<<<
Keroro
giroro
kururu
<<<
というリストを貼って。これを選択したのち、僕の設定したものなら [shift] [shift] w c と押せば
<<<
*Keroro
*giroro
*kururu
<<<
となるわけ。

この入力するものは自分で自由に設定できるので、TiddlyWiki のカユイ所を[[いろいろセットしてみた|http://kuraku.net/tw/clip.html#%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%BF%E3%83%BC]]。
wikiを色々使っているとそれぞれでフォーマットが違ったりして方言に悩まされる(リンクの方法、リストの書き方など)。wikiごとに設定をしておくとかなり簡単になるかも。

shift*2 で設定したもの、Ctl*2 で履歴が現われる。
shift とか ctl キーだと思わず押してしまうときもあるけど、そんなときは''落ちついて Space キーを押せば''全て消える。

この設定ファイルを作るのに夢中になっていて、ふと気付く。
これって、''emacs lisp をいじくり回している感覚''に近い。自分のやりたい入力方法の関数を作って、キーバインドする感じ。
ブラウザを使った入力が多くなり、とんと emacs から離れてしまっていたのだけれど、ふうむ、やっていることは変わらんのね。

^^#家で試してみると、おかしな動きをするね「ペースター」。とんでもないところにカーソルが飛んだり、選択が消えてしまう(貼れば出てくるようだが) PC のスペックに影響するのかな。^^
!!Haloscan
こちら用にアカウントを取り直して設定。コメント、トラックバックできるはず。
ニーズがあるかは知らんが・・

!!Wii から
Wii インターネットチャンネルから書き込みテストをこちらに対してしてみたつもりだったが、反映されていない。save がうまく行かない??
バレンタインデーのチョコレート。ヨメサンよりもらう。
忘れてなかったらしい、エラいなあ。

『大吟醸チョコ』だって。
体調が悪いのでまだ食べてない。

ホワイトデー忘れないようにしないと‥
(<<reminder year:2007 month:3 day:15 title:"WhiteDay">>)
!!またしても
風邪でダウン。昨日今日と仕事を休み。
こんなん書いてないで寝ないと・・
include plugin のテスト。
タイトルが重複したら???

main からは読みこまれないようだ。
そりゃそうか。

!Include Plugin
というのを google group で見つける。
YouSearch などでお世話になっている [[abego の Udo|http://www.abego-software.de/]] さん作成。
他の TW ファイルをそのままメインの(Include Plugin を入れた) TW で参照できる。

1ファイルのサイズが (1M超えた~) と泣いていたジブンからすれば、これは待ちに待っていたものだと云えるだろう。
使い方によってはかなり強力なツールとなるのは間違いない。

実験してみたが、やはりタイトルが重複していると認識されないようだ。まぁ考えてみればそうなんだけど。参照だけであればタイトルなどうまいこと wrap して見せて欲しいという気がしてしまうが。
*こちらも [[myEmpty Control]] を作成
!ヘタの横好きがまた
朝、読む本が無いので久しぶりに ~GameBoy SP を持って出た。

電車で''「スーパーマリオブラザーズ」''。もちろん相変わらずヘタで、クッパの突破が精一杯。成長してはいない。
ちなみに家では Wii で「スーパーマリオ64」をやっている。[[ヴァーチャルコンソール|http://www.nintendo.co.jp/wii/vc/]]の。

朝のスーパーマリオはしばらくライフワークにするか。
もうちょっとマリオのスキルを上げようかなと思う。ムダ?

!うらやましくなってしまうな
>[[さくらインターネットの共用サーバに screen をインストールする (talk to oneself 2)|http://www.hazama.nu/t2o2/archives/002698.html]]

太鉄さんのエントリより。
なにより telnet 接続ができるのが羨しい。

セキュリティはどうなっているのだろ。

!xyzzy
Tiddlywiki ファイルを直接いじるときは xyzzy が良いかもしれない。
utf-8 がきちんと save できるのを確認した。

>[[FrontPage - XyzzyWiki|http://xyzzy.s53.xrea.com/wiki/index.php?FrontPage]]

!snip
<<<
usage with multiple TiddlyWiki files

Source: [[TiddlySnip - FAQ|http://tiddlysnip.com/#FAQ]]
<<<
複数 TW への対応をマツ。
!mail fetch
待望だった、Gmail の mail fetch 機能が使えるようになりましたね。

英語表示にして、Settings の Accounts より設定できます。
日本語の表示にしているとまだ出てこないみたいですね。

しかしながら、
<<<
Gmail がよその POP サーバからメールを拾ってくるには、その POP サーバに自分のアカウントでログインするための情報を google に教える必要がある。
...
google だからどこの馬の骨とも知れない業者ではないだろうけど、それでもれっきとした他人だよ。その赤の他人に自分のユーザ名/パスワードを教えちゃって平気なの? そんなに google を信じていいの? 

Source: [[どさにっき|http://ya.maya.st/d/200612b.html]]
<<<
という話もあるし、ふうむ気をつけて使うものなのかな。

!xyzzy
emacs な人向けのカスタマイズ。
<<<
いくつか自分で試してみたカスタマイズについて説明します。方針としてはなじんだemacsの操作にできるだけ近づけようということです。もちろん、なんでもかんでもというわけではなく、xyzzyの方が便利なところはそのまま使っていきます。

Source: [[xyzzyのカスタマイズ (chez sugi)|http://chez-sugi.net/xyzzy/000950.html]]
<<<
[[.xyzzy]] を貼っておく。
!DS ないけど
洋ちゃん CM の『レントン教授』やりたいなぁ。DS 持ってりゃなぁ。

~~(カンケーないけど「ハケンの品格(?)」に安田さん出てるね。どうでしょうファンじゃなきゃ分からん...)~~

!そんなに面白いのかと思う
昼休み夢中になってやるほど、Windows のソリティアは面白い??
いまのプロジェクトの現場に、まぁ多いのですわ、昼休みにちょっと歩けば、あっちもこっちもミドリの画面。

[[LineRider|http://www.deviantart.com/deviation/40255643/]] でもやれば、と思うのだが。

!コンパクトでマニュアルというのは
<<<
「今年はマニュアル操作のできるコンパクトデジカメが流行るんじゃないか」と言う話がアリアリだった昨今。リコー GR-DとCanon PowerShot G7しかなかった選択肢に、やってきましたニコン参入。COOLPIX P5000でございます。

Source: [[Re:START : COOLPIX P5000|http://www.1s-rhythm.info/re_start/log/eid68.html]]
<<<
もちろん [[GR DIGITAL|http://www.ricoh.co.jp/dc/gr/digital/]] は欲しいのだが。これも良い感じ。
GR-D とは違って、SDカードというのもいいかな。

とにかくコンパクトでマニュアル操作できるものが一つ欲しい。
(だが金は無い、しばらく無い、今年は無い)

Nikon というのも魅かれる。

!mozex textarea をエディタで開く
<<<
This guide assumes you are running *NIX, MS Windows or MacOS version of Mozilla. The same installation process and package may be used with both Mozilla and Firefox, Solaris, Linux, MacOS, Windows.

Source: [[mozdev.org - mozex: development|http://mozex.mozdev.org/development.html]]
<<<
「[[ヒビノアワ|http://cheebow.info/chemt/]]」から辿った情報。

ブラウザの textarea を外部エディタで開いて、編集できるらしい。
TW で使えるかも。いやいや、お手軽な TW より MT のエントリとかに良いのか。

!Macintosh Garden
<<<
link to Kaleidoscopeのページ

Source: [[Macintosh Garden|http://www.norizuki.com/MG/96Sep.html]]
<<<
[[めのうさん|http://www.norizuki.com/MG]]のお名前を見つけて、何年かぶりに[[Macintosh Garden|http://www.norizuki.com/MG]]へ行ってみる。

古い記事を眺めていたら ''Kaleidoscope'' の文字を見つけ泣きそうになってしまった。
やっぱり一番楽しくコンピュータをいじっていたのはあの頃かもしれない。
いつかまた Mac に戻りたいなぁ。

!Copy URL+ の拡張
<<<
サイトのタイトルとURLアドレスをコピーしてTiddlyWikiのリンクを作る作業を簡単にしたいと思いませんか。Firefoxの拡張のひとつであるCopy URL+ はサイトのアドレスとURLをクリップボードにコピーします。今回、このCopy URL+ を簡単にカスタマイズしてTiddlyWikiのリンクをクリップボードにコピーするようにしてました。

Source: [[素敵なTiddlyWiki  - カスタマイズノート 第2版|http://www.potto.client.jp/#%5B%5BTips%20-%20Firefox%E3%81%A7%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E6%A5%BD%E3%81%AB%5D%5D]]
<<<
これは便利。

さらに拡張してみる。
{{{
user_pref('copyurlplus.menus.2.label','Create TiddlyWikiLink & selection');
user_pref('copyurlplus.menus.2.copy','<<<\n%SEL%\n\nSource: [[%TITLE%|%URL%]]\n<<<\n');
}}}
セレクトした部分と一緒に TW-Snip に合わせたフォーマットでコピー。
!るす番
ヨメサンがお友達の家に行ったので、ナオとお留守番。

彼を背中に背負って、離乳食を作りつつ、ヨメサンが焦がしたル・クルーゼを磨いていたら。
腰にキタ。
背中でナオはウトウト。

そんな日曜の午後です。
!ゲたろう
[[検索ちゃん|http://ja.wikipedia.org/wiki/%E7%88%86%E7%AC%91%E5%95%8F%E9%A1%8C%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%81%A1%E3%82%83%E3%82%93]] をいつも『[[タモリ倶楽部|http://www.tv-asahi.co.jp/tamoriclub/]]』の並びで観て見ているのだけれど。

今回気になった問題。
>''「どれにしようかな、神様のいうとおり」に続くフレーズは各地でたくさんある''

僕はというとこれに続くフレーズは一つしか思い浮かばないのだが。
結果のランキングを見ると一切その文言が入っていない。
っていうか、''短かい! そんなに短かいのかそれは??''

恐るおそるヨメサンに訊いてみた。
笑われた、というか呆れられた‥ ウチの地域ではそうなんだって、ホント。

うーん、笑われそうだが書いてみる‥
こんな感じ、

<<<
どれにしようかな、神様のいうとおり、
ゲゲゲのゲ(鬼)太郎、
ウルトラマンエース、
ぶたぶたこぶた、
こいつに決めた。
<<<

子供の頃なので、「鬼太郎」を知らず「ゲ太郎」と云ってましたわ。なんとなく『ゲゲゲ』の後だったからだと思うケド。

南信地方で「そうそう」という声が聞こえると良いのだが。

!ふふふさんがなんやら始めたらしい
<<<
ふふふはWeb上の仮想会社「vega21.com」を運営していますが、このたびネット上のバーチャル世界「セカンドライフ」にも仮想会社を設立しましたのでお知らせします。

Source: [[ふふふノート: セカンドライフの仮想会社|http://vega21.lolipop.jp/mt/archives/000196.html]]
<<<

面白そうなのでリンクしとく。あとで見る。

!「ぐりとぐらかるた」
<<<
愛子さんが「ぐりとぐらかるた」で遊んでいるらしいですね。我が家なはかるたはないですけど、「ぐりとぐら」は定番の絵本になっています。親から子供に引き継いだ絵本です。なんで「ぐりとぐら」のカステラはあんなに美味しそうなんでしょうね。

Source: [[[N] ぐりとぐらかるた|http://netafull.net/book/018685.html]]
<<<

確かにあのカステラは食べたくなるよなぁ。
「ぐりとぐら」子供に読んであげたい本です。

!重要なファクター
何のことを云っているのかには言及して欲しくないのだけど。

アプリケーションの優秀なもので、惚れこんでしまいそうなもので、ホント (これはスゴイ) ってものがあるじゃない。

僕もそういったものを探すのがとても好きなので、どんなプラットフォームにでも色んなものをインストールしては消して、良いものがあれば使い続けるわけなのだけれど。

ときどき素晴しいアプリがあったとき。''問題になるのはアイコン''。

好きなソフトでも、アイコンが気に入らないと「うーん」てなる。
我慢ならないときにはつい変えてしまったりして。けっこうあるのですわジブン。

逆に、機能的にはヘロヘロで''アイコンだけが COOL'' だったりすると、(あああ、勿体ない) てなります。
!終日会議2日目
昨日今日と一日会議。
まぁオブザーバみたいなものなので気楽に話を聞いてただけなのだが。
それでも疲れる会議だわ。

喋りたい人が大きな声で喋るという、昔ながらの会議な感じ。
それでもみんな同じ方向を見ているので、イヤな印象は受けない。外から見るとちょっと羨ましい。

自分は何のために仕事しているんだろ、と自答してしまった。

!最強のLR
<<<
線を引いてソリを走らせる「Line Rider」というゲームがあり、YouTubeではその動画がいろいろと公開されています。もはやアート作品のようになっているのですが、これは今まで見た中でいちばん凄いかも。ゴールするんですね。

Source: [[[N] Line Riderのスゴ動画|http://netafull.net/video/018570.html]]
<<<

これは確かに今までで最強かも。

''「おおお、戻ったー!!」''てなること必至。
!考えなしに
[[saku saku|http://www.tvk-yokohama.com/saku2/home.html]]見てて思い出した。

小学校の高学年のとき、クラスの一人が突然、もみあげを剃ってきたことがあった。
男の子で普通に長めの髪型の彼の、''もみあげ部分だけ青々としてて''。
一体何があったんだと思ったものだ。

数日経ってから、それが『テクノカット』というものをマネて、見事に失敗したのだということが分かった。(本人は成功しているつもりだったのかもしれないが)

恐らく、YMO に傾倒したお兄ちゃんに影響を受けて (エイヤっ) てやってしまったのだと思うのだが。
ホントに子供ってヘンなことするよね。

ウチのコも奇行がタイヘン。
!『ネウロ』
以前に Youtube でなんとなく見た''『脳噛ネウロ』''を書店見つけた。一巻を。
買ってみると、面白いかも。

<<<
[[YouTube - 魔人探偵脳噛ネウロ (Majin Tantei Nougami Neuro) OP|http://youtube.com/watch?v=EQ_3CCdrl9o]]
<<<

しかし、このムービーは勝手に作ったものなんだよね。なんというか、スゴイね。

!JS をもちょっとなんとかしたい
<<<
[[PamGau::TiddlySpot - ここでもTiddlyWiki|http://kyorecoba.tiddlyspot.com/#prototype.js]]
<<<
prototype.js を使えるようにしたいと思うので。

JS を真面目に習得したいなぁ、いまさらだけど。
!冗談じゃないよっ
<<<
アンチウイルスソフトとして世界的に有名なNortonシリーズですが、先月末の2月28日に行われたアップデートの際に何をドコでどう間違ったのか、「TiddlyWiki」というWikiソフトのデータを「W32.Feebs」というウイルスと誤認し、全データを削除するという事件が世界中で発生。データを失った「TiddlyWiki」ユーザーが続出しているようです。

Source: [[Norton AntiVirus、Wikiをウイルスと誤認して全削除 - GIGAZINE|http://gigazine.net/index.php?/news/comments/20070303_norton_delete_tiddlywiki/]]
<<<

幸い、ノートン先生は使っていなかったので良かったですが、怖いですな。
仕事の TW 全部消されたりしたらシャレにならん。
!卒業したい気もする
<<<
「ロリポップを卒業したい人のためのレンタルサーバー選び」 の続編。最近、Paperboy&co.のレンタルサーバー「heteml(ヘテムル)」を使いたくなったので申し込もうと思ったら、「チカッパ!」というのも始まっていて、違いがよく分からない。

なので、ついカッとなってまた比較表を作ってしまった。とりあえず上っ面の情報のみ。なお、特にPaperboy&co.から何か貰ったりはしていません。

Source: [[ロリポップを卒業したい人のためのレンタルサーバー選び2007 :Heartlogic|http://www.heartlogic.jp/archives/2007/02/rental_server_2007.html]]
<<<

あとで読む。
で終りなら Diigo でいいじゃん。

!DeleteListPlugin
TW で tiddler をまとめて消したいときがよくある。
レイアウトや plugin は残したまま空に近い TW ファイルが作りたいときなど。

PluginManager には一応削除の機能がついているけど、systemConfig tag のものしかリストされないし、どうやら Bugっぽくて削除機能は効かない様。

というわけで、PluginManager を hack して作ってしまいましたわ。作ったというと怒られそうだが。
一応動きました。よく分からんコードも残っているけど・・

*[[DeleteListPlugin]]
*[[DeleteListPlugin Sample]]
!TW: DcTableOfContentsPlugin
[[DcTableOfContentsPlugin]] が使いたくて仕方がなかったのだが、どういうわけか自分の TW ではことごとくうまく行かない。

H1 などのタグを拾って、インデックス化してくれるものなのだが、H1などの内容を変えて、でもきちんと閉じないで終っている模様。
どういうことになるかというと。Header タグがあるたびに文字が大きくなってく‥ こんなに大きくなるんだぁ、ってのが見えるようになる。‥使えぬわ。
この Plugin それほど古いものじゃないので自分の環境の問題かとも思ったのだが。

{{{
  ...
  // following two lines is the default handler
  var e = createTiddlyElement(w.output, "h" + w.matchLength);
  //w.subWikify(e, this.terminator);
  w.subWikifyTerm(e,this.termRegExp); //change krk
}}}

this.terminator がうまくないようで、H1 とかは teminator が指定していないみたい。TW 本体を hack して直してみたら。動いた。

いいね。
ちょっと自分用にあちこちイジる。Style は中に持つようにしてしまった。
[[TiddlyWiki textFormat]] へ入れてみた。(最初のインデックス部分)

まぁここから持っていく人はいないだろうけど。こういう時には「イジりました」ということをちゃんと明記しておくもんだろうか?
!TW: TiddlerListMacro の対応
TiddlerListMacro を使ってリストするのが大変便利なのだが、このサイトのように内容までリストした場合、そこに CheckboxPlugin の Box があると大変なことになる。⇒[X]

{{{<<tiddler XX>>}}} と同じ話で、tiddler の変なところに「X」がいっぱい付く。

ということで、TiddlerListMacro にパッチ。

{{{
 }
 }
 }
+// patch krk for CheckboxPlugin
+ listWikiText = listWikiText.replace(/\[([Xx_ ])\]/g,"\($1\)");
+// end
 
 // Last group footer
}}}

いいのかこんなんで。
{{{<<tiddler XX>>}}}  にもやりたいけどよく分からん。

__追記(2007.03.09):__

{{{
listWikiText = listWikiText.replace(/\[([Xx_ ])\]/g,"\[ $1 \]");
}}}

こちらの方がシンプル。スペースを挟んだだけ。
!TW: DeleteListPlugin (ver.0.1.1)
systemConfig などのタグを on/off できるようにリストしていたが。ユーザが指定できるように分離した。
よく使うタグを設定しておけば、まとめてタグのセットができるようになる。
*[[DeleteListPlugin|http://kuraku.net/tw/tw.html#DeleteListPlugin]]
ToDo として、完了報告をきちんと表示したい。(今はなんとなく終ってる)

!TW: 更新日の更新タイミング
自分の使い方としてはこちらの方が良いようだ。

{{{
config.options.chkForceMinorUpdate=true;
}}}

更新したときにいちいち更新日を変えない設定。
__shift + done__ で新しくなる。(今までの逆)

オペレーション的なことで気付いたのだが、ctl + リンク で開いていた tiddler であれば閉じるようになっているようだ。
ふうむ、使うか?ソレ?
!さいきんの彼
ヨメサンはお友だちの家に泊まりでお出掛け。ナオと二人るす番の夜です。
彼はとっくに布団にいて、さきほど起きてミルクを飲んですぐにまた寝たところ。

さいきん多いのが仕事帰ってくると部屋が大変になっていること。
この前はキッチンが一面、輪ゴムで敷きつめられていた。
まぁ、散らかすのがシゴトですねぇ、今の彼の。

今日は僕がキッチンに立っていると、後ろでごそごそ。
「触るものみな傷つける」という感じで、二つ目の急須を割りそうになりました。なんとかソシ。

それにしても成長著しい。テーブルの下で立ち上がり、机上のものをすぐ掴む。その適用範囲がどんどん広くなっていて。まぁ油断ができない状態。

1才になるまでに歩き始めるだろうと10ヶ月検診で云われたらしく。
うーん、楽しみだけどコワいなぁ。


!一眼もって
[img[http://farm1.static.flickr.com/133/416476819_928fa4d6fe_m.jpg][http://flickr.com/photos/kuraku/416476819/]]
~~珍しくαSweet を持って散歩へ。いつもの写真と変わらないなぁ。28-80mmレンズなんだから‥、というものが多い。Zorki の弊害?~~
!TW: CheckboxPlugin --対応済みだった-- ?
tiddler マクロで使うために CheckboxPlugin に patch をせにゃぁ、ということを云っていたが。

新しいバージョンのもので対応できているみたい。(ver2.1.3、なぜ TW と同じ?)
検証したときはうまく行かなかったのだけれど、キャッシュだったのか?

とりあえずは tiddler で Checkbox を含んだものを表示しているときには、チェックは変えられないという対処がされている。

あとでソースをちゃんと見よう。TiddlerListMacro への対応もこちらでするべきかもしれないから。

''追記(2007.03.13):''
やっぱりうまく行っていないことに気付く。ふうむ。

!TW: MarkupPostBody の問題
Google Analytict を入れようと、MarkupPostBody の tiddler を追加したのだが反映されてない

{{{
<!--POST-BODY-START-->

<!--POST-BODY-END-->
}}}

ここに入ってこない。
いろいろ見ていたら発見。

{{{
	<div id="storeArea"></div>^M
<!--POST-BODY-START-->
}}}

storeArea の終りを表わす {{{</div>}}} の後に CR が入っているのである。
これをうまく行っていない TW に入れてみると MarkupPostBody が差し込まれた。
ふむ、なにかのタイミングで CR が消えてしまったのだな。気をつけよう。


!!と思ったら

{{{
//# -------------------------
//# LoaderBase: A (abstract) storage loader that loads the \
tiddlers from a list of HTML elements.
}}}

で始まるブロックに CR が付いているのも発見。
この TW など一切 CR が消えてしまってるようだが大丈夫なのか??

!!なので、
気になったので、素の TW にまるごと ImportTiddlers。
そう、おかしいな、と思ったらすぐにまるごとコピーすれば良いのだ。
このあたりも便利になったなぁ。
!ちょっとザンネン
予定では今晩、ヨメサンのお友だちが家族で食事に来ることになっていたのだけれど。先方の都合でキャンセルに。

どうして残念かと云えば、そこのカワイイ奥さんに会えるからでも、カッコイイ旦那さんに会えるからでもなく。
「シュウくん」に会えるから。

ナオとほとんど変わらないくらいの彼は、なんといっても''『癒し系』''。 

普段仏頂面のダレかさんと違って、(ニコー) と笑ってくれます。
ハカイ神のダレかさんと違って、とっても穏か。
積極的にナオに向って行くのだけれど、ナオはいつものように笑ってバンバン(カオ行きマス)
そしてけっきょく泣いてしまうシュウくん、不憫だのぅ。そんなところもカワイイの、

・・・アラ、
ナオ、そんなところに居たのカイ。
こちらへおいでヨ。
待って、ドコに行くの‥ 待ってー

!TW: すげぇエディタ
TidIDEPlugin を試してみている。
(via: [[ELS Design Studios|http://TiddlyTools.com/]])

懸案の更新日付を変えられる点がクリアになったりするのだが。いかんせんオーバースペックであり、この Plugin だけでサイズをかなり取ってしまっている様。

ふうむあったら良いけど必須ではないなぁ、いまのところ。
!iddy
[[ヒビノアワ|http://cheebow.info/chemt/]] で紹介されていた [[iddy|http://iddy.jp]] が良さげ。

自分もあっちこちにサイトが散らばっているので。暇を見つけて設定してみよう。

<<<
[[関根元和さんのプロフィール : iddy|http://iddy.jp/profile/cheebow]]
<<<

!TW: HelpTextMacro
[[HelpTextMacro]] を内職。
複数の wiki を使っていたりすると、構文がこんがらがってしまう。なんだかんだでよく確認します僕も。
なので編集時にチラ見できる機能が欲しかった。
~~(どんなのかというと、このあたりクリックして編集画面にすると右上の方に「help」ボタンが出ます)~~

TW をこれからやってみるってヒトにも良いかも。「これから」って人にはちょっとインストールが難しいのかな。

!JSON 読み方
なんとなくで呼んでたら合ってた。チェーンソーを連想しガチだが。
!けふのヨメサン
ウチのヒトはどうも、常識人のツラを被った@@color(#3333ff):ナントカ@@かもしれない、と思うことがときどきある。

今日僕が丁度取りに立とうと思ったものを、立ち上がる前に渡してくれたことがあった。
さすが夫婦や。とカンシンして、

「こういうのって何て云うのか知ってる?」
当り前の様に『以心伝心』という言葉を思い浮かべたのだけれど。

「なに?''『お見通し』''?」

また、
見たい DVD があったのだけど、何だったのか忘れてしまったという話になり。
「そういうときはすぐに手帳にメモするんだよ」と彼女の手帳を開いて見せてくれた。

『''戦国自__営__隊''』

多分、国の資産でやっていると思うぞ。すなわちわれわれの税金が。

!TW: DeleteListPlugin (0.1.2)
削除完了時にメッセージを表示するように修正。
表示方法がよく分からず、あまり良い方法ではない。いずれキレイにしたい。
まずは要求は満たしたかなぁ。

あと「systemConfig タグのチェックを表示したときには 。systemConfigDisables タグもチェックしましょう」ということを追記‥ したつもりだったが Up していないことに気づく。
直しマス。
*[[DeleteListPlugin|http://kuraku.net/tw/tw.html#DeleteListPlugin]]
!ゲキレンジャー
日曜にナオと一緒に「ゲキレンジャー」をなんとなく見ていた。もちろん、彼が内容を理解できるワケもなく (なんとなく) である。
おおっと、こんなお方が出演しているのを発見。

<<<
最後は、理央につかえるメレ役の''平田裕香さん''。「最後にコメントするだけでも緊張するのに、直前に(荒木さんに)そんな面白いこと言われて、どうしたらいいのか…(笑)」と戸惑いながらも、「初めての悪役ですが、ぜひ応援してください」とコメントを。
__どんどんキワドクなっていくため、平田さんも思わずストップをかけたというセクシーなメレの衣装__。「寒空の下、この衣装で、理央様の手下となって、寒さと戦っています」という平田さんの頑張りは、敵役ながらアッパレ!

Source: [[tv asahi|テレビ朝日 獣拳戦隊ゲキレンジャー|http://www.tv-asahi.co.jp/geki/]]
<<<

来週も見ます。

!TW: WikiBar
[[WikiBar]] がすごい。
TW の編集を助けてくれるもの。僕で云えば''ペースターの変わりになるもの''、かな。

macro が内蔵できたりしてちょっとオーバースペック気味ではあるが。なんというか、__自分で Plugin 作ってやろうとかいう気持ちはキレイに消えますな__。
カラーパレット機能などは秀逸だ。

気になるのが例によってジブンの環境だけかもしれないけど、複数行選んでリスト化
(頭に「*」) ができない。1行目だけに付く。
これはー、困るな。ペースターと併用すればいいのだけど。
!ビックリした
昨日はヨメサンの両親が日帰りで来訪。ナオの顔を見に来てくれたのでした。
本当に来てくれる度に色々持ってきてくれて、お米を筆頭に。とても助かります。

ちなみに来週は僕の方の両親が来る予定。
離れて住んでいる僕等のところに足しげく来てくれる両両親には感謝です。僕たちももっと行った方がいいのだけれど。ナオが小さいうちはどうしてもしかたないのかな。

さて、今回驚いたこと。
Wii が面白いとヨメサンがすすめ。内心僕は (興味が湧くかな?) と思って見ていたのだけれど。

お義父さんがすごいのですわ。
「あっ」という間に使い方などマスターしてしまって、操作にもすぐ馴れてゲームもうまいのですわ。
まぁなんつーか、負けました『テニス』で。まぁ僕がヘタすぎるのだろうケド。

お義父さんは多芸なお人で、ダンスや書道、テニスもやってたのかな。なんにでも興味を持ってやってみようとする人は、やっぱり違うのだな、と思ったのでした。

さて、日帰りで少ししか会えなかったのだけど。ナオもご機嫌で、満足して帰ってもらえたと思うのだけどどうだろう。
なんというか (おもてなしする) という感じより、色々いただいてしまって、いつも申し訳ない感じです。
!TW: HelpTextMacro (ver.0.1.1)
やっと満足行く機能にまでなりましたわ。
しかし腑に落ちない部分が幾つか。いいのかそんなんで。
こちらに入れたら、iframe の方が上になっちゃうのね。→Flickr Badge の部分。
!IE で JS デバッグ
[["IEerBug" とは [てっく煮]|http://tech.nitoyon.com/javascript/application/ieerbug/]] を導入。
~/js/ 以下へ置いた。

[[IEerBug Marklet|javascript:(function(){var%20s=document.createElement('script');s.type='text/javascript';s.src='file://C:/home/js/ieerbug-0-2/ieerbug.js';document.body.appendChild(s);})();]]
という Bookmarklet を作成して呼べば IEerBug が立ち上がるようになる。(*.js の path は自分用に)

これだけでは窓が開くだけなので、ソースに
{{{
console.debug("test");
console.debug("value is : %d %s", i, s);
console.debug("debug object : %o", {x : 3, y : 2});
console.info(document);
console.assert(a);
}}}
などと書くか、

[[IEerBug Document Info|javascript:(function(){var%20s=document.createElement('script');s.type='text/javascript';s.text='console.info(document)';document.body.appendChild(s);})();]]
このような Bookmarklet を実行すると DOM の内容が見られる。
{{{
javascript:(function(){var%20s=document.createElement('script');s.type='text/javascript';s.text='console.info(document)';document.body.appendChild(s);})();
}}}
s.text の内容に console コマンドを書けば良い。

Bookmarklet を使用したのは、[[FireBug Lite|http://webos-goodies.jp/archives/50999805.html]] をそうやって使う方法があったので真似た。
IE で DOM の内容が見られるってのは、それなりに使えるはず。
スバラシイです。(ネーミングセンスはアレだが)
!ふと思い出したら
そういえばけっこう前だが、''「ところてん」を食事前に必ず食べていた''時期があった。

そう、[[アノの影響|http://www.fujitv.co.jp/kokuchi/070123.html]]で。

今となれば、事実のものとそうでないときちんと仕分けして教えて欲しいよね。
まぁいまさらだけど、よく踊らされましたなぁあの番組にゃ。
!『べそかき親子体操』
<<<
「ハイ、じゃあお母さんたちにありがとうしようねー」

って言ったとき、スーのほうをチラっとみたら

Source: [[べそかき親子体操|うちの3姉妹~マンガで見る今日の出来事~|http://ameblo.jp/3shimai/entry-10026432801.html]]
<<<

考えただけで泣けてくる。そんな日が遠からず来るのか・・・
でもそういうシチュエーションって、きっとハハなんだろな。
!タイヘン
風邪が直んないなぁ。という状況だったのですが。ここへ来て、また急変。

一昨日くらいからセキがひどく。まともに寝ていられない状態。
今日にいたっては、元々平熱が低い僕が、(クラっ) とくるほど高い熱をマークして、慌てて救急病院へ行ってきた。
インフルエンザかもしれない、と。

明日また医者行ってきます。
仕事は休み。
!ガムテープ追加
さいわい、インフルエンザではありませんでした、ふぅ。
今日も仕事は休み。

ナオがレベルアップして、ついに冷蔵庫を開けやがりました。
ただでさえキッチンは引き出し、開き、にガムテープがペタペタ貼ってあり見られない状況なのに。
さらに追加です。
!Google Notebook
いつの間にかバージョンアップして、「ポップアウト」なんてワザが使えるようになってますね。
このエリアが狭いとずっと思っていたので、これはありがたい。

というか、日本語になったの、いつ?

!April Fool's Day
そういや「エイプリルフール」。
どこか面白いサイトはあったのでしょうか。
明日まとめサイトを探した方が早いな、きっと。

ダメダネ。

エイプリルフールといえば、と習い性で、[[こちら|http://pccm.com/op3/]]へ。~~([+]Palm系でお世話になっているサイト)~~
・・・URL 間違ってる??
どこまでがネタなのか分からぬわ、
!泣かれるとツラい
朝でかけるとき、泣かれます。
僕が着替えをしてコートを着ると、ナオが泣いてすがって来るのです。

「チチよ行かないでー」

玄関でお見送りしてくれるときには、もうあきらめるみたいですけど。
この頃毎朝、仕事に出かける気が一度失せます。

!ブランク
Lifework で TiddlyWiki のソースを見たりしているのです。
ソースを持ち歩こうと、Palm に Doc にして入れたのだけれど、[[J-DOC Reader|http://simple-palm.com/jdoc/index.html]] を起動してからの、''Graffitiエリアが畳めない! どうしても''。

うーん、こんなことに悩んだ覚えはないのだけれど、なにかしないとイケナイのだっけか?

!Tw:PartTiddlerPlugin
PartTiddlerPlugin を入れて、FrontPage がすっきり。
tidder ひとつでタブの表示が可能になったり、他いろいろ使えそう。
!『シブミ (上/下) - トレヴェニアン』
<html>
<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4150411050/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://images-jp.amazon.com/images/P/4150411050.09.MZZZZZZZ.jpg" alt="シブミ〈上〉" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4150411050/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">シブミ〈上〉</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4150411050/kurakunet-22" title="シブミ〈上〉" target="_blank">amazlet</a> on 07.04.04</div></div><div class="amazlet-detail">トレヴェニアン Trevanian 菊池 光 <br />早川書房 (2006/02)<br />売り上げランキング: 138480<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4150411050/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div>
</html>
長く本棚に眠っていたもの。読む本が尽きたので仕方なくという感じで手したのだった。

元々トレヴェニアンは作風がとても好きなので、この作も文句なく面白かった。
ではなぜ長いこと眠らせてたかというと、冒頭だけ読んで放ってあったんだよね。なにか乗れなくって。最初に出てくる (いかにもアメリカ人) というエージェントがメインキャラクターだと思ってしまったような記憶がある。

実際はまったく違う。「日本の心を持った暗殺者」が主人公。
と聞けばなんだそのヘタなオビの文言は、みたいな印象を持たれそうだが、いやいやいや。そこはトレヴェニアンなのである。

作風が好きだと云ったが、この人の作は結局『[[夢果つる街|http://www.amazon.co.jp/exec/obidos/ASIN/4042450024/kurakunet-22/ref=nosim/]]』『[[バスク真夏の死|http://www.amazon.co.jp/exec/obidos/ASIN/4042450016/kurakunet-22/ref=nosim/]]』の二作だけ。
しかしこの二作の印象が強烈で、僕の好きな作家の一人である。
「シブミ」でさらに好きになったかな。

!I have ~FireBug installed and can't upload
<<<
Open ~FireBug, click "options", and un-check "show ~XMLHttpRequests".

If that doesn't work try this:

    Quick further report: what you suggested worked: you have to disable Firebug from the Add-ons list, and then restart Firefox, and then the update completes correctly.

Source: [[tiddlyspot - frequently asked questions|http://faq.tiddlyspot.com/#%5B%5BI%20have%20FireBug%20installed%20and%20can't%20upload%5D%5D]]
<<<
前にもこんなことがあった気がする・・・
JS がおかしいときは [[FireBug |https://addons.mozilla.org/ja/firefox/addon/1843]]を疑え、か。
!なにか別のもの
やっと風邪が治まってきました。でもクスリが切れるとセキが出るのです。
もう一ヶ月以上風邪にやられてるわけだけど。

いくらなんでも長すぎる。
「どこか悪いんじゃないの?」とヨメサンに__脅され__。今朝も医者に寄って出勤したのでした。

明日は桜見に行けるかなぁ。
!『推理小説 - 秦 建日子』
<html>
<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4309407765/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://images-jp.amazon.com/images/P/4309407765.09.MZZZZZZZ.jpg" alt="推理小説" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4309407765/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">推理小説</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4309407765/kurakunet-22" title="推理小説" target="_blank">amazlet</a> on 07.04.07</div></div><div class="amazlet-detail">秦 建日子 <br />河出書房新社 (2005/12/21)<br />売り上げランキング: 42844<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4309407765/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div>
</html>
読み終ったとき、
「まぁノベライズなんて、こんなものでしょ」と思った。そんな印象。

違う、「アンフェア」の方が後だ。

(映像ありき) な作風だったのでそう思い込んでしまったらしい。
多分ドラマの方が面白いんだろうな、と感じた珍しい作だった。
!いいですよぅ
<<<
スタントマンを使わない俳優とされていたジャッキー・チェンでしたが、このほど、あるスタントマンがジャッキー・チェンの身代わりをしていたことをブログで暴露したそうです。

Source: [[[N] ジャッキー・チェンのスタントマンがブログで暴露|http://netafull.net/talent/019478.html]]
<<<

いやぁ、ジャッキーももう年だしねぇ。
ケガされるくらいならスタントくらいいいですよぅ。

と、こちらが思えるトシで聞いて良かった。

!twitter
<<<
先日からまわりで大盛り上がりの「今何してる」サービスTwitterですが、こういうのを見るとなんか作ってみたくなるのがプログラマの性。

Source: [[ヒビノアワ: Twitter用Windowsクライアント「Twit」できました|http://cheebow.info/chemt/archives/2007/04/twitterwindowst.html]]
<<<

twitter 楽しそう。
!TW:DirtyFlagMacro
散々探したのだけれど無かった機能。dirtyflag の表示。
TW を長いこと開いて作業していると。いま編集中だっけ?save しないといけないんだっけ? となることがよくあって。

それで仕方ないとやっつけ気味に作ってみたら、[[HoverMenu]]と一緒に使うと思いの外良い。

記事の編集や追加をすると、[[HoverMenu]](→の追従するボタン) のすぐ下に「*」が出るだけのもの。上のサイトタイトルにも出ます。Emacs っぽいカンジ。

>[[http://kuraku.net/tw/tw.html#DirtyFlagMacro|http://kuraku.net/tw/tw.html#DirtyFlagMacro]]

使い方がまだ書いてないのでメモ。[>][[2007.04.09|http://kuraku.net/tw/tw.html#2007.04.09]]

!DEATH NOTE - the Last name
一作目も期待しないで観たのだけど、良かった。

「[[the Last name|http://wwws.warnerbros.co.jp/deathnote/]]」も正直あまり期待せずに観たら、思った以上によくできてた。
漫画のファンもきちんと楽しませてくれたと思う。
<html>
<a href="http://www.flickr.com/photos/kuraku/450767452/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/204/450767452_adf677efc6_m.jpg" width="240" height="161" alt="FH000015" /></a></html>
土曜日に花見に。
もうずいぶん散ってしまっていたけどそれも良し。
!懐しの
<<<
インデックス・ホールディングス子会社の日活は4月10日、往年の人気アニメ「ヤッターマン」と「科学忍者隊ガッチャマン」の実写映画化を決めたと発表した。ヤッターマンは2009年春の公開を目指し、具体的に製作が進行しているという。

Source: [[ITmedia News:「ヤッターマン」「ガッチャマン」を実写映画化|http://www.itmedia.co.jp/news/articles/0704/10/news049.html]]
<<<

これはちょっと楽しみかも。
!TW:サーバに置いて使う
自分でまとめておきたいということもあり
[[サーバサイドの TiddlyWiki 運用 (UploadPlugin関連の使い方)|http://kuraku.net/tw/tw.html#%5B%5B%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B5%E3%82%A4%E3%83%89%E3%81%AE%20TiddlyWiki%20%E9%81%8B%E7%94%A8%20(UploadPlugin%E9%96%A2%E9%80%A3%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)%5D%5D]] を作成。
!ラオウ昇魂式
朝新聞を見ていたら目に入った。
<<<
[[ラオウ昇魂式|http://www.hokuto-no-ken.jp/raoh-ceremony/]]
<<<
うーん、すごいな。ちょっと行きたい。
と思ったら、

<<<
映画の宣伝だろっ?

Source: [[ラオウ昇魂式-タソガレノゴロネコ|http://blog.goo-net.com/groneko/archive/214]]
<<<

ふうむ

!くらう
[[KURAKU.net|http://kuraku.net/krk/]] がコメント・トラックバックスパムで大変なことになっています。
仕方なく止めました。

昨年対策して調子が良かったのですが、数ヶ月でもう・・・
ホントにメイワク。
!帰ってきた時効警察
「待ってましたぁ」
という場面が多くて嬉しかったのでした。
変にリニューアルしてなくて良かったですね。女の子が一人増えたくらい。

三日月サンが好きでねぇ。~~(アノ人を思い出す名前ですなぁ)~~

しばらくは楽しみが続くのが嬉しい。
タダ『[[どうでしょう|http://www.htb.co.jp/suidou/]](tvk)』の裏なのが‥

<<<
[[テレビ朝日|時効警察|http://www.tv-asahi.co.jp/jikou/index_top.html]]
<<<
!角煮を煮る。
昨日の AM に駅のスーパーにてヨメサンと買い物。「角煮用豚バラブロック」を目にする。
角煮したいね、ということになり 600g購入。

昼すぎになって、レシピを読んでいたヨメサン。
「これじゃ夕食にならないね」と云う。確かに、2時間煮込んで、3時間置いてさらに煮込む、ということでは夕食に間に合わない。
急に意欲が冷めた彼女は、キッチンから出てきてしまった。というのも AM に買った品で(まあいきさつがあるのだが) 気合の入ったランチを作ってしまったため。(いまからやる気にはならない) と。
で僕がやることに。まぁ、たまにはキッチンに立たんと。

手間はかからない。時間がかかるだけ。
それで溜っていた洗い物などもしつつ、鍋を覗いていた。定期的にナオが「襲撃」に来るので躱しつつ。([*]襲撃: 冷蔵庫を開ける、調味料入れを床へ落とす、陶器をカチャカチャ、ダシ用昆布を「はむはむ」、他)
下茹でしたものを冷蔵庫で冷す、3時間。

夕食後の21時半くらいに思い出し、再開。ナオは寝てくれてたので、妨害はナシ。
調味料を入れ弱火でコトコト。「ゲキレンジャー」でもやってたな、と思い出し。

で、先ほどやっとヨシとした。
味見はしていない、明日の楽しみで。

実はパート2。
<<<
[[角煮を煮る。 (KU-RA-KU)|http://kuraku.net/krk/2004/09/post_300.html]]
<<<
[[あの作|http://www5d.biglobe.ne.jp/~tin/Stock/Docs.htm#docs]]を懐しく思い出したのでした。

!ハナ
[img[http://farm1.static.flickr.com/229/459889942_62b76e4351_m.jpg][http://www.flickr.com/photos/kuraku/459889942/]] 

東急ハンズにて購入、何でしょうか?
!『毎日のみそ汁100』
<html>
<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4344003454/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://images-jp.amazon.com/images/P/4344003454.09.MZZZZZZZ.jpg" alt="毎日のみそ汁100" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4344003454/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">毎日のみそ汁100</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4344003454/kurakunet-22" title="毎日のみそ汁100" target="_blank">amazlet</a> on 07.04.17</div></div><div class="amazlet-detail">飛田 和緒 <br />幻冬舎 (2003/05)<br />売り上げランキング: 59838<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4344003454/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div>
</html>
書店で見かける。
買いそうになる。
買えばいいじゃん、
ちょっと高いの。
ページもシンプルでとってもキレイ。
買えばいいじゃん、
うん、買おう。
!カート・ヴォネガット
「タイタンの妖女」「スロータハウス5」の、カート・ヴォネガットが 4/11にお亡くなりになったそうです。

未読の作がたくさんあるから読んでみようか。

<<<
[[カート・ヴォネガット - Wikipedia|http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%88%E3%83%BB%E3%83%B4%E3%82%A9%E3%83%8D%E3%82%AC%E3%83%83%E3%83%88#_note-0]]
<<<
!TiddlyWiki 一問一答
を書き始めました。
<<<
[[TiddlyWiki 一問一答|http://kuraku.net/tw/tw.html#%5B%5BTiddlyWiki%20%E4%B8%80%E5%95%8F%E4%B8%80%E7%AD%94%5D%5D]]
<<<
なーんか見てる人いるんかいなというサイトですけど。
興味を持ってくれる人が増えるといいなぁ、と。

!奪いあい
子供って、大人していることの真似がしたくって仕方がないイキモノなのですね。
携帯とか TV のリモコンとかをイジりたくてしょうがない。

それでウチの子なんですが、マウスに異常な興味を示します。形が変わっていると思うのかな。

僕が PC を触っていると近寄ってきてマウスを奪ってグリグリグリといじりまわします。
取り上げれば当然泣き出し、何もできなくなってしまうので仕方なく予備のマウスを出してきて、握らせようとするのですが、そちらには興味ナシ。

(この「ぴかー」て光っているのがいいんじゃい!」)
ということか。

で、もうアタマ来て。
そちらの予備マウスを USB に挿して操作し始めたのだけど。
同じことをしたいんだよね、子供って。同じように机の上で動かすもんだから、カーソルがあっちこっちに飛ぶ。
(キィィ) てなりますわ。
!料理のウマいオトーサンを目指すのよ
この週末はほとんど料理人でした。
食事はすべて僕が用意しました。もちろん後片付けも。

ますますわんぱくになっていくナオにヨメサンはかなり疲弊ギミ。ちょっと負傷もしてるし、少しは休んでもらわんと。

外食をまったくせずに済んだ週末があってもいいじゃん。
!それはないんじゃないの
昨日定期を継続更新しようとするが、どの場所の機械を使っても''「とりあつかいできません。」''となる。
受付の時間帯でもあるのかと、今朝もう一度やってみるも同じ。

窓口で訊いてみると、
「8月くらいまで [[PASMO|http://www.pasmo.co.jp/]] の券売機での取り扱いはできないんです」
とのこと。その場合は窓口か、駅員さんにお願いして PASMO用の設定をしてもらう必要があるそうな。

[[PASMO|http://www.pasmo.co.jp/]] が好評すぎて、新規発売が停止しているのはニュースで知っていたけれど、すでに購入している人には無関係と思っていた。
不便な状態がしばらく続くらしい。
せっかく便利なのに完全に躓いてるね。
!SuperCard
仕事で Web のレイアウトを考えているのですが。
これまでの職場では、「デザインはデザイナーの仕事」というのが徹底されていたので、僕なんかが Web 画面のレイアウトに口出しをすることなんてなかったのですけど。

今の職場では技術者が画面を作成しているのが当たり前で。僕なんぞがレイアウトやインタフェースについて、つい云いたくなってしまう場面がよくある。

自分がインターフェースの重要性について叩きこまれたのはちょうど10年前くらいかな。
当時、Macintosh の SuperCard というアプリケーション開発環境を使ってました。その頃 Mac に付いてきていた HyperCard の拡張版と思ってください。
「Hyper」じゃなくって、「Super」だ!、というズッコケネーミングなんですけどね。

こやつと格闘していた日々を思い出して、ちょっと『SuperCard』で検索してみるのだけれど、見つからないなぁ。

まぁ、「Super」はともかく、HyperCard は今だって欲しいツールだと思う。どこ行ったの?

''#追記:''
HyperCard を楽しくて使い倒していた感覚って、いま TW を使い倒している感覚になんとくなく似ていることに気付く。

''#追記 2:''
あったぁー!!
>[[www.supercard.us|http://www.supercard.us/index.html]]
Windows 版は無いな (オイ)
<<<
2007年4月25日、ほぼ日刊イトイ新聞主催による「カレー部例会」に参加させて頂きました。カレーを作ってくれたのは、タモさんことタモリさんと、東京カリー番長です。

[img[http://netafull.net/images/_167_472303312_0b75035c6e-1.jpg]]

Source: [[[N] ほぼ日刊イトイ新聞「カレー部例会」のまとめ|http://netafull.net/diary/019833.html]]
<<<
うらやましい! 食べたいいぃぃ
!ウチの子は
ナオが今日で1歳になりました。
うーん、あれから一年か、もっと前な気がするなぁ。

さいきんの彼の得意ワザは、''「はい、どうぞ」''

とにかく近くにあるものを全て差し出す。とりあえず「ありがとう」と云って受けとるのだけれど。それもそっと元の場所に戻すので、またそれを手に取って、くれる。
『永久機関』である。このエネルギーをなにかに使いたい。

そして、ついこの前のこと。
手に届くものを全部渡してくれてしまった彼は。ちょっと考えてから、
__仕方なく近くにあったヨメサンの手を取って、僕の手の上に置いた__。

(仲良くね)、てこと?
!誤解が解けるのに時間がかかった
TiddlyWiki のマクロ [[TWGuideForJPMacro|http://kuraku.net/tw/tw.html#TWGuideForJPMacro]]を作った。
すでにある [[HelpTextMacro]] のアレンジで、ガイド(ヘルプ) tiddler を内包しているのが特徴。Shadow に入れてしまえば変更してもらいやすいし良いかと。

いや、TW をつつき回していると知らない間に時間が過ぎ去ってますわ。楽しいです。
必要にかられて、Plugin(Macro) を作ってみたりしていると、どうしても JavaScript を習得するしかないわけで、いまさらながらにやっと JS と真面目に向き合っているところ。

というのも、やっぱり、こんな文章があるくらいで、

<<<
...
しかしその高い普及率にもかかわらず、JavaScriptが汎用的でダイナミックな優れたオブジェクト指向プログラミング言語であることはあまり知られていません。

どうして、その素晴らしさが認められないのでしょう?また、なぜ、JavaScriptは誤解されるのでしょうか?

Source: [[Collection & Copy - JavaScript: 世界で最も誤解されたプログラミング言語|http://d.hatena.ne.jp/brazil/20050829/1125321936]]
<<<

僕もご多分に漏れずに誤解していたクチで、AJAX がこんなにも流行りになっているここ数年でも、その敷居を高く感じていた。
というのも、まぁ前記のコンテンツにもあるけど、最初の頃が散々だったんだよね。~LiveScript の時代のイメージをいまだに引き摺っているのですわ。
''「画面上をこざかしく飾り立てるためのもの」''

いやね、かえって当時(10年前くらいに) Web に関わっていた技術者はまだ、そう思っている人けっこういると思う。
ホントにひどかったんだから。JS はまず Off にするものって感じで。

そして、時代は変わったわけだなぁ。遅れてるなぁ、ジブン。
そんな自分がついに JS にハマり込んでしまったのはひとえに TW のお陰だね。ありがたや、
!最終的にホワイトカラーはダメだと云われた 1
5/3 より実家に行ってきました。昨日帰ってきたのです。
ナオの一歳の誕生祝いを実家でしてくれるということで、ヨメサンのご両親とナオと一路長野へ。

覚悟して行ったとはいえ、がっつり渋滞にはまりこみ、いつもならば4時間で着くところを''8時間ですよ''。
ヘトヘトのまま酒をかっくらいその日は落ちました。

二日目の4日はまず観光。
実家近くの温泉街にいろいろあって、そこの水芭蕉。
[img[http://farm1.static.flickr.com/206/485374041_a6130a91f1_m.jpg][http://www.flickr.com/photos/kuraku/485374041/]]
姉夫婦の二人の甥っ子がまた元気で、ナオもテンション上げまくりでもぅタイヘン。

さらに花桃の名所があり、
[img[http://farm1.static.flickr.com/169/485375847_57cc271e46_m.jpg][http://www.flickr.com/photos/kuraku/485375847/]]
GW ということでまぁ人がたくさん。

夕方からナオのお祝いをしていただく。
ウチのあたりは「''一升餅をかつぐ''」風習がありまして。それ自体はけっこうあちこちでやられるみたいだけど。
なんというか、田舎なのかな。もっと濃い感じで。

(つづく。というか書きかけです 朝っぱらなので、も一回寝ます)
!最終的にホワイトカラーはダメだと云われた 2
([[つづき|2007.05.05 最終的にホワイトカラーはダメだと云われた 1]])

{{{
三浦の翁は百六つ

 浦島太郎は九千年

鶴は千年 亀は萬年

 ※粃(しいな)は流れてゆけ

  実は残れ、(※くり返し)
}}}

昔脱穀で使われていたという大きなザルにナオを乗せて、歌う歌。
このデータはネット上に無かった、探してみたけど。貴重?
''『粃(しいな)』''とは、ようするに籾殻(もみがら)らしい。
子供を米に見たてて余計なものをふるって、必要な部分だけ残し、これからも育って行きます、的な儀式ということだろうか。母もあまり詳細なことは識っていなかった。

儀式としては、
#ザルに乗せる
##振って、歌う
#「ものさし」「筆」「そろばん」から一つ選ばせる
##ものさし: 裁縫
##筆: 勉学
##そろばん: 商才
#餅を背負う
##お供えのように二つにしてある餅を一緒に担ぐ

で、ナオは大泣きしましたわ、やっぱり。
よっぽど体が大きい子でもないかぎり担いで歩くのは難しいらしい。ナオはけっこう大きな方なので期待されていたけれど、そこはそれ甘えん坊さん。
でも、転んだり尻餅をついたりすることは縁起が良いこととされているらしい。
そしてそろばんを選びました、まぁ3つの中で形が面白いからみんな選ぶらしい。オモチャ度が高いだけかと。

そんなこんなで会は終り、その日は温泉に入ってそこに泊まったのでした。
コーフンしたナオが夜中起きまくり・・ 寝不足に、

(まだつづくのか)
!最終的にホワイトカラーはダメだと云われた 3
([[つづき|2007.05.06 最終的にホワイトカラーはダメだと云われた 2]])

最終日。朝ホテルをチェックアウトして実家に戻ると、お茶をしながら少し話をし、すぐ出発。
家路へ。

5/5 のこと、渋滞の覚悟はあったものの、思った以上に混んではいなかった。来るときあまりにガッツリ渋滞にハマったので、(なんだぁ大したことないじゃん) という感じで我が家に着きました。
それでも2時間近く、いつもよりオーバーしてたんだけど。お義父さんたちはここから更に実家に帰るのだけれど。

さて、この帰省の中でよく話されていたことが、引越しのこと。

僕ら引越すんですわ、8月に。
しかし、今のマンションは 6月末で更新。なんとか7月末まで延ばしてもらえないかと交渉するも (ダメ) と。
まぁ、はっきり云ってダメダメな不動産屋なので期待はしていなかったが ~~(これについては云いたいことがいろいろあるのだがヤメておく)~~
しょうがないので、ヨメサンとナオは、ヨメサンの実家へ1ヶ月ほどお世話になることにして、僕はウィークリーマンションでも借りようかということになった。

でも荷物はどうするのよ、てことになる。
そういうニーズにより、預かってくれるサービスはあるみたいなんだけど。まぁ安くはないわな。
そこでお義父さんに相談して、家で預かってもらうことになった。
しかし、それだって簡単じゃないのよ、引越しを二回するようなものだから。とはいえ、ヨメサン側の身内が総動員で手伝ってくれることになり一安心。
(家族ってありがたいね) と身に染みましたわ。

それで話しは戻って、
家でしばらく寛いでから千葉へ戻る義父と義母。この機会に持って行ける荷物を先に持っていってもらおうということになり。
ここへ引越したときからダンボールに入れっぱなしの本たちを持って行ってもらうことになった。

本て重いじゃない。で、考えなしに放り込んだダンボール箱がたくさん。持ってきたときには業者が担いでくれたので良かったのだが。
僕が__ほうほうの態__で玄関まで持ってきた一番重いダンボール。「ムリですムリです」というのも聞かずにお義父さん、肩にひょいと担ぐとスタスタと運んで行ってしまった。

''さすがに農業をやっているオトコはチガウ・・・'' と呆然。

それを傍らでナオを抱きつつ見ていたヨメサン。
''「やっぱりホワイトカラーはダメね」''
!人力検索はてなネタ
まぁ、辻ちゃんいろいろあったけどヨカッタネ。

<<<
うまくいけば実体化した怪人(恐らくモーニングイマジン。)がセクシービームやらなにやらして電王のライダーパスとライダーチケットをゲットしてきてくれるでしょう。
モーニングイマジン。が失敗したとしても、あなたの前に必ず電王が現れます。

Source: [[子どもの作りかたがわかりません。誰か教えてください! 今日、元モーニング娘。辻希美さん妊娠のニュースが報道されました。辻希美さんファンのわたしとしては、彼女に少.. - 人力検索はてな|http://q.hatena.ne.jp/1178591080#c88295]]
<<<

ネタとしてはあんまり好きじゃないのだけれど、この投稿には吹いてしまった・・・ノデ。

!歩きタバコの人
さいきんは朝早めに起きて、少し Web を見て回ったあとに朝食を作っている。
と云っても、昨夜の残りものを温めたり、お味噌汁を作ったり、卵焼きを作ったり程度だけれど。
そうしているうちにヨメサンとナオが起きてくるので、7時くらいから皆なで朝食に。

話し相手がいるので TV を点けることもなく、ナオがいるので騒がしいというイイ感じの朝がこのところ続いている。

今朝はヨメサンが図書館に行くというので、僕の出勤と一緒に家を出た。
ベビーカーを押しながら歩いていると、たくさんの人たちが僕らの横を通り過ぎて行く。

「あんな人もいるから気をつけてね」と云うと。
なになに? とヨメサンが訊き返してきた。
僕は「あんな感じで」と視線を送って、
「ナオの横を''タバコをブラブラさせながら通って行く人もいるから気をつけてね''」と云う。

するとその声が聞こえたようで、後ろ姿のそのヒトはタバコを自分の体の前へ持っていった。一瞬ブラブラは止めたようだ。
フウム、小さい声で云ったつもりだったのだが、まぁいいさ。
最低限のマナーは守ろうよ。
これはイイ。

<<<
サンコーの「USB AM/FM RADIO」は、その名の通りUSBでつないでAMラジオとFMラジオをPCで録音できる製品。音声はWMAとWAVに保存できるので、WMA対応のポータブルプレーヤーへ転送して通勤時に聴くことも。

Source: [[サンコー「USB AM/FM RADIO」:PCでAM/FMラジオを録音 : Gizmodo Japan(ギズモード・ジャパン)|http://www.gizmodo.jp/2007/05/usb_amfm_radiopcamfm.html]]
<<<

今のところはラジオが入らない。近くに電車の高架線が通っているからと思うのですが。
引っ越したらおそらくは、ビンビンに感度良く入ってくれるはず、と期待しているのですが。

これあったら、ラジオのためだけに置いてあるでっかいCDラジカセ(CD は機能せず) とオサラバできるだろうに。

(情報リソースの元は、 [[ヒビノアワさん|http://cheebow.info/chemt/]])

!浅漬け鉢
さいきんの一歳児ですが、
(ああ、忙しい忙しい) という呈で冷蔵庫冷凍庫を開けゴソゴソ。ゴミ箱をひっくり返しては中身をあさり、めぼしいものがあれば口につっこもうとし。ちょっと用があって開けた収納の中に突進。洗濯機にゴミ箱のティッシュを投げ込み。
ととっても活動的。

財布が好きですぐ手に取って物色、(ほれ、取っとけ!) と札を全部渡してくれます。
まぁ太っ腹。

さて、浅漬けの鉢を買いましたのでいろいろと漬けてみようとしてます。
大根とキュウリ、ニンジンはもうやってみました。素材によって味付けが変わるので組み合わせは大事のようで。あと切る大きさも。

塩をまず入れて、もう一味に顆粒の出汁や塩コンブ、生姜なんか良いみたい。
品数が一つ増えて、野菜もとれるのでおススメ。カンタンですし。

探してみたらあった、
<<<
[[びいどろマルチ鉢 - (資)東福通商  英文名:Toufuku Trade Company|http://www.zakka.net/tftrade/shouhin.php?shid=21735]]
<<<
^^(写真はヒドいですが)^^
!ジブンだけではあるまい
エロ本みたいな表紙の少年漫画雑誌を平気で電車の中で広げられるお国柄って、世界でも日本くらいじゃないの、と思うのです。

!夜歩く
この頃、通勤に歩くようになりました。

これまでは新宿から折り返すような道筋で往復していたのですが、時間が同じなら歩こうと思い。もよりの駅を探すと意外と近い。
でもどうせならもう少し長めに歩こうと思い。小田急線駅から20~25分くらいの駅まで歩くようになりました。

けっこう裏道っぽいところを行くのですが。雰囲気の良いところがあって、けっこう坂だったりして。夜はちょっと恐いカンジですけど。
あと駅近くに大きな本屋があった。いろんな発見がありそう。
!Twitter
時は来た、と思い。ついに Twitter に登録 (おせーよ)

子供の頃からのアマノジャクの性癖が、これまで見て見ぬフリをさせてきたのでした。
しかし、時代に乗り遅れてはいかんと (おくれてるよ)

それにしても ''__500 Error__'' がバシバシ出ているのですけど、ここのサーバ大丈夫なの? いかんでしょ 500 は、セメテ見せないようにしないと・・・

ううむ、これから情報を集めます。ゼンゼン面白さが分かっとらん。
いちお、こちら、

>http://twitter.com/kuraku
!ビジョのハシゴ
土曜日に某説明会に家族で出掛けたのですが。

午後にその場所へ出向いて、説明してくれる方と一緒のテーブルへついたのですが、いつものことながらナオが元気で。
遊びたい遊びたいと、(てってって) 歩いてどこぞへ行ってしまいます。
ヨメサン、仕方なく彼にお付き合い。話はほとんど僕だけで聞くことに。お金とかのことなのでヨメサンの方が得意なのだが。

それで、テーブルに全然帰ってこなくて、あっちへ行ったりこっちへ行ったり、そして何をしているのかというと。

__''(オネーサン、抱いて抱いて) 攻撃''__

目につく女性にかたっぱしから行ってるよう。
最後の方では僕に説明をしてくれているお姉さんにも、''「ねぇオネーサン、僕を抱かない?」'' てなもんで、抱かれてました。

いつの間にか大人気物になってた。

で。どうも見てると若い女の人ばかりで、男性には見向きもせず、託児所のオバちゃんに抱かれても (いやじゃー) と泣くという…

なんか先がシンパイになってきた。
!家ごはん
「3人で朝食」が続いてます。このまま定着するといいなぁ。

午前1時に寝ようが、朝6時に起きられる体になったようです、ジブン。
ただ、さいきんナオが早起きになってしまって、食事を作ってると攻撃してくるのです。ヨメサンはというと「まだねむーい」とソファでゴロゴロしてて戦力にならず。(ナオが夜中起きるので、それに付きあっているから眠いのは当然)
それで、料理をしつつ対決しとりますわ。

''『料理の下手な女性』''というエントリをいくつか見ていて、以下のような文章がありました。

<<<
別に男が偉いわけでもない。男のほうが料理が上手なら自分で作れば、は、正論だ。それにうまいものが食べたいなら、金を出してグルメになればいい…なのか? というと、そこが実は大きな間違いで、外食の味は日常の料理の味ではない。料理屋でよく、おふくろの味とかいうのもあるが、そう言われてきたもので、私がそうだと納得できなのは数少ない。おふくろの味というのはたぶん嘘だ。

Source: [[極東ブログ: 料理の下手な女|http://finalvent.cocolog-nifty.com/fareastblog/2004/08/post_18.html]]
<<<

>外食の味は日常の料理の味ではない
どんなに美味しいものも、「おふくろの味」っぽいものでも、家庭の味ではないのはなぜだろう。
居酒屋ですごく美味しいこれぞ「おふくろの味」というものを食べたときより、行きつけだったバーで店長が作ってくれたオムレツの方が家庭の味に近いと感じたのはどうしてか。

「__''作った人とコミュニケーションしながら食べる料理''__」が、家庭の味なんだろうなと思う。
そしてそれはたぶんすごく美味しいものになるはず。

彼女が作ったマズい料理もウマイと思えるでしょ。
さいわい僕は「彼女作ったのマズい料理」は食べたことないから分からないけど。(ふるってたのかなぁ料理できる人をと‥)

ヨメサン、料理うまいです。僕よりよっぽど。なんというか身についてる感じ、サスガです。
ナオも料理好きになってくれるかなぁ。僕が日常的に作っていれば、男性も料理をするものと考えて育っていってくれると思うのだけれど。

だから、''「作った人とコミュニケーションしながら食べる料理」''にこれからもこだわって行きたいね。

!言語バーをなんとかしたいというニーズ
<<<
今回ご紹介する『諦めている不便利』はこちら。言語バーマニアックスさん、ご投稿ありがとうございました!

    タスクバーから言語バーを永久に消したい。

Source: [[WindowsXPのデスクトップ、タスクバーから言語バーを消す方法 : P O P * P O P|http://www.popxpop.com/archives/2007/05/windowsxp.html]]
<<<

確かにアレはジャマだ。
急に短くなって、チラっと見えるだけになったりするし。

でも家の PC では二通りの IME が必要だ。ヨメサンに「SKK で入力セヨ!」とは云えない。

「かな」になっているかどうか__だけ__を確認するために見ることはする。見えないときもあるけど(チラっとしか見えないとき)

なので、
*IME の種類
*入力の種類(かな/半角)
だけを表示するツールが欲しい‥ あるのかな? 
余計なボタンを消したいということなんだけれど。
!アニメ版『時をかける少女』
「時かけ」といえば、原田知世の映画と、内田有紀のドラマを観たことがある。
映画はもうずいぶん前のことなので忘れていることが多いイメージだけな感じ。ドラマは部分的にしか観ていないので、なんとも云えないが袴田くんの一夫(おそらく) がピッタリ当った役柄だと思った覚えがあるくらい。
あと原作はさらりと読んだだけで、細部はまったくといっていいくらい忘れてしまった。

それでそれで今回のアニメ版だけれど、何の予備知識もなく観たところ。面白かった。
ネタバレになるから多くは話せないが、中途半端な記憶のせいか、良い意味で騙された。

フットワークの良いヨメサンが図書館から借りてきてくれたので、再読。それから今回の作のサイトを見たところいろいろと分かってきた。

なるほど、原作を現代風にアレンジしたのではなくって、あれからきちんと時間は経っていて、「おばさん」は、『和子さん』だったのね。
ふむしかもあの3人で写っている写真が出ているとのこと。まったく分かっていなかった。
もう一回じっくり観たいところだ。

ロマンチックな味付けがちょっと強いかな、と感じた部分もあったが (さいごの記憶のところとか) 
__つっこみドコロはいろいろあるけど、でも好き__リストに追加かな。
!先週の時効警察
[[高泉敦子|http://ja.wikipedia.org/wiki/%E9%AB%98%E6%B3%89%E6%B7%B3%E5%AD%90]]さんと、岸博之さんが出てた。
高泉さんは警官役。声を聞いた瞬間「アレ?」てなりよく見たら‥
岸さんは猟師役。

高泉さんは「[[ア・ラ・カルト|http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BB%E3%83%A9%E3%83%BB%E3%82%AB%E3%83%AB%E3%83%88_%E5%BD%B9%E8%80%85%E3%81%A8%E9%9F%B3%E6%A5%BD%E5%AE%B6%E3%81%AE%E3%81%84%E3%82%8B%E3%83%AC%E3%82%B9%E3%83%88%E3%83%A9%E3%83%B3]]」の出演者。ここ数年毎年行ってるので。

岸さんは「元カクスコ」。~~(Wikipedia に情報が無いトハ)~~

いや、ちょっと嬉しかったので、書いとく。
!機能あちこち
このサイトもちょこちょことあちこち修正をしているのだけど。

やっと欲しかった、前日の日記ボタンを付けることができたので書いておく。

最新の日記だけは「A-Z」へのリンクが出てしまってますが、ただのインデックスです。
まぁ見えなくしても良いのだけれど。

とりあえずは過去のものへどんどん遡れるようになりました。
mixi や、Feed から来た場合には使えると思います。
!Palm Foleo
<<<
開催中のDカンファレンスにて、Palmの「新しいモバイルデバイス」が正式に発表されました。Palm Foleo (フォリオ)は10インチワイド画面とフルキーボードを備え、Bluetoothでスマートフォンと同期するという「モバイルコンパニオン」製品。

Source: [[Palm Foleo モバイルコンパニオン 発表 - Engadget Japanese|http://japanese.engadget.com/2007/05/30/palm-foleo-announced/]]
<<<

フルキーボードですか。
たしかに魅力的な機能もたくさん持っていそうですが、
これまでの Palm を夢中になって使っていた人たちが欲しいと思うのカナ?
<<<
<html><div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4101006032/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://images-jp.amazon.com/images/G/09/icons/books/comingsoon_books.gif" alt="ヴィヨンの妻" style="border: none;" alt="no image" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4101006032/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">ヴィヨンの妻</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4101006032/kurakunet-22" title="ヴィヨンの妻" target="_blank">amazlet</a> on 07.06.04</div></div><div class="amazlet-detail">太宰 治 <br />新潮社 (1950/12)<br />売り上げランキング: 209385<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4101006032/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div></html>
<<<

いまだから読める太宰治。

てな感じで、この年になって読むといろいろ考えるところがありますな。
こちらの作はまた、「死への疾走感」があって。ちょっと落ち込む向きもあり。

しかしながら、この作家はそういう思いを読者に抱かせるために、(あたかも自分を投影したキャラクタの姿) を好んで書いたという説もあるようだ。
けっきょく、そのまま逝ってしまったようだけど。

なんというか、ダメ人間っぷりに共感してしまうんだよね。
中毒性があるねこの人のものは。
!カールみたい
朝、品数が少なかったのでもう一品と、ジャガイモと玉ねぎを細切りにしたものをフライパンで固めに炒めて、塩コショウにカレー粉を加えたものを作った。

食べてヨメサンの一声、

''「カールみたいでおいしいね」''

僕が「へ?」という顔をしていると、「いや、いい意味でね、おいしいよ」

するとなにかい。
キミのカレー味の美味しいものの基準はカールですかい。
なんでカールなんだよ。カレー味のカールって、そんなにメジャーか?
小学生がキミは、他に表現方法は無いの?

と散々セメた。
「そこまで云わなくても」と云われた。

!ping のさけび
''「ピング」''ではアリマセン。

__''「ピン」''__ と呼んでクダサイ。

お願いです。「ング」は要らないのデス。
!Mii Editor
ヨメサンが作った僕の Mii はけっこう似ていると評判だったりします。ミウチに。
~~(※Mii とは Wii で作る似顔絵。自分の顔でプレイできたりします)~~

Web上のエディタがあるみたい。あとでイジってみる。

>[[Mii Editor: Create and Edit Mii Characters for your Nintendo Wii™|http://www.miieditor.com/]]
!時効警察 最終回
なんというか、いつもな感じで終ってほっとしましたわ。
ヤベェ、進展しちゃうよフタリの仲が、とハラハラ。

''いつでも第三弾行けそうだね。''

金曜の夜のお供が一つ減って淋しいけど。
!TW 2.2.1
待望の 2.2 がリリースされました。
ので、upgrade。

合わせてあちこちに手を入れました。
!言いまつがい
さいきん言葉が出て来ないときがけっこうある。

先週末のこと、土曜の夜だったかな。
ヨメサンお奨めのレシピで ''『茄子の揚げびたし』'' を作ったのでした。
揚げものついでに天ぷらもした。

茄子は、さすが (お奨め) なだけあって美味しくできあがった。味もしっかりしみている。
二人で 「ヒョイパク」 状態。

それで僕が、

「おいしいね、この・・・」 (アレなんだっけ、としばし思考)

''「・・・なすびたし」''

笑われた。トシ?
引っこしなので毎週末は片付けばかりなのですが。
先週末は、DVD と CD を捨て、整理、詰め込み、してました。

懐しの CD がたくさん、つい聞いてみると、いろいろと思い出したり。
でもいっぱい捨てました、過去の物を引きずってると新しいものが入ってこないしね。

ヨメサンと一緒に (おおっ) となったのが''『オザケン』''。
古いカンジがイイカンジ。

まだまだ片付けは続きます。
<<<
「持たない暮らし」の中にあった「2週間に1つ、身につけたい習慣」というリストがあったので、自分なりの○×をつけてみました。

リストは、こちら。

{{{
「持たない暮らし」に直接関係なさそうな項目もありますが、
 実践すると、次第に家の中からモノが減っていきます。 イライラしなくなり
心と体が健康になるので、 つまらない買い物をしなくなるのです。
 すでにできている項目は飛ばし、やりやすいことから順次、 実践していきましょう。
}}}

Source: [[2週間に1つ、身につけたい習慣リスト : その他(ライフ) : とりあえず、やってみる! : あすなろBLOG|http://blog.pasonatech.co.jp/masuda/399/3957.html]]
<<<

diigo でハイライトしたもの、
*「安くて大量なもの」よりも「高くても気に入ったほう」を選び、大切に使う
*持っているうちでいちばん好きな食器で食事するようにする
*4階までは階段を使う
*1日1回は必ず空を見る
*子供のおもちゃは、お風呂の前に片付けさせる(片付ける)
*寝る前に、翌日の外出の準備をしておく
実践していこう。
!みんなで (ああぁ) てなった
朝の電車内にて、

どうしてこんなラッシュ時に乗り込む必要があったのか、赤ちゃんを背負った女性が吊革につかまっていた。
赤ちゃんは楽しそうに周りにいる大人たちを順番に見回しては、無邪気な笑顔を振りまいているのだが、お母さんはすごくツラそう。
座席の人変わってあげれば良いのにと見れば目の前に座っている人も子供を膝に乗せていた。

周りの人たちの方が気を使ってしまうという感じで、人々その親子に注目している雰囲気。僕もその一人、というか (赤ちゃんカワイイ) と目が合うとテレパシーを発信してた。
駅が進みちょっと空いてきて、やっとその親子が座れたときには (ホッ) とした空気があたりに流れた。やれやれ

座ることができたのでオンブからダッコに切り替えようと、お母さんが彼か彼女を (まだ6ヶ月前ってところで判別フノウ。可愛い目をしているが手がすごく大きい) 方向転換させつつ膝の上に乗せようとしたとき、

電車内って座席の端っこに (鉄のバー) が縦にあるじゃない、それに

''(ゴンッ)''

小さな頭をぶつけた。
周りみんなで ''(ああぁ)'' てなった。僕はつい声が出てしまったようだ。
赤ちゃんは少し泣いたけど、すぐにおさまった。ヨカッタねぇやっと落ち着けて。

あんな (バー) は取ってしまえ、と思った朝。
!まるで草原のよう
朝食を作っていたら、背後からヨメサンの悲鳴が聞こえた。

何事かとリビングへ行くと、ヨメサンがフリーズ。
僕も目の前のものを見て固まった。

レタスとキュウリのサラダを先に作って、テーブルへ置いておいたのだが。
近くにヨメサンがいるだろうと思っていたこともあり、彼のことをまったく気にしていなかった。

さいきんナオは、
まず椅子を引き出してその上に這い上がり、さらに高みを目指しテーブルの上にまで登るというスキルを身につけていた。

目の前の惨状はというと。
ナオはレタスとキュウリをおもいっきりやりたい放題した状態。皿にはほとんど残っていない。そしてけっこうその量が多かったので、

まるで彼は草原にいるよう‥

僕も無意識に「やっちゃったな」みたいなことを口にしていたらしい。
「怒られた」と思ったナオは泣き出した。「大丈夫、大丈夫」と彼をなだめつつ、テーブルの上に残っていたものを拾い集めて洗い、また水切り器にかけて再度盛りつけた。
そしてなんとか食事に。

大丈夫。今度、本当に草原に連れていってあげるからね。

#
そういえば「まるで雪の中にいるよう」ってこともあったな。
!Standalone Complex
いつの間にか家のネットワーク環境が切れてました。

ヨメサンに云わせりゃ「云っておいたでしょ」てなもんですが。
いよいよ、来週引越しその1 です。
!進捗報告
どうやらさいきん分かってきました。
ナオは一生懸命に僕らのことを呼んでくれていたみたい。

(なんだかよく分からないことを叫んでいるなぁ) て思っていたのが。
実のところ「おかーさん」「おとーさん」と云っていたらしい。

「おかーさん」はけっこう明確に発音できるときがあって、彼を恨んだのだけど(オイ)

きちんと返事を返すようにしたら、またさらによく呼んでくれるようになった。
しかし、なんというか、本当に自分のことを云ってくれているのかはいまだにあやしい。ハハを呼んでるだけという気もして。

ちなみに「はーい」「はい」「おいしい」「うまい」「まんま」「でんき (なんでや)」
はマスターしております。

はやく「おとーさん」とハッキリ呼んで欲しいの。
!引越しその1
昨日は、引越しその1 でした。
ヨメサンの実家に荷物をすべて移すことに。

ヨメサン方のご家族総動員してもらって作業。お義父さん、お義母さん、お義姉夫妻と。
みなさんフル稼働で動いてもらって。僕らの片付けがきちんと終っていなかった部分もフォローしてもらい(汗) かなりスピーディーに仕事は進み。

それでも10時すぎから始めて終ったのが、2時半。

11時半から近くのカレー屋さんに皆なで行こうと予約していたのだが、それを二回延してもらった。というか、今思えばどうして積み込みが一時間で終ると思ったのか・・

お昼を済ませて、お義姉さん夫婦と別れ(東京在住なので)、一路ヨメサンの実家へ。
そして荷物をすべて降ろす。これはあっという間に終り。レンタカーの返却へ。

帰ってきてから夕食をいただいたのが 21時。
少しお話をしていたけど、すぐに瞼が落ちてきた。
昨日の夜も遅く、朝も早かったし、そんな状態のままここ数年無かったくらい動いたのだから、布団に入ったらすぐに記憶が遠のきました。(ヨメサンにマッサージしてもらっている最中に)

!単身赴任
昼前にヨメサンの実家を後にする。
彼女とナオは8月の頭まで実家なのです。僕は一人ウィークリーマンション生活。

バス停留所に着くとちょうど出発しようとしていた高速バスになんとか乗りこむ。
ホッとしたと同時に、ちょっと淋しくなってしまった。

これからしばらく独身(的)生活です。
!ネット離れ
単身赴任状態が続いておるのですが。

インターネット環境はあるのだけれど。持って来たノート PC が古くて (win98) Javascript のページがまともに見られないみたい。
というわけで、更新がなかなかできないのです。不便だなぁ。

週末はまたヨメサンの実家へ。ナオに会ってこれました。
外で遊ぶことが多いからか虫刺されがたくさん‥

昨日は一日一人で、池袋をぶらぶら。ネタとくになし、て感じで。
!『しゃべれどもしゃべれども』
<html>
<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/410123731X/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ec1.images-amazon.com/images/I/21XE0WFT2ZL.jpg" alt="しゃべれどもしゃべれども" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/410123731X/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">しゃべれどもしゃべれども</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/410123731X/kurakunet-22" title="しゃべれどもしゃべれども" target="_blank">amazlet</a> on 07.07.18</div></div><div class="amazlet-detail">佐藤 多佳子 <br />新潮社 (2000/05)<br />売り上げランキング: 733<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/410123731X/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div>
</html>

もっと落語のことを掘り下げてある物語かな、と勝手に期待していたこともあり、期待とはちょっと違うものであった。

でも面白かった。
太一くんのイメージとはちょっと重ならない感じだけれど、映画も見たいと思った。

!~ISO200
久しぶりに新宿ヨドバシのフィルム売り場に行った。

安くていつもまとめ買いしていた、~CENTURIA200 が無い。
で、よくよく見ると ~ISO200 のフィルムが見当らず。なんてこったい。

ちょっと写真から離れてたらこんなことになっていたトハ。フィルムは 200 ばっかり使ってたから困ったなぁ。400 に慣れていくしかないのか。

そして、
<<<
[[フィルム|コニカミノルタ フォトアクセス|http://photo.konicaminolta.jp/consumer/film/index.html]]
<<<

うおっ、終了したのか‥
Agfa の時のショック再び。
これから、フィルム撮影は贅沢な趣味になっていくのか?
!~PEN-D
あんまりに淋しいので、カメラを買いました。(ツっこみ不要)

''OLYMPUS ~PEN-D:''
[img[http://farm2.static.flickr.com/1394/868251852_79bd9083b8_t.jpg][http://www.flickr.com/photos/kuraku/868251852/]]

ハーフサイズに手を出してしまいました。
AGAT を狙っていたりしたのだけれど、勢いでこちらに。オークションで 10kほどで。
レンズキャップは購入しました 41mm のものを。

お店で現像をお願いするときにけっこう説明が必要でした。
本当は一枚ずつ CD に焼いて欲しかったのだけれど、それはムリと。普通の 35mm のサイズで2枚入る形にはできるとのことでそうしてもらうことに。

まだうまく撮れてるか分からないけど、今日その結果が出ます。
でも環境が無いので見られませぬ。プリントはしていないので。

!いま一番怖い CM
牛乳買いに行くやつ。
!試し撮り
~PEN-D の写真が出来てきました。
二枚ずつを一枚に焼いてもらったので、露出がどちらかに引っぱられるのは仕方が無い。分離して調整するしかないでしょう。

とはいえ思った以上にうまく撮れてました。
露出計もばっちり動いてる。これで、アンチョコを持ち歩く必要がなくなりましたね。(EV値表)

[img[http://farm2.static.flickr.com/1253/883612109_1b31f2b61b_m.jpg][http://www.flickr.com/photos/kuraku/883612109/]]

問題はピントが合ってないのと、ファインダーから見える範囲と写る範囲の誤差。
こればかりは馴れるしかないのでしょう。

あとは現像を良いところを見つけることかな。
あちこち行ってみてますが。昨日はカメラのキタムラでハーフでも一枚一枚 CD に焼いてくれて、さらに普通の料金くらい (500円ちょい) なので嬉々としてお願いしたら、一週間かかると云われてしまった。
ふうむ。
!やれやれ
もぅ何がなんやら覚えていないことが多いのですけど。なんとか現状復帰しました。

昨日やっと、新居の PC よりネットワーク接続できまして。~~(それまでも使えてたんだけど、旧い PC でまったく思うようにならず)~~

まぁ、おいおい色々報告していきます。
!さて
やっといつも通りの生活が戻ってきたと思いきや、
お盆なのでヨメサンとナオは実家へ遊びに、そうそう何日も休むわけにはいかないワタシはお留守番。ルルル‥

あんまり楽しいことが無かったウィークリーマンション生活ですが、良い写真はいくつか撮れました。

[img[http://farm2.static.flickr.com/1196/1104360979_8e8bf836c6_m.jpg][http://www.flickr.com/photos/kuraku/1104360979/]]
!拾う神
Konicaminolta の CENTURIA SUPER が無くなった、と嘆いておりましたが。
''DNP CENTURIA'' をさっそく使用しております。

晴天の日、PEN-D に 100 を入れたら、次の日曇天で。あーあ、と思いながらも買ったばかり の PEN-D だったのでその日のうちに撮り終ってしまった。

でもキレイに写ってましたわ、PEN-D の性能か フィルムの性能か。

しばらくはこのフィルムばかりになりそう、まとめ買いできそうですし。
!ひきこもり
>[[GT-X750|http://www.epson.jp/products/colorio/scanner/gtx750/firmscan.htm]]

こんなん買いまして。
いろいろ、いじくり回しております。
夜中、独り部屋にひきこもって白い手袋をしてゴソゴソしているところをヨメサンに目撃され。ヒメイが上がります (フィルムを扱うので一応着けてる、いつまで保つか)

[img[http://farm2.static.flickr.com/1314/1203264164_ac1ff06d10_m.jpg][http://www.flickr.com/photos/kuraku/1203264164/]]

実際、フィルムスキャンばかりしてますので、他の機能は知りませぬが。

思っていたよりきれいかな。この値段なら十分使えます。なんと云っても現像代、フィルム代だけで良いですから。
フィルムカメラが贅沢なシュミになりつつある今こそ欲しかったもの。

子供が大きくなるまではと、''なんと今は書斎があるのです''ウチ。
夜二人が寝た後、そこにひきこもっては、いろいろイジりまわしておるのです。

!さいきんの一歳児
今朝も大泣き。
(チチよー、ドコ行くー、連れてけー)

ずいぶん我が強くなってきてまして、要る要らないはハッキリと。
朝食時、いらなくなったニンジンをテーブル下へ投げ落とすのをたしなめるも訊かズ (そりゃそう)

そして、とうとうバルコニーからチチのパンツ(トランクス) を投げやがりました。(13F です、ウチ)

暴れん坊将軍め。

[img[http://farm2.static.flickr.com/1171/1257967445_a3e6520939_m.jpg][http://www.flickr.com/photos/kuraku/1257967445/]]
<<<
<nowiki>そしたら息子(1歳なりたて)がヨチヨチ歩きながら絵本を持ってきた。
「んっ」(読んでくれ!!)と言って差し出す、だがしかし俺も急いでるw </nowiki>

Source: [[育児板拾い読み@2ch んっ|http://ikuzi2.blog73.fc2.com/blog-entry-1830.html]]
<<<

「んっ」 て、本差し出します、ウチも。
すごく共感してしまったので、なんとなく。
[img[http://farm2.static.flickr.com/1217/1321656082_1e3f6cd452_m.jpg][http://www.flickr.com/photos/kuraku/1321656082/]]

あわただしい日々ながら。
夜中独り、PC に向いながら、時々寝室の二人の寝顔を覗きに行くことでストレス発散。

ああ、BAR に行きたいな。
[img[http://farm2.static.flickr.com/1227/1354914201_8e64c795d4_m.jpg][http://www.flickr.com/photos/kuraku/1354914201/]]

数日前、ケーサツから電話がありまして・・
うん、
眠いのでまた今度。
!忘れられた写真
そうそう警察から電話があったのです、池袋警察。
「警察から電話」、ってこれまでも何度かありますけど、動悸が早くなりますな、悪いことした覚えはないのに。

池袋の頃、現像されたネガと ~CD-ROM をどこぞに忘れたのでした。
悔しいので記憶から消去してました。それが落とし物として届いたとのこと。
平日しか受けとれないとのことで、朝早く出て池袋まで経由してもらってきました。
しかし、どこにあったのかは教えてくないのね。訊けば教えてくれたのかな。
それが昨日のシャシンですわ。

その ~CD-ROM にどうしてもアクセスできず。フィルムスキャンしてカットしました (half なので半分に切るのです)
CD を読めないことがこれまでも何度かあったのです。half を CD まで焼いてくれるところは特殊らしく。いかにも PC で焼きました、というノーブランドの CD をくれる。ドライブに読み込ませると変な音がして、まったく中身が見えず。
ふうむ、ウチの PC がおかしいのかも。CD、DVD ドライブが。

フィルムスキャンは楽しいのだけど、時間がかかり過ぎ。
平日だと 2日がかりくらい時間をかけて、flickr に上げている。そもそもスキャンに時間がかかるというのもあるのだけれど。さらに、half なのでカット作業があって、GIMP でやってますが。
その上、たいがい色かぶりしてますので色調整。またコントラスト調整も必要。

夜中こんなことばかりやってます。
だが、写真のウデは一向に上がらズ。
!『バベル案内』
[[バベル案内|http://www.aoky.net/articles/steve_yegge/tour_de_babel.htm]] という記事を仕事中に見つけ読み耽る。
今年の始めくらいに Steve Yagge という人のものを青木靖さんという方が訳したもの。僕のアンテナには引っかからなかったらしい。

実際には上記のリンクにはアクセスできず、Google のキャッシュで見たのでした。
>[[バベル案内 - Google 検索|http://72.14.253.104/search?q=cache:xCW8lZCXo3oJ:www.aoky.net/articles/steve_yegge/tour_de_babel.htm+%E3%81%84%E3%81%BE%E3%81%A0+emacs+%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E4%BA%BA&hl=ja&ct=clnk&cd=1&gl=jp&lr=lang_ja&client=firefox-a]]

僕の検索条件については気にしないで。(しごと中にふと思い)

理解できないところも多いが、なかなかの名文。
元サイトが残っていると良いけど。

>Perlでオブジェクトが使えないのは、ラリーが決して本当にオブジェクトを信じたことがないためだ。
これには衝撃を受けた。
自分もいまだオブジェクトを信じられていない気がするからだ。
!首をやられました
三連休は結婚記念日にかかっていたりして、いろいろと。

わざわざお義母さんに子守りに来てもらって、ヨメサンと二人食事にでかけたのが日曜の夜。
いい気持ちで帰ってきて、ドアを開けたら元気にナオが走ってきた。(22時半くらいか)
あらら、一度寝たけどまた起きてしまったらしい。
で、そこから寝ない寝ない。けっきょく、水を飲んだら収まったようでなんとか就寝。でも数時間経ってたなぁ。
お義母さんに申し訳なかった。

[img[http://farm2.static.flickr.com/1171/1453262229_bda503b764_m.jpg][http://www.flickr.com/photos/kuraku/1453262229/]]

そして月曜日は昼頃からすぐ近くの某所に観光へ。
そこの中の移動がたいへんで、坂道ばかり。最終的には長くて急な階段をナオを抱いて登るという苦行に遭い。
楽しかったけどへとへとに。
お義母さんも楽しんでくれたようで良かった。ナオともたくさん遊べたし、機嫌良く帰ってくれたと思う。
夕方になると、疲れたのであろうヨメサンとナオはダウン。

僕は夕食を作って、6時半くらいに二人を起こす。
楽しかった三連休、食事を終えて、まったりし。なんとか明日から仕事に復帰できるでしょう、という感じで床に就くが‥

ナオが寝ないぃ・・

そして今日。彼を長いこと抱いていたせいか首が猛烈に痛いっス。

!ヨメブログ
[[再開|http://kuraku.net/baby]]しているみたいです。
また、キマグレでしょうけど。
!笑えない
昨日は、__「首をちょっとイタめちゃった、エヘ、」__
的なエントリをしましたが。

今朝、起きたら動けません。
「お、おヨメサン~、タスケテ~」
てなりましたわ。首に激痛で起き上がれず。

うーん油断したわ。
!『のはなし』
<html><div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4796660941/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ec1.images-amazon.com/images/I/212AfyTiRtL.jpg" alt="のはなし" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4796660941/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">のはなし</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4796660941/kurakunet-22" title="のはなし" target="_blank">amazlet</a> on 07.09.28</div></div><div class="amazlet-detail">伊集院 光 <br />宝島社 (2007/09/28)<br />売り上げランキング: 8<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4796660941/kurakunet-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div></html>

まだ買えてない。
!最悪の事態が想定される
先週のこと。

朝の通勤電車の中で携帯が震えるのが分かった。見ればヨメサンからである。
電車の中のなので出ることができず。そのまま切れるまで手に持っていた。

ヨメサンが朝携帯に電話することなんて、まず無い。
忘れものとかしたときも、こちらが電車に乗っているのは分かっているのだから、メールを送ってくるはず。実際そういうことはよくある。
それでも電話をかけてくるということはよっぽどのことがあったに違いない。
きっとパニック状態だ。
ということは・・・ 

すぐに頭に浮かんだのは、ナオがケガをしたのでは、ということ。
あのヨメサンがパニックになるほどのケガだとすると、とんでもないことである。
大丈夫だろうか、無事だろうか、すぐに戻るべきだろうか、今日は仕事に行けないのだろうか、などとぐるぐるぐる・・・

携帯を持った手にじっとりと汗が出てきた。電車内でもすぐに出なかったことを後悔した。
次の駅で電車を降りて、コールバックすると、

「かけてないよ」と返ってきた。
え? そんな莫迦な。

「もしかしてナオが携帯持ってなかった?」
そういえばと訊いてみると、うんイジってたみたい、という返事。
そうなんだよ、前もあったことなんだからすぐに気がつかなければいけなかった。無言電話はナオである 100%。それに思いいたらなかったジブンが悪い。

とりあえずホッとして携帯を切る。電車行っちゃたよ、とっくに。
そして、次に来た電車に乗り込み携帯をしまおうとすると、留守電マークが点いてる。よもや、と聴いてみると、

「ダー あー ・・あーっ 」

ナオの能天気な声がしばらく続いた。
あああ
!原点回帰
TW による blog の運用をけっこう本気で模索していたのですが、どうやら難しいという結論です。
検索エンジンに引っかからないというのはけっこう致命的かと。

そういうわけでこちらの「[[よしなしこと、|clip.html]]」の TW は用意が整い次第止めようかと思っております。(「[[備忘録|http://tw.kuraku.net/]]」の方はもちろんそのまま続けます)
まぁ見ている人もいないに等しいみたいだし。

とはいえ現行の MT では更新がままならず。
というのもエントリが多いのか、管理画面がしょっちゅう (真っ白) になる。
大量のスパムをくらってましたし。
MT4 にしたら好転するのかしらん。ちょっと調べてみます。ダメなら WP かな。sb か。

とか考えながら、lolipop の自分のページを見てみたら、かなり ''容量オーバーしてるっ'' なんてこった。
放ったらかしスギ。
!閉めますね
[[というわけで|2007.10.02 原点回帰]]、こちらの更新はひとまずストップします。
実験終了という感じで、とはいえエントリを移していないので、この間の僕の日記はこちらを見るしかないのです。

続きはこちらへ、
>[[KU-RA-KU|http://kuraku.net/krk/]]
ありがとうございました。
<<tabs FontPageCLip
FrontPage "front page" @FrontPage/frontpage
RecentTiddlers "recent tiddler" @FrontPage/recenttiddlers
Comment "show comment" @FrontPage/haloscan
"SendTrackBack" "send trackback" "Send Trackback on HaloScan"
Flickr "from Flickr" "Flickr image tag To TW image format"
"AboutMe" "ジブン" @FrontPage/aboutme
>>
<part frontpage hidden>
入口はこちら http://tw.kuraku.net/clip.html

[[Firefox|http://www.mozilla-japan.org/products/firefox/central.html]] 推奨です。他のブラウザでは確認しておりません。~~(とりあえず、IE ではきちんと表示されない部分があります。IE の方は左⇒の~SideBarから日記(日付のもの)などクリックしてください)~~
[img[FireFox2|http://sfx-images.mozilla.org/affiliates/Buttons/firefox2/firefox-spread-btn-1.png][http://www.mozilla-japan.org/products/firefox/]]
コメント・トラックバック可能です。by [[HaloScan|http://www.haloscan.com/]]
(※IE からはできません。Comment/Trackback ボタンが見えない場合は、refresh を押してください)

*[[Whats new]]
*''Recent Diary:'' <<tiddlerList search:"^200\d.\d\d.\d\d" tiddlerList top:"5" itemTemplate:"%link+++^\n%text\n===" separator:" / " order:"-created">>
*[[RSS feed|clip.xml]] (RSS に出力するもの <<tag toRSS>>)
</part>
<part recenttiddlers hidden>
''Recent 30 tiddlers:''
<<tiddlerList top:"30" separator:" / " format:"span" order:"-modified" title:"[^UploadLog]">>
</part>
<part reminder30 hidden>
''Reminder:''
<<showReminders leadtime:30 tag:"!holidays">>

<<newReminder>>
</part>
<part haloscan hidden>
!!このサイトへのコメント一覧
<<rssReader asText proxy.cgi?url=http://www.haloscan.com/members/rss.php?user=krkclip>>

<html><a href="http://www.haloscan.com/"><img width="88" height="31" src="http://www.haloscan.com/halolink.gif" border="0" alt="Weblog Commenting and Trackback by HaloScan.com" target=_blank></a></html>
</part>
<part aboutme hidden>
kuraku@kuraku.net
kuraku.net@gmail.com
</part>
<<displaydiary 5>>
Index of all tiddlers
<<tiddlerList group:"tiddler.title.substr(0,1)" groupTemplate:"[ ''%group'' ]\n">>
/***
|''Name:''|ArchivedTimeline|
|''Version:''|0.3.1 (Feb 04, 2006)|
|''Source:''|https://sourceforge.net/projects/ptw/|
|''Author:''|BramChen|
|''Type:''|Macro|
!Description
Timeline archived monthly.
!Syntax/Examples
>{{{<<timeline [modified | created]>>}}}

!Known issues/Todos
* 

!Instructions

!Notes
* 

!Revision history
* v0.3.1 (04 Feb 2006)
** JSLint checked
* v0.3.0 (Feb 04, 2006)
** Fixed several missing variable declarations
* v0.2.0 (Dec 26, 2005)
** changed for the new feature of Macro timeline of TW 2.0.0 beta 6
* v0.1.0 (Nov 3, 2005)
** Initial release.

!Code
***/
//{{{
version.extensions.archivedTimeline = {major: 0, minor: 3, revision: 1,
 date: new Date("Feb 04, 2006"),
 name: "ArchivedTimeline",
 type: "Macro",
 author: "BramChen",
 source: "http://sourceforge.net/project/showfiles.php?group_id=150646"
};

config.macros.archivedTimeline = {
 tooltips: "Archives sorted by ",
 msg : "The param of macro timeline should be 'created' or 'modified'",
 //dateFormat: "YYYY0MM0DD"
 dateFormat: "DD MMM YYYY" //kuraku upd
};
config.macros.timeline = config.macros.archivedTimeline;

config.macros.timeline.handler = function(place,macroName,params) {
 var field = params[0] ? params[0] : "modified";
 if (field != "modified" && field != "created") {
 displayMessage(config.macros.timeline.msg);
 return;
 }
 place.appendChild(document.createTextNode(this.tooltips + field));
 var tiddlers = store.reverseLookup("tags","excludeLists",false,field);
 var lastMonth = ""; var lastDay = ""; var theText = "----\n"; var i = 0;
 var cookie; var archives;
 for (var t=tiddlers.length-1; t>=0; t--) {
 var tiddler = tiddlers[t];
 var theField = (field == "created") ? tiddler.created : tiddler.modified;
 var theMonth = theField.convertToYYYYMMDDHHMM().substr(0,6);
 var theDay = theField.convertToYYYYMMDDHHMM().substr(0,8); 
 if(theMonth != lastMonth) {
 if (lastMonth === "") {
 lastMonth = theMonth;
 }
 else {
 place.appendChild(document.createElement("hr")); 
 cookie = 'chktimeline'+(i++);
 archives = this.formatString(this.dateFormat, lastMonth);
 this.slider(place,cookie,theText,archives,this.tooltips + archives); 
 lastMonth = theMonth; theText = "----\n"; 
 }
 }
 if(theDay != lastDay){
 theText += theField.formatString(this.dateFormat) + '\n';
 lastDay = theDay; 
 }
 theText += '* [[' + tiddler.title + ']]\n'; 
 }
 place.appendChild(document.createElement("hr"));
 cookie = 'chktimeline'+(i++);
 archives = this.formatString(this.dateFormat, lastMonth);
 this.slider(place,cookie,theText,archives,this.tooltips + archives); 
 place.appendChild(document.createElement("hr"));
};

config.macros.timeline.onClickSlider = config.macros.slider.onClickSlider;

config.macros.timeline.slider = function(place,cookie,text,id,tooltips)
{
 var btn = createTiddlyButton(place,id,tooltips,this.onClickSlider); 
 var panel = createTiddlyElement(place,"div",null,"timelineSliderPanel",null);
 panel.setAttribute("cookie",cookie);
 panel.style.display = config.options[cookie] ? "block" : "none";
 if(text){
 wikify(text,panel);
 }
};

config.macros.timeline.formatString = function(template, yyyymm)
{
 var dateString = new Date(yyyymm.substr(0,4)+'/'+yyyymm.substr(4,2)+'/01');
 template = template.replace(/DDD|0DD|DD|hh|mm|ss/g,'');
 return dateString.formatString(template+" "+(document.all?"▼":"▾")); //kuraku upd
};
//}}}
/***

!~AutoCloseMessagePlugin - 時限メッセージダイアログ

''説明''
~TiddlyWikiで保存したり検索したときに右上に出るダイアログ風の
ポップアップは意外と邪魔になるものです。どうせ定型的な内容だし、
それをクリックするような状況もほとんどないので数秒たったら自動的に
消えるようなプラグインを作成しました。

''インストール''
 この記事の内容をペースト、systemConfigタグを付けて保存、リロード。
 全てのメッセージダイアログが3秒で消えるようになります。
 {{{timeout: 3000}}}の箇所を変更すると消えるまでの時間を設定できます。

----
''ソースコード''
***/
//{{{
config.autoCloseMessage = {
	timeout: 6000
};

javascript:(
	function() {
		var orig_displayMessage = displayMessage;
		displayMessage = hook_displayMessage;

		function hook_displayMessage(text,linkText) {
			orig_displayMessage(text,linkText);
			setTimeout("clearMessage()", config.autoCloseMessage.timeout);
		}
	}
)();
//}}}
//{{{
// DeleteList plugin
config.tasks.DeleteListTask = {
	text: "DelList",
	tooltip: "Delete List tool",
	content: "<<deletelist>>"
}
config.backstageTasks.push("DeleteListTask");

// add TiddlerTweaker
config.tasks.tTweakerTask = {
	text: "TTweaker",
	tooltip: "TiddlerTweaker tool",
	content: "<<tiddler TiddlerTweaker>>"
}
config.backstageTasks.push("tTweakerTask");
//}}}
/***
|''Name:''|CalendarPlugin|
|''Source:''|http://www.TiddlyTools.com/#CalendarPlugin|
|''Author:''|SteveRumsby|
|''License:''|unknown|
|''~CoreVersion:''|2.0.10|

// // updated by Jeremy Sheeley to add cacheing for reminders
// // see http://www.geocities.com/allredfaq/reminderMacros.html
// // ''Changes by ELS 2006.08.23:''
// // added handling for weeknumbers (code supplied by Martin Budden. see "wn**" comment marks)
// // ''Changes by ELS 2005.10.30:''
// // config.macros.calendar.handler()
// // ^^use "tbody" element for IE compatibility^^
// // ^^IE returns 2005 for current year, FF returns 105... fix year adjustment accordingly^^
// // createCalendarDays()
// // ^^use showDate() function (if defined) to render autostyled date with linked popup^^
// // calendar stylesheet definition
// // ^^use .calendar class-specific selectors, add text centering and margin settings^^


!!!!!Configuration:
<<option chkDisplayWeekNumbers>> Display week numbers //(note: Monday will be used as the start of the week)//
|''First day of week:''|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|
|''First day of weekend:''|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|

!!!!!Syntax:
|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|
|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|
|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|
|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|
|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|
|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|

***/
// //Modify this section to change the text displayed for the month and day names, to a different language for example. You can also change the format of the tiddler names linked to from each date, and the colours used.

//{{{
config.macros.calendar = {};

config.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.macros.calendar.daynames = ["M", "T", "W", "T", "F", "S", "S"];

config.macros.calendar.weekendbg = "#c0c0c0";
config.macros.calendar.monthbg = "#e0e0e0";
config.macros.calendar.holidaybg = "#ffc0c0";

//}}}
// //''Code section:''
// (you should not need to alter anything below here)//
//{{{
if(config.options.txtCalFirstDay == undefined)
 config.options.txtCalFirstDay = 0;
if(config.options.txtCalStartOfWeekend == undefined)
 config.options.txtCalStartOfWeekend = 5;
if(config.options.chkDisplayWeekNumbers == undefined)//wn**
 config.options.chkDisplayWeekNumbers = false;
if(config.options.chkDisplayWeekNumbers)
 config.options.txtCalFirstDay = 0;

config.macros.calendar.tiddlerformat = "0DD/0MM/YYYY"; // This used to be changeable - for now, it isn't// <<smiley :-(>> 
config.macros.calendar.tiddlerformat = "YYYY.0MM.0DD"; 

version.extensions.calendar = { major: 0, minor: 6, revision: 0, date: new Date(2006, 1, 22)};
config.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

config.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead
//}}}

// //Is the given date a holiday?
//{{{
function calendarIsHoliday(date)
{
 var longHoliday = date.formatString("0DD/0MM/YYYY");
 var shortHoliday = date.formatString("0DD/0MM");

 for(var i = 0; i < config.macros.calendar.holidays.length; i++) {
 if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday) {
 return true;
 }
 }
 return false;
}
//}}}

// //The main entry point - the macro handler.
// //Decide what sort of calendar we are creating (month or year, and which month or year)
// // Create the main calendar container and pass that to sub-ordinate functions to create the structure.
// ELS 2005.10.30: added creation and use of "tbody" for IE compatibility and fixup for year >1900//
// ELS 2005.10.30: fix year calculation for IE's getYear() function (which returns '2005' instead of '105')//
// ELS 2006.05.29: add journalDateFmt handling//
//{{{
config.macros.calendar.handler = function(place,macroName,params)
{
 var calendar = createTiddlyElement(place, "table", null, "calendar", null);
 var tbody = createTiddlyElement(calendar, "tbody", null, null, null);
 var today = new Date();
 var year = today.getYear();
 if (year<1900) year+=1900;
 
 // get format for journal link by reading from SideBarOptions (ELS 5/29/06 - based on suggestion by Martin Budden)
 var text = store.getTiddlerText("SideBarOptions");
 this.journalDateFmt = "DD-MMM-YYYY";
 var re = new RegExp("<<(?:newJournal)([^>]*)>>","mg"); var fm = re.exec(text);
 if (fm && fm[1]!=null) { var pa=fm[1].readMacroParams(); if (pa[0]) this.journalDateFmt = pa[0]; }

 if (params[0] == "thismonth")
 {
 cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);
 createCalendarOneMonth(tbody, year, today.getMonth());
 } 
 else if (params[0] == "lastmonth") {
 var month = today.getMonth()-1; if (month==-1) { month=11; year--; }
 cacheReminders(new Date(year, month, 1, 0, 0), 31);
 createCalendarOneMonth(tbody, year, month);
 }
 else if (params[0] == "nextmonth") {
 var month = today.getMonth()+1; if (month>11) { month=0; year++; }
 cacheReminders(new Date(year, month, 1, 0, 0), 31);
 createCalendarOneMonth(tbody, year, month);
 }
 else {
 if (params[0]) year = params[0];
 if(params[1])
 {
 cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);
 createCalendarOneMonth(tbody, year, params[1]-1);
 }
 else
 {
 cacheReminders(new Date(year, 0, 1, 0, 0), 366);
 createCalendarYear(tbody, year);
 }
 }
 window.reminderCacheForCalendar = null;
}
//}}}
//{{{
//This global variable is used to store reminders that have been cached
//while the calendar is being rendered. It will be renulled after the calendar is fully rendered.
window.reminderCacheForCalendar = null;
//}}}
//{{{
function cacheReminders(date, leadtime)
{
 if (window.findTiddlersWithReminders == null)
 return;
 window.reminderCacheForCalendar = {};
 var leadtimeHash = [];
 leadtimeHash [0] = 0;
 leadtimeHash [1] = leadtime;
 var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);
 for(var i = 0; i < t.length; i++) {
 //just tag it in the cache, so that when we're drawing days, we can bold this one.
 window.reminderCacheForCalendar[t[i]["matchedDate"]] = "reminder:" + t[i]["params"]["title"]; 
 }
}
//}}}
//{{{
function createCalendarOneMonth(calendar, year, mon)
{
 var row = createTiddlyElement(calendar, "tr", null, null, null);
 createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);
 row = createTiddlyElement(calendar, "tr", null, null, null);
 createCalendarDayHeader(row, 1);
 createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}

//{{{
function createCalendarMonth(calendar, year, mon)
{
 var row = createTiddlyElement(calendar, "tr", null, null, null);
 createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);
 row = createTiddlyElement(calendar, "tr", null, null, null);
 createCalendarDayHeader(row, 1);
 createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}

//{{{
function createCalendarYear(calendar, year)
{
 var row;
 row = createTiddlyElement(calendar, "tr", null, null, null);
 var back = createTiddlyElement(row, "td", null, null, null);
 var backHandler = function() {
 removeChildren(calendar);
 createCalendarYear(calendar, year-1);
 };
 createTiddlyButton(back, "<", "Previous year", backHandler);
 back.align = "center";

 var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);
 yearHeader.align = "center";
 //yearHeader.setAttribute("colSpan", 19);
 yearHeader.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?22:19);//wn**

 var fwd = createTiddlyElement(row, "td", null, null, null);
 var fwdHandler = function() {
 removeChildren(calendar);
 createCalendarYear(calendar, year+1);
 };
 createTiddlyButton(fwd, ">", "Next year", fwdHandler);
 fwd.align = "center";

 createCalendarMonthRow(calendar, year, 0);
 createCalendarMonthRow(calendar, year, 3);
 createCalendarMonthRow(calendar, year, 6);
 createCalendarMonthRow(calendar, year, 9);
}
//}}}

//{{{
function createCalendarMonthRow(cal, year, mon)
{
 var row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);
 createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);
 createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);
 row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarDayHeader(row, 3);
 createCalendarDayRows(cal, year, mon);
}
//}}}

//{{{
function createCalendarMonthHeader(cal, row, name, nav, year, mon)
{
 var month;
 if(nav) {
 var back = createTiddlyElement(row, "td", null, null, null);
 back.align = "center";
 back.style.background = config.macros.calendar.monthbg;

/*
 back.setAttribute("colSpan", 2);

 var backYearHandler = function() {
 var newyear = year-1;
 removeChildren(cal);
 cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
 createCalendarOneMonth(cal, newyear, mon);
 };
 createTiddlyButton(back, "<<", "Previous year", backYearHandler);
*/
 var backMonHandler = function() {
 var newyear = year;
 var newmon = mon-1;
 if(newmon == -1) { newmon = 11; newyear = newyear-1;}
 removeChildren(cal);
 cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
 createCalendarOneMonth(cal, newyear, newmon);
 };
 createTiddlyButton(back, "<", "Previous month", backMonHandler);


 month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
// month.setAttribute("colSpan", 3);
// month.setAttribute("colSpan", 5);
 month.setAttribute("colSpan", config.options.chkDisplayWeekNumbers?6:5);//wn**

 var fwd = createTiddlyElement(row, "td", null, null, null);
 fwd.align = "center";
 fwd.style.background = config.macros.calendar.monthbg; 

// fwd.setAttribute("colSpan", 2);
 var fwdMonHandler = function() {
 var newyear = year;
 var newmon = mon+1;
 if(newmon == 12) { newmon = 0; newyear = newyear+1;}
 removeChildren(cal);
 cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
 createCalendarOneMonth(cal, newyear, newmon);
 };
 createTiddlyButton(fwd, ">", "Next month", fwdMonHandler);
/*
 var fwdYear = createTiddlyElement(row, "td", null, null, null);
 var fwdYearHandler = function() {
 var newyear = year+1;
 removeChildren(cal);
 cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
 createCalendarOneMonth(cal, newyear, mon);
 };
 createTiddlyButton(fwd, ">>", "Next year", fwdYearHandler);
*/
 } else {
 month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
 //month.setAttribute("colSpan", 7);
 month.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?8:7);//wn**
 }
 month.align = "center";
 month.style.background = config.macros.calendar.monthbg;
}
//}}}

//{{{
function createCalendarDayHeader(row, num)
{
 var cell;
 for(var i = 0; i < num; i++) {
 if (config.options.chkDisplayWeekNumbers) createTiddlyElement(row, "td");//wn**
 for(var j = 0; j < 7; j++) {
 var d = j + (config.options.txtCalFirstDay - 0);
 if(d > 6) d = d - 7;
 cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);
 if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))
 cell.style.background = config.macros.calendar.weekendbg;
 }
 }
}
//}}}

//{{{
function createCalendarDays(row, col, first, max, year, mon)
{
 var i;
 if (config.options.chkDisplayWeekNumbers){
 if (first<=max) {
 var ww = new Date(year,mon,first);
 createTiddlyElement(row, "td", null, null, "w"+ww.getWeek());//wn**
 }
 else createTiddlyElement(row, "td", null, null, null);//wn**
 }
 for(i = 0; i < col; i++) {
 createTiddlyElement(row, "td", null, null, null);
 }
 var day = first;
 for(i = col; i < 7; i++) {
 var d = i + (config.options.txtCalFirstDay - 0);
 if(d > 6) d = d - 7;
 var daycell = createTiddlyElement(row, "td", null, null, null);
 var isaWeekend = ((d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))? true:false);

 if(day > 0 && day <= max) {
 var celldate = new Date(year, mon, day);
 // ELS 2005.10.30: use <<date>> macro's showDate() function to create popup
 if (window.showDate) {
 showDate(daycell,celldate,"popup","DD",config.macros.calendar.journalDateFmt,true, isaWeekend); // ELS 5/29/06 - use journalDateFmt 
 } else {
 if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;
 var title = celldate.formatString(config.macros.calendar.tiddlerformat);
 if(calendarIsHoliday(celldate)) {
 daycell.style.background = config.macros.calendar.holidaybg;
 }
 if(window.findTiddlersWithReminders == null) {
 var link = createTiddlyLink(daycell, title, false);
 link.appendChild(document.createTextNode(day));
 } else {
 var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);
 }
 }
 }
 day++;
 }
}
//}}}

// //We've clicked on a day in a calendar - create a suitable pop-up of options.
// //The pop-up should contain:
// // * a link to create a new entry for that date
// // * a link to create a new reminder for that date
// // * an <hr>
// // * the list of reminders for that date
//{{{
function onClickCalendarDate(e)
{
 var button = this;
 var date = button.getAttribute("title");
 var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));

 date = dat.formatString(config.macros.calendar.tiddlerformat);
 var popup = createTiddlerPopup(this);
 popup.appendChild(document.createTextNode(date));
 var newReminder = function() {
 var t = store.getTiddlers(date);
 displayTiddler(null, date, 2, null, null, false, false);
 if(t) {
 document.getElementById("editorBody" + date).value += "\n<<reminder day:" + dat.getDate() +
 " month:" + (dat.getMonth()+1) +
 " year:" + (dat.getYear()+1900) + " title: >>";
 } else {
 document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +
 " month:" + (dat.getMonth()+1) +
 " year:" + (dat.getYear()+1900) + " title: >>";
 }
 };
 var link = createTiddlyButton(popup, "New reminder", null, newReminder); 
 popup.appendChild(document.createElement("hr"));

 var t = findTiddlersWithReminders(dat, [0,14], null, 1);
 for(var i = 0; i < t.length; i++) {
 link = createTiddlyLink(popup, t[i].tiddler, false);
 link.appendChild(document.createTextNode(t[i].tiddler));
 }
}
//}}}

//{{{
function calendarMaxDays(year, mon)
{
 var max = config.macros.calendar.monthdays[mon];
 if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) {
 max++;
 }
 return max;
}
//}}}

//{{{
function createCalendarDayRows(cal, year, mon)
{
 var row = createTiddlyElement(cal, "tr", null, null, null);

 var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first1 < 0) first1 = first1 + 7;
 var day1 = -first1 + 1;
 var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first2 < 0) first2 = first2 + 7;
 var day2 = -first2 + 1;
 var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first3 < 0) first3 = first3 + 7;
 var day3 = -first3 + 1;

 var max1 = calendarMaxDays(year, mon);
 var max2 = calendarMaxDays(year, mon+1);
 var max3 = calendarMaxDays(year, mon+2);

 while(day1 <= max1 || day2 <= max2 || day3 <= max3) {
 row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
 createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;
 createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;
 }
}
//}}}

//{{{
function createCalendarDayRowsSingle(cal, year, mon)
{
 var row = createTiddlyElement(cal, "tr", null, null, null);

 var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first1 < 0) first1 = first1+ 7;
 var day1 = -first1 + 1;
 var max1 = calendarMaxDays(year, mon);

 while(day1 <= max1) {
 row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
 }
}
//}}}

// //ELS 2005.10.30: added styles
//{{{
setStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td { text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");
//}}}
// // override cookie settings for CalendarPlugin:
//{{{
//First day of week:(Monday = 0, Sunday = 6)
config.options.txtCalFirstDay=0;

//First day of weekend:(Monday = 0, Sunday = 6)
config.options.txtCalStartOfWeekend=5;

config.macros.calendar.weekendbg = "#FFC9D7";
//}}}
<<deletelist check:toRSS>>
/***
|Name|CheckboxPlugin|
|Source|http://www.TiddlyTools.com/#CheckboxPlugin|
|Version|2.1.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Add checkboxes to your tiddler content|

Checkbox 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.

!!!!!Usage
<<<
The checkbox syntax, including all optional parameters, is contained inside a matched set of [ and ] brackets.
{{{ [x=id(title|tag){init_script}{onclick_script}] }}}

An 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:
{{{ [x]=id(title|tag){init_script}{onclick_script} }}}

//{{{
[ ]or[_] and [x]or[X]
//}}}
Simple 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
//{{{
[x=id]
//}}}
Assign 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.
//{{{
[x(title|tag)] or [x(title:tag)]
//}}}
Initializes 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.''//
//{{{
[x{javascript}{javascript}]
//}}}
You 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'.

The 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).

Note: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: {{{ [x=id{}{javascript}] }}} 
<<<
!!!!!Configuration
<<<
Normally, 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.
*''container'': the tiddler in which the checkbox is displayed. (e.g., this tiddler)
*''tagged'': the tiddler that is being tagged (e.g., "~MyTask" when tagging "~MyTask:done")
*''tagging'': the "tag tiddler" (e.g., "~done" when tagging "~MyTask:done")
You 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):
{{{config.checkbox.refresh = { tagged:true, tagging:true, container:true };}}}

You 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:
{{{[_{this.refresh.container=false}]}}}
<<<
!!!!!Examples
<<<
//{{{
[X] label
[_] label
//}}}
>checked and unchecked static default values
>[X] label
>[_] label
//{{{
[_=demo] label
//}}}
>document-based value (id='demo', no cookie)
>[_=demo] label
//{{{
[_=chkDemo] label
//}}}
>cookie-based value  (id='chkDemo')
>[_=chkDemo] label
//{{{
[_(CheckboxPlugin|demotag)]
[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}]
//}}}
>tag-based value (TogglyTagging)
>[_(CheckboxPlugin|demotag)] toggle 'demotag' (and refresh tiddler display)
>[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}] toggle 'demotag' (no refresh)
>current tags: <script>return store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString();</script>
><script label="click to view current tags">alert(store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString());return false</script>
//{{{
[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state
//}}}
>custom init and onClick functions
>[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state
Retrieving option values:
config.options['demo']=<script>return config.options['demo']?"true":"false";</script>
config.options['chkDemo']=<script>return config.options['chkDemo']?"true":"false";</script>

!!!!!Installation
import (or copy/paste) the following tiddlers into your document:
''CheckboxPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
2006.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)
2006.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.
2006.02.25 - 2.1.0 added configuration options to enable/disable forced refresh of tiddlers when toggling tags
2006.02.23 - 2.0.4 when toggling tags, force refresh of the tiddler containing the checkbox.
2006.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.
2006.02.23 - 2.0.2 when using tag-based storage, allow use [[ and ]] to quote tiddler or tag names that contain spaces:
{{{[x([[Tiddler with spaces]]:[[tag with spaces]])]}}}
2006.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.
2006.01.04 - 2.0.0 update for ~TW2.0
2005.12.27 - 1.1.2 Fix lookAhead regExp handling for {{{[x=id]}}}, which had been including the "]" in the extracted ID.  
Added check for "chk" prefix on ID before calling saveOptionCookie()
2005.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.
2005.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
2005.12.25 - 1.0.0 added support for tracking checkbox state using tags ("TogglyTagging")
Revised version number for official post-beta release.
2005.12.08 - 0.9.3 support separate 'init' and 'onclick' function definitions.
2005.12.08 - 0.9.2 clean up lookahead pattern
2005.12.07 - 0.9.1 only update tiddler source content if checkbox state is actually different.  Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)
2005.12.07 - 0.9.0 initial BETA release
<<<
!!!!!Credits
<<<
This feature was created by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.CheckboxPlugin = {major: 2, minor: 1, revision:3 , date: new Date(2006,5,4)};
//}}}

// // 1.2.x compatibility
//{{{
if (!window.story) window.story=window;
if (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}
if (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}
if (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}
//}}}

//{{{
config.checkbox = { refresh: { tagged:true, tagging:true, container:true } };
config.formatters.push( {
	name: "checkbox",
	match: "\\[[xX_ ][\\]\\=\\(\\{]",
	lookahead: "\\[([xX_ ])(\\])?(=[^\\s\\(\\]{]+)?(\\([^\\)]*\\))?({[^}]*})?({[^}]*})?(\\])?",
	handler: function(w)
		{
			var lookaheadRegExp = new RegExp(this.lookahead,"mg");
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source)
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
			{
				// get params
				var checked=lookaheadMatch[1];
				var id=lookaheadMatch[3];
				var tag=lookaheadMatch[4];
				var fn_init=lookaheadMatch[5];
				var fn_click=lookaheadMatch[6];
				// create checkbox element
				var c = document.createElement("input");
				c.setAttribute("type","checkbox");
				c.onclick=onClickCheckbox;
				c.srcpos=w.matchStart+1; // remember location of "X"
				c.container=story.findContainingTiddler(w.output); if (c.container) c.container=c.container.id.substr(7); // tiddler containing checkbox
				c.refresh = { };
				c.refresh.container=config.checkbox.refresh.container;
				c.refresh.tagged=config.checkbox.refresh.tagged;
				c.refresh.tagging=config.checkbox.refresh.tagging;
				w.output.appendChild(c);
				// set default state
				c.checked=(checked.toUpperCase()=="X");
				// get/set state by ID
				if (id) {
					c.id=id.substr(1); // trim off leading "="
					if (config.options[c.id]!=undefined)
						c.checked=config.options[c.id];
					else
						config.options[c.id]=c.checked;
				}
				// get/set state by tag
				if (tag) {
					c.tiddler=c.container;
					c.tag=tag.substr(1,tag.length-2).trim(); // trim off parentheses
					var pos=c.tag.indexOf("|"); if (pos==-1) var pos=c.tag.indexOf(":");
					if (pos==0) { c.tag=tag.substr(1); }
					if (pos>0) { c.tiddler=c.tag.substr(0,pos).replace(/\[\[/g,"").replace(/\]\]/g,""); c.tag=c.tag.substr(pos+1); }
					c.tag.replace(/\[\[/g,"").replace(/\]\]/g,"");
					if (!c.tag.length) c.tag="checked";
					var t=store.getTiddler(c.tiddler);
					c.checked = (t && t.tags)?(t.tags.find(c.tag)!=null):false;
				}
				if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters
				if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);
				c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie
				w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
			}
		}
	}
)
//}}}

//{{{
function onClickCheckbox()
{
	if (this.fn_init)
		// custom function hook to set initial state (run only once)
		{ try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }
	else if (this.fn_click)
		// custom function hook to override or react to changes in checkbox state
		{ try { eval(this.fn_click) } catch(e) { displayMessage("Checkbox click error: "+e.toString()); } }
	if (this.id)
		// save state in config AND cookie (only when ID starts with 'chk')
		{ config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }
	if ((!this.id || this.id.substr(0,3)!="chk") && !this.tag) {
		// save state in tiddler content only if not using cookie or tag tracking
		var t=story.findContainingTiddler(this); if (t) {
			var t=store.getTiddler(t.id.substr(7));
			if (this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed
				t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);
				store.setDirty(true);
			}
		}
	}
	if (this.tag) {
		var t=store.getTiddler(this.tiddler);
		if (!t) { t=(new Tiddler()); t.set(this.tiddler,"",config.options.txtUserName,(new Date()),null); store.addTiddler(t); } 
		var tagged=(t.tags && t.tags.find(this.tag)!=null);
		if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }
		if (!this.checked && tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }
		// if tag state has been changed, force a display update
		if (this.checked!=tagged) {
			if (this.refresh.tagged) story.refreshTiddler(this.tiddler,null,true); // the TAGGED tiddler
			if (this.refresh.tagging) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler
		}
	}
	// refresh containing tiddler (but not during initial rendering, or we get an infinite loop!)
	if (!this.init && this.refresh.container && this.container!=this.tiddler)
		story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox
	return true;
}
//}}}
/***
|''Name:''|Based on CollapseTiddlersPlugin|
|''Source:''|http://gensoft.revhost.net/Collapse.html|
|''Author:''|Bradley Meck|
|''License:''|unknown|
|''~CoreVersion:''|2.0.10|

|JOS 9/14/2006: changed text for 'collapse all' and 'expand all' to lower-case (consistency's sake); cleanned-up syntax (readability's sake) |
|JOS 9/14/2006: removed "WebCollapsedTemplate" altogether; added compat code for topOfPageMode; added tool tips for collapseAll and expandAll |
|ELS 2/24/2006: added fallback to "CollapsedTemplate if "WebCollapsedTemplate" is not found |
|ELS 2/6/2006: added check for 'readOnly' flag to use alternative "WebCollapsedTemplate" |
***/
//{{{
config.commands.collapseTiddler = {
  text: "fold",
  tooltip: "Collapse this tiddler",
  handler: function(event,src,title){
    var e = story.findContainingTiddler(src);
    var t = "CollapsedTemplate";
    if (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }
    if (config.options.chkTopOfPageMode!=undefined) {
      var pm=config.options.chkTopOfPageMode;
      config.options.chkTopOfPageMode=false;
    }
    if(e.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){
      if(e.getAttribute("template") != t ){
        e.setAttribute("oldTemplate",e.getAttribute("template"));
        story.displayTiddler(null,title,t);
      }
    }
    if (config.options.chkTopOfPageMode!=undefined) config.options.chkTopOfPageMode=pm;
  }
}

config.commands.expandTiddler = {
  text: "unfold",
  tooltip: "Expand this tiddler",
  handler: function(event,src,title){
    if (config.options.chkTopOfPageMode!=undefined) {
      var pm=config.options.chkTopOfPageMode;
      config.options.chkTopOfPageMode=false;
    }
    var e = story.findContainingTiddler(src);
    story.displayTiddler(null,title,e.getAttribute("oldTemplate"));
    if (config.options.chkTopOfPageMode!=undefined) config.options.chkTopOfPageMode=pm;
  }
}

config.macros.collapseAll = {
  handler: function(place,macroName,params,wikifier,paramString,tiddler){
    createTiddlyButton(place,"collapse all","Collapse all tiddlers",function(){
                         var t = "CollapsedTemplate";
                         if (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }
                         if (config.options.chkTopOfPageMode!=undefined) {
                           var pm=config.options.chkTopOfPageMode;
                           config.options.chkTopOfPageMode=false;
                         }
                         story.forEachTiddler(function(title,tiddler){
                                                if(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE])
                                                  story.displayTiddler(null,title,t);
                                              })
                           if (config.options.chkTopOfPageMode!=undefined) config.options.chkTopOfPageMode=pm;
                       })
  }
}

config.macros.expandAll = {
  handler: function(place,macroName,params,wikifier,paramString,tiddler){
    createTiddlyButton(place,"expand all","",function(){
                         var t = "CollapsedTemplate";
                         if (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }
                         if (config.options.chkTopOfPageMode!=undefined) {
                           var pm=config.options.chkTopOfPageMode;
                           config.options.chkTopOfPageMode=false;
                         }
                         story.forEachTiddler(function(title,tiddler){
                                                if(tiddler.getAttribute("template") == t) story.displayTiddler(null,title,tiddler.getAttribute("oldTemplate"));
                                              })
                           if (config.options.chkTopOfPageMode!=undefined) config.options.chkTopOfPageMode=pm;
                       })
  }
}

config.commands.collapseOthers = {
  text: "focus",
  tooltip: "Expand this tiddler and collapse all others",
  handler: function(event,src,title){
    var e = story.findContainingTiddler(src);
    var t = "CollapsedTemplate";
    if (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }
    if (config.options.chkTopOfPageMode!=undefined) {
      var pm=config.options.chkTopOfPageMode;
      config.options.chkTopOfPageMode=false;
    }
    story.forEachTiddler(function(title,tiddler){
                           if(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){
                             if (tiddler!=e) story.displayTiddler(null,title,t);
                           }
                         })
    if (config.options.chkTopOfPageMode!=undefined) config.options.chkTopOfPageMode=pm;
  }
}
//}}}
<!--{{{-->
<div class='toolbar' macro='toolbar editTiddler permalink closeOthers +expandTiddler closeTiddler'></div>
<div><span class='title' macro='view title'></span></div>
<!--}}}-->
{{{
config.options.chkAnimate=false;
config.options.chkHttpReadOnly=false;
config.options.chkForceMinorUpdate=true;
config.options.txtMaxEditRows="30"; 
config.options.txtBackupFolder="backup";

config.commands.closeTiddler.text = "X"; // default is "close"
config.messages.messageClose.text = "X"; // default is "close"
config.views.wikified.defaultText = ""; // default is "The tiddler '%0' doesn't yet exist. Double-click to create it"

config.options.chkDeleteListDisplayInOptions=true;

config.commands.collapseTiddler.text=">>"; //fold
config.commands.expandTiddler.text="<<"; //unfold
}}}
PageTemplate
|>|>|SiteTitle - SiteSubtitle|
|MainMenu|DefaultTiddlers<<br>><<br>><<br>><<br>>ViewTemplate<<br>><<br>>EditTemplate|SideBarOptions|
|~|~|OptionsPanel|
|~|~|AdvancedOptions|
|~|~|<<tiddler Configuration.SideBarTabs>>|

''StyleSheet:'' StyleSheetColors - StyleSheetLayout - StyleSheetPrint

SiteUrl
SideBarTabs
|[[Timeline|TabTimeline]]|[[All|TabAll]]|[[Tags|TabTags]]|>|>|[[More|TabMore]] |
|>|>||[[Missing|TabMoreMissing]]|[[Orphans|TabMoreOrphans]]|[[Shadowed|TabMoreShadowed]]|
[img[http://sv78.lolipop.jp/cnt/accnt.php?cnt_id=1141500&ac_id=LA11052066&mode=total]]
[img[http://sv78.lolipop.jp/cnt/accnt.php?cnt_id=1141500&ac_id=LA11052066&mode=today]]
[img[http://sv78.lolipop.jp/cnt/accnt.php?cnt_id=1141500&ac_id=LA11052066&mode=yesterday]]
/***
''Date Plugin for TiddlyWiki version 2.x''
^^author: Eric Shulman - ELS Design Studios
source: http://www.TiddlyTools.com/#DatePlugin
license: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^
^^last update: <<date tiddler "DDD, MMM DDth, YYYY hh:0mm:0ss">>^^

There are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW.  While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier.  This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.

You can ''specify a date using a combination of year, month, and day number values or mathematical expressions (such as "Y+1" or "D+30")'', and then just display it as formatted date text, or create a ''link to a 'dated tiddler''' for quick blogging, or create a ''popup menu'' containing the dated tiddler link plus links to ''tiddlers that were changed'' as well as any ''scheduled reminders'' for that date.
!!!!!Usage
<<<
When installed, this plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}.  All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.

However, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:
* [mode] is either ''display'', ''link'' or ''popup''.  If omitted, it defaults to ''display''.  This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.
* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively.  You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters.  Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler.  You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values.  
* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax.  The default is "YYYY.0MM.0DD"
>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^
>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^
>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^
>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^
* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format

In addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:

''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}'' 

Note that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:
* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status:  'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.
* [weekend] - true indicates a weekend, false indicates a weekday.  When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.
<<<
!!!!!Examples
<<<
The current date: <<date>>
The current time: <<date today "0hh:0mm:0ss">>
Today's blog: <<date link today "DDD, MMM DDth, YYYY">>
Recent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>
The first day of next month will be a <<date Y M+1 1 "DDD">>
This tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>
The SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>
This document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>
<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''DatePlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2006.02.14 [2.0.5]''
when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.
''2006.02.05 [2.0.4]''
added var to variables that were unintentionally global.  Avoids FireFox 1.5.0.1 crash bug when referencing global variables
''2006.01.18 [2.0.3]''
In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content.  With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned.  To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.
''2006.01.11 [2.0.2]''
correct 'weekend' override detection logic in showDate()
''2006.01.10 [2.0.1]''
allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)
added flag param to showDate() API to override internal weekend[] array
''2005.12.27 [2.0.0]''
Update for TW2.0
Added parameter handling for 'linkformat'
''2005.12.21 [1.2.2]''
FF's date.getYear() function returns 105 (for the current year, 2005).  When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number.  But IE's date.getYear() already returns 2005.  As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005).  Adding +1900 is now conditional so the values will be correct on both browsers.
''2005.11.07 [1.2.1]''
added support for "tiddler" dynamic date parameter
''2005.11.06 [1.2.0]''
added support for "tiddler:title" dynamic date parameter
''2005.11.03 [1.1.2]''
when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu.  Based on a suggestion from BenjaminKudria.
''2005.11.03 [1.1.1]''
Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache.  While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed.  This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).
''2005.11.01 [1.1.0]''
corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended.  This should hopefully speed up calendar generators and other plugins that render multiple dates...
''2005.10.31 [1.0.1]''
documentation and code cleanup
''2005.10.31 [1.0.0]''
initial public release
''2005.10.30 [0.9.0]''
pre-release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].
<<<
!!!!!Code
***/
//{{{
version.extensions.date = {major: 2, minor: 0, revision: 5, date: new Date(2006,2,14)};
//}}}

//{{{
// 1.2.x compatibility
if (!window.story) window.story=window;
if (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}
if (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}
if (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}
//}}}

//{{{
config.macros.date = {
	format: "YYYY.0MM.0DD", // default date display format
	linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format
	weekendbg: "#c0c0c0", // "cocoa"
	holidaybg: "#c0ffee", // "coffee"
	modifiedsbg: "#bbeeff", // "beef"
	remindersbg: "#ffaace", // "face"
	holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)
	weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]
};
//}}}

//{{{
config.macros.date.handler = function(place,macroName,params)
{
	// do we want to see a link, a popup, or just a formatted date?
	var mode="display";
	if (params[0]=="display") { mode=params[0]; params.shift(); }
	if (params[0]=="popup") { mode=params[0]; params.shift(); }
	if (params[0]=="link") { mode=params[0]; params.shift(); }
	// get the date
	var now = new Date();
	var date = now;
	if (!params[0] || params[0]=="today")
		{ params.shift(); }
	else if (params[0]=="filedate")
		{ date=new Date(document.lastModified); params.shift(); }
	else if (params[0]=="tiddler")
		{ date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }
	else if (params[0].substr(0,8)=="tiddler:")
		{ var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }
	else {
		var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));
		var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));
		var d = eval(params.shift().replace(/D/ig,now.getDate()+0));
		date = new Date(y,m-1,d);
	}
	// date format with optional custom override
	var format=this.format; if (params[0]) format=params.shift();
	var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();
	showDate(place,date,mode,format,linkformat);
}
//}}}

//{{{
window.showDate=showDate;
function showDate(place,date,mode,format,linkformat,autostyle,weekend)
{
	if (!mode) mode="display";
	if (!format) format=config.macros.date.format;
	if (!linkformat) linkformat=config.macros.date.linkformat;
	if (!autostyle) autostyle=false;

	// format the date output
	var title = date.formatString(format);
	var linkto = date.formatString(linkformat);

	// just show the formatted output
	if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }

	// link to a 'dated tiddler'
	var link = createTiddlyLink(place, linkto, false);
	link.appendChild(document.createTextNode(title));
	link.title = linkto;
	link.date = date;
	link.format = format;
	link.linkformat = linkformat;

	// if using a popup menu, replace click handler for dated tiddler link
	// with handler for popup and make link text non-italic (i.e., an 'existing link' look)
	if (mode=="popup") {
		link.onclick = onClickDatePopup;
		link.style.fontStyle="normal";
	}

	// format the popup link to show what kind of info it contains (for use with calendar generators)
	if (!autostyle) return;
	if (hasModifieds(date))
		{ link.style.fontStyle="normal"; link.style.fontWeight="bold"; }
	if (hasReminders(date))
		{ link.style.textDecoration="underline"; }
	if(isToday(date))
		{ link.style.border="1px solid black"; }

	if( (weekend!=undefined?weekend:isWeekend(date)) && (config.macros.date.weekendbg!="") )
		{ place.style.background = config.macros.date.weekendbg; }
	if(isHoliday(date)&&(config.macros.date.holidaybg!=""))
		{ place.style.background = config.macros.date.holidaybg; }
	if (hasModifieds(date)&&(config.macros.date.modifiedsbg!=""))
		{ place.style.background = config.macros.date.modifiedsbg; }
	if (hasReminders(date)&&(config.macros.date.remindersbg!=""))
		{ place.style.background = config.macros.date.remindersbg; }
}
//}}}

//{{{
function isToday(date) // returns true if date is today
	{ var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }

function isWeekend(date) // returns true if date is a weekend
	{ return (config.macros.date.weekend[date.getDay()]); }

function isHoliday(date) // returns true if date is a holiday
{
	var longHoliday = date.formatString("0MM/0DD/YYYY");
	var shortHoliday = date.formatString("0MM/0DD");
	for(var i = 0; i < config.macros.date.holidays.length; i++) {
		var holiday=config.macros.date.holidays[i];
		if (holiday==longHoliday||holiday==shortHoliday) return true;
	}
	return false;
}
//}}}

//{{{
// Event handler for clicking on a day popup
function onClickDatePopup(e)
{
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);
	var popup = createTiddlerPopup(this);
	if(popup) {
		// always show dated tiddler link (or just date, if readOnly) at the top...
		if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))
			createTiddlyLink(popup,this.date.formatString(this.linkformat),true);
		else
			createTiddlyText(popup,this.date.formatString(this.linkformat));
		addModifiedsToPopup(popup,this.date,this.format);
		addRemindersToPopup(popup,this.date,this.linkformat);
	}
	scrollToTiddlerPopup(popup,false);
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	return(false);
}
//}}}

//{{{
function indexModifieds() // build list of tiddlers, hash indexed by modification date
{
	var modifieds= { };
	var tiddlers = store.getTiddlers("title");
	for (var t = 0; t < tiddlers.length; t++) {
		var date = tiddlers[t].modified.formatString("YYYY0MM0DD")
		if (!modifieds[date])
			modifieds[date]=new Array();
		modifieds[date].push(tiddlers[t].title);
	}
	return modifieds;
}
function hasModifieds(date) // returns true if date has modified tiddlers
{
	if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();
	return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);
}

function addModifiedsToPopup(popup,when,format)
{
	if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
	var mods = config.macros.date.modifieds[when.formatString("YYYY0MM0DD")];
	if (mods) {
		mods.sort();
		var e=createTiddlyElement(popup,"div",null,null,"changes:");
		for(var t=0; t<mods.length; t++) {
			var link=createTiddlyLink(popup,mods[t],false);
			link.appendChild(document.createTextNode(indent+mods[t]));
			createTiddlyElement(popup,"br",null,null,null);
		}
	}
}
//}}}

//{{{
function indexReminders() // build list of tiddlers with reminders, hash indexed by reminder date
{
	var reminders = { };

	if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed

	var matches = store.search("reminder",false,false,"title","excludeSearch");
	var macroPattern = "<<([^>\\s]+)(?:\\s*)([^>]*)>>";
	var macroRegExp = new RegExp(macroPattern,"mg");
	var arr = [];
	for(var t=matches.length-1; t>=0; t--)
	{
		var targetText = matches[t].text;
		do {
			// Get the next formatting match
			var formatMatch = macroRegExp.exec(targetText);
			if(formatMatch)
			{
				if (formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")
				{
                                       //Find the matching date.
                                       var params = formatMatch[2].readMacroParams();
                                       var dateHash = getParamsForReminder(params);
                                       var date = findDateForReminder(dateHash);
                                       if (date != null)
                                       {
						var dateindex = date.formatString("YYYY0MM0DD")
						if (!reminders[dateindex])
							reminders[dateindex]=new Array();
						reminders[dateindex].pushUnique(t);
                                       }
				}
			}
		} while(formatMatch);
	}
	return reminders;
}

function hasReminders(date) // returns true if date has reminders
{
        if (window.reminderCacheForCalendar != null)
          return window.reminderCacheForCalendar[date] != null;
	return false; // ELS 2005.11.03: BYPASS due to performance issues
	if (!config.macros.date.reminders) config.macros.date.reminders = indexReminders();
	return (config.macros.date.reminders[date.formatString("YYYY0MM0DD")]!=undefined);
}

function addRemindersToPopup(popup,when,format)
{
	if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed

	var indent = String.fromCharCode(160)+String.fromCharCode(160);
	var reminders=findTiddlersWithReminders(when, [0,31],null,1);
	var e=createTiddlyElement(popup,"div",null,null,"reminders:"+(!reminders.length?" none":""));
	for(var t=0; t<reminders.length; t++) {
		link = createTiddlyLink(popup,reminders[t].tiddler,false);
		var diff=reminders[t].diff;
		diff=(!diff)?"Today":((diff==1)?"Tomorrow":diff+" days");
		var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;
		link.appendChild(document.createTextNode(indent+diff+" - "+txt));
		createTiddlyElement(popup,"br",null,null,null);
	}
	if (readOnly) return;	// omit "new reminder..." link
	var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");
	var title = when.formatString(format);
	link.title="add a reminder to '"+title+"'";
	link.onclick = function() {
		// show tiddler editor
		story.displayTiddler(null, title, 2, null, null, false, false);
		// find body 'textarea'
		var c =document.getElementById("tiddler" + title).getElementsByTagName("*");
		for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;
		// append reminder macro to tiddler content
		if (i<c.length) {
			if (store.tiddlerExists(title)) c[i].value+="\n"; else c[i].value="";
			c[i].value += "<<reminder day:"+when.getDate()+" month:"+(when.getMonth()+1)+" year:"+(when.getFullYear())+' title:"Enter a title" >>';
		}
	};
}
//}}}
/***
|Name|DcTableOfContentsPlugin|
|Created by|Doug Compton|
|Source|http://www.zagware.com/tw/plugins.html#DcTableOfContentsPlugin|
|Version|0.3.0 - 4/12/2006|
!Description
This macro will insert a table of contents reflecting the headings that are used in a tiddler and will be automatically updated when you make changes.  Each item in the table of contents can be clicked on to jump to that heading.  It can be used either inside of select tiddlers or inside a system wide template.

A parameter can be used to show the table of contents of a seperate tiddler, <<showtoc tiddlerTitle>>

It will also place a link beside each header which will jump the screen to the top of the current tiddler.  This will only be displayed if the current tiddler is using the <<showtoc>> macro.

The appearance of the table of contents and the link to jump to the top can be modified using CSS.  An example of this is given below.

!Examples
If you had a tiddler with the following headings

 ! Heading1
 !! Heading2
 !! Heading3
 !!! Heading4
 ! Heading5

this table of contents would be automatically generated
*Heading1
**Heading2
**Heading3
***Heading4
*Heading5

!Changing how it looks
To modifiy the appearance, you can use CSS similiar to the below.
//{{{
.dcTOC ul {
	color: red;
	list-style-type: lower-roman;
}
.dcTOC a {
	color: green;
	border: none;
}

.dcTOC a:hover {
	background: white;
	border: solid 1px;
}
.dcTOCTop {
	font-size: 2em;
	color: green;
}
//}}}

!Usage
!!Only in select tiddlers
The table of contents above is an example of how to use this macro in a tiddler.  Just insert <<showtoc>> in a tiddler on a line by itself.

It can also display the table of contents of another tiddler by using the macro with a parameter, <<showtoc tiddlerTitle>>
!!On every tiddler
It can also be used in a template to have it show on every tiddler.  An example ViewTemplate is shown below.

//{{{
<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'>Created <span macro='view created date DD-MM-YY'></span>, updated <span macro='view modified date DD-MM-YY'></span></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class="toc" macro='showtoc'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
//}}}

!History
!!0.3.0.1 - 2007.06.07 patched - KuRaKu
!!0.3.0 - 04/12/2006
*Added the ability to show the table of contents of a seperate tiddler.
*Fixed an error when a heading had a ~WikiLink in it.
!!0.2.0 - 04/10/2006
*Added the [top] link on headings to jump to the top of the current tiddler.
*The appearance can now be customized using CSS.
*All event handlers now return false.
!!0.1.0 - 04/07/2006
*Initial version

!Code
***/
//{{{

version.extensions.DcTableOfContentsPlugin= {
	major: 0, minor: 3, revision: 0,
	date: new Date(2006, 4, 12), 
	type: 'macro',
	source: "http://www.zagware.com/tw/plugins.html#DcTableOfContentsPlugin"
};

// Replace heading formatter with our own
for (var n=0; n<config.formatters.length; n++) {
	var format = config.formatters[n];
	if (format.name == 'heading') {
		format.handler = function(w) {

			// following two lines is the default handler
			var e = createTiddlyElement(w.output, "h" + w.matchLength);
			//w.subWikify(e, this.terminator);
			w.subWikifyTerm(e,this.termRegExp); //change krk

			// Only show [top] if current tiddler is using showtoc
			//if (w.tiddler.isTOCInTiddler == 1) {
			if (w.tiddler && w.tiddler.isTOCInTiddler == 1) { // change krk
				// Create to outter SPAN containing the default CSS values
				var span = createTiddlyElement(e, "span");
				span.style.fontSize = ".5em";
				span.style.color = "blue";

				// Create the link to jump to the top
				createTiddlyButton(span, " [top]", "Go to top of tiddler", window.scrollToTop, "dcTOCTop", null, null);
			}
		}
		break;
	}
}


config.macros.showtoc = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var text = "";
		var title = "";
		var myTiddler = null;

		// Did they pass in a tiddler?
		if (params.length) {
			title = params[0];
			myTiddler = store.getTiddler(title);
		} else {
			myTiddler = tiddler;
		}

		if (myTiddler == null) {
			wikify("ERROR: Could not find " + title, place);
			return;
		}

		var lines = myTiddler .text.split("\n");
		myTiddler.isTOCInTiddler = 1;

		// Create to SPAN so the TOC can be customized using CSS
		var span = createTiddlyElement(place, "span", null, "dcTOC");

		if (lines != null) {
			for (var x=0; x<lines.length; x++) {
				var line = lines[x];
				if (line.substr(0,1) == "!") {
					// Find first non ! char
					for (var i=0; i<line.length; i++) {
						if (line.substr(i, 1) != "!") {
							break;
						}
					}
					var desc = line.substring(i);
					// Remove WikiLinks
					desc = desc.replace(/\[\[/g, "");
					desc = desc.replace(/\]\]/g, "");

					text += line.substr(0, i).replace(/[!]/g, '*');
					text += '<html><a href="javascript:;" onClick="window.scrollToHeading(\'' + title + '\', \'' + desc+ '\', event)">' + desc+ '</a></html>\n';
				}
			}
		}
		wikify(text, span);
	}
}

window.scrollToTop = function(evt) {
	if (! evt)
		var evt = window.event;

	var target = resolveTarget(evt);
	var tiddler = story.findContainingTiddler(target);

	if (! tiddler)
		return false;

	window.scrollTo(0, ensureVisible(tiddler));

	return false;
}

window.scrollToHeading = function(title, anchorName, evt) {
	var tiddler = null;

	if (! evt)
		var evt = window.event;

	if (title) {
		story.displayTiddler(store.getTiddler(title), title, null, false);
		tiddler = document.getElementById(story.idPrefix + title);
	} else {
		var target = resolveTarget(evt);
		tiddler = story.findContainingTiddler(target);
	}

	if (tiddler == null)
		return false;
	
	var children1 = tiddler.getElementsByTagName("h1");
	var children2 = tiddler.getElementsByTagName("h2");
	var children3 = tiddler.getElementsByTagName("h3");
	var children4 = tiddler.getElementsByTagName("h4");
	var children5 = tiddler.getElementsByTagName("h5");

	var children = new Array();
	children = children.concat(children1, children2, children3, children4, children5);

	for (var i = 0; i < children.length; i++) {
		for (var j = 0; j < children[i].length; j++) {
			var heading = children[i][j].innerHTML;

			// Remove all HTML tags
			while (heading.indexOf("<") >= 0) {
				heading = heading.substring(0, heading.indexOf("<")) + heading.substring(heading.indexOf(">") + 1);
			}

			// Cut off the code added in showtoc for TOP
			heading = heading.substr(0, heading.length-6);

			if (heading == anchorName) {
				var y = findPosY(children[i][j]);
				window.scrollTo(0,y);
				return false;
			}
		}
	}
	return false
}

// add krk
setStylesheet(".dcTOC ul{color: red;list-style-type: lower-roman;}.dcTOC a{color: green;border: none;}","dcTOCStyles");
//}}}
[[@FrontPage]]
/***
|''Name:''|DeleteListPlugin|
|''Source:''|http://kuraku.net/tw/tw.html#DeleteListPlugin|
|''Author:''|KuRaKu|
|''License:''|http://creativecommons.org/licenses/by-sa/2.5/|
|''Version:''|0.1.6 (2007-06-11)|
|''~CoreVersion:''|2.2|

!!Description
tiddler をまとめて消すことができます。
@@color(red):実際に削除を行なうときにはバックアップをしてください。@@
(間違えて消えてしまっても責任は持てません)

tiddler を複数指定した場合は削除に時間がかかりますのでしばらくお待ちください。

It is possible to erase it bringing tiddler together. 
@@color(red):Please back up when you actually delete it. @@
(The responsibility cannot be taken even if disappearing by mistake. )

It takes time for the deletion and wait for a while, please when you specify two or 
more tiddler. 

!!Examples
{{{
<<deletelist [list:tagname1[,tagname2]] [check:tagname3[,tagname4]]>>
}}}
''list:'' Tag list of tiddler that wants to list
''check:'' Tag list of tiddler that wants to checked

When you want to list 'systemConfig' tag of tiddler with 'plugins' tag. 
{{{<<deletelist list:plugins check:systemConfig>>}}}

see: [[DeleteListPlugin sample|DeleteList]]

!!Tagcheck Configuration
You can set checktag of default.
Please add tiddler [[DeleteListPluginConfig]] after making systemConfig tag.
{{{
config.macros.deletelist.tags = [ "systemConfig", "systemConfigDisable", "toRSS", "today" ];
}}}
If you put "systemConfig" tag, it is necessary to put "systemConfigDisable" tag too.

!!Add OptionsPanel Coniguration
Display DeleteList in OptionsPanel: <<option chkDeleteListDisplayInOptions>>
~~if flag is true appear in OptionsPanel of sidebar.~~

!!Custom display "Wait message" or "Progress indicator"
You can set wait message.
{{{
config.macros.deletelist.waitmessage = "<blink>Wait ...</blink>";
}}}
Or set indicator animetion picture.
{{{
config.macros.deletelist.waitmessage = "<img src='http://kuraku.net/tw/indicator.white.gif'>";
}}}
Add or Create [[DeleteListPluginConfig]] and set waitmessage by html format.

!!tips
If you want to add new collectively tag, let's use this. 
You only have to make new tiddler of the content of {{{<<deletelist check:newtag>>}}}.

!!History
*2007.06.11, var 0.1.6:
**added display indicator or wait message.
**improved content of source.
**BugFix select cancel on dialog.
*2007.04.25, ver 0.1.5:
**added flag of the SystemConfig tag is displayed by default. 
**added error is displayed if there is no matched tiddler. 
**added display list tiddler tags.
**improved new parameter list and check are added.
**improved content of source.
*2007.04.16, ver 0.1.4:
**added shadow tiddler "DeleteList" (is in only {{{<<deletelist>>}}}).
**added option "chkDeleteListDisplayInOptions". if check this flag, appear "DeleteList" in options.

!!Source
/*{{{*/
version.extensions.deletelist = { major: 0, minor: 1, revision: 6, date: new Date(2007,6,11),
	source: "http://kuraku.net/tw/tw.html#DeleteListPlugin"
};

config.macros.deletelist = {};
config.macros.deletelist.version="Version %0.%1.%2".format([version.extensions.deletelist.major,version.extensions.deletelist.minor,version.extensions.deletelist.revision]);

config.macros.deletelist.tags = [];

if(config.options.chkDeleteListDisplayInOptions == undefined)
  config.options.chkDeleteListDisplayInOptions = false;

config.macros.deletelist.waitmessage = "<span style='fonze-size:0.8em;color:#d00;'><blink>>> wait a minute...</blink></span>";

config.macros.deletelist.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	var e = createTiddlyElement(place,"div");
	e.setAttribute("refresh","macro");
	e.setAttribute("macroName","deletelist");
	e.setAttribute("params",paramString);
	createTiddlyElement(place,"div","result_dlp");
	this.refresh(e,paramString);
}

config.macros.deletelist.refresh = function(place,params)
{
	var parameters = params.parseParams("name",null,true);
	var list_tags = parameters[0]["list"]?parameters[0]["list"][0].split(","):[];
	var check_tags = parameters[0]["check"]?parameters[0]["check"][0].split(","):[];

	var tagslists = [];
	tagslists = config.macros.deletelist.tags;
	if(check_tags.length > 0)
		tagslists = check_tags;

	var listViewTemplate = {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'systemConfig', field: 'systemConfig', title: 'S',  type: 'Boolean', trueText: "S", falseText: ""},
			{name: 'Title', field: 'title', tiddlerLink: 'title', title: "Title", type: 'TiddlerLink'}
		],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'warning'}
			],
		actions: [
			{caption: "More actions...", name: ''},
			{caption: "Delete these tiddlers forever", name: 'delete'}
		]};

	for(var t=0; t<tagslists.length; t++){
    	var tagname = tagslists[t];
		var tmpl = {name: tagname, field: tagname, title: tagname, type: 'TagCheckbox', tag:tagname};
		listViewTemplate.columns.push(tmpl);
	}

	var selectedRows = [];
	ListView.forEachSelector(place,function(e,rowName) {
		if(e.checked)
			selectedRows.push(e.getAttribute("rowName"));
		});

	removeChildren(place);

	tagname = params;
	var lists = [];
	var t,tiddler,p,tn;
	var configTiddlers = [];

	if(list_tags.length > 0){
		for( var i=0; i<list_tags.length; i++){
			var tagtiddlers = store.getTaggedTiddlers(list_tags[i]);
			configTiddlers = configTiddlers.concat(tagtiddlers);
		}
	}else
		configTiddlers = store.getTiddlers();

	// no match error
	if(configTiddlers.length <= 0){
		createTiddlyError(place,"Don't Match tiddler","no exist your input tagname tiddler.");
		return;
	}

	for(t=0; t<configTiddlers.length; t++){
		tiddler = configTiddlers[t];

		p = store.getTiddlerSlices(tiddler.title,["Name","Description","Version","CoreVersion","Date","Source","Author","License","Browsers"]);
		p.tiddler = tiddler;
		p.title = tiddler.title;

		for(var tl=0; tl<tagslists.length; tl++){
			tn = tagslists[tl];
			p[tn] = p.tiddler.isTagged(tagslists[tl]);
		}

		p['systemConfig'] = ( (p.tiddler.isTagged('systemConfig')) && !(p.tiddler.isTagged('systemConfigDisable')) );

		lists.push(p);
	}

	for(t=0; t<lists.length; t++){
		var p = lists[t];
		p.Selected = selectedRows.indexOf(lists[t].title) != -1;
	}

	var sysInfo = createTiddlyElement(place,"div",null,null,"S: 'systemConfig' tag and not 'systemConfigDisable' tag");
	sysInfo.setAttribute("style", "font-size:0.8em;");
	if(list_tags.length > 0){
		var listtagsInfo = createTiddlyElement(place,"div",null,null,"list tiddler tags: "+list_tags.toString().replace(",", " / "));

		listtagsInfo.setAttribute("style", "font-size:0.8em;");
	}

	if(lists.length == 0)
		createTiddlyElement(place,"em",null,null,this.noPluginText);
	else
		ListView.create(place,lists,listViewTemplate,this.onSelectCommand);

	var ver = createTiddlyElement(place,"div",null,null,"DeleteListPlugin "+config.macros.deletelist.version);
	ver.setAttribute("style", "font-size:0.8em;");
	// wait message area
	createTiddlyElement(place,"div","wait_dlp");
}

config.macros.deletelist.onSelectCommand = function(obj,command,rowNames)
{
	var t;
	var reslist = document.getElementById("result_dlp");
	var wait = document.getElementById("wait_dlp");

	switch(command) {
		case "remove":
			for(t=0; t<rowNames.length; t++)
				store.setTiddlerTag(rowNames[t],false,"systemConfig");
			break;
		case "delete":
			wait.innerHTML = config.macros.deletelist.waitmessage;

			if(rowNames.length > 0 && confirm(config.macros.plugins.confirmDeleteText.format([rowNames.join(", ")]))) {
				for(t=0; t<rowNames.length; t++) {
					store.removeTiddler(rowNames[t]);
					story.closeTiddler(rowNames[t],true,false);
				}
				//message display
				createTiddlyElement(reslist,"H5",null,null,"Delete tiddler count: "+rowNames.length+"\n");
				var disp = createTiddlyElement(reslist,"ul",null,null); 
				for(var i=0; i<rowNames.length; i++){
					createTiddlyElement(disp, "li",null,null,rowNames[i]+"\n");
				}
			}
			wait.innerHTML = "";
			break;
	}
	if(config.options.chkAutoSave)
		saveChanges(true);
}

//set shadow tiddler
config.shadowTiddlers["DeleteList"]="<<deletelist>>";
//add OptionsPanel
if( config.options.chkDeleteListDisplayInOptions){
	config.shadowTiddlers.OptionsPanel+="\nDeleteList";
}
/*}}}*/
!!Sample list
{{{
<<deletelist>>
}}}
<<deletelist>>
//{{{
config.macros.deletelist.tags = [ "toRSS", "today", "excludeLists", "excludeSearch" ];
config.macros.deletelist.waitmessage = "<img src='http://kuraku.net/tw/indicator.white.gif'>";
//}}}
/***
|''Name:''|DirtyFlagMacro|
|''Source:''|http://kuraku.net/tw/tw.html#DirtyFlagMacro|
|''Author:''|KuRaKu|
|''License:''|unknown|
|''Version:''|0.1.2 (2007-04-10)|
|''~CoreVersion:''|2.1.3|
|''Overrides:''|TiddlyWiki.prototype.setDirty|

!!Description
TW を編集中かどうかを、TiddlyWiki.dirty をチェックしてマーク表示できるマクロ。
「save 忘れを防ぐ・余計な save を減らす」ことができるはずである。

''オススメ:'' [[HoverMenu]] と使用するととても便利。

!!Examples
{{{
TW DirtyFlag is: <<dirtyflag>>
}}}
TW DirtyFlag is: <<dirtyflag>>

!!Configureration
[[DirtyFlagMacroConfig]] を作成することにより、マークの書式が変更できる。
{{{
config.macros.dirtyflag.flagT = "#";
config.macros.dirtyflag.flagF = "";
config.macros.dirtyflag.style = "color: #f00; font-size: 1.2em;";
}}}

!!Source
/*{{{*/
version.extensions.dirtyflag = { major: 0, minor: 1, revision: 2, date: new Date(2007,4,10),
	source: "http://kuraku.net/tw/tw.html#DirtyFlagMacro"
};

config.macros.dirtyflag = {};
config.macros.dirtyflag.flagT = "*";
config.macros.dirtyflag.flagF = "";
config.macros.dirtyflag.style = "color: #000;";
config.macros.dirtyflag.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	var e = createTiddlyElement(place,"span");
	e.setAttribute("refresh","macro");
	e.setAttribute("macroName","dirtyflag");
	e.setAttribute("name","dirtyFlag");
	e.setAttribute("style", config.macros.dirtyflag.style);
	this.changeMark();
}

config.macros.dirtyflag.changeMark = function()
{
	// get dirtyflag
	var dirty = ((store && store.isDirty && store.isDirty()) 
				|| (story && story.areAnyDirty && story.areAnyDirty()));
	// change dirtyflag mark
	var dcheck = document.getElementsByName("dirtyFlag");
	if(dcheck){
		var flagT = config.macros.dirtyflag.flagT;
		var flagF = config.macros.dirtyflag.flagF;
		for(var i=0; i<dcheck.length; i++){
			if(dirty == true){
				dcheck[i].innerHTML = flagT;
			}else if(dirty == false){
				dcheck[i].innerHTML = flagF;
			}
		}
	}
}

TiddlyWiki.prototype.setDirty = function(dirty)
{
	this.dirty = dirty;

	// added check & display
	config.macros.dirtyflag.changeMark();
}
/*}}}*/
/*{{{*/
config.macros.dirtyflag.style = "color: #f00;";
/*}}}*/
JavaScript
/***
|Name|DisableWikiLinksPlugin|
|Source|http://www.TiddlyTools.com/#DisableWikiLinksPlugin|
|Version|1.4.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Tiddler.prototype.autoLinkWikiWords, 'wikiLink' formatter|
|Description|selectively disable TiddlyWiki's automatic ~WikiWord linking behavior|

This 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 {{{[[...]]}}}.

You can also block automatic WikiWord linking behavior only for non-existing tiddler titles, while still automatically 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]], 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.  

Note: 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)

!!!!!Configuration
<<<
Self-contained control panel:
<<option chkDisableNonExistingWikiLinks>> Disable automatic WikiWord links for non-existing tiddlers
<<option chkDisableWikiLinks>> Disable ALL automatic WikiWord tiddler links
<<option chkAllowLinksFromShadowTiddlers>> ... except for WikiWords contained in shadow tiddlers
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''DisableWikiLinksPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2006.12.31 [1.4.0]'' in formatter, test for chkDisableNonExistingWikiLinks
''2006.12.09 [1.3.0]'' in formatter, test for excluded wiki words specified in DisableWikiLinksList
''2006.12.09 [1.2.2]'' fix logic in autoLinkWikiWords() (was allowing links TO shadow tiddlers, even when chkDisableWikiLinks is TRUE).  
''2006.12.09 [1.2.1]'' revised logic for handling links in shadow content
''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
''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)
''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
''2005.12.09 [1.0.0]'' initial release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.disableWikiLinks= {major: 1, minor: 4, revision: 0, date: new Date(2006,12,31)};

if (config.options.chkDisableNonExistingWikiLinks==undefined) config.options.chkDisableNonExistingWikiLinks= false;
if (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks= false;
if (config.options.chkAllowLinksFromShadowTiddlers==undefined) config.options.chkAllowLinksFromShadowTiddlers=true;

// find the formatter for wikiLink and replace handler with 'pass-thru' rendering
initDisableWikiLinksFormatter();
function initDisableWikiLinksFormatter() {
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="wikiLink"; i++);
	config.formatters[i].coreHandler=config.formatters[i].handler;
	config.formatters[i].handler=function(w) {
		// supress any leading "~" (if present)
		var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;
		var title=w.matchText.substr(skip);
		var exists=store.tiddlerExists(title);
		var inShadow=w.tiddler && store.isShadowTiddler(w.tiddler.title);

		// check for specific excluded wiki words
		var t=store.getTiddlerText("DisableWikiLinksList")
		if (t && t.length && t.indexOf(w.matchText)!=-1)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }

		// if not disabling links from shadows (default setting)
		if (config.options.chkAllowLinksFromShadowTiddlers && inShadow)
			return this.coreHandler(w);

		// check for non-existing non-shadow tiddler
		if (config.options.chkDisableNonExistingWikiLinks && !exists)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }

		// if not enabled, just do standard WikiWord link formatting
		if (!config.options.chkDisableWikiLinks)
			return this.coreHandler(w);

		// just return text without linking
		w.outputText(w.output,w.matchStart+skip,w.nextMatch)
	}
}

Tiddler.prototype.coreAutoLinkWikiWords = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function()
{
	// DEBUG alert("processing: "+this.title);
	// if all automatic links are not disabled, just return results from core function
	if (!config.options.chkDisableWikiLinks)
		return this.coreAutoLinkWikiWords.apply(this,arguments);
	return false;
}
//}}}
/***
''Usage:''
{{{
<<displaydialy [days count:default 3]>>
}}}
''Source:''
***/
/*{{{*/
config.macros.displaydiary = {};
config.macros.displaydiary.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
  var tiddlers = store.reverseLookup("tags","excludeLists",false,"title");
  var cnt = params[0]?params[0]:3;
  var dsptid = [];

  for(var t=tiddlers.length-1; t>=0; t--) {
    var diary = tiddlers[t];
    if(diary.title.match(/^\d\d\d\d\.\d\d\.\d\d/)) {
      dsptid.push(diary);
      cnt--;
    }
    if(cnt<=0)
      break;
  }

  for(var t=0; t<dsptid.length; t++) {
      var tid = dsptid[t];
      story.displayTiddler("bottom", tid.title);
  }
}
/*}}}*/
<div align='right'><span class='toolbar' macro='tiddler QuickEditToolbar'></span>
<span class='toolbar' macro='toolbar deleteTiddler helptext saveCloseTiddler cancelCloseTiddler +saveTiddler -cancelTiddler'></span></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div><div class='editor' macro='edit tags'></div>
<div class='editor' macro='edit text'></div>
<!-- add 'autosizeEditor' command to end of existing editor toolbar definition -->
<!-- <div class='toolbar' macro='toolbar ... autosizeEditor wikibar'> -->
<!-- add span with 'resizeEditor' macro anywhere in the edit template -->
<span macro='resizeEditor'></span></div>
version.extensions.favicon = {major: 0, minor: 1, revision: 0, date:
"18 July 2005"};
var n = document.createElement("link");
n.rel = "shortcut icon";
n.href = "http://kuraku.net/tw/KRKCLip.ico";
//n.href = "http://kuraku.net/tw/favicon7.ico";
document.getElementsByTagName("head")[0].appendChild(n);
<<saveChanges>><<upload http://tw.kuraku.net/store.cgi clip.html backup .>>

Username: <<option txtUploadUserName>>
Password: <<option pasUploadPassword>>

----
[[download|http://tw.kuraku.net/download.cgi?file=clip.html]]
''filckrs image format example:''
{{{<a href="http://www.flickr.com/photos/kuraku/450767452/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/204/450767452_adf677efc6_m.jpg" width="240" height="161" alt="FH000015" /></a>}}}
<script>
config.flickr2twimg = {
	format: function(){
		var fimg = document.getElementById('fimg').value;
		if(fimg.length <= 0 || !fimg.match(/\.flickr\./i) ){
			alert("Please input flickr img tag!!"); 
			return;
		}
		var getlink = fimg.match(/href=\"([^\"]+)\".*src=\"([^\"]+)\"/);
		if(!getlink){
			alert("Don't Match link or image source or both!!"); 
			return;
		}
		var twimg = "[img["+getlink[2]+"]["+getlink[1]+"]]";
		document.getElementById('timg').value = twimg;
		document.getElementById('timg').focus();
		document.getElementById('timg').select();
		document.getElementById("img").innerHTML=fimg;
	}
}
</script>
<html>
INPUT flickr image tag:
<form name="flickr_img_link">
<textarea id="fimg" style="width:90%; height:3; font-size:1.0em"></textarea>
</form>
<p>
<input type="button" value=" format for tw image " onclick='config.flickr2twimg.format();'>&nbsp;&nbsp;
<input type="button" value=" clear " onclick='document.getElementById(
"fimg").value="";document.getElementById("timg").value="";document.getElementById("img").innerHTML="";'>
<p>
<div id="img"></div>
<form name="tw_img_link">
<textarea id="timg" style="width:90%; height:3; font-size:1.0em"></textarea>
</form>
</html>
/***
|Name|FontSizePlugin|
|Created by|SaqImtiaz|
|Location|http://lewcid.googlepages.com/lewcid.html#FontSizePlugin|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Resize tiddler text on the fly. The text size is remembered between sessions by use of a cookie.
You can customize the maximum and minimum allowed sizes.
(only affects tiddler content text, not any other text)

Also, you can load a TW file with a font-size specified in the url.
Eg: http://lewcid.googlepages.com/lewcid.html#font:110

!Demo:
Try using the font-size buttons in the sidebar, or in the MainMenu above.

!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Then put {{{<<fontSize "font-size:">>}}} in your SideBarOptions tiddler, or anywhere else that you might like.

!Usage
{{{<<fontSize>>}}} results in <<fontSize>>
{{{<<fontSize font-size: >>}}} results in <<fontSize font-size:>>

!Customizing:
The buttons and prefix text are wrapped in a span with class fontResizer, for easy css styling.
To change the default font-size, and the maximum and minimum font-size allowed, edit the config.fontSize.settings section of the code below.

!Notes:
This plugin assumes that the initial font-size is 100% and then increases or decreases the size by 10%. This stepsize of 10% can also be customized.

!History:
*27-07-06, version 1.0 : prevented double clicks from triggering editing of containing tiddler.
*25-07-06, version 0.9

!Code
***/

//{{{
config.fontSize={};

//configuration settings
config.fontSize.settings =
{
 defaultSize : 100, // all sizes in %
 maxSize : 200,
 minSize : 40,
 stepSize : 10
};

//startup code
var fontSettings = config.fontSize.settings;

if (!config.options.txtFontSize)
 {config.options.txtFontSize = fontSettings.defaultSize;
 saveOptionCookie("txtFontSize");}
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
setStylesheet("#contentWrapper .fontResizer .button {display:inline;font-size:105%; font-weight:bold; margin:0 1px; padding: 0 3px; text-align:center !important;}\n .fontResizer {margin:0 0.5em;}","fontResizerButtonStyles");

//macro
config.macros.fontSize={};
config.macros.fontSize.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{

 var sp = createTiddlyElement(place,"span",null,"fontResizer");
 sp.ondblclick=this.onDblClick;
 if (params[0])
 createTiddlyText(sp,params[0]);
 createTiddlyButton(sp,"+","increase font-size",this.incFont);
 createTiddlyButton(sp,"=","reset font-size",this.resetFont);
 createTiddlyButton(sp,"–","decrease font-size",this.decFont);
}

config.macros.fontSize.onDblClick = function (e)
{
 if (!e) var e = window.event;
 e.cancelBubble = true;
 if (e.stopPropagation) e.stopPropagation();
 return false;
}

config.macros.fontSize.setFont = function ()
{
 saveOptionCookie("txtFontSize");
 setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
}

config.macros.fontSize.incFont=function()
{
 if (config.options.txtFontSize < fontSettings.maxSize)
 config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;
 config.macros.fontSize.setFont();
}

config.macros.fontSize.decFont=function()
{

 if (config.options.txtFontSize > fontSettings.minSize)
 config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;
 config.macros.fontSize.setFont();
}

config.macros.fontSize.resetFont=function()
{

 config.options.txtFontSize=fontSettings.defaultSize;
 config.macros.fontSize.setFont();
}

config.paramifiers.font =
{
 onstart: function(v)
 {
 config.options.txtFontSize = v;
 config.macros.fontSize.setFont();
 }
};
//}}}
FontSizePlugin は、サイトのフォントサイズを変えるインターフェースを提供する。

{{{<<fontSize>>}}} で <<fontSize>>
{{{<<fontSize font-size: >>}}} で <<fontSize font-size:>>

SideBarOptions に付けてはみたものの滅多に使わないです。
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.7 (2007-03-28)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

''Syntax:'' 
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//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.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].

!Revision history
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** 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.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features: 
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) 
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features: 
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs: 
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features: 
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version

!Code
***/
//{{{

	
//============================================================================
//============================================================================
//		   ForEachTiddlerPlugin
//============================================================================
//============================================================================

// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {

if (!window.abego) window.abego = {};

version.extensions.ForEachTiddlerPlugin = {
	major: 1, minor: 0, revision: 7, 
	date: new Date(2007,2,28), 
	source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
	licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
	copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"
};

// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
	TiddlyWiki.prototype.forEachTiddler = function(callback) {
		for(var t in this.tiddlers) {
			callback.call(this,t,this.tiddlers[t]);
		}
	};
}

//============================================================================
// forEachTiddler Macro
//============================================================================

version.extensions.forEachTiddler = {
	major: 1, minor: 0, revision: 7, date: new Date(2007,2,28), provider: "http://tiddlywiki.abego-software.de"};

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler = {
	 // Standard Properties
	 label: "forEachTiddler",
	 prompt: "Perform actions on a (sorted) selection of tiddlers",

	 // actions
	 actions: {
		 addToList: {},
		 write: {}
	 }
};

// ---------------------------------------------------------------------------
//  The forEachTiddler Macro Handler 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler.getContainingTiddler = function(e) {
	while(e && !hasClass(e,"tiddler"))
		e = e.parentNode;
	var title = e ? e.getAttribute("tiddler") : null; 
	return title ? store.getTiddler(title) : null;
};

config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);

	if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params
	// Parse the "in" clause
	var tiddlyWikiPath = undefined;
	if ((i < params.length) && params[i] == "in") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "TiddlyWiki path expected behind 'in'.");
			return;
		}
		tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the where clause
	var whereClause ="true";
	if ((i < params.length) && params[i] == "where") {
		i++;
		whereClause = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the sort stuff
	var sortClause = null;
	var sortAscending = true; 
	if ((i < params.length) && params[i] == "sortBy") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "sortClause missing behind 'sortBy'.");
			return;
		}
		sortClause = this.paramEncode(params[i]);
		i++;

		if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
			 sortAscending = params[i] == "ascending";
			 i++;
		}
	}

	// Parse the script
	var scriptText = null;
	if ((i < params.length) && params[i] == "script") {
		i++;
		scriptText = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the action. 
	// When we are already at the end use the default action
	var actionName = "addToList";
	if (i < params.length) {
	   if (!config.macros.forEachTiddler.actions[params[i]]) {
			this.handleError(place, "Unknown action '"+params[i]+"'.");
			return;
		} else {
			actionName = params[i]; 
			i++;
		}
	} 
	
	// Get the action parameter
	// (the parsing is done inside the individual action implementation.)
	var actionParameter = params.slice(i);


	// --- Processing ------------------------------------------
	try {
		this.performMacro({
				place: place, 
				inTiddler: tiddler,
				whereClause: whereClause, 
				sortClause: sortClause, 
				sortAscending: sortAscending, 
				actionName: actionName, 
				actionParameter: actionParameter, 
				scriptText: scriptText, 
				tiddlyWikiPath: tiddlyWikiPath});

	} catch (e) {
		this.handleError(place, e);
	}
};

// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {

	var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);

	var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
	context["tiddlyWiki"] = tiddlyWiki;
	
	// Get the tiddlers, as defined by the whereClause
	var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
	context["tiddlers"] = tiddlers;

	// Sort the tiddlers, when sorting is required.
	if (parameter.sortClause) {
		this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
	}

	return {tiddlers: tiddlers, context: context};
};

// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
	return this.getTiddlersAndContext(parameter).tiddlers;
};

// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
//				  The following properties are supported:
//
//						place
//						whereClause
//						sortClause
//						sortAscending
//						actionName
//						actionParameter
//						scriptText
//						tiddlyWikiPath
//
//					All properties are optional. 
//					For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
	var tiddlersAndContext = this.getTiddlersAndContext(parameter);

	// Perform the action
	var actionName = parameter.actionName ? parameter.actionName : "addToList";
	var action = config.macros.forEachTiddler.actions[actionName];
	if (!action) {
		this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
		return;
	}

	var actionHandler = action.handler;
	actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};

// ---------------------------------------------------------------------------
//  The actions 
// ---------------------------------------------------------------------------

// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;

	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
		return;
	}

	// Perform the action.
	var list = document.createElement("ul");
	place.appendChild(list);
	for (var i = 0; i < tiddlers.length; i++) {
		var tiddler = tiddlers[i];
		var listItem = document.createElement("li");
		list.appendChild(listItem);
		createTiddlyLink(listItem, tiddler.title, true);
	}
};

abego.parseNamedParameter = function(name, parameter, i) {
	var beginExpression = null;
	if ((i < parameter.length) && parameter[i] == name) {
		i++;
		if (i >= parameter.length) {
			throw "Missing text behind '%0'".format([name]);
		}
		
		return config.macros.forEachTiddler.paramEncode(parameter[i]);
	}
	return null;
}

// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;
	if (p >= parameter.length) {
		this.handleError(place, "Missing expression behind 'write'.");
		return;
	}

	var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
	p++;

	// Parse the "begin" option
	var beginExpression = abego.parseNamedParameter("begin", parameter, p);
	if (beginExpression !== null) 
		p += 2;
	var endExpression = abego.parseNamedParameter("end", parameter, p);
	if (endExpression !== null) 
		p += 2;
	var noneExpression = abego.parseNamedParameter("none", parameter, p);
	if (noneExpression !== null) 
		p += 2;

	// Parse the "toFile" option
	var filename = null;
	var lineSeparator = undefined;
	if ((p < parameter.length) && parameter[p] == "toFile") {
		p++;
		if (p >= parameter.length) {
			this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
			return;
		}
		
		filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
		p++;
		if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
			p++;
			if (p >= parameter.length) {
				this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
				return;
			}
			lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
			p++;
		}
	}
	
	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
		return;
	}

	// Perform the action.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
	var count = tiddlers.length;
	var text = "";
	if (count > 0 && beginExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
	
	for (var i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		text += func(tiddler, context, count, i);
	}
	
	if (count > 0 && endExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);

	if (count == 0 && noneExpression) 
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
		

	if (filename) {
		if (lineSeparator !== undefined) {
			lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
			text = text.replace(/\n/mg,lineSeparator);
		}
		saveFile(filename, convertUnicodeToUTF8(text));
	} else {
		var wrapper = createTiddlyElement(place, "span");
		wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
	}
};


// ---------------------------------------------------------------------------
//  Helpers
// ---------------------------------------------------------------------------

// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
	return {
		place : placeParam, 
		whereClause : whereClauseParam, 
		sortClause : sortClauseParam, 
		sortAscending : sortAscendingParam, 
		script : scriptText,
		actionName : actionNameParam, 
		actionParameter : actionParameterParam,
		tiddlyWikiPath : tiddlyWikiPathParam,
		inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
		viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
	};
};

// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of 
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
	if (!idPrefix) {
		idPrefix = "store";
	}
	var lenPrefix = idPrefix.length;
	
	// Read the content of the given file
	var content = loadFile(this.getLocalPath(path));
	if(content === null) {
		throw "TiddlyWiki '"+path+"' not found.";
	}
	
	var tiddlyWiki = new TiddlyWiki();

	// Starting with TW 2.2 there is a helper function to import the tiddlers
	if (tiddlyWiki.importTiddlyWiki) {
		var errorText = tiddlyWiki.importTiddlyWiki(content);
		if (errorText)
			throw "File '"+path+"' is not a TiddlyWiki.";
		tiddlyWiki.dirty = false;
		return tiddlyWiki;
	}
	
	// The legacy code, for TW < 2.2
	
	// Locate the storeArea div's
	var posOpeningDiv = content.indexOf(startSaveArea);
	var posClosingDiv = content.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
		throw "File '"+path+"' is not a TiddlyWiki.";
	}
	var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
	
	// Create a "div" element that contains the storage text
	var myStorageDiv = document.createElement("div");
	myStorageDiv.innerHTML = storageText;
	myStorageDiv.normalize();
	
	// Create all tiddlers in a new TiddlyWiki
	// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
	var store = myStorageDiv.childNodes;
	for(var t = 0; t < store.length; t++) {
		var e = store[t];
		var title = null;
		if(e.getAttribute)
			title = e.getAttribute("tiddler");
		if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
			title = e.id.substr(lenPrefix);
		if(title && title !== "") {
			var tiddler = tiddlyWiki.createTiddler(title);
			tiddler.loadFromDiv(e,title);
		}
	}
	tiddlyWiki.dirty = false;

	return tiddlyWiki;
};


	
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
// 
//	 (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
	var script = context["script"];
	var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
	var fullText = (script ? script+";" : "")+functionText+";theFunction;";
	return eval(fullText);
};

// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
	var result = [];
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
	tiddlyWiki.forEachTiddler(function(title,tiddler) {
		if (func(tiddler, context, undefined, undefined)) {
			result.push(tiddler);
		}
	});
	return result;
};

// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
	var message = "Extra parameter behind '"+actionName+"':";
	for (var i = firstUnusedIndex; i < parameter.length; i++) {
		message += " "+parameter[i];
	}
	this.handleError(place, message);
};

// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? -1 
			   : +1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? +1 
			   : -1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
	// To avoid evaluating the sortClause whenever two items are compared 
	// we pre-calculate the sortValue for every item in the array and store it in a 
	// temporary property ("forEachTiddlerSortValue") of the tiddlers.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
	var count = tiddlers.length;
	var i;
	for (i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
	}

	// Do the sorting
	tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);

	// Delete the temporary property that holds the sortValue.	
	for (i = 0; i < tiddlers.length; i++) {
		delete tiddlers[i].forEachTiddlerSortValue;
	}
};


// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
	displayMessage(message);
};

// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
	var message ="<<"+macroName;
	for (var i = 0; i < params.length; i++) {
		message += " "+params[i];
	}
	message += ">>";
	displayMessage(message);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
	var message = (exception.description) ? exception.description : exception.toString();
	return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};

// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
	if (place) {
		this.createErrorElement(place, exception);
	} else {
		throw exception;
	}
};

// Internal.
//
// Encodes the given string.
//
// Replaces 
//	 "$))" to ">>"
//	 "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
	var reGTGT = new RegExp("\\$\\)\\)","mg");
	var reGT = new RegExp("\\$\\)","mg");
	return s.replace(reGTGT, ">>").replace(reGT, ">");
};

// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
// 
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
	// Remove any location part of the URL
	var hashPos = originalPath.indexOf("#");
	if(hashPos != -1)
		originalPath = originalPath.substr(0,hashPos);
	// Convert to a native file format assuming
	// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
	// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
	// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
	// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
	var localPath;
	if(originalPath.charAt(9) == ":") // pc local file
		localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
		localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(7));
	else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(5));
	else // pc network file
		localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");	
	return localPath;
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
	".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
	"forEachTiddler");

//============================================================================
// End of forEachTiddler Macro
//============================================================================


//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
	var n =  prefix.length;
	return (this.length >= n) && (this.slice(0, n) == prefix);
};



//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
	var n = suffix.length;
	return (this.length >= n) && (this.right(n) == suffix);
};


//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
	return this.indexOf(substring) >= 0;
};

//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or 
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == item) {
			return i;
		}
	}
	return -1;
};

//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false. 
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
	return (this.indexOf(item) >= 0);
};

//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements 
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (this.contains(items[i])) {
			return true;
		}
	}
	return false;
};


//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
// 
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null] 
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (!this.contains(items[i])) {
			return false;
		}
	}
	return true;
};


} // of "install only once"

// Used Globals (for JSLint) ==============
// ... DOM
/*global 	document */
// ... TiddlyWiki Core
/*global 	convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, 
			displayMessage, endSaveArea, hasClass, loadFile, saveFile, 
			startSaveArea, store, wikify */
//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/

ForEachTiddlerPlugin は tiddler を様々な条件でリストすることができる。
「ある tag がついている tiddler でタイトルに XX を含まないものをリスト」など可能。

''plugin より syntax''
{{{
<<forEachTiddler [in tiddlyWikiPath]
 [where whereCondition]
 [sortBy sortExpression [ascending or descending]]
 [script scriptText]
 [action [actionParameters]]>>
}}}

!!![[FrontPage]] の recent 20 tiddlers
{{{
<<forEachTiddler
 where 'tiddler.title!="UploadLog"'
 sortBy 'tiddler.modified' descending 
 script 'function tagsLine(tiddler){var tags=tiddler.tags; var result=""; for (var i = 0; i < tags.length;i++) {result += (i==0)?"/"+tags[i] + "/": tags[i]+"/";} return result;}'
 write '(index<20?"*[["+tiddler.title+"]]@@color:#999;font-size:90%;" +tiddler.modified.formatString(" - YY.MM.DD 0hh:0mm")+" (created "+tiddler.created.formatString("YY.MM.DD")+") {{{"+tagsLine(tiddler)+"}}}@@\n" : "")'
>>
}}}
*[[UploadLog]] を除外している (where)
*さいきん修正されたもの順 (sortBy)
*tag をすべて並べる function (script)
*20までのものを表示、作成日、更新日、tag を出力 (write)
''実際のリスト:'' +++[recent 20 tiddlers...]<<forEachTiddler
 where 'tiddler.title!="UploadLog"'
 sortBy 'tiddler.modified' descending 
 script 'function tagsLine(tiddler){var tags=tiddler.tags; var result=""; for (var i = 0; i < tags.length;i++) {result += (i==0)?"/"+tags[i] + "/": tags[i]+"/";} return result;}'
 write '(index<20?"*[["+tiddler.title+"]]@@color:#999;font-size:90%;" +tiddler.modified.formatString(" - YY.MM.DD 0hh:0mm")+" (created "+tiddler.created.formatString("YY.MM.DD")+") {{{"+tagsLine(tiddler)+"}}}@@\n" : "")'
>>===


!!![[toRSS]] のチェックリスト
{{{
<<forEachTiddler 
 where 'tiddler.title!="UploadLog" && tiddler.title!="toRSS"'
 sortBy 'tiddler.modified' descending 
 write '(index==0?"| !toRSS | !title | !modified date |\n":"")+(index<20?"|[ ("+tiddler.title+"|toRSS)]|[["+tiddler.title+"]]|"+tiddler.modified.formatString("YY.0MM.0DD-0hh:0mm")+"|\n":"")'
>>
}}}
*[[UploadLog]] [[toRSS]] を除外 (where)
*さいきん修正されたもの順 (sortBy)
*最初の行(0) に table のヘッダを出力
*20行まで table 表示
''実際のリスト:'' +++[toRSS list...]<<forEachTiddler 
 where 'tiddler.title!="UploadLog" && tiddler.title!="toRSS"'
 sortBy 'tiddler.modified' descending 
 write '(index==0?"| !toRSS | !title | !modified date |\n":"")+(index<20?"|[ ("+tiddler.title+"|toRSS)]|[["+tiddler.title+"]]|"+tiddler.modified.formatString("YY.0MM.0DD-0hh:0mm")+"|\n":"")'
>>===


!!サンプル
他の例はやはりこちらを見てもらうしかない。
[[ForEachTiddlerMacroExamples|http://tiddlywiki.abego-software.de/#ForEachTiddlerExamples]]
入口はこちら http://kuraku.net/tw/clip.html

[[Firefox|http://www.mozilla-japan.org/products/firefox/central.html]] 推奨です。他のブラウザでは確認しておりません。~~(とりあえず、IE ではきちんと表示されない部分があります。IE の方は左⇒の~SideBarから日記(日付のもの)などクリックしてください)~~
<html><a href="http://www.mozilla-japan.org/products/firefox/" target=_blank><img border="0" alt="Get Firefox!" title="Get Firefox!" src="http://sfx-images.mozilla.org/affiliates/Buttons/80x15/white_1.gif"/></a></html>
コメント・トラックバック可能です。

*[[Whats new]]
*''Recent Diary:'' <<tiddlerList search:"^200\d.\d\d.\d\d$" tiddlerList top:"3" itemTemplate:"%link+++^\n%text\n===" separator:" / " order:"-created">>
*[[RSS feed|clip.xml]] (RSS に出力するもの <<tag toRSS>>)
''Reminder:''
<<showReminders leadtime:30 tag:"!holidays">>
----
/% ----- Counter ----- %/~~<html><div align="right">
total:<img src="http://sv78.lolipop.jp/cnt/accnt.php?cnt_id=1228246&ac_id=LA11052066&mode=total"><br>
today:<img src="http://sv78.lolipop.jp/cnt/accnt.php?cnt_id=1228246&ac_id=LA11052066&mode=today"> / yesterday:<img src="http://sv78.lolipop.jp/cnt/accnt.php?cnt_id=1228246&ac_id=LA11052066&mode=yesterday">
</div></html>[ (toRSS)]toRSS
''Recent 20 tiddlers:'' <<tiddlerList top:"20" separator:" / " format:"span" order:"-modified" title:"[^UploadLog]">>
~~
<html><a href="http://www.haloscan.com/"><img width="88" height="31" src="http://www.haloscan.com/halolink.gif" border="0" alt="Weblog Commenting and Trackback by HaloScan.com" target=_blank></a></html>^^+++^<<tiddler HaloscanRSS>>
===^^
/***
|''Name:''|GenerateRssHijack|
|''Description:''|Generate an RSSFeed with plaintext, html and TiddlyWiki content|
|''Version:''|0.1.4|
|''Date:''|Oct 23, 2006|
|''Source:''|http://tiddlywiki.bidix.info/#GenerateRssHijack|
|''Documentation:''|http://tiddlywiki.bidix.info/#GenerateRssHijackDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.0.0|
|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|
|''Include:''|none|
|''Require:''|none|
***/
//{{{
version.extensions.GenerateRssHijack= {
	major: 0, minor: 1, revision: 3, 
	date: new Date(2006,9,29),
	source: 'http://tiddlywiki.bidix.info/#GenerateRssHijack',
	documentation: 'http://tiddlywiki.bidix.info/#GenerateRssHijackDoc',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.0.0',
	browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'	
};

// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlersTaggedWith = function(field,includeTag)
{
	var results = [];
	this.forEachTiddler(function(title,tiddler) {
		if(tiddler.tags.find(includeTag) != null)
			results.push(tiddler);
		});
	if(field)
		results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });
	return results;
}

// generate RSS file with tiddlers tagged with toRSS
window.generateRss_ori = window.generateRss;
window.generateRss = function ()
{
	var s = [];
	var d = new Date();
	var u = store.getTiddlerText("SiteUrl",null);
	// Assemble the header 
	s.push("<" + "?xml version=\"1.0\"" + " encoding='UTF-8'" + "?>");
	s.push("<rss version=\"2.0\" xmlns:tiddlywiki=\"http://tiddlywiki.bidix.info/#TiddlyWikiNamespace\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\">");
	s.push("<channel>");
	s.push("<title>" + wikifyPlain("SiteTitle").htmlEncode() + "</title>");
	if(u)
		s.push("<link>" + u.htmlEncode() + "</link>");
	s.push("<description>" + wikifyPlain("SiteSubtitle").htmlEncode() + "</description>");
	s.push("<language>en-us</language>");
	s.push("<copyright>Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + "</copyright>");
	s.push("<pubDate>" + d.toGMTString() + "</pubDate>");
	s.push("<lastBuildDate>" + d.toGMTString() + "</lastBuildDate>");
	s.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");
	s.push("<generator>TiddlyWiki " + version.major + "." + version.minor + "." + version.revision + "</generator>");
	// The body
	var tiddlers = store.getTiddlersTaggedWith("modified","toRSS");
	var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;
	for (var t=tiddlers.length-1; t>=n; t--)
		s.push(tiddlers[t].saveToRss(u));
	// And footer
	s.push("</channel>");
	s.push("</rss>");
	// Save it all
	return s.join("\n");
}

Tiddler.prototype.getAsInnerHTML = function() {
 var wrapper = createTiddlyElement(document.body,"span",null,null);
 wikify(this.text,wrapper ,null,this);
 var text = wrapper.innerHTML;
 wrapper.parentNode.removeChild(wrapper);
 //replace tddlylink with externallink
 var u = store.getTiddlerText("SiteUrl",null);
var pattern;
var substitution;
 if ((version.major = 2) && (version.minor > 0)) {
 	pattern = /<a\s+tiddlylink="([^"]+)"\s+refresh="link"\s+class=\"([^"]+)\"\s+title=\"([^"]+)\"\s+href="([^"]+)"/mg;
 	substitution = "<a href=\""+u+"#[[$1]]\" class=\"$2\" title=\"$3\" tiddlylink=\"$1\" refresh=\"link\" ";
 }
 else {
	pattern = /<a\s+tiddlylink="([^"]+)"\s+refresh="link"\s+title="([^"]+)"\s+href="([^"]+)"/mg;
	substitution = "<a tiddlylink=\"$1\" refresh=\"link\" title=\"$2\" href=\""+u+"#[[$1]]\"";
 }
 text = text.replace(pattern, substitution);
 return text;
};

Tiddler.prototype.saveToRss = function(url)
{
	var s = [];
	s.push("<item>");
	s.push("<title>" + this.title.htmlEncode() + "</title>");
	//plain text
	s.push("<description>" + this.text.replace(regexpNewLine,"<br />").htmlEncode() + "</description>");
	// html text
	s.push("<content:encoded><![CDATA[	" + this.getAsInnerHTML() +"]]></content:encoded>");
	// tiddler
	s.push("<tiddlywiki:title>" + this.title.htmlEncode() + "</tiddlywiki:title>");
	s.push("<tiddlywiki:wikitext>" + this.text.htmlEncode() + "</tiddlywiki:wikitext>");
	s.push("<tiddlywiki:modifier>" + this.modifier.htmlEncode() + "</tiddlywiki:modifier>");
	s.push("<tiddlywiki:modified>" + this.modified.convertToYYYYMMDDHHMM() + "</tiddlywiki:modified>");
	s.push("<tiddlywiki:created>" + this.created.convertToYYYYMMDDHHMM() + "</tiddlywiki:created>");
	//s.push("<tiddlywiki:links>" + this.text.htmlEncode() + "</tiddlywiki:links>");
	s.push("<tiddlywiki:tags>" + this.getTags().htmlEncode() + "</tiddlywiki:tags>");
	for(var t=0; t<this.tags.length; t++)
		s.push("<category>" + this.tags[t] + "</category>");
	s.push("<link>" + url + "#" + encodeURIComponent(String.encodeTiddlyLink(this.title)) + "</link>");
	s.push("<pubDate>" + this.modified.toGMTString() + "</pubDate>");
	s.push("</item>");
	return(s.join("\n"));
}
//}}}
/***
http://tiddlystyles.com/#theme:Flickr
!General Rules
***/

/*{{{*/
* {
 margin: 0px;
}

#displayArea {
 margin: 1em 17em 0em 2em;
}

a,
.button{
 color: #0063dc;
 text-decoration: none;
 background: transparent;
 border: 0;
}

a:hover, a:active, a.button:hover {
 color: #ff0084;
 background: transparent;
}
/*}}}*/
/***
!Header /%====================================================================================%/
***/
/*{{{*/
#header {
 color: #ff0084;
 padding: 0px;
}

#titleline{
 background-color: transparent;
 padding:0;
 border-bottom: 2px dotted #ccc;
}

#siteTitle {
 font-size: 2.5em;
 color: #0063dc;
}

#siteSubtitle {
 color: #ff0084;
}

#titleLine a{
 color: #0063dc;
}

#titleLine a:hover{
 color: #ff0084;
}
/*}}}*/
/***
!Popup /%====================================================================================%/
***/
/*{{{*/
#popup{
 background-color: #fff;
}

#popup hr{
 color: #e6e6e6;
}

#popup a{
 color: #ff0084;
 background-color: #fff;
}

#popup a:hover{
 color: #0063dc;
 background-color: #fff;
}
/*}}}*/
/***
|Name|GotoPlugin|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Version|1.3.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|view any tiddler by entering it's title - displays list of possible matches|

''View a tiddler by typing its title and pressing //enter//.''  Input just enough to uniquely match a single tiddler title and ''press //enter// to auto-complete the title for you!!''  If multiple titles match your input, a list is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press //escape// to close the listbox to resume typing.  When the listbox is ''//not//'' being displayed, press //escape// to clear the current text input and start over.

Note: ''At any time, you can move the focus directly to the text input field by using the ~ALT-G keyboard shortcut.''
!!!!!Examples
<<<
syntax: {{{<<goto quiet insert inputstyle liststyle>>}}}
All parameters are optional.
* ''quiet'' prevents //automatic// display of the list as each character is typed.  To view the list when ''quiet'', use //down// or //enter//.
* ''insert'' causes the selected tiddler title to be inserted into the tiddler source currently being edited (use with EditTemplate)
* ''inputstyle'' and ''liststyle'' are CSS declarations that modify the default input and listbox styles.  Note: styles containing spaces must be surrounded by ({{{"..."}}} or {{{'...'}}}) or ({{{[[...]]}}}).
{{{<<goto>>}}}
<<goto>>
{{{<<goto quiet>>}}}
<<goto quiet>>
{{{<<goto width:20em width:20em>>}}}
<<goto width:20em width:20em>>

You can also invoke the macro with the "insert" keyword.  When used in the [[EditTemplate]], like this:
{{{
<span macro="goto insert"></span>
}}}
it allows you to type/select a tiddler title, and instantly insert a link to that title (e.g. {{{[[TiddlerName]]}}}) into the tiddler source being edited.
<<<
!!!!!Configuration
<<<
The following ~TiddlyWiki search options (see AdvancedOptions) are applied when matching tiddler titles:
><<option chkRegExpSearch>> use regular expressions (text patterns)
><<option chkCaseSensitiveSearch>> use case sensitive matching
You can also create a tiddler tagged with <<tag systemConfig>> to control listing of tiddlers/shadows/tags, as well as the maximum height of the listbox.  //The default values are shown below://
//{{{
config.macros.goto.includeTiddlers=true;
config.macros.goto.includeShadows=true;
config.macros.goto.includeTags=true;
config.macros.goto.listMaxSize=10;
//}}}
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''GotoPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revisions
<<<
''2007.04.21 [1.3.2]'' in html definition, removed DIV around droplist (see 1.2.6 below).  It created more layout problems then it solved. :-(
''2007.04.01 [1.3.1]'' in processItem(), ensure that correct textarea field is found by checking for edit=="text" attribute
''2007.03.30 [1.3.0]'' tweak SideBarOptions shadow to automatically add {{{<<goto>>}}} when using default sidebar content
''2007.03.30 [1.2.6]'' in html definition, added DIV around droplist to fix IE problem where list appears next to input field instead of below it.  
''2007.03.28 [1.2.5]'' in processItem(), set focus to text area before setting selection (needed for IE to get correct selection 'range')
''2007.03.28 [1.2.4]'' added prompt for 'pretty text' when inserting a link into tiddler content
''2007.03.28 [1.2.3]'' added local copy of core replaceSelection() and modified for different replace logic
''2007.03.27 [1.2.2]'' in processItem(), use story.getTiddlerField() to retrieve textarea control
''2007.03.26 [1.2.1]'' in html, use either 'onkeydown' (IE) or 'onkeypress' (Moz) event to process <esc> key sooner, to prevent <esc> from 'bubbling up' to the tiddler (which will close the current editor).
''2007.03.26 [1.2.0]'' added support for optional "insert" keyword param. When used in [[EditTemplate]], (e.g. {{{<span macro="goto insert"></span>}}}) it triggers alternative processing: instead of displaying the selected tiddler, that tiddler's title is inserted into a tiddler's textarea edit field surrounded by {{{[[...]]}}}.
''2006.05.10 [1.1.2]'' when filling listbox, set selection to 'heading' item... auto-select first tiddler title when down/enter moves focus into listbox
''2006.05.08 [1.1.1]'' added accesskey ("G") to input field html (also set when field gets focus).  Also, inputKeyHandler() skips non-printing/non-editing keys. 
''2006.05.08 [1.1.0]'' added heading to listbox for better feedback (also avoids problems with 1-line droplist)
''2006.05.07 [1.0.0]'' list matches against tiddlers/shadows/tags.  input field auto-completion... 1st enter=complete matching input (or show list)... 2nd enter=view tiddler.  optional "quiet" param controls when listbox appears.
''2006.05.06 [0.5.0]'' added handling for enter (13), escape(27), and down(40) keys.   Change 'ondblclick' to 'onclick' for list handler to view tiddlers (suggested by Florian Cauvin - prevents unintended trigger of tiddler editor).  shadow titles inserted into list instead of appended to the end.
''2006.05.05 [0.0.0]'' started
<<<
!!!!!Credits
>This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
!!!!!Code
***/
//{{{
version.extensions.goto= {major: 1, minor: 3, revision: 2, date: new Date(2007,4,21)};

// automatically tweak shadow SideBarOptions to add "sendTiddler" toolbar command (following "editTiddler")
config.shadowTiddlers.SideBarOptions=config.shadowTiddlers.SideBarOptions.replace(/<<search>>/,"{{button{goto}}}\n<<goto>><<search>>");

config.macros.goto= { 
	handler:
	function(place,macroName,params) {
		var quiet=(params[0] && params[0]=="quiet"); if (quiet) params.shift();
		var insert=(params[0] && params[0]=="insert"); if (insert) params.shift();
		var instyle=params.shift(); if (!instyle) instyle="";
		var liststyle=params.shift(); if (!liststyle) liststyle="";
		var keyevent=window.event?"onkeydown":"onkeypress";
		createTiddlyElement(place,"span").innerHTML
			=this.html.replace(/%keyevent%/g,keyevent).replace(/%insert%/g,insert).replace(/%quiet%/g,quiet).replace(/%instyle%/g,instyle).replace(/%liststyle%/g,liststyle);
	},

	html:
	'<form onsubmit="return false" style="display:inline;margin:0;padding:0">\
		<input name=goto type=text autocomplete="off" accesskey="G" style="%instyle%"\
			title="enter a tiddler title"\
			onfocus="this.select(); this.setAttribute(\'accesskey\',\'G\');"\
			%keyevent%="return config.macros.goto.inputEscKeyHandler(event,this,this.form.list);"\
			onkeyup="return config.macros.goto.inputKeyHandler(event,this,this.form.list,%quiet%,%insert%);">\
		<select name=list style="%liststyle%;display:none;position:absolute"\
			onchange="if (!this.selectedIndex) this.selectedIndex=1;"\
			onblur="this.style.display=\'none\';"\
			%keyevent%="return config.macros.goto.selectKeyHandler(event,this,this.form.goto,%insert%);"\
			onclick="return config.macros.goto.processItem(this.value,this.form.goto,this,%insert%);">\
		</select>\
	</form>',
	
	getItems:
	function() {
		var items=[];
		var tiddlers=store.reverseLookup("tags","excludeSearch",false,"title");
		if (this.includeTiddlers) for(var t=0; t<tiddlers.length; t++) items.push(tiddlers[t].title);
		if (this.includeShadows) for (var t in config.shadowTiddlers) items.pushUnique(t);
		if (this.includeTags) { var tags=store.getTags(); for(var t=0; t<tags.length; t++) items.pushUnique(tags[t][0]); }
		return items;
	},
	includeTiddlers: true, includeShadows: true, includeTags: true,

	getItemSuffix:
	function(t) {
		if (store.tiddlerExists(t)) return "";  // tiddler
		if (store.isShadowTiddler(t)) return " (shadow)"; // shadow
		return " (tag)"; // tag 
	},

	keyProcessed:
	function(ev) { // utility function: exits handler and prevents browser from processing the keystroke
		ev.cancelBubble=true; // IE4+
		try{event.keyCode=0;}catch(e){}; // IE5
		if (window.event) ev.returnValue=false; // IE6
		if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
		if (ev.stopPropagation) ev.stopPropagation(); // all
		return false;
	},

	inputEscKeyHandler:
	function(event,here,list) {
		var key=event.keyCode;
		// escape... hide list (2nd esc=clears input)
		if (key==27) {
			if (list.style.display=="none")
				here.value=here.defaultValue;
			list.style.display="none";
			return this.keyProcessed(event);
		}
		return true; // key bubbles up
	},

	inputKeyHandler:
	function(event,here,list,quiet,insert) {
		var key=event.keyCode;
		// non-printing chars... bubble up, except: backspace=8, enter=13, space=32, down=40, delete=46
		if (key<48) switch(key) { case 8: case 13: case 32: case 40: case 46: break; default: return true; }
		// blank input... if down/enter... fall through (list all)... else, hide list
		if (!here.value.length && !(key==40 || key==13))
			{ list.style.display="none"; return this.keyProcessed(event); }
		// find matching items...
		var pattern=config.options.chkRegExpSearch?here.value:here.value.escapeRegExp();
		var re=new RegExp(pattern,config.options.chkCaseSensitiveSearch?"mg":"img");
		var found = []; var items=this.getItems();
		for(var t=0; t<items.length; t++) if(items[t].search(re)!=-1) found.push(items[t]);
		// matched one item... enter... not *exact* match... autocomplete input field
		if (found.length==1 && quiet && key==13 && here.value!=found[0])
			{ list.style.display="none"; here.value=found[0]; return this.keyProcessed(event); }
		// no match/exact match... enter... create/show it
		if (found.length<2 && key==13)
			return this.processItem(found.length?found[0]:here.value,here,list,insert);
		// quiet/no match... hide list...
		list.style.display=(!quiet && found.length)?"block":"none";
		// no matches... key bubbles up
		if (!found.length) return true;
		// down/enter... show/move to list...
		if (key==40 || key==13)  { list.style.display="block"; list.focus(); }
		// list is showing... fill list...
		if (list.style.display!="none") {
			while (list.length > 0) list.options[0]=null; // clear list...
			found.sort();
			list.options[0]=new Option(found.length==1?this.listMatchMsg:this.listHeading.format([found.length]),"",false,false);
			for (var t=0; t<found.length; t++)  // fill list...
				list.options[t+1]=new Option(found[t]+this.getItemSuffix(found[t]),found[t],false,false);
			list.size=(found.length<this.listMaxSize?found.length:this.listMaxSize)+1; // resize list...
			list.selectedIndex=(key==40 || key==13)?1:0;
		}
		return true; // key bubbles up
	},
	listMaxSize: 10,
	listHeading: 'Found %0 matching titles:',
	listMatchMsg: 'Press enter to open tiddler...',

	selectKeyHandler:
	function(event,list,editfield,insert) {
		if (event.keyCode==27) // escape... hide list, move to edit field
			{ editfield.focus(); list.style.display="none"; return this.keyProcessed(event); }
		if (event.keyCode==13 && list.value.length) // enter... view selected item
			{ this.processItem(list.value,editfield,list,insert); return this.keyProcessed(event); }
		return true; // key bubbles up
	},

	askForText: "Enter the text to display for this link",

	processItem:
	function(title,here,list,insert) {
		if (!title.length) return; here.value=title; list.style.display='none';
		if (insert) {
			var tidElem=story.findContainingTiddler(here); if (!tidElem) { here.focus(); return false; }
			var e=story.getTiddlerField(tidElem.getAttribute("tiddler"),"text");
			if (!e||e.getAttribute("edit")!="text") return false;
			var txt=prompt(this.askForText,title); if (!txt||!txt.length) { here.focus(); return false; }
			e.focus(); // put focus on target field before setting selection
			this.replaceSelection(e,"[["+txt+"|"+title+"]]"); // insert selected tiddler as a PrettyLink
		}
		else
			story.displayTiddler(null,title); // show selected tiddler
		return false;
	},

	replaceSelection:
	function (e,text) { // copied from 2.1.3 core and then tweaked
		if (e.setSelectionRange) {
			var oldpos = e.selectionStart;
			var isRange=e.selectionEnd-e.selectionStart;
			e.value = e.value.substr(0,e.selectionStart) + text + e.value.substr(e.selectionEnd);
			e.setSelectionRange( isRange?oldpos:oldpos+text.length, oldpos+text.length);
			var linecount = e.value.split('\n').length;
			var thisline = e.value.substr(0,e.selectionStart).split('\n').length-1;
			e.scrollTop = Math.floor((thisline-e.rows/2)*e.scrollHeight/linecount);
		}
		else if (document.selection) {
			var range = document.selection.createRange();
			if (range.parentElement() == e)	{
				var isCollapsed = range.text == "";
				range.text = text;
				 if (!isCollapsed) {
					range.moveStart('character', -text.length);
					range.select();
				}
			}
		}
	}
}
//}}}
/***
|Name|HaloscanMacro|
|Created by|JimSpeth|
|Location|http://end.com/~speth/HaloscanMacro.html|
|Version|1.1.0|
|Requires|~TW2.x|

!Description
Comment and trackback support for TiddlyWiki (via Haloscan).

!History
* 16-Feb-06, version 1.1.0, drastic changes, now uses settings from haloscan account config
* 31-Jan-06, version 1.0.1, fixed display of counts for default tiddlers
* 30-Jan-06, version 1.0, initial release

!Examples
|!Source|!Output|h
|{{{<<haloscan comments>>}}}|<<haloscan comments>>|
|{{{<<haloscan trackbacks>>}}}|<<haloscan trackbacks>>|

!Installation
Register for a [[Haloscan|http://www.haloscan.com]] account.  It's free and painless.
Install the HaloscanMacro in a new tiddler with a tag of systemConfig (save and reload to activate).
In the macro configuration code (below), change //YourName// to your Haloscan account name.
Use the macro somewhere in a tiddler (see ViewTemplate for an example).

!Settings
You can adjust various options for your account in the member configuration area of Haloscan's web site.  The macro will use these settings when formatting the links.

!Code
***/
//{{{

/* change "YourName" to your Haloscan account name */
config.macros.haloscan = {account: "krkclip", baseURL: "http://www.haloscan.com/load/"};

var haloscanLoaded = 0;
config.macros.haloscan.load = function ()
{
    if (haloscanLoaded == 1)
        return;
    
    account = config.macros.haloscan.account;
    if (!account || (account == "YourName"))
        account = store.getTiddlerText("SiteTitle");
    
    var el = document.createElement('script');
    el.language = 'JavaScript'; 
    el.type = 'text/javascript'; 
    el.src = config.macros.haloscan.baseURL + account;
    document.documentElement.childNodes[0].appendChild(el);
    
    haloscanLoaded = 1;
}
config.macros.haloscan.load();

/* this totally clobbers document.write, i hope that's ok */
var safeWrite = function(s)
{
    document.written = s;
    return s;
};
document.write = safeWrite;

config.macros.haloscan.refreshDefaultTiddlers = function ()
{
    var start = store.getTiddlerText("DefaultTiddlers");
    if (start)
    {
        var titles = start.readBracketedList();
        for (var t=titles.length-1; t>=0; t--)
            story.refreshTiddler(titles[t], DEFAULT_VIEW_TEMPLATE, 1);
    }
}

var haloscanRefreshed = 0;
config.macros.haloscan.handler = function (place, macroName, params, wikifier, paramString, tiddler)
{
    if (typeof HaloScan == 'undefined')
    {
        if (haloscanRefreshed == 0)
        {
            setTimeout("config.macros.haloscan.refreshDefaultTiddlers()", 1);
            haloscanRefreshed = 1;
        }
        return;
    }
    
    var id = story.findContainingTiddler(place).id.substr(7);
    var hs_search = new RegExp('\\W','gi');
    id = id.replace(hs_search,"_");
    
    account = config.macros.haloscan.account;
    if (!account || (account == "YourName"))
        account = store.getTiddlerText("SiteTitle");
    
    var haloscanError = function (msg)
    {
        createTiddlyError(place, config.messages.macroError.format(["HaloscanMacro"]), config.messages.macroErrorDetails.format(["HaloscanMacro", msg]));
    }
    
    if (params.length == 1)
    {
        if (params[0] == "comments")
        {
            postCount(id);
            commentsLabel = document.written; //"Add/view comments";
            commentsPrompt = "Comments on this tiddler";
            var commentsHandler = function(e) { HaloScan(id); return false; };
            var commentsButton = createTiddlyButton(place, commentsLabel, commentsPrompt, commentsHandler);
        }
        else if (params[0] == "trackbacks")
        {
            postCountTB(id);
            trackbacksLabel = document.written; //"Add/view trackbacks"; 
            trackbacksPrompt = "Trackbacks for this tiddler";
            var trackbacksHandler = function(e) { HaloScanTB(id); return false; };
            var trackbackButton = createTiddlyButton(place, trackbacksLabel, trackbacksPrompt, trackbacksHandler);
        }
        else
            haloscanError("unknown parameter: " + params[0]);
    }
    else if (params.length == 0)
        haloscanError("missing parameter");
    else
        haloscanError("bad parameter count");
}

//}}}
<<rssReader asText proxy.cgi?url=http://www.haloscan.com/members/rss.php?user=krkclip>>
{{{
''太字''
--取消線--
__下線__
//斜体//
2^^3^^=8
a~~ij~~ = -a~~ji~~
}}}
''太字''
--取消線--
__下線__
//斜体//
2^^3^^=8
a~~ij~~ = -a~~ji~~
 
{{{
@@ハイライト@@
@@color(green):着色(ここでは緑)@@
@@color:red;文字列(赤)@@
@@bgcolor(#000000):color(#00FFFF):背景色の設定もできます。@@
@@color:#0ff;background-color:#000;文字列@@
@@font-size:+2;文字列@@
}}}
@@ハイライト@@
@@color(green):着色(ここでは緑)@@
@@color:red;文字列(赤)@@
@@bgcolor(#000000):color(#00FFFF):背景色の設定もできます。@@
@@color:#0ff;background-color:#000;文字列@@
@@font-size:+2;文字列@@
 
{{{
{{{固定幅の表示}} }
{{{
 <monospacedtext>固定幅の表示(ブロック)</monospacedtext>
}} }
表示されないコメントを入れる。
/% comment %/ これは見えません。
"""装飾無し(「"」三つで囲む)"""
~装飾無し
水平線
----
}}}
{{{固定幅の表示}}}
{{{
 <monospacedtext>固定幅の表示(ブロック)</monospacedtext>
}}}
表示されないコメントを入れる。
/% comment %/ これは見えません。
"""装飾無し(「"」三つで囲む)"""
~装飾無し
水平線
----

通常リスト
{{{
* 一段目
** 階層化もできます。
** 同一レベルに記述するとこんなかんじ。
* そして元に戻ります。
}}}
* 一段目
** 階層化もできます。
** 同一レベルに記述するとこんなかんじ。
* そして元に戻ります。

番号リスト
序数を付けたリストです。
{{{
#item1
#item2
##item2.1
##item2.2
##item2.3
#item3
##item3.1
###item3.1.1
###item3.1.2
}}}
#item1
#item2
##item2.1
##item2.2
##item2.3
#item3
##item3.1
###item3.1.1
###item3.1.2

見出し
いわゆる <h2>...</h2> などに相当する見出しです。五段階に対応してます。
{{{
!Header 1
!!Header 2
!!!Header 3
!!!!Header 4
!!!!!Header 5
}}}
!Header 1
!!Header 2
!!!Header 3
!!!!Header 4
!!!!!Header 5 
外部リンク
他のサイトへのリンクをする場合、[[Google|http://www.google.com/]]などと記載します。
 
画像の埋込み
{{{
[img[Google|http://www.google.co.jp/images/logo_sm.gif]]
}}}
[img[Google|http://www.google.co.jp/images/logo_sm.gif]]
さらにリンク
{{{
[img[Google|http://www.google.co.jp/images/logo_sm.gif][http://google.co.jp/]]
}}}
[img[Google|http://www.google.co.jp/images/logo_sm.gif][http://google.co.jp/]]
同じフォルダにある場合はパス名は不要なようです。
 
引用
{{{
<<<
引用しています。
引用しています。
<<<
}}}
<<<
引用しています。
引用しています。
<<<

{{{
>level 1
>level 1
>>level 2
>>level 2
>>>level 3
>>>level 3
>>level 2
>level 1
}}}
>level 1
>level 1
>>level 2
>>level 2
>>>level 3
>>>level 3
>>level 2
>level 1 
表組
{{{
|!th1111111111|!th2222222222|
|>| colspan |
| rowspan |left|
|~| right|
|bgcolor(#a0ffa0):colored| center |
|caption|c
}}}
|!th1111111111|!th2222222222|
|>| colspan |
| rowspan |left|
|~| right|
|bgcolor(#a0ffa0):colored| center |
|caption|c

ドキュメント内リンク (追加)
{{{
[[GettingStarted]]
[[スタートのメモ|GettingStarted]]
}}}
[[GettingStarted]]
[[スタートのメモ|GettingStarted]]
/***
|''Name:''|HelpTextMacro|
|''Source:''|http://kuraku.net/tw/tw.html#HelpTextMacro|
|''Author:''|KuRaKu|
|''License:''|unknown|
|''Version:''|0.1.1 (2007-03-19)|
|''~CoreVersion:''|2.1.3|

!!Description
編集時にヘルプを表示できます。
デフォルトでは [[HelpText]] という名前の tiddler を表示します。
<pre> で表示しておりますの内容がそのまま出てきます。専用の tiddler を用意してください。(TWフォーマットでは見苦しいです)

!!Install
この [[HelpTextMacro]] をコピーした後、タグに systemConfig を追加。
とりあえずはこちらの [[HelpText]] もコピーしてください。
保存してリロードしてください。

[[EditTemplate]] に以下のように「helptext」を追記します。
//{{{
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler helptext deleteTiddler'></div>
...
//}}}
([[EditTemplate]] はこれまでに修正したことが無ければ {{{Sidebar: More>Shadow}}} を見てください)

!!Configuration
[[HelpTextMacroConfig]] を作って、以下のように記述すると表示する tiddler の指定ができます。
同様に systemConfig タグを付けて保存してください。
//{{{
config.commands.helptext.helptiddler = "HelpText";
//}}}
/%
Style を変更することもできます。以下がデフォルトです。
//{{{
.helpText {
	background: #fff; color: #222;
} 
.helpText p pre {
	font-size: 1.0em; line-height: 1.1em;
}
//}}}
%/
!!Source
***/
/*{{{*/
version.extensions.helptext = { major: 0, minor: 1, revision: 1, date: new Date(2007,3,19),
	source: "http://kuraku.net/tw/tw.html#HelpTextMacro"
};

config.commands.helptext = {};
config.commands.helptext.helptiddler = "HelpText";
config.commands.helptext.handler = function(event,src,title)
{
	var popup = Popup.create(src);
	if(popup)
		{
		createTiddlyElement(popup,"H1",null,"helpText","TiddlyWiki Format Help:");
		var ht = store.fetchTiddler(config.commands.helptext.helptiddler).text;

		//createTiddlyElement(popup,"pre",null,"helpText",ht);
		popup.setAttribute("style","background:#fff; color: #222;");
		var wrapper = createTiddlyElement(popup, "span", null, "helpText");
		//wikify(ht, span);
		wikify(ht, wrapper, null, store.getTiddler(config.commands.helptext.helptiddler));
		}
	Popup.show(popup,false);
	event.cancelBubble = true;
	if (event.stopPropagation) event.stopPropagation();
	return false;
}

merge(config.commands.helptext,{
	text: "help",
	tooltip: "help to help file"});

var helpTextStyles = ".helpText blockquote {border-left: 3px solid;}\n .helpText pre {background: #FFFFCC none repeat ; border:1px solid #FFEE88;}\n .helpText table {border: 1px solid;}\n .helpText th thead {background: #0ff; border: 1px solid #000; color: #000;}\n .helpText td {background: #fff; border: 1px solid #000; color: #000;} ";

setStylesheet(helpTextStyles,"helpTextStyles");
/*}}}*/
/***
| Name|HideWhenPlugin|
| Description|Allows conditional inclusion/exclusion in templates|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://mptw.tiddlyspot.com/#HideWhenPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{

window.removeElementWhen = function(test,place) {
	if (test) {
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};

merge(config.macros,{

	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( eval(paramString), place);
	}},

	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !eval(paramString), place);
	}},

	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAny(params), place);
	}},

	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAny(params), place);
	}},

	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
	}},

	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
	}}

});

//}}}

/***
文字列を<<hl ハイライトして>>出力する。
!!!Usage
{{{
<<hl 文字列>>
<<hl "文字列 スペースを含む場合はクォートで囲む">>
}}}
***/
//{{{
config.macros.hl = {};
config.macros.hl.handler = function(place,macroName,params)
{
var e = createTiddlyElement(place,"span",null,null,params[0]);
e.style["backgroundColor"] = "#0ff";
}
//}}}
*<<reminder month:1 day:1 title:"元日">>
*<<reminder month:1 day:8 offsetdayofweek:1 title:"成人の日">>
*<<reminder month:2 day:11 title:"建国記念の日">>
*<<reminder month:3 day:21 title:"春分の日">>
*<<reminder month:4 day:29 title:"昭和の日">>
*<<reminder month:5 day:3 title:"憲法記念日">>
*<<reminder month:5 day:4 title:"みどりの日">>
*<<reminder month:5 day:5 title:"子供の日">>
*<<reminder month:7 day:20 title:"海の日">>
*<<reminder month:9 day:15 offsetdayofweek:1 title:"敬老の日">>
*<<reminder month:9 day:23 title:"秋分の日">>
*<<reminder month:10 day:9 offsetdayofweek:1 title:"体育の日">>
*<<reminder month:11 day:3 title:"文化の日">>
*<<reminder month:11 day:23 title:"勤労感謝の日">>
*<<reminder month:12 day:23 title:"天皇誕生日">>
<<top>>
<<toggleSideBar>><<renameButton '>' >>
<<jump j '' top>>
<<saveChanges>><<renameButton s 'save to disk'>><<upload http://tw.kuraku.net/store.cgi clip.html backup .>><<renameButton w 'save to web'>>
<<newTiddler>><<renameButton n>>
<<newJournal  "YYYY.0MM.0DD" "toRSS" "today">><<renameButton t>>
<<dirtyflag>>
/***
|Name|HoverMenuPlugin|
|Created by|SaqImtiaz|
|Location|http://lewcid.googlepages.com/lewcid.html#HoverMenuPlugin|
|Version|1.11|
|Requires|~TW2.x|
!Description:
Provides a hovering menu on the edge of the screen for commonly used commands, that scrolls with the page.

!Demo:
Observe the hovering menu on the right edge of the screen.

!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
To customize your HoverMenu, edit the HoverMenu shadow tiddler.

To 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!

The menu has an id of hoverMenu, in case you want to style the buttons in it using css.

!Notes:
Since 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.

If you dont intend to use these three macros at all, feel free to remove those sections of code in this tiddler.

!To Do:
* rework code to allow multiple hovering menus in different positions, horizontal etc.
* incorporate code for keyboard shortcuts that correspond to the buttons in the hovermenu

!History:
*03-08-06, ver 1.11: fixed error with button tooltips
*27-07-06, ver 1.1 : added JumpMacro to hoverMenu
*23-07-06

!Code
***/

/***
start HoverMenu plugin code
***/
//{{{
config.hoverMenu={};
//}}}

/***
HoverMenu configuration settings
***/
//{{{
config.hoverMenu.settings={
 align: 'right', //align menu to right or left side of screen, possible values are 'right' and 'left' 
 x: 1, // horizontal distance of menu from side of screen, increase to your liking.
 y: 158 //vertical distance of menu from top of screen at start, increase or decrease to your liking
 };
//}}}

//{{{
//continue HoverMenu plugin code
config.hoverMenu.handler=function()
{
 var theMenu = createTiddlyElement(document.getElementById("contentWrapper"), "div","hoverMenu");
 theMenu.setAttribute("refresh","content");
 theMenu.setAttribute("tiddler","HoverMenu");
 var menuContent = store.getTiddlerText("HoverMenu");
 wikify(menuContent,theMenu);

 var Xloc = this.settings.x;
 Yloc =this.settings.y;
 var ns = (navigator.appName.indexOf("Netscape") != -1);
 function SetMenu(id)
 {
 var GetElements=document.getElementById?document.getElementById(id):document.all?document.all[id]:document.layers[id];
 if(document.layers)GetElements.style=GetElements;
 GetElements.sP=function(x,y){this.style[config.hoverMenu.settings.align]=x +"px";this.style.top=y +"px";};
 GetElements.x = Xloc;
 GetElements.y = findScrollY();
 GetElements.y += Yloc;
 return GetElements;
 }
 window.LoCate_XY=function()
 {
 var pY = findScrollY();
 ftlObj.y += (pY + Yloc - ftlObj.y)/15;
 ftlObj.sP(ftlObj.x, ftlObj.y);
 setTimeout("LoCate_XY()", 10);
 }
 ftlObj = SetMenu("hoverMenu");
 LoCate_XY();
};

window.old_lewcid_hovermenu_restart = restart;
restart = function()
{
 window.old_lewcid_hovermenu_restart();
 config.hoverMenu.handler();
};

setStylesheet(
"#hoverMenu .button, #hoverMenu .tiddlyLink {border:none; font-weight:bold; background:#18f; color:#FFF; padding:0 5px; float:right; margin-bottom:4px;}\n"+
"#hoverMenu .button:hover, #hoverMenu .tiddlyLink:hover {font-weight:bold; border:none; color:#fff; background:#000; padding:0 5px; float:right; margin-bottom:4px;}\n"+
"#hoverMenu .button {width:100%; text-align:center}"+
"#hoverMenu { position:absolute; width:7px;}\n"+
"\n","hoverMenuStyles");


config.macros.renameButton={};
config.macros.renameButton.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{

 if (place.lastChild.tagName!="BR")
 {
 place.lastChild.firstChild.data = params[0];
 if (params[1]) {place.lastChild.title = params[1];}
 }
};

config.shadowTiddlers["HoverMenu"]="<<top>>\n<<toggleSideBar>><<renameButton '>' >>\n<<jump j '' top>>\n<<saveChanges>><<renameButton s 'Save TiddlyWiki'>>\n<<newTiddler>><<renameButton n>>\n";
//}}}
//end HoverMenu plugin code

//Start ToggleSideBarMacro code
//{{{
config.macros.toggleSideBar={};

config.macros.toggleSideBar.settings={
 styleHide : "#sidebar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 1em;}\n"+"",
 styleShow : " ",
 arrow1: "«",
 arrow2: "»"
};

config.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
 var tooltip= params[1]||'toggle sidebar';
 var mode = (params[2] && params[2]=="hide")? "hide":"show";
 var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
 var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;
 var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");
 if (mode == "hide")
 { 
 (document.getElementById("sidebar")).setAttribute("toggle","hide");
 setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");
 }
};

config.macros.toggleSideBar.onToggleSideBar = function(){
 var sidebar = document.getElementById("sidebar");
 var settings = config.macros.toggleSideBar.settings;
 if (sidebar.getAttribute("toggle")=='hide')
 {
 setStylesheet(settings.styleShow,"ToggleSideBarStyles");
 sidebar.setAttribute("toggle","show");
 this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
 }
 else
 { 
 setStylesheet(settings.styleHide,"ToggleSideBarStyles");
 sidebar.setAttribute("toggle","hide");
 this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
 }

 return false;
}

setStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleSideBarButtonStyles");
//}}}
//end ToggleSideBarMacro code

//start JumpToTopMacro code
//{{{
config.macros.top={};
config.macros.top.handler=function(place,macroName)
{
 createTiddlyButton(place,"^","jump to top",this.onclick);
}
config.macros.top.onclick=function()
{
 window.scrollTo(0,0);
};

config.commands.top =
{
 text:" ^ ",
 tooltip:"jump to top"
};

config.commands.top.handler = function(event,src,title)
{
 window.scrollTo(0,0);
}
//}}}
//end JumpToStartMacro code

//start JumpMacro code
//{{{
config.macros.jump= {};
config.macros.jump.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
 var label = (params[0] && params[0]!=".")? params[0]: 'jump';
 var tooltip = (params[1] && params[1]!=".")? params[1]: 'jump to an open tiddler';
 var top = (params[2] && params[2]=='top') ? true: false; 

 var btn =createTiddlyButton(place,label,tooltip,this.onclick);
 if (top==true)
 btn.setAttribute("top","true")
}

config.macros.jump.onclick = function(e)
{
 if (!e) var e = window.event;
 var theTarget = resolveTarget(e);
 var top = theTarget.getAttribute("top");
 var popup = Popup.create(this);
 if(popup)
 {
 if(top=="true")
 {createTiddlyButton(createTiddlyElement(popup,"li"),'Top ↑','Top of TW',config.macros.jump.top);
 createTiddlyElement(popup,"hr");}
 
 story.forEachTiddler(function(title,element) {
 createTiddlyLink(createTiddlyElement(popup,"li"),title,true);
 });
 }
 Popup.show(popup,false);
 e.cancelBubble = true;
 if (e.stopPropagation) e.stopPropagation();
 return false;
}

config.macros.jump.top = function()
{
 window.scrollTo(0,0);
}
//}}}
//end JumpMacro code

//utility functions
//{{{
Popup.show = function(unused,slowly)
{
 var curr = Popup.stack[Popup.stack.length-1];
 var rootLeft = findPosX(curr.root);
 var rootTop = findPosY(curr.root);
 var rootHeight = curr.root.offsetHeight;
 var popupLeft = rootLeft;
 var popupTop = rootTop + rootHeight;
 var popupWidth = curr.popup.offsetWidth;
 var winWidth = findWindowWidth();
 if (isChild(curr.root,'hoverMenu'))
 var x = config.hoverMenu.settings.x;
 else
 var x = 0;
 if(popupLeft + popupWidth+x > winWidth)
 popupLeft = winWidth - popupWidth -x;
 if (isChild(curr.root,'hoverMenu'))
 {curr.popup.style.right = x + "px";}
 else
 curr.popup.style.left = popupLeft + "px";
 curr.popup.style.top = popupTop + "px";
 curr.popup.style.display = "block";
 addClass(curr.root,"highlight");
 if(config.options.chkAnimate)
 anim.startAnimating(new Scroller(curr.popup,slowly));
 else
 window.scrollTo(0,ensureVisible(curr.popup));
}

window.isChild = function(e,parentId) {
 while (e != null) {
 var parent = document.getElementById(parentId);
 if (parent == e) return true;
 e = e.parentNode;
 }
 return false;
};
//}}}


/*{{{*/
config.macros.toggleSideBar.settings.arrow1 = "<";
config.macros.toggleSideBar.settings.arrow2 = ">";
/*}}}*/
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Version|1.6.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|

''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
When installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.

''Deferred execution from an 'onClick' link''
By including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.  You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text

''External script source files:''
You can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}).  This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins.  The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.

''Display script source in tiddler output''
By including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.

''Defining javascript functions and libraries:''
Although the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed.  Thus, you cannot load a library and //immediately// use it's functions within the same tiddler.  However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).

To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened.  For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.

Since the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines.  Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.

''Creating dynamic tiddler content''
An important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:
* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.
* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.
* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.

If your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display.  For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.

//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler.  To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//

''Accessing the ~TiddlyWiki DOM''
The plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.

Access to this DOM element allows you to create scripts that can:
* vary their actions based upon the specific location in which they are embedded
* access 'tiddler-relative' information (use findContainingTiddler(place))
* perform direct DOM manipulations (when returning wikified text is not enough)
<<<
!!!!!Examples
<<<
an "alert" message box:
><script show>
	alert('InlineJavascriptPlugin: this is a demonstration message');
</script>
dynamic output:
><script show>
	return (new Date()).toString();
</script>
wikified dynamic output:
><script show>
	return "link to current user: [["+config.options.txtUserName+"]]";
</script>
dynamic output using 'place' to get size information for current tiddler:
><script show>
   if (!window.story) window.story=window;
   var title=story.findContainingTiddler(place).id.substr(7);
   return title+" is using "+store.getTiddlerText(title).length+" bytes";
</script>
creating an 'onclick' button/link that runs a script:
><script label="click here" title="clicking this link will show an 'alert' box" show>
   if (!window.story) window.story=window;
   alert("Hello World!\nlinktext='"+place.firstChild.data+"'\ntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");
</script>
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}
>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}
><script src="demo.js" show>
	return "loading demo.js..."
</script>
><script label="click to execute demo() function" show>
	demo()
</script>
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2007.02.19 [1.6.0]'' added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
''2006.10.16 [1.5.2]'' add newline before closing '}' in 'function out_' wrapper.  Fixes error caused when last line of script is a comment.
''2006.06.01 [1.5.1]'' when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly
''2006.04.19 [1.5.0]'' added 'show' parameter to force display of javascript source code in tiddler output
''2006.01.05 [1.4.0]'' added support 'onclick' scripts.  When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked.  'place' value is set to match the clicked button/link element.
''2005.12.13 [1.3.1]'' when catching eval error in IE, e.description contains the error text, instead of e.toString().  Fixed error reporting so IE shows the correct response text.  Based on a suggestion by UdoBorkowski
''2005.11.09 [1.3.0]'' for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content.  Based on a suggestion by BradleyMeck
''2005.11.08 [1.2.0]'' handle loading of javascript from an external URL via src="..." syntax
''2005.11.08 [1.1.0]'' pass 'place' param into scripts to provide direct DOM access 
''2005.11.08 [1.0.0]'' initial release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.inlineJavascript= {major: 1, minor: 6, revision: 0, date: new Date(2007,2,19)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",

	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			if (lookaheadMatch[1]) { // load a script library
				// make script tag, set src, add to body to execute, then remove for cleanup
				var script = document.createElement("script"); script.src = lookaheadMatch[1];
				document.body.appendChild(script); document.body.removeChild(script);
			}
			if (lookaheadMatch[5]) { // there is script code
				if (lookaheadMatch[4]) // show inline script code in tiddler output
					wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
				if (lookaheadMatch[2]) { // create a link to an 'onclick' script
					// add a link, define click handler, save code in link (pass 'place'), set link attributes
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);
					link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}
					link.code="function _out(place){"+lookaheadMatch[5]+"\n};_out(this);"
					link.setAttribute("title",lookaheadMatch[3]?lookaheadMatch[3]:"");
					link.setAttribute("href","javascript:;");
					link.style.cursor="pointer";
				}
				else { // run inline script code
					var code="function _out(place){"+lookaheadMatch[5]+"\n};_out(w.output);"
					code=code.replace(/document.write\(/gi,'place.innerHTML+=(');
					try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }
					if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
				}
			}
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} )
//}}}
http://kuraku.net/krk/
mailto: kuraku [at] kuraku [dot] net
|''Type:''|file|
|''URL:''|http://kuraku.net/tw/tw.html|
|''Workspace:''|(default)|

This tiddler was automatically created to record the details of this server
<html>
<a href="http://www.flickr.com" style="text-align:center;">www.<strong style="color:#3993ff">flick<span style="color:#ff1c92">r</span></strong>.com</a>
<iframe style="background-color:#ffffff; border-color:#ffffff; border:none;" width="113" height="151" frameborder="0" scrolling="no" src="http://www.flickr.com/apps/badge/badge_iframe.gne?zg_bg_color=ffffff&zg_person_id=97997926%40N00" title="Flickr Badge"></iframe>
</html>
[[tags|TagCloud]]
<<tag Plugins|systemConfig>>[[]]
[[KURAKU.net|http://kuraku.net/krk/]]
[[KuRaKu TiddlyWiki 備忘録|http://tw.kuraku.net/tw.html]]
[[KuRaKu TW Top|http://tw.kuraku.net/]]
~~[[TiddlyWiki|http://www.tiddlywiki.com]] Ver.<<version>>~~
<<tiddler LoadScripts>>
<!--{{{-->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-622015-3";
urchinTracker();
</script>
<!--}}}-->
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>

<!--
<style type="text/css">
#contentWrapper {display:none;}
body { background:#eee; }
</style>
<div id="SplashScreen" style="border: 1px solid #ccc; -moz-border-radius:1em; display:block; text-align:center; width:600px; margin:100px auto; padding:.5em; color:#fff; font-size:28pt; font-family:verdana,arial,helvetica,sans; background-color:#33f; font-weight: bold;">KRK CLip is loading<br><div style="font-size: 18px; color:#fff;">please wait<blink>...</blink></div></div> -->
<!--}}}-->
/***
''Usage:''
{{{
previous tidder: <<navitiddler -1>>
next tidder: <<navitiddler +1>>
}}}
''Source:''
***/
/*{{{*/
config.macros.navitiddler = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		if(!params[0] || params[0] == "0")
			return;
		var param = params[0];
		var tiddlers = store.reverseLookup("tags","excludeLists",false,"title");

		var cnt;
		for(cnt=0; cnt<tiddlers.length; cnt++) {
			if(tiddlers[cnt].title == tiddler.title) {
				break;
			}
		}

		var targetcnt = cnt + parseInt(param);
		if(targetcnt < 0 || targetcnt >= tiddlers.length)
			return;

		if(parseInt(param) < 0){
			var arrow = createTiddlyElement(place,"span");
			arrow.innerHTML = "<<<";
		}
	
		createTiddlyLink(place,tiddlers[targetcnt].title,true,"button");

		if(parseInt(param) > 0){
			var arrow = createTiddlyElement(place,"span");
			arrow.innerHTML = ">>>";
		}
	}
};
/*}}}*/
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Version|2.3.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Slider.prototype.stop|
|Description|show content in nest-able 'slider' or 'floating' panels, without needing to create separate tiddlers for each panel|

!!!!!Configuration
<<<
Enable animation for slider panels
<<option chkFloatingSlidersAnimate>> allow sliders to animate when opening/closing
>(note: This setting is in //addition// to the general option for enabling/disabling animation effects:
><<option chkAnimate>> enable animations (entire document)
>For slider animation to occur, you must also allow animation in general.

Debugging messages for 'lazy sliders' deferred rendering:
<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering
<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered
<<<
!!!!!Usage
<<<
When installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content.  Use {{{+++}}} and {{{===}}} to delimit the slider content.  You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created.  This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.

Additional optional syntax elements let you specify
*default to open
*cookiename
*heading level
*floater (with optional CSS width value)
*transient display (clicking elsewhere closes panel)
*custom class/label/tooltip/accesskey
*alternate label/tooltip (displayed when panel is open)
*panelID (for later use with {{{<<DOM>>}}} macro.  See [[DOMTweaksPlugin]])
*automatic blockquote style on panel
*deferred rendering of panel content
The complete syntax, using all options, is:
//{{{
++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip][altlabel|alttooltip]}}}#panelID:>...
content goes here
===
//}}}
where:
* {{{+++}}} (or {{{++++}}}) and {{{===}}}<br>marks the start and end of the slider definition, respectively.  When the extra {{{+}}} is used, the slider will be open when initially displayed.
* {{{(cookiename)}}}<br>saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.
* {{{!}}} through {{{!!!!!}}}<br>displays the slider label using a formatted headline (Hn) style instead of a button/link style
* {{{^width^}}} (or just {{{^}}})<br>makes the slider 'float' on top of other content rather than shifting that content downward.  'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.).  If omitted, the default width is "auto" (i.e., fit to content)
* {{{"*"}}} //(without the quotes)//<br>denotes "transient display": when a click occurs elsewhere in the document, the slider/floating panel will be automatically closed.  This is useful for creating 'pulldown menus' that automatically go away after they are used.
* """{{class{[label=key|tooltip][altlabel|alttooltip]}}}"""<br>uses label/tooltip/accesskey.  """{{class{...}}}""", """=key""", """|tooltip""" and """[altlabel|alttooltip]""" are optional.  'class' is any valid CSS class name, used to style the slider label text.  'key' must be a ''single letter only''.  altlabel/alttooltip specifiy alternative label/tooltip for use when slider/floating panel is displayed.
* {{{#panelID:}}}<br>defines a unique DOM element ID that is assigned to the panel element used to display the slider content.  This ID can then be used later to reposition the panel using the {{{<<DOM move id>>}}} macro (see [[DOMTweaksPlugin]]), or to access/modify the panel element through use of {{{document.getElementById(...)}}}) javascript code in a plugin or inline script.
* {{{">"}}} //(without the quotes)//<br>automatically adds blockquote formatting to slider content
* {{{"..."}}} //(without the quotes)//<br>defers rendering of closed sliders until the first time they are opened.  //Note: deferred rendering may produce unexpected results in some cases.  Use with care.//

//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//
<<<
!!!!!Examples
<<<
simple in-line slider: 
{{{
+++
   content
===
}}}
+++
   content
===
----
use a custom label and tooltip: 
{{{
+++[label|tooltip]
   content
===
}}}
+++[label|tooltip]
   content
===
----
content automatically blockquoted: 
{{{
+++>
   content
===
}}}
+++>
   content
===
----
all options combined //(default open, cookie, heading, sized floater, transient, class, label/tooltip/key, blockquoted, deferred)//
{{{
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
   content
===
}}}
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
   content
===
----
complex nesting example:
{{{
+++[get info...=I|click for information or press Alt-I]
	put some general information here,
	plus a floating panel with more specific info:
	+++^10em^[view details...|click for details]
		put some detail here, which could in turn contain a transient panel,
		perhaps with a +++^25em^*[glossary definition]explaining technical terms===
	===
===
}}}
+++[get info...=I|click for information or press Alt-I]
	put some general information here,
	plus a floating panel with more specific info:
	+++^10em^[view details...|click for details]
		put some detail here, which could in turn contain a transient panel,
		perhaps with a +++^25em^*[glossary definition]explaining technical terms===
	===
===
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2007.07.26 - 2.3.1'' in document.onclick(), propagate return value from hijacked core click handler to consume OR bubble up click as needed.  Fixes "IE click disease", whereby nearly every mouse click causes a page transition.
''2007.07.20 - 2.3.0'' added syntax for setting panel ID (#panelID:).  This allows individual slider panels to be repositioned within tiddler content simply by giving them a unique ID and then moving them to the desired location using the {{{<<DOM move id>>}}} macro.
''2007.07.19 - 2.2.0'' added syntax for alttext and alttip (button label and tooltip to be displayed when panel is open)
''2007.07.14 - 2.1.2'' corrected use of 'transient' attribute in IE to prevent (non-recursive) infinite loop
''2007.07.12 - 2.1.0'' replaced use of "*" for 'open/close on rollover' (which didn't work too well).  "*" now indicates 'transient' panels that are automatically closed if a click occurs somewhere else in the document.  This permits use of nested sliders to create nested "pulldown menus" that automatically disappear after interaction with them has been completed.  Also, in onClickNestedSlider(), use "theTarget.sliderCookie", instead of "this.sliderCookie" to correct cookie state tracking when automatically dismissing transient panels.
''2007.06.10 - 2.0.5'' add check to ensure that window.adjustSliderPanel() is defined before calling it (prevents error on shutdown when mouse event handlers are still defined)
''2007.05.31 - 2.0.4'' add handling to invoke adjustSliderPanel() for onmouseover events on slider button and panel.  This allows the panel position to be re-synced when the button position shifts due to changes in unrelated content above it on the page.  (thanks to Harsha for bug report)
''2007.03.30 - 2.0.3'' added chkFloatingSlidersAnimate (default to FALSE), so that slider animation can be disabled independent of the overall document animation setting (avoids strange rendering and focus problems in floating panels)
''2007.03.01 - 2.0.2'' for TW2.2+, hijack Morpher.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends
''2007.03.01 - 2.0.1'' in hijack for Slider.prototype.stop, use apply() to pass params to core function
|please see [[NestedSlidersPluginHistory]] for additional revision details|
''2005.11.03 - 1.0.0'' initial public release
<<<
!!!!!Credits
<<<
This feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.
<<<
!!!!!Code
***/
//{{{
version.extensions.nestedSliders = {major: 2, minor: 3, revision: 1, date: new Date(2007,7,26)};
//}}}

//{{{
// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;
if (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;
if (config.options.chkFloatingSlidersAnimate==undefined) config.options.chkFloatingSlidersAnimate=false;

// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
	background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");
//}}}

//{{{
config.formatters.push( {
	name: "nestedSliders",
	match: "\\n?\\+{3}",
	terminator: "\\s*\\={3}\\n?",
	lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\[\\>]*\\^)?)?(\\*)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(\\[[^\\]]*\\])?(?:\\}{3})?(\\#[^:]*\\:)?(\\>)?(\\.\\.\\.)?\\s*",
	handler: function(w)
		{
			lookaheadRegExp = new RegExp(this.lookahead,"mg");
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source)
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
			{
				// var defopen=lookaheadMatch[1]
				// var cookiename=lookaheadMatch[2]
				// var header=lookaheadMatch[3]
				// var panelwidth=lookaheadMatch[4]
				// var transient=lookaheadMatch[5]
				// var class=lookaheadMatch[6]
				// var label=lookaheadMatch[7]
				// var openlabel=lookaheadMatch[8]
				// var panelID=lookaheadMatch[9]
				// var blockquote=lookaheadMatch[10]
				// var deferred=lookaheadMatch[11]

				// location for rendering button and panel
				var place=w.output;

				// default to closed, no cookie, no accesskey, no alternate text/tip
				var show="none"; var cookie=""; var key="";
				var closedtext=">"; var closedtip="";
				var openedtext="<"; var openedtip="";

				// extra "+", default to open
				if (lookaheadMatch[1]) show="block";

				// cookie, use saved open/closed state
				if (lookaheadMatch[2]) {
					cookie=lookaheadMatch[2].trim().slice(1,-1);
					cookie="chkSlider"+cookie;
					if (config.options[cookie]==undefined)
						{ config.options[cookie] = (show=="block") }
					show=config.options[cookie]?"block":"none";
				}

				// parse label/tooltip/accesskey: [label=X|tooltip]
				if (lookaheadMatch[7]) {
					var parts=lookaheadMatch[7].trim().slice(1,-1).split("|");
					closedtext=parts.shift();
					if (closedtext.substr(closedtext.length-2,1)=="=")	
						{ key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }
					openedtext=closedtext;
					if (parts.length) closedtip=openedtip=parts.join("|");
					else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }
				}

				// parse alternate label/tooltip: [label|tooltip]
				if (lookaheadMatch[8]) {
					var parts=lookaheadMatch[8].trim().slice(1,-1).split("|");
					openedtext=parts.shift();
					if (parts.length) openedtip=parts.join("|");
					else openedtip="hide "+openedtext;
				}

				var title=show=='block'?openedtext:closedtext;
				var tooltip=show=='block'?openedtip:closedtip;

				// create the button
				if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link
					var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;
					var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);
					btn.onclick=onClickNestedSlider;
					btn.setAttribute("href","javascript:;");
					btn.setAttribute("title",tooltip);
				}
				else
					var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);
				btn.innerHTML=title; // enables use of HTML entities in label

				// set extra button attributes
				btn.setAttribute("closedtext",closedtext);
				btn.setAttribute("closedtip",closedtip);
				btn.setAttribute("openedtext",openedtext);
				btn.setAttribute("openedtip",openedtip);
				btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
				btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)
				btn.keyparam=key; // save the access key letter ("" if none)
				if (key.length) {
					btn.setAttribute("accessKey",key); // init access key
					btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
				}
				btn.onmouseover=function(event) // mouseover on button aligns floater position with button
					{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel,this.sliderPanel.className); }

				// create slider panel
				var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";
				var panelID=lookaheadMatch[9]; if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters
				var panel=createTiddlyElement(place,"div",panelID,panelClass,null);
				panel.button = btn; // so the slider panel know which button it belongs to
				btn.sliderPanel=panel; // so the button knows which slider panel it belongs to
				panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):"";
				panel.setAttribute("transient",lookaheadMatch[5]=="*"?"true":"false");
				panel.style.display = show;
				panel.style.width=panel.defaultPanelWidth;
				panel.onmouseover=function(event) // mouseover on panel aligns floater position with button
					{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this,this.className); }

				// render slider (or defer until shown) 
				w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
				if ((show=="block")||!lookaheadMatch[11]) {
					// render now if panel is supposed to be shown or NOT deferred rendering
					w.subWikify(lookaheadMatch[10]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
					// align floater position with button
					if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel,panelClass);
				}
				else {
					var src = w.source.substr(w.nextMatch);
					var endpos=findMatchingDelimiter(src,"+++","===");
					panel.setAttribute("raw",src.substr(0,endpos));
					panel.setAttribute("blockquote",lookaheadMatch[10]?"true":"false");
					panel.setAttribute("rendered","false");
					w.nextMatch += endpos+3;
					if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
					if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\n\n"+panel.getAttribute("raw"));
				}
			}
		}
	}
)

// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)
function findMatchingDelimiter(src,starttext,endtext) {
	var startpos = 0;
	var endpos = src.indexOf(endtext);
	// check for nested delimiters
	while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
		// count number of nested 'starts'
		var startcount=0;
		var temp = src.substring(startpos,endpos-1);
		var pos=temp.indexOf(starttext);
		while (pos!=-1)  { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
		// set up to check for additional 'starts' after adjusting endpos
		startpos=endpos+endtext.length;
		// find endpos for corresponding number of matching 'ends'
		while (startcount && endpos!=-1) {
			endpos = src.indexOf(endtext,endpos+endtext.length);
			startcount--;
		}
	}
	return (endpos==-1)?src.length:endpos;
}
//}}}

//{{{
window.onClickNestedSlider=function(e)
{
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);
	var theLabel = theTarget.firstChild.data;
	var theSlider = theTarget.sliderPanel
	var isOpen = theSlider.style.display!="none";

	// toggle label
	theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");
	// toggle tooltip
	theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));

	// deferred rendering (if needed)
	if (theSlider.getAttribute("rendered")=="false") {
		if (config.options.chkDebugLazySliderRender)
			alert("rendering '"+theLabel+"':\n\n"+theSlider.getAttribute("raw"));
		var place=theSlider;
		if (theSlider.getAttribute("blockquote")=="true")
			place=createTiddlyElement(place,"blockquote");
		wikify(theSlider.getAttribute("raw"),place);
		theSlider.setAttribute("rendered","true");
	}
	// show/hide the slider
	if(config.options.chkAnimate && (theSlider.className!='floatingPanel' || config.options.chkFloatingSlidersAnimate))
		anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
	else
		theSlider.style.display = isOpen ? "none" : "block";
	// reset to default width (might have been changed via plugin code)
	theSlider.style.width=theSlider.defaultPanelWidth;
	// align floater panel position with target button
	if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);
	// if showing panel, set focus to first 'focus-able' element in panel
	if (theSlider.style.display!="none") {
		var ctrls=theSlider.getElementsByTagName("*");
		for (var c=0; c<ctrls.length; c++) {
			var t=ctrls[c].tagName.toLowerCase();
			if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
				{ ctrls[c].focus(); break; }
		}
	}
	var cookie=theTarget.sliderCookie;
	if (cookie && cookie.length) {
		config.options[cookie]=!isOpen;
		if (config.options[cookie]!=theTarget.defOpen)
			saveOptionCookie(cookie);
		else { // remove cookie if slider is in default display state
			var ex=new Date(); ex.setTime(ex.getTime()-1000);
			document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();
		}
	}
	return false;
}
//}}}

//{{{
// click in document background closes transient panels 
document.nestedSliders_savedOnClick=document.onclick;
document.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);
	// call original click handler
	if (document.nestedSliders_savedOnClick)
		var retval=document.nestedSliders_savedOnClick.apply(this,arguments);
	// if click was inside transient panel (or something contained by a transient panel)... leave it alone
	var p=target;
	while (p)
		if ((p.className=="floatingPanel"||p.className=="sliderPanel")&&p.getAttribute("transient")=="true") break;
		else p=p.parentNode;
	if (p) return retval;
	// otherwise, find and close all transient panels...
	var all=document.all?document.all:document.getElementsByTagName("DIV");
	for (var i=0; i<all.length; i++) {
		 // if it is not a transient panel, or the click was on the button that opened this panel, don't close it.
		if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;
		// otherwise, if the panel is currently visible, close it by clicking it's button
		if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button}) 
	}
	return retval;
};
//}}}

//{{{
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {
	if (panelClass=="floatingPanel") {
		var left=0;
		var top=btn.offsetHeight; 
		if (place.style.position!="relative") {
			var left=findPosX(btn);
			var top=findPosY(btn)+btn.offsetHeight;
			var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;
			if (p) { left-=findPosX(p); top-=findPosY(p); }
		}
		if (findPosX(btn)+panel.offsetWidth > getWindowWidth())  // adjust position to stay inside right window edge
			left-=findPosX(btn)+panel.offsetWidth-getWindowWidth()+15; // add extra 15px 'fudge factor'
		panel.style.left=left+"px"; panel.style.top=top+"px";
	}
}

function getWindowWidth() {
	if(document.width!=undefined)
		return document.width; // moz (FF)
	if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		return document.documentElement.clientWidth; // IE6
	if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )
		return document.body.clientWidth; // IE4
	if(window.innerWidth!=undefined)
		return window.innerWidth; // IE - general
	return 0; // unknown
}
//}}}

//{{{
// TW2.1 and earlier:
// hijack Slider animation handler 'stop' handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function()
	{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }

// TW2.2+
// hijack Morpher animation handler 'stop' handler so overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
	Morpher.prototype.coreStop = Morpher.prototype.stop;
	Morpher.prototype.stop = function()
		{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }
}
//}}}
/***
|''Name:''|NewerTiddlerPlugin|
|''Version:''|$Revision: 13 $ |
|''Source:''|http://thePettersons.org/tiddlywiki.html#NewerTiddlerPlugin |
|''Author:''|[[Paul Petterson]] |
|''Type:''|Macro Extension |
|''Requires:''|TiddlyWiki 1.2.33 or higher |
!Description
Create a 'new tiddler' button with lots more options! Specify the text to show on the button, the name of the new tiddler (with date macro expansion), one or more tags for the new tiddlers, and what text if any to include in the new tiddler body! Uses a named parameter format, simalar to the reminder plugin.

Also - if the tiddler already exists it won't replace any of it's existing data (like tags).

!Syntax
* {{{<<newerTiddler button:"Inbox" name:"Inbox YYYY/MM/DD" tags:"Journal, inbox" text:"New stuff for today:">>}}}
* {{{<<newerTiddler button:"@Action" name:"Action: what" tags:"@Action" text:"Add project and describe action">>}}}
* {{{<<newerTiddler button:"New Project" name:"Project Name?" tags:"My Projects, My Inbox, Journal" template:"MyTemplate">>}}}
!!Parameters
* name:"Name of Tiddler"
* tags:"Tag1, Tag2, Tag3" - tags for new tiddler, comma seperated //don't use square brackets //({{{[[}}})// for tags!//
* button:"name for button" - the name to display instead of "new tiddler"
* body:"what to put in the tiddler body"
* template:"Name of a tiddler containing the text to use as the body of the new tiddler"

''Note:'' if you sepecify both body and template parameters, then template parameter will be used and the body parameter overridden.

!Sample Output
* <<newerTiddler button:"Inbox" name:"Inbox YYYY/MM/DD" tags:"Journal inbox" text:"New stuff for today:">>
* <<newerTiddler button:"@Action" name:"Action: what" tags:"@Action" text:"Add project and describe action">>
* <<newerTiddler button:"New Project" name:"Project Name?" tags:"[[My Projects]] [[My Inbox]] Journal" template:"MyTemplate">>

!Todo
<<projectTemplate>>

!Known issues
* Must use double quotes (") around parameter values if they contain a space, can't use single quotes (').
* can't use standard bracketted style tags, ust type in the tags space and all and put a comma between them. For example tags:"one big tag, another big tag" uses 2 tags ''one big tag'' and ''another big tag''.

!Notes
* It works fine, and I use it daily, however I haven't really tested edge cases or multiple platforms. If you run into bugs or problems, let me know!

!Requests
* Have delta-date specifiers on the name: name:"Inbox YYY/MM/DD+1" ( ceruleat@gmail.com )
* Option to just open the tiddler instead of immediately edit it ( ceruleat@gmail.com )
* Have date formatters in tags as well as in name (me)

!Revision history
$History: PaulsNotepad.html $
 * 
 * ***************** Version 2 *****************
 * User: paulpet Date: 2/26/06 Time: 7:25p
 * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig
 * Port to tw2.0, bug fixes, and simplification!
v1.0.2 (not released) - fixed small documentation issues.
v1.0.1 October 13th - fixed a bug occurring only in FF
v1.0 October 11th - Initial public release
v0.8 October 10th - Feature complete... 
v0.7 Initial public preview

!Code
***/
//{{{
config.macros.newerTiddler = { 
name:"New(er) Tiddler",
tags:"",
text:"Type Tiddler Contents Here.",
button:"new(er) tiddler",

reparse: function( params ) {
 var re = /([^:\'\"\s]+)(?::([^\'\":\s]+)|:[\'\"]([^\'\"\\]*(?:\\.[^\'\"\\]*)*)[\'\"])?(?=\s|$)/g;
 var ret = new Array() ;
 var m ;

 while( (m = re.exec( params )) != null )
 ret[ m[1] ] = m[2]?m[2]:m[3]?m[3]:true ;

 return ret ;
},
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
 if ( readOnly ) return ;

 var input = this.reparse( paramString ) ;
 var tiddlerName = input["name"]?input["name"].trim():config.macros.newerTiddler.name ;
 var tiddlerTags = input["tags"]?input["tags"]:config.macros.newerTiddler.tags ;
 var tiddlerBody = input["text"]?input["text"]:config.macros.newerTiddler.text ;
 var buttonText = input["button"]?input["button"]:config.macros.newerTiddler.button ;
 var template = input["template"]?input["template"]:null;

 // if there is a template, use it - otherwise use the tiddlerBody text
 if ( template ) {
 tiddlerBody = store.getTiddlerText( template );
 }
 if ( tiddlerBody == null || tiddlerBody.length == 0 )
 tiddlerBody = config.macros.newerTiddler.text ;

 // mptw hack
 tiddlerBody = tiddlerBody.replace(/\$\)\)/g,">>");
 tiddlerBody = tiddlerBody.replace(/\$\}\}/g,">>");

 var now = new Date() ;
 tiddlerName = now.formatString( tiddlerName ) ;
 
 createTiddlyButton( place, buttonText, "", function() {
 var exists = store.tiddlerExists( tiddlerName );
 var t = store.createTiddler( tiddlerName );
 if ( ! exists )
 t.assign( tiddlerName, tiddlerBody, config.views.wikified.defaultModifier, now, tiddlerTags.readBracketedList() );
 
 story.displayTiddler(null,tiddlerName,DEFAULT_EDIT_TEMPLATE);
 story.focusTiddler(tiddlerName,"title");
 return false;
 });
}}
//}}}
/***
This plugin is released under the [[Creative Commons Attribution 2.5 License|http://creativecommons.org/licenses/by/2.5/]]
***/

<div id='header'>
<div id='titleline'>
<span id='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span id='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='sidebar'>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebarOptions' macro="slider chkSliderSidebarOptions SideBarOptions 'search & options »' 'Search and other tools'"></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
/***
|<html><a name="Top"/></html>''Name:''|PartTiddlerPlugin|
|''Version:''|1.0.7 (2007-03-07)|
|''Source:''|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Table of Content<html><a name="TOC"/></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Description',null, event)">Description, Syntax</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Applications',null, event)">Applications</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('LongTiddler',null, event)">Refering to Paragraphs of a Longer Tiddler</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Citation',null, event)">Citation Index</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('TableCells',null, event)">Creating "multi-line" Table Cells</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Tabs',null, event)">Creating Tabs</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Sliders',null, event)">Using Sliders</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Revisions',null, event)">Revision History</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Code',null, event)">Code</a></html>
!Description<html><a name="Description"/></html>
With the {{{<part aPartName> ... </part>}}} feature you can structure your tiddler text into separate (named) parts. 
Each part can be referenced as a "normal" tiddler, using the "//tiddlerName//''/''//partName//" syntax (e.g. "About/Features"). E.g. you may create links to the parts, use it in {{{<<tiddler...>>}}} or {{{<<tabs...>>}}} macros etc.

''Syntax:'' 
|>|''<part'' //partName// [''hidden''] ''>'' //any tiddler content// ''</part>''|
|//partName//|The name of the part. You may reference a part tiddler with the combined tiddler name "//nameOfContainerTidder//''/''//partName//.|
|''hidden''|When defined the content of the part is not displayed in the container tiddler. But when the part is explicitly referenced (e.g. in a {{{<<tiddler...>>}}} macro or in a link) the part's content is displayed.|
|<html><i>any&nbsp;tiddler&nbsp;content</i></html>|<html>The content of the part.<br>A part can have any content that a "normal" tiddler may have, e.g. you may use all the formattings and macros defined.</html>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Applications<html><a name="Applications"/></html>
!!Refering to Paragraphs of a Longer Tiddler<html><a name="LongTiddler"/></html>
Assume you have written a long description in a tiddler and now you want to refer to the content of a certain paragraph in that tiddler (e.g. some definition.) Just wrap the text with a ''part'' block, give it a nice name, create a "pretty link" (like {{{[[Discussion Groups|Introduction/DiscussionGroups]]}}}) and you are done.

Notice this complements the approach to first writing a lot of small tiddlers and combine these tiddlers to one larger tiddler in a second step (e.g. using the {{{<<tiddler...>>}}} macro). Using the ''part'' feature you can first write a "classic" (longer) text that can be read "from top to bottom" and later "reuse" parts of this text for some more "non-linear" reading.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Citation Index<html><a name="Citation"/></html>
Create a tiddler "Citations" that contains your "citations". 
Wrap every citation with a part and a proper name. 

''Example''
{{{
<part BAX98>Baxter, Ira D. et al: //Clone Detection Using Abstract Syntax Trees.// 
in //Proc. ICSM//, 1998.</part>

<part BEL02>Bellon, Stefan: //Vergleich von Techniken zur Erkennung duplizierten Quellcodes.// 
Thesis, Uni Stuttgart, 2002.</part>

<part DUC99>Ducasse, Stéfane et al: //A Language Independent Approach for Detecting Duplicated Code.// 
in //Proc. ICSM//, 1999.</part>
}}}

You may now "cite" them just by using a pretty link like {{{[[Citations/BAX98]]}}} or even more pretty, like this {{{[[BAX98|Citations/BAX98]]}}}.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating "multi-line" Table Cells<html><a name="TableCells"/></html>
You may have noticed that it is hard to create table cells with "multi-line" content. E.g. if you want to create a bullet list inside a table cell you cannot just write the bullet list
{{{
* Item 1
* Item 2
* Item 3
}}}
into a table cell (i.e. between the | ... | bars) because every bullet item must start in a new line but all cells of a table row must be in one line.

Using the ''part'' feature this problem can be solved. Just create a hidden part that contains the cells content and use a {{{<<tiddler >>}}} macro to include its content in the table's cell.

''Example''
{{{
|!Subject|!Items|
|subject1|<<tiddler ./Cell1>>|
|subject2|<<tiddler ./Cell2>>|

<part Cell1 hidden>
* Item 1
* Item 2
* Item 3
</part>
...
}}}

Notice that inside the {{{<<tiddler ...>>}}} macro you may refer to the "current tiddler" using the ".".

BTW: The same approach can be used to create bullet lists with items that contain more than one line.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating Tabs<html><a name="Tabs"/></html>
The build-in {{{<<tabs ...>>}}} macro requires that you defined an additional tiddler for every tab it displays. When you want to have "nested" tabs you need to define a tiddler for the "main tab" and one for every tab it contains. I.e. the definition of a set of tabs that is visually displayed at one place is distributed across multiple tiddlers.

With the ''part'' feature you can put the complete definition in one tiddler, making it easier to keep an overview and maintain the tab sets.

''Example''
The standard tabs at the sidebar are defined by the following eight tiddlers:
* SideBarTabs
* TabAll
* TabMore
* TabMoreMissing
* TabMoreOrphans
* TabMoreShadowed
* TabTags
* TabTimeline

Instead of these eight tiddlers one could define the following SideBarTabs tiddler that uses the ''part'' feature:
{{{
<<tabs txtMainTab 
    Timeline Timeline SideBarTabs/Timeline 
    All 'All tiddlers' SideBarTabs/All 
    Tags 'All tags' SideBarTabs/Tags 
    More 'More lists' SideBarTabs/More>>
<part Timeline hidden><<timeline>></part>
<part All hidden><<list all>></part>
<part Tags hidden><<allTags>></part>
<part More hidden><<tabs txtMoreTab 
    Missing 'Missing tiddlers' SideBarTabs/Missing 
    Orphans 'Orphaned tiddlers' SideBarTabs/Orphans 
    Shadowed 'Shadowed tiddlers' SideBarTabs/Shadowed>></part>
<part Missing hidden><<list missing>></part>
<part Orphans hidden><<list orphans>></part>
<part Shadowed hidden><<list shadowed>></part>
}}}

Notice that you can easily "overwrite" individual parts in separate tiddlers that have the full name of the part.

E.g. if you don't like the classic timeline tab but only want to see the 100 most recent tiddlers you could create a tiddler "~SideBarTabs/Timeline" with the following content:
{{{
<<forEachTiddler 
		sortBy 'tiddler.modified' descending 
		write '(index < 100) ? "* [["+tiddler.title+"]]\n":""'>>
}}}
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Using Sliders<html><a name="Sliders"/></html>
Very similar to the build-in {{{<<tabs ...>>}}} macro (see above) the {{{<<slider ...>>}}} macro requires that you defined an additional tiddler that holds the content "to be slid". You can avoid creating this extra tiddler by using the ''part'' feature

''Example''
In a tiddler "About" we may use the slider to show some details that are documented in the tiddler's "Details" part.
{{{
...
<<slider chkAboutDetails About/Details details "Click here to see more details">>
<part Details hidden>
To give you a better overview ...
</part>
...
}}}

Notice that putting the content of the slider into the slider's tiddler also has an extra benefit: When you decide you need to edit the content of the slider you can just doubleclick the content, the tiddler opens for editing and you can directly start editing the content (in the part section). In the "old" approach you would doubleclick the tiddler, see that the slider is using tiddler X, have to look for the tiddler X and can finally open it for editing. So using the ''part'' approach results in a much short workflow.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Revision history<html><a name="Revisions"/></html>
* v1.0.7 (2007-03-07)
** Bugfix: <<tiddler "./partName">> does not always render correctly after a refresh (e.g. like it happens when using the "Include" plugin). Thanks to Morris Gray for reporting the bug.
* v1.0.6 (2006-11-07)
** Bugfix: cannot edit tiddler when UploadPlugin by Bidix is installed. Thanks to José Luis González Castro for reporting the bug.
* v1.0.5 (2006-03-02)
** Bugfix: Example with multi-line table cells does not work in IE6. Thanks to Paulo Soares for reporting the bug.
* v1.0.4 (2006-02-28)
** Bugfix: Shadow tiddlers cannot be edited (in TW 2.0.6). Thanks to Torsten Vanek for reporting the bug.
* v1.0.3 (2006-02-26)
** Adapt code to newly introduced Tiddler.prototype.isReadOnly() function (in TW 2.0.6). Thanks to Paulo Soares for reporting the problem.
* v1.0.2 (2006-02-05)
** Also allow other macros than the "tiddler" macro use the "." in the part reference (to refer to "this" tiddler)
* v1.0.1 (2006-01-27)
** Added Table of Content for plugin documentation. Thanks to RichCarrillo for suggesting.
** Bugfix: newReminder plugin does not work when PartTiddler is installed. Thanks to PauloSoares for reporting.
* v1.0.0 (2006-01-25)
** initial version
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Code<html><a name="Code"/></html>
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
//{{{
//============================================================================
//                           PartTiddlerPlugin

// Ensure that the PartTiddler Plugin is only installed once.
//
if (!version.extensions.PartTiddlerPlugin) {



version.extensions.PartTiddlerPlugin = {
    major: 1, minor: 0, revision: 7,
    date: new Date(2007, 2, 7), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#PartTiddlerPlugin"
};

if (!window.abego) window.abego = {};
if (version.major < 2) alertAndThrow("PartTiddlerPlugin requires TiddlyWiki 2.0 or newer.");

//============================================================================
// Common Helpers

// Looks for the next newline, starting at the index-th char of text. 
//
// If there are only whitespaces between index and the newline 
// the index behind the newline is returned, 
// otherwise (or when no newline is found) index is returned.
//
var skipEmptyEndOfLine = function(text, index) {
	var re = /(\n|[^\s])/g;
	re.lastIndex = index;
	var result = re.exec(text);
	return (result && text.charAt(result.index) == '\n') 
			? result.index+1
			: index;
}


//============================================================================
// Constants

var partEndOrStartTagRE = /(<\/part>)|(<part(?:\s+)((?:[^>])+)>)/mg;
var partEndTagREString = "<\\/part>";
var partEndTagString = "</part>";

//============================================================================
// Plugin Specific Helpers

// Parse the parameters inside a <part ...> tag and return the result.
//
// @return [may be null] {partName: ..., isHidden: ...}
//
var parseStartTagParams = function(paramText) {
	var params = paramText.readMacroParams();
	if (params.length == 0 || params[0].length == 0) return null;
	
	var name = params[0];
	var paramsIndex = 1;
	var hidden = false;
	if (paramsIndex < params.length) {
		hidden = params[paramsIndex] == "hidden";
		paramsIndex++;
	}
	
	return {
		partName: name, 
		isHidden: hidden
	};
}

// Returns the match to the next (end or start) part tag in the text, 
// starting the search at startIndex.
// 
// When no such tag is found null is returned, otherwise a "Match" is returned:
// [0]: full match
// [1]: matched "end" tag (or null when no end tag match)
// [2]: matched "start" tag (or null when no start tag match)
// [3]: content of start tag (or null if no start tag match)
//
var findNextPartEndOrStartTagMatch = function(text, startIndex) {
	var re = new RegExp(partEndOrStartTagRE);
	re.lastIndex = startIndex;
	var match = re.exec(text);
	return match;
}

//============================================================================
// Formatter

// Process the <part ...> ... </part> starting at (w.source, w.matchStart) for formatting.
//
// @return true if a complete part section (including the end tag) could be processed, false otherwise.
//
var handlePartSection = function(w) {
	var tagMatch = findNextPartEndOrStartTagMatch(w.source, w.matchStart);
	if (!tagMatch) return false;
	if (tagMatch.index != w.matchStart || !tagMatch[2]) return false;

	// Parse the start tag parameters
	var arguments = parseStartTagParams(tagMatch[3]);
	if (!arguments) return false;
	
	// Continue processing
	var startTagEndIndex = skipEmptyEndOfLine(w.source, tagMatch.index + tagMatch[0].length);
	var endMatch = findNextPartEndOrStartTagMatch(w.source, startTagEndIndex);
	if (endMatch && endMatch[1]) {
		if (!arguments.isHidden) {
			w.nextMatch = startTagEndIndex;
			w.subWikify(w.output,partEndTagREString);
		}
		w.nextMatch = skipEmptyEndOfLine(w.source, endMatch.index + endMatch[0].length);
		
		return true;
	}
	return false;
}

config.formatters.push( {
    name: "part",
    match: "<part\\s+[^>]+>",
	
	handler: function(w) {
		if (!handlePartSection(w)) {
			w.outputText(w.output,w.matchStart,w.matchStart+w.matchLength);
		}
	}
} )

//============================================================================
// Extend "fetchTiddler" functionality to also recognize "part"s of tiddlers 
// as tiddlers.

var currentParent = null; // used for the "." parent (e.g. in the "tiddler" macro)

// Return the match to the first <part ...> tag of the text that has the
// requrest partName.
//
// @return [may be null]
//
var findPartStartTagByName = function(text, partName) {
	var i = 0;
	
	while (true) {
		var tagMatch = findNextPartEndOrStartTagMatch(text, i);
		if (!tagMatch) return null;

		if (tagMatch[2]) {
			// Is start tag
	
			// Check the name
			var arguments = parseStartTagParams(tagMatch[3]);
			if (arguments && arguments.partName == partName) {
				return tagMatch;
			}
		}
		i += tagMatch[0].length;
	}
}

// Return the part "partName" of the given parentTiddler as a "readOnly" Tiddler 
// object, using fullName as the Tiddler's title. 
//
// All remaining properties of the new Tiddler (tags etc.) are inherited from 
// the parentTiddler.
// 
// @return [may be null]
//
var getPart = function(parentTiddler, partName, fullName) {
	var text = parentTiddler.text;
	var startTag = findPartStartTagByName(text, partName);
	if (!startTag) return null;
	
	var endIndexOfStartTag = skipEmptyEndOfLine(text, startTag.index+startTag[0].length);
	var indexOfEndTag = text.indexOf(partEndTagString, endIndexOfStartTag);

	if (indexOfEndTag >= 0) {
		var partTiddlerText = text.substring(endIndexOfStartTag,indexOfEndTag);
		var partTiddler = new Tiddler();
		partTiddler.set(
						fullName,
						partTiddlerText,
						parentTiddler.modifier,
						parentTiddler.modified,
						parentTiddler.tags,
						parentTiddler.created);
		partTiddler.abegoIsPartTiddler = true;
		return partTiddler;
	}
	
	return null;
}

// Hijack the store.fetchTiddler to recognize the "part" addresses.
//
var hijackFetchTiddler = function() {
	var oldFetchTiddler = store.fetchTiddler ;
	store.fetchTiddler = function(title) {
		var result = oldFetchTiddler.apply(this, arguments);
		if (!result && title) {
			var i = title.lastIndexOf('/');
			if (i > 0) {
				var parentName = title.substring(0, i);
				var partName = title.substring(i+1);
				var parent = (parentName == ".") 
						? store.resolveTiddler(currentParent)
						: oldFetchTiddler.apply(this, [parentName]);
				if (parent) {
					return getPart(parent, partName, parent.title+"/"+partName);
				}
			}
		}
		return result;	
	};
};

// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. 
// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.
// Otherwise hijack now.
if (!store) {
	var oldRestartFunc = restart;
	window.restart = function() {
		hijackFetchTiddler();
		oldRestartFunc.apply(this,arguments);
	};
} else
	hijackFetchTiddler();




// The user must not edit a readOnly/partTiddler
//

config.commands.editTiddler.oldIsReadOnlyFunction = Tiddler.prototype.isReadOnly;

Tiddler.prototype.isReadOnly = function() {
	// Tiddler.isReadOnly was introduced with TW 2.0.6.
	// For older version we explicitly check the global readOnly flag
	if (config.commands.editTiddler.oldIsReadOnlyFunction) {
		if (config.commands.editTiddler.oldIsReadOnlyFunction.apply(this, arguments)) return true;
	} else {
		if (readOnly) return true;
	}

	return this.abegoIsPartTiddler;
}

config.commands.editTiddler.handler = function(event,src,title)
{
	var t = store.getTiddler(title);
	// Edit the tiddler if it either is not a tiddler (but a shadowTiddler)
	// or the tiddler is not readOnly
	if(!t || !t.abegoIsPartTiddler)
		{
		clearMessage();
		story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
		story.focusTiddler(title,"text");
		return false;
		}
}

// To allow the "./partName" syntax in macros we need to hijack 
// the invokeMacro to define the "currentParent" while it is running.
// 
var oldInvokeMacro = window.invokeMacro;
function myInvokeMacro(place,macro,params,wikifier,tiddler) {
	var oldCurrentParent = currentParent;
	if (tiddler) currentParent = tiddler;
	try {
		oldInvokeMacro.apply(this, arguments);
	} finally {
		currentParent = oldCurrentParent;
	}
}
window.invokeMacro = myInvokeMacro;

// To correctly support the "./partName" syntax while refreshing we need to hijack 
// the config.refreshers.tiddlers to define the "currentParent" while it is running.
// 
(function() {
	var oldTiddlerRefresher= config.refreshers.tiddler;
	config.refreshers.tiddler = function(e,changeList) {
		var oldCurrentParent = currentParent;
		try {
			currentParent = e.getAttribute("tiddler");
			return oldTiddlerRefresher.apply(this,arguments);
		} finally {
			currentParent = oldCurrentParent;
		}
	};
})();

// Scroll the anchor anchorName in the viewer of the given tiddler visible.
// When no tiddler is defined use the tiddler of the target given event is used.
window.scrollAnchorVisible = function(anchorName, tiddler, evt) {
	var tiddlerElem = null;
	if (tiddler) {
		tiddlerElem = document.getElementById(story.idPrefix + tiddler);
	}
	if (!tiddlerElem && evt) {
		var target = resolveTarget(evt);
		tiddlerElem = story.findContainingTiddler(target);
	}
	if (!tiddlerElem) return;

	var children = tiddlerElem.getElementsByTagName("a");
	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var name = child.getAttribute("name");
		if (name == anchorName) {
			var y = findPosY(child);
			window.scrollTo(0,y);
			return;
		}
	}
}

} // of "install only once"
//}}}

/***
<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.

<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
/***
!!PercentBox 
This lets you manage complicated todo lists by putting characters between brackets, Including percentage done, complete (check), incomplete, alert, and question mark.  It will flag those lines with a brightly colored text-icon. 

''Examples''
{{{
[xx] New Item / Incomplete
[XX] Complete
[26] Percent Complete
[!!] Alert
[??] Question
}}}
[xx] New Item / Incomplete
[XX] Complete
[26] Percent Complete
[!!] Alert
[??] Question

自分で使い易いように修正する。前後のスペースはあまり要らない。

***/
{{{
version.extensions.PercentBox= {major: 0, minor: 0, revision:1 , date: new Date(2006,8,24)};
 
 config.formatters.push( {
 name: "PercentBox",
 match: "\\[[0-9xX\\!\\?][0-9xX\\!\\?][0-9xX]?\\]",
 lookahead: "\\[([0-9xX\\!\\?][0-9xX\\!\\?][0-9xX]?)\\]",
 //~ match: "\\[[0-9][0-9][0-9]?\\].*\n",
 //~ lookahead: "\\[([0-9][0-9][0-9]?)\\](.*\n)",
 handler: function(w)
 {
 var lookaheadRegExp = new RegExp(this.lookahead,"mg");
 lookaheadRegExp.lastIndex = w.matchStart;
 var lookaheadMatch = lookaheadRegExp.exec(w.source);
 if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
 {
 var inside=lookaheadMatch[1];
 var line=lookaheadMatch[2];
 
 
 
 //~ var style = "color:#A00;display:inline;font-weight:bold;font-size:8pt;";
 var style = "color:#111;display:inline;font-weight:bold;font-size:8pt;";
 var lineStyle = "";
 
 if (inside == "100" || inside == "XX")
 {
 style += "color:#0B0;font-size:12pt;"; // org 8pt
 //~ inside = inside+"%"
 //~ inside = "&nbsp;&nbsp;&nbsp;√&nbsp;&nbsp;&nbsp;&nbsp;";
//~ inside = "&nbsp;&nbsp;√&nbsp;&nbsp;&nbsp;"; //krk
//~ inside = "&nbsp;√&nbsp;";
   inside = "√&nbsp;";
 //~  inside = "&nbsp;~√~&nbsp;&nbsp;&nbsp;";
 }
 
 else if ( inside == "??" )
 {
 style += "color:#A00;";
//~ inside = "&nbsp;&nbsp;(?)&nbsp;&nbsp;";
//~ inside = "&nbsp;(?)&nbsp;";
 inside = "(?)&nbsp;";
 }
 
 else if ( inside == "!!" )
 {
 style += "color:#A00;";
 //~ inside = "&nbsp;&nbsp;&nbsp;&nbsp;!&nbsp;&nbsp;&nbsp;&nbsp;";
//~ inside = "&nbsp;&nbsp;&nbsp;!!&nbsp;&nbsp;&nbsp;&nbsp;";
//~ inside = "&nbsp;&nbsp;!!&nbsp;";
 inside = "!!&nbsp;";
 }
 
 //~ else if (inside == "XX")
 //~ {
 //~ style += "color:#888;";
 //~ inside = "&nbsp;>>>&nbsp;&nbsp;";
 //~ lineStyle += "color:#888;";
 //~ }
 
 else if (inside == "xx" || inside == "XX" || inside == "00")
 {
//~ inside = "&nbsp;>>>&nbsp;&nbsp;";
 inside = ">>&nbsp;&nbsp;";
 //~inside = "&nbsp;&nbsp;&nbsp;>&nbsp;&nbsp;&nbsp;&nbsp;";
 }

 else if ( inside.length == 2 )
{
 style += "color:#F63;";
 inside = "&nbsp;"+inside+"%&nbsp;"
}
 
 //~ if (inside == "&nbsp;00%&nbsp;")
 //~ {
 //~ style += "color:#000;font-size:8pt";
 //~ }
 
 if (parseInt(inside) > 100)
 return;
 
 var c = document.createElement("span");
 c.setAttribute("style",style);
 //~ c.innerHTML = "&nbsp;&nbsp;[" + inside + "]&nbsp;";
 c.innerHTML = "&nbsp;" + inside + "";
 w.output.appendChild(c);
 
 
 
 //~ var d = document.createElement("span");
 //~ d.setAttribute("style",lineStyle);
 //~ d.innerHTML = line;
 //~ w.output.appendChild(d);
 
 //~ var br = document.createElement("br");
 //~ w.output.appendChild(br);
 
 
 }
 
 
 }
 }
 );
}}}
When a TiddlyWiki is located on the web (view over http), for security reasons, browsers do not allow TiddlyWiki to access a remote page located on a different site.

For example, when views over http a TiddlyWiki is unable to:
*import a plugin using EricShulman's ImportTiddlersPlugin
*access <<tag RSSFeeds>> with RSSReaderPlugin
*imbed a remote page in a tiddler
* ...

A first possibility is to bypass the browser check. However, visitors usually are not comfortable with altering the security options of their browser. 

The ProxyService tries to provide an other way. 

ProxyService is mainly a Ruby script that implements a very simple proxy.  The command: proxy.cgi?url=host.domain.com/some/page.html simply gets and returns the URL.

Nevertheless, this service should not be used for other purpose than as TiddlyWiki companion and under the author's control, the access is allowed only to a list of site contained in a separate file ([[allowedsites]] for example) and to hosts of the current domain.

Thanks to UploadToFileMacro, this allowedSiteList could be fully maintained in TiddlyWiki by editing [[allowedsites]] and using <<uploadToFile allowedsites allowedsites>> macro.

Long past, Eric included in his ImportTiddlersPlugin the ability to specify a proxy URL as a parameter SiteProxy could be provide to initialize it.

Finally, as in AllowedSiteList proxy.cgi?action=list return the current allowed host list.
/%
|Name|QuickEditToolbar|
|Source|http://www.TiddlyTools.com/#QuickEditToolbar|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|NestedSlidersPlugin, InlineJavascriptPlugin|
|Overrides||
|Description|quickly insert TiddlyWiki tiddler links or common formatting sequences directly into tiddler content|
|Status|ALPHA - experimental - use at your own risk |
|added|added some feature  by KuRaKu(2007.04.23) |

Usage:

in EditTemplate, add: <div class='toolbar' macro='tiddler QuickEditToolbar'></div>

%/
+++^20em^*[quicklink|add a tiddler link]<script>
		place.style.padding=".5em 1em";
	</script>{{fine smallform{
		//enter/select a tiddler://
		{{wrap{<<goto insert width:100%;margin:0;font-size:8pt; width:90%;font-size:8pt;>>}}}}}}===
+++^*[format|add formatting sequence to current selection]
	{{nowrap center fine{
	''<script label="B" title="bold">
		return config.quickEdit.wrapSelection(place,"''","''");
	</script>'' &nbsp;&nbsp; //<script label="Ita" title="italics">
		return config.quickEdit.wrapSelection(place,"//","//");
	</script>// &nbsp;&nbsp; __<script label="U" title="underline">
		return config.quickEdit.wrapSelection(place,"__","__");
	</script>__ &nbsp;&nbsp; --<script label="S" title="strikethrough"> //added krk -----
		return config.quickEdit.wrapSelection(place,"--","--");
	</script>-- &nbsp;&nbsp; ^^<script label="super" title="superscript"> //added krk -----
		return config.quickEdit.wrapSelection(place,"^^","^^");
	</script>^^ &nbsp;&nbsp; ~~<script label="sub" title="subscript"> //added krk -----
		return config.quickEdit.wrapSelection(place,"~~","~~");
	</script>~~ &nbsp;&nbsp; <script label="*bullet" title="bullet"> // added krk -----
		var here=story.findContainingTiddler(place); if (!here) return false;
		var e=story.getTiddlerField(here.getAttribute("tiddler"),"text"); if (!e||e.getAttribute("edit")!="text") return false;
		e.focus(); var seltext = config.quickEdit.getSelection(e);
		seltext = seltext.replace(/^/mg,'\*');
		return config.quickEdit.setSelection(place, seltext);
	</script> &nbsp; <script label="+number" title="numbered"> // added krk -----
		var here=story.findContainingTiddler(place); if (!here) return false;
		var e=story.getTiddlerField(here.getAttribute("tiddler"),"text"); if (!e||e.getAttribute("edit")!="text") return false;
		e.focus(); var seltext = config.quickEdit.getSelection(e);
		seltext = seltext.replace(/^/mg,'\+');
		return config.quickEdit.setSelection(place, seltext);
	</script> &nbsp; @@<script label="hilight" title="hilight"> //added krk -----
		return config.quickEdit.wrapSelection(place,"@@","@@");
	</script>@@  &nbsp; @@bgcolor(#0ff):<script label="hilight" title="hilight"> //added krk -----
		return config.quickEdit.wrapSelection(place,"@@bgcolor(#0ff):","@@");
	</script>@@ &nbsp; @@color(#f00):<script label="red" title="red style"> //added krk -----
		return config.quickEdit.wrapSelection(place,"@@color(#f00):","@@");
	</script>@@
	<script label="link" title="wiki link"> //added krk -----
		return config.quickEdit.wrapSelection(place,"[[","]]");
	</script> &nbsp; <script label="image" title="image (jpg, gif, png)">
		var fn=config.quickEdit.promptForFilename("Enter/select an image file",getLocalPath(document.location.href),"");
		if (!fn) return false; // cancelled by user
		var tip=prompt("Enter a tooltip for this image",""); if (!tip) tip=""; else tip+="|";
		return config.quickEdit.setSelection(place,"[img["+tip+fn+"]]");
	</script> &nbsp; <script label="table" title="table row">
		return config.quickEdit.setSelection(place,"\n|left | centered | right|\n");
	</script> &nbsp; <script label="tab2tbl" title="table row"> // added krk -----
		var here=story.findContainingTiddler(place); if (!here) return false;
		var e=story.getTiddlerField(here.getAttribute("tiddler"),"text"); if (!e||e.getAttribute("edit")!="text") return false;
		e.focus(); var seltext = config.quickEdit.getSelection(e);
		seltext = seltext.replace(/[\t ]+/mg,'|'); seltext = seltext.replace(/^|$/mg,'|');
		return config.quickEdit.setSelection(place, seltext);
	</script> &nbsp; <script label="quote" title="multi-line indented blockquote">
		return config.quickEdit.wrapSelection(place,"\n<<<\n","\n<<<\n");
	</script> &nbsp; <script label="monospace" title="monospace font inline (CODE)">
		return config.quickEdit.wrapSelection(place,"{{{","}}}");
	</script> &nbsp; <script label="monoblock" title="monospaced font block with literal newlines (PRE)">
		return config.quickEdit.wrapSelection(place,"\n{{{\n","\n}}}\n");
	</script> &nbsp; <script label="comment" title="TiddlyWiki comment">
		return config.quickEdit.wrapSelection(place,"/%","%/");
	</script>
	}}}===
<script> place.lastChild.style.padding=".5em 1em"; </script><script>

config.quickEdit = {
	replaceSelection: // copy from CoreTweaks to eliminate dependency - not needed in TW2.2+
	function (e,text) {
		if (e.setSelectionRange) {
			var oldpos = e.selectionStart;
			var isRange=e.selectionEnd-e.selectionStart;
			e.value = e.value.substr(0,e.selectionStart) + text + e.value.substr(e.selectionEnd);
			e.setSelectionRange( isRange?oldpos:oldpos+text.length, oldpos+text.length);
			var linecount = e.value.split('\n').length;
			var thisline = e.value.substr(0,e.selectionStart).split('\n').length-1;
			e.scrollTop = Math.floor((thisline-e.rows/2)*e.scrollHeight/linecount);
		}
		else if (document.selection) {
			var range = document.selection.createRange();
			if (range.parentElement() == e)	{
				var isCollapsed = range.text == "";
				range.text = text;
				 if (!isCollapsed) {
					range.moveStart('character', -text.length);
					range.select();
				}
			}
		}
	},
	getSelection:
	function(e) {
		var seltext="";
		if (e.setSelectionRange)
			seltext=e.value.substr(e.selectionStart,e.selectionEnd-e.selectionStart);
		else if (document.selection) {
			var range = document.selection.createRange();
			if (range.parentElement()==e)	seltext=range.text
		}
		return seltext;
	},
	setSelection:
	function(where,newtext) {
		var here=story.findContainingTiddler(where); if (!here) return false;
		var e=story.getTiddlerField(here.getAttribute("tiddler"),"text"); if (!e||e.getAttribute("edit")!="text") return false;
		e.focus(); config.quickEdit.replaceSelection(e,newtext);
		return false;
	},
	wrapSelection:
	function(where,before,after) {
		var here=story.findContainingTiddler(where); if (!here) return false;
		var e=story.getTiddlerField(here.getAttribute("tiddler"),"text"); if (!e||e.getAttribute("edit")!="text") return false;
		e.focus(); config.quickEdit.replaceSelection(e,before+config.quickEdit.getSelection(e)+after);
		return false;
	},
	promptForFilename:
	function(msg,path,file) {
		if(window.Components) { // moz
			try {
				netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
				var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
				var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
				picker.init(window, msg, nsIFilePicker.modeOpen);
				var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
				thispath.initWithPath(path);
				picker.displayDirectory=thispath;
				picker.defaultExtension='jpg';
				picker.defaultString=file;
				picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterImages);
				if (picker.show()!=nsIFilePicker.returnCancel)
					var result="file:///"+picker.file.persistentDescriptor.replace(/\\/g,'/');
			}
			catch(e) { alert('error during local file access: '+e.toString()) }
		}
		else { // IE
			try { // XP only
				var s = new ActiveXObject('UserAccounts.CommonDialog');
				s.Filter='All files|*.*|JPG files|*.jpg|GIF files|*.gif|PNG files|*.png|';
				s.FilterIndex=1; // default to JPG files;
				s.InitialDir=path;
				s.FileName=file;
				if (s.showOpen()) var result=s.FileName;
			}
			catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
		}
		return result;
	}
}
</script>
/***
| Name|QuickOpenTagPlugin|
| Description|Changes tag links to make it easier to open tags as tiddlers|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {

	dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

	createTagButton: function(place,tag,excludeTiddler) {
		// little hack so we can to <<tag PrettyTagName|RealTagName>>
		var splitTag = tag.split("|");
		var pretty = tag;
		if (splitTag.length == 2) {
			tag = splitTag[1];
			pretty = splitTag[0];
		}
		
		var sp = createTiddlyElement(place,"span",null,"quickopentag");
		createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
		
		var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
                        config.views.wikified.tag.tooltip.format([tag]),onClickTag);
		theTag.setAttribute("tag",tag);
		if (excludeTiddler)
			theTag.setAttribute("tiddler",excludeTiddler);
    		return(theTag);
	},

	miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tagged = store.getTaggedTiddlers(tiddler.title);
		if (tagged.length > 0) {
			var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
                        	config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
			theTag.setAttribute("tag",tiddler.title);
			theTag.className = "miniTag";
		}
	},

	allTagsHandler: function(place,macroName,params) {
		var tags = store.getTags();
		var theDateList = createTiddlyElement(place,"ul");
		if(tags.length == 0)
			createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);
		for (var t=0; t<tags.length; t++) {
			var theListItem = createTiddlyElement(theDateList,"li");
			var theLink = createTiddlyLink(theListItem,tags[t][0],true);
			var theCount = " (" + tags[t][1] + ")";
			theLink.appendChild(document.createTextNode(theCount));
			var theDropDownBtn = createTiddlyButton(theListItem," " +
			config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
			theDropDownBtn.setAttribute("tag",tags[t][0]);
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
"	{ margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
"	{ border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
"	{ margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
"	{ margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
"	/* looks better in right justified main menus */",
"	{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", 
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		// we fully replace these builtins. can't hijack them easily
		window.createTagButton = this.createTagButton;
		config.macros.allTags.handler = this.allTagsHandler;
		config.macros.miniTag = { handler: this.miniTagHandler };
		config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
		store.addNotification("QuickOpenTagStyles",refreshStyles);
	}
}

config.quickOpenTag.init();

//}}}
QuickOpenTagPlugin はタグリストのインターフェースを提供します。

タグ表示の右側に、タグの振られているリスト一覧へのリンク「▼」を付加します。

例: <<tag plugintips>>

一覧リストには、「open all」、「open tag XXX」のリンクが付きます。
*open all: リストを全て開く
*open tag XXX: XXX タグの tiddler を開く。
~GoogleGroup は見れなくても、せめて ~TiddlySpot.com は許可してクダサイ...
!~RSSFeeds-TiddlyWiki
<<rssReader asHtml http://kuraku.net/tw/proxy.cgi?url=http://www.tiddlywiki.com/index.xml>>
/%<<rssReader asHtml http://kuraku.net/tw/proxy/http://www.tiddlywiki.com/index.xml>>%/

<<rssReader asHtml http://kuraku.net/tw/proxy.cgi?url=http://tiddlyspot.blogspot.com/feeds/posts/default>>

<<rssReader asHtml http://kuraku.net/tw/proxy.cgi?url=http://announce.tiddlyspot.com/index.xml>>

<<rssReader asHtml http://kuraku.net/tw/proxy.cgi?url=http://faq.tiddlyspot.com/index.xml>>

<<rssReader asHtml http://kuraku.net/twproxy.cgi?url=http://tiddlyspot.com/blog/feed/>>

<<rssReader asHtml http://kuraku.net/tw/proxy.cgi?url=http://tiddlywiki.bidix.info/index.xml>>

<<rssReader asHtml http://kuraku.net/tw/proxy.cgi?url=http://www.tiddlytools.com/index.xml>>

<<rssReader asHtml http://kuraku.net/tw/proxy.cgi?url=http://groups.google.com/group/TiddlyWiki/feed/atom_v1_0_msgs.xml>>
/***
|''Name:''|RSSReaderPlugin|
|''Description:''|This plugin provides a RSSReader for TiddlyWiki|
|''Version:''|0.3.0|
|''Date:''|Aug 24, 2006|
|''Source:''|http://tiddlywiki.bidix.info/#RSSReaderPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#RSSReaderPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''Credit:''|BramChen for RssNewsMacro|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.0.0|
|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|
|''Include:''|none|
|''Require:''|none|
***/
//{{{
version.extensions.RSSReaderPlugin = {
	major: 0, minor: 3, revision: 0,
	date: new Date("Aug 24, 2006"),
	author: "BidiX",
	credit: "BramChen for RssNewsMacro",
	source: "http://TiddlyWiki.bidix.info/#RSSReaderPlugin",
	documentation : "http://TiddlyWiki.bidix.info/#RSSReaderPluginDoc",
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.0.0',
	browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'	
};

config.macros.rssReader = {
	dateFormat: "DDD, DD MMM YYYY",
	itemStyle: "display: block;border: 1px solid black;padding: 5px;margin: 5px;", //useed  '@@'+itemStyle+itemText+'@@'
	msg:{
		permissionDenied: "Permission to read preferences was denied.",
		noRSSFeed: "No RSS Feed at this address %0",
		urlNotAccessible: " Access to %0 is not allowed"
	},
	cache: [], 	// url => request
	desc: "noDesc",
	// feedURL: "",
	place:"",
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		var desc = params[0];
		var feedURL = params[1];
		// var toFilter = (params[2] ? params[2] : false);
		var toFilter = false;
		var filterString;
		if (params[2] != undefined) {
			toFilter = true;
			if (params[2].match(/\w+/))
				filterString = params[2];
			else
				filterString = tiddler.title;
		}
		var place = createTiddlyElement(place, "div", "RSSReader");
		wikify("^^<<rssFeedUpdate "+feedURL+" [[" + tiddler.title + "]]>>^^\n",place);
		if (this.cache[feedURL]) {
			this.processResponse(this.cache[feedURL], feedURL, place, desc, toFilter, filterString);
		}
		else {
			this.asyncGet(feedURL, place, desc, toFilter, filterString);
		}
	},

	asyncGet: function (feedURL, place, desc, toFilter, filterString){
		var xmlhttp;
		try {xmlhttp=new XMLHttpRequest();}
		catch (e) {
			try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");}
			catch (e) {
				try {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}
				catch (e) { displayMessage(e.description?e.description:e.toString());}
			}
		}
		if (!xmlhttp){
			return;
		}
		if (window.netscape){
			try {
				if (document.location.protocol.indexOf("http") == -1) {
 					netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
				}
			}
			catch (e) { displayMessage(e.description?e.description:e.toString()); }
		}
		xmlhttp.onreadystatechange=function (){
			if (xmlhttp.readyState==4) {
				if (xmlhttp.status==200 || xmlhttp.status===0) {
					config.macros.rssReader.processResponse(xmlhttp, feedURL, place, desc, toFilter, filterString);
				}
				else {
					displayMessage("Problem retrieving XML data:" + xmlhttp.statusText);
				}
			}
		};
		try {
			xmlhttp.open("GET",feedURL,true);
			if (config.browser.isIE) {
				xmlhttp.send();
			}
			else {
				xmlhttp.send(null);
			}
		}
		catch (e) {
			wikify(e.toString()+this.urlNotAccessible.format([feedURL]), place);
		}
	},
	processResponse: function(xmlhttp, feedURL, place, desc, toFilter, filterString){	
		if (window.netscape){
			try {
				if (document.location.protocol.indexOf("http") == -1) {
					netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
				}
			}
			catch (e) { displayMessage(e.description?e.description:e.toString()); }
		}
		if (xmlhttp.responseXML){
			this.cache[feedURL] = xmlhttp;
			this.genRssNews(xmlhttp.responseXML, place, feedURL, desc, toFilter, filterString);
		}
		else {
			var dom = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml"); 
			if (dom) {
				this.cache[feedURL] = xmlhttp;
				this.genRssNews(dom, place, feedURL, desc, toFilter, filterString);
			}
			else {
				wikify("<html>"+xmlhttp.responseText+"</html>", place);
				displayMessage(this.msg.noRSSFeed.format([feedURL]));
			}
		}
	},
	genRssNews: function(xml, place, feedURL, desc, toFilter, filterString){
		// Channel
		var chanelNode = xml.getElementsByTagName('channel').item(0);
		var chanelTitleElement = (chanelNode ? chanelNode.getElementsByTagName('title').item(0) : null);
		var chanelTitle = "";
		if ((chanelTitleElement) && (chanelTitleElement.firstChild)) chanelTitle = chanelTitleElement.firstChild.nodeValue;
		var chanelLinkElement = (chanelNode ? chanelNode.getElementsByTagName('link').item(0) : null);
		var chanelLink = "";
		if (chanelLinkElement) chanelLink = chanelLinkElement.firstChild.nodeValue;
		var titleTxt = "!![["+chanelTitle+"|"+chanelLink+"]]\n";
		var title = createTiddlyElement(place,"div",null,"ChanelTitle",null);
		wikify(titleTxt,title);
		// ItemList
		var itemList = xml.getElementsByTagName('item');
		var article = createTiddlyElement(place,"ul",null,null,null);
		var lastDate;
		var re;
		if (toFilter) 
			re = new RegExp(filterString.escapeRegExp());
		for (var i=0; i<itemList.length; i++){
			var titleElm = itemList[i].getElementsByTagName('title').item(0);
			var titleText = (titleElm ? titleElm.firstChild.nodeValue : '');
			if (toFilter && ! titleText.match(re)) {
				continue;
			}
			var descText = '';
			var isWikitext = false;
			var descElem = itemList[i].getElementsByTagName('wikitext').item(0);
			if (descElem){
				try{
					isWikitext = true;
					descText = "\n"+descElem.firstChild.nodeValue;}
					catch(e){}
			}
			else {
				descElem = itemList[i].getElementsByTagName('encoded').item(0);
				if (descElem){
					try{descText = descElem.firstChild.nodeValue;}
						catch(e){}
					descText = "<html>"+descText+"</html>";
				}
				else {
					descElem = itemList[i].getElementsByTagName('description').item(0);
					if (descElem){
						try{descText = descElem.firstChild.nodeValue;}
						catch(e){}
						descText = descText.replace(/<br \/>/g,'\n');
						if (desc == "asHtml")
							descText = "<html>"+descText+"</html>";
					}
				}
			}
			var linkElm = itemList[i].getElementsByTagName("link").item(0);
			var linkURL = linkElm.firstChild.nodeValue;
			var pubElm = itemList[i].getElementsByTagName('pubDate').item(0);
			var pubDate;
			if (!pubElm) {
				pubElm = itemList[i].getElementsByTagName('date').item(0); // for del.icio.us
				if (pubElm) {
					pubDate = pubElm.firstChild.nodeValue;
					pubDate = this.formatDateString(this.dateFormat, pubDate);
					}
					else {
						pubDate = '0';
					}
				}
			else {
				pubDate = (pubElm ? pubElm.firstChild.nodeValue : 0);
				pubDate = this.formatString(this.dateFormat, pubDate);
			}
			titleText = titleText.replace(/\[|\]/g,'');
			var rssText = '** '+'[[' + titleText + '|' + linkURL + ']]' + '\n' ;
			if ((desc != "noDesc") && descText){
				if (version.extensions.nestedSliders){
					rssText = rssText.replace(/\n/g,' ');
					descText = '+++[...]\n'
						+(isWikitext ? '\n<<rssFeedImportTiddler '+ feedURL + ' [['+titleText+']]>>':'')
						+'@@'+this.itemStyle+descText+'\n@@\n'
						+'===';
					}
				rssText = rssText + descText + '\n\n';
			}
			var story;
			if ((lastDate != pubDate) && ( pubDate != '0')) {
				story = createTiddlyElement(article,"li",null,"RSSItem",pubDate);
				lastDate = pubDate;
			}
			else {
				lastDate = pubDate;
			}
			story = createTiddlyElement(article,"div",null,"RSSItem",null);
			wikify(rssText,story);
		}
	},
	formatString: function(template, theDate){
		var dateString = new Date(theDate);
		template = template.replace(/hh|mm|ss/g,'');
		return dateString.formatString(template);
	},
	formatDateString: function(template, theDate){
		var dateString = new Date(theDate.substr(0,4), theDate.substr(5,2) - 1, theDate.substr(8,2)
			/*,  theDate.substr(11,2), theDate.substr(14,2), theDate.substr(17,2)*/
			);
		return dateString.formatString(template);
	}
	
};
//}}}

//{{{
config.macros.rssFeedUpdate = {
	label: "Update",
	prompt: "Clear the cache and redisplay this RssFeed",
	handler: function(place,macroName,params) {
		var feedURL = params[0];
		var tiddlerTitle = params[1];
		createTiddlyButton(place, this.label, this.prompt, 
			function () {
				if (config.macros.rssReader.cache[feedURL]) {
					config.macros.rssReader.cache[feedURL] = null; 
					//story.refreshTiddler(tiddlerTitle,null, true);
			}
			story.refreshTiddler(tiddlerTitle,null, true);
		return false;});
	}
};
//}}}

//{{{
config.macros.rssFeedImportTiddler = {
	label: "Import",
	prompt: "Import this tiddler in this TiddlyWiki",
	askReplaceMsg: "Tiddler already exists, replace it ?",
	handler: function(place,macroName,params) {
		var  feedUrl = params[0];
		var tiddlerTitle = params[1];
		createTiddlyButton(place, this.label, this.prompt, 
			function () {
				if (feedUrl && config.macros.rssReader.cache[feedUrl]) {
					var tiddler = config.macros.rssFeedImportTiddler.parseRssNews(config.macros.rssReader.cache[feedUrl].responseXML, tiddlerTitle);
					if (tiddler && (! store.getTiddler(tiddlerTitle) || confirm(config.macros.rssFeedImportTiddler.askReplaceMsg))) {
						store.addTiddler(tiddler);
						store.notify(tiddler.title, true);
						store.setDirty(true);
					}
				}
			return false;});
	},
	
	// parse a RssFeed for retrieving a Tiddler with title
	parseRssNews: function(xml, title) {
		// ItemList
		if (document.location.protocol.indexOf("http") == -1) {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
		}

		var itemList = xml.getElementsByTagName('item');
		for (var i=0; i<itemList.length; i++){

			var titleElm = itemList[i].getElementsByTagName('title').item(0);
			var titleText = titleElm.firstChild.nodeValue;
			if (titleText == title) {
				//	<tiddlywiki:title>
				//	titleText
				titleText = titleText.htmlDecode();
				//	<tiddlywiki:wikitext>
				var elem = itemList[i].getElementsByTagName('wikitext').item(0);
				var text = elem ? elem.firstChild.nodeValue.htmlDecode() : "";
				//	<tiddlywiki:modifier>
				elem = itemList[i].getElementsByTagName('modifier').item(0);
				var modifier = elem ? elem.firstChild.nodeValue : "";
				//	<tiddlywiki:modified>
				elem = itemList[i].getElementsByTagName('modified').item(0);
				var modified = elem ? Date.convertFromYYYYMMDDHHMM(elem.firstChild.nodeValue) : "";
				//	<tiddlywiki:created>
				elem = itemList[i].getElementsByTagName('created').item(0);
				var created = elem ? Date.convertFromYYYYMMDDHHMM(elem.firstChild.nodeValue) : "";
				//	<tiddlywiki:links>
				//	Links ?
				//	<tiddlywiki:tags>
				elem = itemList[i].getElementsByTagName('tags').item(0);
				var tags = elem ? elem.firstChild.nodeValue.htmlDecode() : "";
				var tiddler = new Tiddler();
				tiddler.assign(titleText,text,modifier,modified,tags,created);
				return tiddler;
			}
		}
		// not found 
		alert("Tiddler \[[" + title +"]] notFound.");
		return null;
	}

};

//}}}
<<tiddlerList search:"^200\d.\d\d.\d\d" tiddlerList top:"5" itemTemplate:"!!≫【%item: %link】 ~~created: %created modified: %modified - %modifier [ (%title|toRSS)]toRSS~~\n~~(%tags)~~\n%text\n\n\n" dateFormat:"YYYY.0MM.0DD" order:"-created">>
//{{{
config.commands.refresh = {
	text: 'refresh',
	tooltip: 'Refresh this tiddler',
	handler: function(e,src,title) {
		clearMessage();
		story.refreshTiddler(title,null,true);
		return false;			
	}
};
//}}}
''Reminder:''
<<showReminders leadtime:30 tag:"!holidays">>

<<newReminder>>
/***
|''Name:''|ReminderPlugin|
|''Version:''|2.3.8 (Mar 9, 2006)|
|''Source:''|http://www.geocities.com/allredfaq/reminderMacros.html|
|''Author:''|Jeremy Sheeley(pop1280 [at] excite [dot] com)|
|''Licence:''|[[BSD open source license]]|
|''Macros:''|reminder, showreminders, displayTiddlersWithReminders, newReminder|
|''TiddlyWiki:''|2.0+|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|

!Description
This 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.

!Installation
* 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.
* Double click this tiddler, and copy all the text from the tiddler's body.
* Paste the text into the body of the new tiddler in your TW.
* Save and reload your TW.
* You can copy some examples into your TW as well.  See [[Simple examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]

!Syntax:
|>|See [[ReminderSyntax]] and [[showRemindersSyntax]]|

!Revision history
* v2.3.8 (Mar 9, 2006)
**Bug fix: A global variable had snuck in, which was killing FF 1.5.0.1
**Feature: You can now use TIDDLER and TIDDLERNAME in a regular reminder format
* v2.3.6 (Mar 1, 2006)
**Bug fix: Reminders for today weren't being matched sometimes.
**Feature:  Solidified integration with DatePlugin and CalendarPlugin
**Feature:  Recurring reminders will now return multiple hits in showReminders and the calendar.
**Feature:  Added TIDDLERNAME to the replacements for showReminders format, for plugins that need the title without brackets.
* v2.3.5 (Feb 8, 2006)
**Bug fix: Sped up reminders lots.  Added a caching mechanism for reminders that have already been matched.
* v2.3.4 (Feb 7, 2006)
**Bug fix: Cleaned up code to hopefully prevent the Firefox 1.5.0.1 crash that was causing lots of plugins 
to crash Firefox.  Thanks to http://www.jslint.com
* v2.3.3 (Feb 2, 2006)
**Feature: newReminder now has drop down lists instead of text boxes.
**Bug fix:  A trailing space in a title would trigger an infinite loop.
**Bug fix:  using tag:"birthday !reminder" would filter differently than tag:"!reminder birthday"
* v2.3.2 (Jan 21, 2006)
**Feature: newReminder macro, which will let you easily add a reminder to a tiddler. Thanks to Eric Shulman (http://www.elsdesign.com) for the code to do this.
** Bug fix: offsetday was not working sometimes
** Bug fix: when upgrading to 2.0, I included a bit to exclude tiddlers tagged with excludeSearch.  I've reverted back to searching through all tiddlers
* v2.3.1 (Jan 7, 2006)
**Feature: 2.0 compatibility
**Feature AlanH sent some code to make sure that showReminders prints a message if no reminders are found.
* v2.3.0 (Jan 3, 2006)
** Bug Fix:  Using "Last Sunday (-0)" as a offsetdayofweek wasn't working.
** Bug Fix:  Daylight Savings time broke offset based reminders (for example year:2005 month:8 day:23 recurdays:7 would match Monday instead of Tuesday during DST.

!Code
***/
//{{{

//============================================================================
//============================================================================
//           ReminderPlugin
//============================================================================
//============================================================================

version.extensions.ReminderPlugin = {major: 2, minor: 3, revision: 8, date: new Date(2006,3,9), source: "http://www.geocities.com/allredfaq/reminderMacros.html"};

//============================================================================
// Configuration
// Modify this section to change the defaults for 
// leadtime and display strings
//============================================================================

config.macros.reminders = {};
config.macros["reminder"] = {};
config.macros["newReminder"] = {};
config.macros["showReminders"] = {};
config.macros["displayTiddlersWithReminders"] = {};

config.macros.reminders["defaultLeadTime"] = [0,6000];
config.macros.reminders["defaultReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY";
config.macros.reminders["defaultShowReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY -- TIDDLER";
config.macros.reminders["defaultAnniversaryMessage"] = "(DIFF)";
config.macros.reminders["untitledReminder"] = "Untitled Reminder";
config.macros.reminders["noReminderFound"] = "Couldn't find a match for TITLE in the next LEADTIMEUPPER days."
config.macros.reminders["todayString"] = "Today";
config.macros.reminders["tomorrowString"] = "Tomorrow";
config.macros.reminders["ndaysString"] = "DIFF days";
config.macros.reminders["emtpyShowRemindersString"] = "There are no upcoming events";


//============================================================================
//  Code
// You should not need to edit anything 
// below this.  Make sure to edit this tiddler and copy 
// the code from the text box, to make sure that 
// tiddler rendering doesn't interfere with the copy 
// and paste.
//============================================================================

// This line is to preserve 1.2 compatibility
 if (!story) var story=window; 
//this object will hold the cache of reminders, so that we don't
//recompute the same reminder over again.
var reminderCache = {};

config.macros.showReminders.handler = function showReminders(place,macroName,params)
{
   var now = new Date().getMidnight();
   var paramHash = {};
   var leadtime = [0,14];
   paramHash = getParamsForReminder(params);
   var bProvidedDate = (paramHash["year"] != null) || 
			(paramHash["month"] != null) || 
			(paramHash["day"] != null) || 
			(paramHash["dayofweek"] != null);
   if (paramHash["leadtime"] != null)
   {
      leadtime = paramHash["leadtime"];
      if (bProvidedDate)
      {
         //If they've entered a day, we need to make 
         //sure to find it.  We'll reset the 
         //leadtime a few lines down.
         paramHash["leadtime"] = [-10000, 10000];
      }
   }
   var matchedDate = now;
   if (bProvidedDate)
   {
      var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);
      var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);
      matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); 
   }

   var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);
   var elem = createTiddlyElement(place,"span",null,null, null);
   var mess = "";
   if (arr.length == 0)
   {
      mess += config.macros.reminders.emtpyShowRemindersString; 
   }
   for (var j = 0; j < arr.length; j++)
   {
      if (paramHash["format"] != null)
      {
         arr[j]["params"]["format"] = paramHash["format"];
      }
      else
      {
         arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];
      }
      mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);
      mess += "\n";
   }
   wikify(mess, elem, null, null);
};


config.macros.displayTiddlersWithReminders.handler = function displayTiddlersWithReminders(place,macroName,params)
{
   var now = new Date().getMidnight();
   var paramHash = {};
   var leadtime = [0,14];
   paramHash = getParamsForReminder(params);
   var bProvidedDate = (paramHash["year"] != null) || 
			(paramHash["month"] != null) || 
			(paramHash["day"] != null) || 
			(paramHash["dayofweek"] != null);
   if (paramHash["leadtime"] != null)
   {
      leadtime = paramHash["leadtime"];
      if (bProvidedDate)
      {
         //If they've entered a day, we need to make 
         //sure to find it.  We'll reset the leadtime 
         //a few lines down.
         paramHash["leadtime"] = [-10000,10000];
      }
   }
   var matchedDate = now;
   if (bProvidedDate)
   {
      var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);
      var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);
      matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); 
   }
   var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);
   for (var j = 0; j < arr.length; j++)
   {
      displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false);
   }
};

config.macros.reminder.handler = function reminder(place,macroName,params)
{
   var dateHash = getParamsForReminder(params);
   if (dateHash["hidden"] != null)
   {
      return;
   }
   var leadTime = dateHash["leadtime"];
   if (leadTime == null)
   {
      leadTime = config.macros.reminders["defaultLeadTime"]; 
   }
   var leadTimeLowerBound = new Date().getMidnight().addDays(leadTime[0]);
   var leadTimeUpperBound = new Date().getMidnight().addDays(leadTime[1]);
   var matchedDate = findDateForReminder(dateHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound);
   if (!window.story) 
   {
      window.story=window; 
   }
   if (!store.getTiddler) 
   {
      store.getTiddler=function(title) {return this.tiddlers[title];};
   }
   var title = window.story.findContainingTiddler(place).id.substr(7);
   if (matchedDate != null)
   {
      var diff = matchedDate.getDifferenceInDays(new Date().getMidnight());
      var elem = createTiddlyElement(place,"span",null,null, null);
      var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate, title);
      wikify(mess, elem, null, null);
   }
   else
   {
      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 + "]]") );
   }
};

config.macros.newReminder.handler = function newReminder(place,macroName,params)
{
  var today=new Date().getMidnight();
  var formstring = '<html><form>Year: <select name="year"><option value="">Every year</option>';
  for (var i = 0; i < 5; i++)
  {
    formstring += '<option' + ((i == 0) ? ' selected' : '') + ' value="' + (today.getFullYear() +i) + '">' + (today.getFullYear() + i) + '</option>';
  }
  formstring += '</select>&nbsp;&nbsp;Month:<select name="month"><option value="">Every month</option>';
  for (i = 0; i < 12; i++)
  {
    formstring += '<option' + ((i == today.getMonth()) ? ' selected' : '') + ' value="' + (i+1) + '">' + config.messages.dates.months[i] + '</option>';
  }
  formstring += '</select>&nbsp;&nbsp;Day:<select name="day"><option value="">Every day</option>';
  for (i = 1; i < 32; i++)
  {
    formstring += '<option' + ((i == (today.getDate() )) ? ' selected' : '') + ' value="' + i + '">' + i + '</option>';
  }

formstring += '</select>&nbsp;&nbsp;Reminder Title:<input type="text" size="40" name="title" value="please enter a title" onfocus="this.select();"><input type="button" value="ok" onclick="addReminderToTiddler(this.form)"></form></html>';

  var panel = config.macros.slider.createSlider(place,null,"New Reminder","Open a form to add a new reminder to this tiddler");
  wikify(formstring ,panel,null,store.getTiddler(params[1]));
};

// onclick: process input and insert reminder at 'marker'
window.addReminderToTiddler = function(form) {
   if (!window.story) 
   {
      window.story=window; 
   }
   if (!store.getTiddler) 
   {
      store.getTiddler=function(title) {return this.tiddlers[title];};
   }
   var title = window.story.findContainingTiddler(form).id.substr(7);
   var tiddler=store.getTiddler(title);
  var txt='\n<<reminder ';
  if (form.year.value != "")
    txt += 'year:'+form.year.value + ' ';
  if (form.month.value != "")
    txt += 'month:'+form.month.value + ' ';
  if (form.day.value != "")
    txt += 'day:'+form.day.value + ' ';
  txt += 'title:"'+form.title.value+'" ';
  txt +='>>';
   tiddler.set(null,tiddler.text + txt);
   window.story.refreshTiddler(title,1,true);
   store.setDirty(true);
};

function hasTag(tiddlerTags, tagFilters)
{
  //Make sure we respond well to empty tiddlerTaglists or tagFilterlists
  if (tagFilters.length==0 || tiddlerTags.length==0)
  {
    return true;
  }

  var bHasTag = false;
  
  /*bNoPos says: "'till now there has been no check using a positive filter"
     Imagine a filterlist consisting of 1 negative filter:
         If the filter isn't matched, we want hasTag to be true.
         Yet bHasTag is still false ('cause only positive filters cause bHasTag to change)
         
     If no positive filters are present bNoPos is true, and no negative filters are matched so we have not returned false
         Thus: hasTag returns true.
      
      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
      means bHasTag must be true for hasTag to return true*/
  var bNoPos=true;
  
for (var t3 = 0; t3 < tagFilters.length; t3++)
  {
      for(var t2=0; t2<tiddlerTags.length; t2++)
      {
           if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!') 
           {
              if (tiddlerTags[t2] == tagFilters[t3].substring(1))
              {
                 //If at any time a negative filter is matched, we return false
                  return false;
              }
           }
           else 
           {
              if (bNoPos)
              {
                 //We encountered the first positive filter
                 bNoPos=false;
              }
              if (tiddlerTags[t2] == tagFilters[t3])
              {
                  //A positive filter is matched. As long as no negative filter is matched, hasTag will return true
                  bHasTag=true;
              }
           }
        }
    }
    return (bNoPos || bHasTag);
};

//This function searches all tiddlers for the reminder  //macro.  It is intended that other plugins (like //calendar) will use this function to query for 
//upcoming reminders.
//The arguments to this function filter out reminders //based on when they will fire.
//
//ARGUMENTS:
//baseDate is the date that is used as "now".  
//leadtime is a two element int array, with leadtime[0] 
//         as the lower bound and leadtime[1] as the
//         upper bound.  A reasonable default is [0,14]
//tags is a space-separated list of tags to use to filter 
//         tiddlers.  If a tag name begins with an !, then 
//         only tiddlers which do not have that tag will 
//         be considered.  For example "examples holidays"  
//         will search for reminders in any tiddlers that  
//         are tagged with examples or holidays and 
//         "!examples !holidays" will search for reminders 
//         in any tiddlers that are not tagged with 
//         examples or holidays.  Pass in null to search 
//         all tiddlers.
//limit.  If limit is null, individual reminders can 
//        override the leadtime specified earlier.  
//        Pass in 1 in order to override that behavior.

window.findTiddlersWithReminders = function findTiddlersWithReminders(baseDate, leadtime, tags, limit)
{
//function(searchRegExp,sortField,excludeTag)
//   var macroPattern = "<<([^>\\]+)(?:\\*)([^>]*)>>";
   var macroPattern = "<<(reminder)(.*)>>";
   var macroRegExp = new RegExp(macroPattern,"mg");
   var matches = store.search(macroRegExp,"title","");
   var arr = [];
   var tagsArray = null;
   if (tags != null)
   {
      tagsArray = tags.split(" ");
   }
   for(var t=matches.length-1; t>=0; t--)
   {
      if (tagsArray != null)
      {
         //If they specified tags to filter on, and this tiddler doesn't 
	 //match, skip it entirely.
         if ( ! hasTag(matches[t].tags, tagsArray))
         {
            continue;
         }
      }

      var targetText = matches[t].text;
      do {
         // Get the next formatting match
         var formatMatch = macroRegExp.exec(targetText);
         if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")
         {
            //Find the matching date.
            
            var params = formatMatch[2] != null ? formatMatch[2].readMacroParams() : {};
            var dateHash = getParamsForReminder(params);
            if (limit != null || dateHash["leadtime"] == null)
            {
               if (leadtime == null)
                   dateHash["leadtime"] = leadtime;
               else
               {
                  dateHash["leadtime"] = [];
                  dateHash["leadtime"][0] = leadtime[0];
                  dateHash["leadtime"][1] = leadtime[1];
               }
            }
	    if (dateHash["leadtime"] == null)
               dateHash["leadtime"] = config.macros.reminders["defaultLeadTime"]; 
            var leadTimeLowerBound = baseDate.addDays(dateHash["leadtime"][0]);
            var leadTimeUpperBound = baseDate.addDays(dateHash["leadtime"][1]);
            var matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);
            while (matchedDate != null)
            {
               var hash = {};
               hash["diff"] = matchedDate.getDifferenceInDays(baseDate);
               hash["matchedDate"] = new Date(matchedDate.getFullYear(), matchedDate.getMonth(), matchedDate.getDate(), 0, 0);
               hash["params"] = cloneParams(dateHash);
               hash["tiddler"] = matches[t].title;
               hash["tags"] = matches[t].tags;
               arr.pushUnique(hash);
	       if (dateHash["recurdays"] != null || (dateHash["year"] == null))
	       {
	         leadTimeLowerBound = leadTimeLowerBound.addDays(matchedDate.getDifferenceInDays(leadTimeLowerBound)+ 1);
                 matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);
	       }
	       else matchedDate = null;
            }
         }
      }while(formatMatch);
   }
   if(arr.length > 1)  //Sort the array by number of days remaining.
   {
      arr.sort(function (a,b) {if(a["diff"] == b["diff"]) {return(0);} else {return (a["diff"] < b["diff"]) ? -1 : +1; } });
   }
   return arr;
};

//This function takes the reminder macro parameters and
//generates the string that is used for display.
//This function is not intended to be called by 
//other plugins.
 window.getReminderMessageForDisplay= function getReminderMessageForDisplay(diff, params, matchedDate, tiddlerTitle)
{
   var anniversaryString = "";
   var reminderTitle = params["title"];
   if (reminderTitle == null)
   {
      reminderTitle = config.macros.reminders["untitledReminder"];
   }
   if (params["firstyear"] != null)
   {
      anniversaryString = config.macros.reminders["defaultAnniversaryMessage"].replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));
   }
   var mess = "";
   var diffString = "";
   if (diff == 0)
   {
      diffString = config.macros.reminders["todayString"];
   }
   else if (diff == 1)
   {
      diffString = config.macros.reminders["tomorrowString"];
   }
   else
   {
      diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);
   }
   var format = config.macros.reminders["defaultReminderMessage"];
   if (params["format"] != null)
   {
      format = params["format"];
   }
   mess = format;
//HACK!  -- Avoid replacing DD in TIDDLER with the date
   mess = mess.replace(/TIDDLER/g, "TIDELER");
   mess = matchedDate.formatStringDateOnly(mess);
   mess = mess.replace(/TIDELER/g, "TIDDLER");
   if (tiddlerTitle != null)
   {
      mess = mess.replace(/TIDDLERNAME/g, tiddlerTitle);
      mess = mess.replace(/TIDDLER/g, "[[" + tiddlerTitle + "]]");
   }
   
   mess = mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("DDD MMM DD, YYYY")).replace("ANNIVERSARY", anniversaryString);
   return mess;
};

// Parse out the macro parameters into a hashtable.  This
// handles the arguments for reminder, showReminders and 
// displayTiddlersWithReminders.
window.getParamsForReminder = function getParamsForReminder(params)
{
   var dateHash = {};
   var type = "";
   var num = 0;
   var title = "";
   for(var t=0; t<params.length; t++)
   {
      var split = params[t].split(":");
      type = split[0].toLowerCase();
      var value = split[1];
      for (var i=2; i < split.length; i++)
      {
         value += ":" + split[i];
      }
      if (type == "nolinks" || type == "limit" || type == "hidden")
      {
         num = 1;
      }
      else if (type == "leadtime")
      {
         var leads = value.split("...");
         if (leads.length == 1)
         {
            leads[1]= leads[0];
            leads[0] = 0;
         }
         leads[0] = parseInt(leads[0], 10);
         leads[1] = parseInt(leads[1], 10);
         num = leads;
      }
      else if (type == "offsetdayofweek")
      {
          if (value.substr(0,1) == "-")
          {
             dateHash["negativeOffsetDayOfWeek"] = 1;
	     value = value.substr(1);
          }
          num = parseInt(value, 10);
      }
      else if (type != "title" && type != "tag" && type != "format")
      {
         num = parseInt(value, 10);
      }
      else
      {
         title = value;
         t++;
         while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"' && params[t] != undefined)
         {
            title += " " + params[t++];
         }
         //Trim off the leading and trailing quotes
         if (title.substr(0,1) == "\"" && title.substr(title.length - 1,1)== "\"")
         {
            title = title.substr(1, title.length - 2);
            t--;
         }
         num = title;
      }
      dateHash[type] = num;
   }
   //date is synonymous with day
   if (dateHash["day"] == null)
   {
      dateHash["day"] = dateHash["date"];
   }
   return dateHash;
};

//This function finds the date specified in the reminder 
//parameters.  It will return null if no match can be
//found.  This function is not intended to be used by
//other plugins.
window.findDateForReminder= function findDateForReminder( dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound)
{
   if (baseDate == null)
   {
     baseDate = new Date().getMidnight();
   }
   var hashKey = baseDate.convertToYYYYMMDDHHMM();
   for (var k in dateHash)
   {
      hashKey += "," + k + "|" + dateHash[k];
   }
   hashKey += "," + leadTimeLowerBound.convertToYYYYMMDDHHMM();
   hashKey += "," + leadTimeUpperBound.convertToYYYYMMDDHHMM();
   if (reminderCache[hashKey] == null)
   {
      //If we don't find a match in this run, then we will
      //cache that the reminder can't be matched.
      reminderCache[hashKey] = false;
   }
   else if (reminderCache[hashKey] == false)
   {
      //We've already tried this date and failed
      return null;
   }
   else
   {
      return reminderCache[hashKey];
   }
   
   var bOffsetSpecified = dateHash["offsetyear"] != null || 
				dateHash["offsetmonth"] != null || 
				dateHash["offsetday"] != null || 
				dateHash["offsetdayofweek"] != null || 
				dateHash["recurdays"] != null;
   
   // If we are matching the base date for a dayofweek offset, look for the base date a 
   //little further back.
   var tmp1leadTimeLowerBound = leadTimeLowerBound;  
   if ( dateHash["offsetdayofweek"] != null)
   {
      tmp1leadTimeLowerBound = leadTimeLowerBound.addDays(-6);  
   }
   var matchedDate = baseDate.findMatch(dateHash, tmp1leadTimeLowerBound, leadTimeUpperBound);
   if (matchedDate != null)
   {
      var newMatchedDate = matchedDate;
      if (dateHash["recurdays"] != null)
      {
         while (newMatchedDate.getTime() < leadTimeLowerBound.getTime())
         {
            newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);
         }
      }
      else if (dateHash["offsetyear"] != null || 
		dateHash["offsetmonth"] != null || 
		dateHash["offsetday"] != null || 
		dateHash["offsetdayofweek"] != null)
      {
         var tmpdateHash = cloneParams(dateHash);
         tmpdateHash["year"] = dateHash["offsetyear"];
         tmpdateHash["month"] = dateHash["offsetmonth"];
         tmpdateHash["day"] = dateHash["offsetday"];
         tmpdateHash["dayofweek"] = dateHash["offsetdayofweek"];
	 var tmpleadTimeLowerBound = leadTimeLowerBound;
	 var tmpleadTimeUpperBound = leadTimeUpperBound;
	 if (tmpdateHash["offsetdayofweek"] != null)
	 {
	 	if (tmpdateHash["negativeOffsetDayOfWeek"] == 1)
		{
		   tmpleadTimeLowerBound = matchedDate.addDays(-6);
		   tmpleadTimeUpperBound = matchedDate;

		}
		else
		{
		   tmpleadTimeLowerBound = matchedDate;
		   tmpleadTimeUpperBound = matchedDate.addDays(6);
		}

	 }
	 newMatchedDate = matchedDate.findMatch(tmpdateHash, tmpleadTimeLowerBound, tmpleadTimeUpperBound);
         //The offset couldn't be matched.  return null.
         if (newMatchedDate == null)
         {
            return null;
         }
      }
      if (newMatchedDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))
      {
         reminderCache[hashKey] = newMatchedDate;
         return newMatchedDate;
      }
   }
   return null;
};

//This does much the same job as findDateForReminder, but
//this one doesn't deal with offsets or recurring 
//reminders.
Date.prototype.findMatch = function findMatch(dateHash, leadTimeLowerBound, leadTimeUpperBound)
{

   var bSpecifiedYear =     (dateHash["year"] != null);
   var bSpecifiedMonth =     (dateHash["month"] != null);
   var bSpecifiedDay =     (dateHash["day"] != null);
   var bSpecifiedDayOfWeek =     (dateHash["dayofweek"] != null);
   if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)
   {
      return new Date(dateHash["year"], dateHash["month"]-1, dateHash["day"], 0, 0);
   }
   var bMatchedYear = !bSpecifiedYear;
   var bMatchedMonth = !bSpecifiedMonth;
   var bMatchedDay = !bSpecifiedDay;
   var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;
   if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)
   {

      //Shortcut -- First try this year.  If it's too small, try next year.
      var tmpMidnight = this.getMidnight();
      var tmpDate = new Date(this.getFullYear(), dateHash["month"]-1, dateHash["day"], 0,0);
      if (tmpDate.getTime() < leadTimeLowerBound.getTime())
      {
         tmpDate = new Date((this.getFullYear() + 1), dateHash["month"]-1, dateHash["day"], 0,0);
      }
      if ( tmpDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))
      {
         return tmpDate;
      }
      else
      {
         return null;
      }
   }

   var newDate = leadTimeLowerBound; 
   while (newDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))
   {
      var tmp = testDate(newDate, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek);
      if (tmp != null)
        return tmp;
      newDate = newDate.addDays(1);
   }
};

function testDate(testMe, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek)
{
   var bMatchedYear = !bSpecifiedYear;
   var bMatchedMonth = !bSpecifiedMonth;
   var bMatchedDay = !bSpecifiedDay;
   var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;
   if (bSpecifiedYear)
   {
      bMatchedYear = (dateHash["year"] == testMe.getFullYear());
   }
   if (bSpecifiedMonth)
   {
      bMatchedMonth = ((dateHash["month"] - 1)  == testMe.getMonth() );
   }
   if (bSpecifiedDay)
   {
      bMatchedDay = (dateHash["day"] == testMe.getDate());
   }
   if (bSpecifiedDayOfWeek)
   {
      bMatchedDayOfWeek = (dateHash["dayofweek"] == testMe.getDay());
   }

   if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)
   {
      return testMe;
   }
};

//Returns true if the date is in between two given dates
Date.prototype.isBetween = function isBetween(lowerBound, upperBound)
{
  return (this.getTime() >= lowerBound.getTime() && this.getTime() <= upperBound.getTime());
}
//Return a new date, with the time set to midnight (0000)
Date.prototype.getMidnight = function getMidnight()
{
   return new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0);
};
// Add the specified number of days to a date.
Date.prototype.addDays = function addDays(numberOfDays)
{
   return new Date(this.getFullYear(), this.getMonth(), this.getDate() + numberOfDays, 0, 0);
};
//Return the number of days between two dates.
Date.prototype.getDifferenceInDays = function getDifferenceInDays(otherDate)
{
//I have to do it this way, because this way ignores daylight savings
   var tmpDate = this.addDays(0);
   if (this.getTime() > otherDate.getTime())
   {
      var i = 0;
      for (i = 0; tmpDate.getTime() > otherDate.getTime(); i++)
      {
         tmpDate = tmpDate.addDays(-1);
      }
      return i;
   }
   else
   {
      var i = 0;
      for (i = 0; tmpDate.getTime() < otherDate.getTime(); i++)
      {
         tmpDate = tmpDate.addDays(1);
      }
      return i * -1;
   }
   return 0;
};
function cloneParams(what) {
    var tmp = {};
    for (var i in what) {
        tmp[i] = what[i];
    }
    return tmp;
}
// Substitute date components into a string
Date.prototype.formatStringDateOnly = function formatStringDateOnly(template)
{
	template = template.replace("YYYY",this.getFullYear());
	template = template.replace("YY",String.zeroPad(this.getFullYear()-2000,2));
	template = template.replace("MMM",config.messages.dates.months[this.getMonth()]);
	template = template.replace("0MM",String.zeroPad(this.getMonth()+1,2));
	template = template.replace("MM",this.getMonth()+1);
	template = template.replace("DDD",config.messages.dates.days[this.getDay()]);
	template = template.replace("0DD",String.zeroPad(this.getDate(),2));
	template = template.replace("DD",this.getDate());
	return template;
};

//}}}
The reminder macro can take the following arguments.

!!!!date syntax
* @@{{{year:NUMBER}}}@@ - The four digit representation of the year (for example {{{year:2046}}} or {{{year:1999}}}
* @@{{{month:NUMBER}}}@@ - The numerical representation of the month (for example {{{month:1}}} for January, {{{month:12}}} for December)
* @@{{{day:NUMBER}}}@@ - The numerical representation of the day of the month (for example {{{day:15}}} will match the 15th day of the month)
* @@{{{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.

!!!!offsets
* @@{{{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}}}
* @@{{{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.

!!!!leadtime
* @@{{{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.

!!!!Reminder display options
* @@{{{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.
* @@{{{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.
** 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.  
** TITLE will be replaced with the title of the reminder
** DATE will be replaced with the matched date of the reminder.
** ANNIVERSARY will be replaced with the number of years since between the matched date and firstyear
The default string is "DIFF: TITLE on DATE ANNIVERSARY"
* @@{{{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.
* @@{{{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.

/***
| Name:|RenameTagsPlugin|
| Description:|Allows you to easily rename or delete tags across multiple tiddlers|
| Version:|6.9.3|
| Date:|30-Sep-2006|
| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
| Author:|Simon Baird <simon.baird@gmail.com>|
| CoreVersion:|2.1.x|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

 prompts: {
 rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
 remove: "Remove the tag '%0' from %1 tidder%2?"
 },

 removeTag: function(tag,tiddlers) {
 for (var i=0;i<tiddlers.length;i++) {
 store.setTiddlerTag(tiddlers[i].title,false,tag);
 }
 },

 renameTag: function(oldTag,newTag,tiddlers) {
 for (var i=0;i<tiddlers.length;i++) {
 store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
 store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new
 }
 },

 storeMethods: {

 saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

 saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {
 if (title != newTitle) {
 var tagged = this.getTaggedTiddlers(title);
 if (tagged.length > 0) {
 // then we are renaming a tag
 if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
 config.renameTags.renameTag(title,newTitle,tagged);

 if (!this.tiddlerExists(title) && newBody == "")
 // dont create unwanted tiddler
 return null;
 }
 }
 return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);
 },

 removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

 removeTiddler: function(title) {
 var tagged = this.getTaggedTiddlers(title);
 if (tagged.length > 0)
 if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
 config.renameTags.removeTag(title,tagged);
 return this.removeTiddler_orig_renameTags(title);
 }

 },

 init: function() {
 merge(TiddlyWiki.prototype,this.storeMethods);
 }
}

config.renameTags.init();

//}}}

/***
|''Name:''|ResizeEditorPlugin|
|''Source:''|http://www.TiddlyTools.com/#ResizeEditorPlugin|
|''Author:''|Eric Shulman - ELS Design Studios|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''~CoreVersion:''|2.0.10|

Adds ''autosizeEditor'' toolbar command and ''resizeEditor'' macro for use in EditTemplate to permit on-the-fly adjustment of the tiddler editor text area height:
* ''autosizeEditor'' - toggles the tiddler editor textarea height between fixed-height and "automatically fit the contents".
* ''resizeEditor'' - adds 'grab handle' below textarea to stretch field height
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''ResizeEditorPlugin'' (tagged with <<tag systemConfig>>)

If you are using the default (shadow) EditTemplate, the plugin automatically updates the template to include the ''autosizeEditor'' toolbar command and ''resizeEditor'' macro.  If you have created a custom EditTemplate tiddler, you will need to manually add the ''autosizeEditor'' toolbar command and ''resizeEditor'' macro to your existing template:
{{{
<!-- add 'autosizeEditor' command to end of existing editor toolbar definition -->
<div class='toolbar' macro='toolbar ... autosizeEditor'>
}}}
and
{{{
<!-- add span with 'resizeEditor' macro anywhere in the edit template -->
<span macro='resizeEditor'></span>
}}}

<<<
!!!!!Revisions
<<<
''2006.11.02 [1.3.1]'' in DragMove() and DragStop(), check for undefined properties so IE doesn't report "Not Implemented" error when property is referenced without having been previously initialized.
''2006.11.01 [1.3.0]'' added 'resizeEditor' MACRO for 'grab handle' stretch resizing (based on code from Jon Scully and Jason Johnston (jj@lojjic.net).  
''2006.11.01 [1.2.6]'' removed increaseEditor, decreaseEditor, and resizeEditor toolbar COMMAND definitions (resize by setting 'rows' property of textarea field conflicts with resize via style.height CSS attribute as set by autosize/drag).
''2006.11.01 [1.2.5]'' fixed 'savedkeypress' handling (was writing to savedkeyup by mistake)
''2006.10.28 [1.2.4]'' added '+' to 'saveTiddler' toolbar command (enables ctrl-enter keyhandling)
''2006.10.18 [1.2.3]'' added decreaseEditor and increaseEditor commands
''2006.10.18 [1.2.2]'' onkeypress handling to redirect PGUP/PGDN to window.scrollByPages() (works in FF, but not yet in IE)
''2006.10.18 [1.2.1]'' fixed references to default string constants (oops!)
''2006.10.18 [1.2.0]'' renamed 'resizeEditor' to 'autosizeEditor' and added new 'resizeEditor' toolbar command to prompt for # of rows to display
''2006.10.02 [1.1.1]'' show checkbox in button label (when automatic resizing is enabled)
''2006.10.01 [1.1.0]'' added 'onkeyup' automatic fit-to-contents handling
''2006.09.30 [1.0.0]'' initial release
<<<
!!!!!Credits
>This feature was developed by EricShulman from [[ELS Design Studios|http://www.elsdesign.com]] with 'grab handle' stretch resizing based on code from Jon Scully and Jason Johnston (jj@lojjic.net).
!!!!!Code
***/
//{{{
version.extensions.resizeEditor = {major: 1, minor: 3, revision: 1, date: new Date(2006,11,2)};

config.commands.autosizeEditor = {
	text: 'autosize',
	tooltip: 'adjust the editor height to fit the contents',
	text_alt: '<input type="checkbox" style="padding:0;margin:0;border:0;background:transparent;" checked>autosize',
	tooltip_alt: 'uncheck to reset the editor to the standard height',
	hideReadOnly: false,
	handler: function(event,src,title) {
		var here=story.findContainingTiddler(src); if (!here) return;
		var ta=here.getElementsByTagName('textarea'); if (!ta) return;
		for (i=0;i<ta.length;i++) { ta[i].button=src; if (!ta[i].maxed) this.start(ta[i]); else this.stop(ta[i],true); }
		return false;
	},
	start: function(e) {
		if (!e.savedkeyup) e.savedkeyup=e.onkeyup;
		if (!e.savedkeypress) e.savedkeypress=e.onkeypress;
		e.savedheight=e.style.height;
		e.style.height=e.scrollHeight-2+'px'; // NOTE "-2" adjustment...  for scrollbar top+bottom border width???
		e.onkeypress=function(ev) {
			if (!ev) var ev=window.event; var e=resolveTarget(ev);
			if (ev.keyCode==33) { // PGUP
				if (window.scrollByPages) window.scrollByPages(-1);
				return false;
			}
			if (ev.keyCode==34) { // PGDN
				if (window.scrollByPages) window.scrollByPages(1);
				return false;
			}
			if (e.savedkeypress) e.savedkeypress();
		}
		e.onkeyup=function(ev) {
			if (!ev) var ev=window.event; var e=resolveTarget(ev);
			e.style.height=e.scrollHeight-2+'px';
			if (e.savedkeyup) e.savedkeyup();
		}
		e.button.innerHTML=config.commands.autosizeEditor.text_alt;
		e.button.title=config.commands.autosizeEditor.tooltip_alt;
		e.maxed=true;
	},
	stop: function(e,resetHeight) {
		if (resetHeight) e.style.height=e.savedheight;
		e.onkeyup=e.savedkeyup;
		e.onkeypress=e.savedkeypress;
		e.button.innerHTML=config.commands.autosizeEditor.text;
		e.button.title=config.commands.autosizeEditor.tooltip;
		e.maxed=false;
	}
};

config.macros.resizeEditor = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) return;
		var ta=here.getElementsByTagName('textarea'); if (!ta) return;
		for (i=0;i<ta.length;i++) new window.TextAreaResizer(ta[i]);
	}
}

// TextAreaResizer script by Jason Johnston (jj@lojjic.net)
// Created August 2003.  Use freely, but give me credit.
// adds a handle below textareas that the user can drag with the mouse to resize the textarea.
// MODIFIED 2006-11-01 by ELS for cross-browser (IE) compatibility

// ELS: use explicit window.* global scope declaration for IE (required for functions called from event handlers)
window.TextAreaResizer = function(elt) {
	this.element = elt;
	this.create();
}
window.TextAreaResizer.prototype = {
	create : function() {
		var elt = this.element;
		var thisRef = this;
		var h = this.handle = document.createElement("div");
		// ELS: grab handle CSS style tweaks
		h.style.height = "3px"; // was 4px... looked too fat!
		h.style.overflow = "hidden"; // ELS: force IE to trim height to < 1em
		h.style.width=elt.offsetWidth+"px"; // ELS: match textarea width
		h.style.backgroundColor = "#999"; // ELS: standard mid-tone (dark) gray
		h.style.cursor = "s-resize";
		h.title = "Drag to resize text box";
		// ELS: IE doesn't support addEventListener()...
		// h.addEventListener("mousedown", function(evt){thisRef.dragStart(evt);}, false);
		h.onmousedown=function(evt){thisRef.dragStart(evt)};
		elt.parentNode.insertBefore(h, elt.nextSibling);
	},
	dragStart : function(evt) {
		// ELS: fixup event for IE
		if (!evt) var evt=window.event;
		// ELS: stop any ongoing drag event (from missed mouseup if outside window)
		this.dragStop(evt);
		var thisRef = this;
		this.dragStartY = evt.clientY;
		// ELS: IE doesn't support defaultView or getComputedStyle()... use offsetHeight instead
		// this.dragStartH = parseFloat(document.defaultView.getComputedStyle(this.element, null).getPropertyValue("height"));
		this.dragStartH = this.element.offsetHeight;
		// ELS: IE doesn't support addEventListener()...
		// document.addEventListener("mousemove", this.dragMoveHdlr=function(evt){thisRef.dragMove(evt);}, false);
		// document.addEventListener("mouseup", this.dragStopHdlr=function(evt){thisRef.dragStop(evt);}, false);
		document.savedmousemove=document.onmousemove;
		document.onmousemove=this.dragMoveHdlr=function(evt){thisRef.dragMove(evt)};
		document.savedmouseup=document.onmouseup;
		document.onmouseup=this.dragStopHdlr=function(evt){thisRef.dragStop(evt)};
	},
	dragMove : function(evt) {
		// ELS: fixup event for IE
		if (!evt) var evt=window.event;
		// ELS: make sure height is at least 10px
		var h=this.dragStartH+evt.clientY-this.dragStartY; if (h<10) h=10; this.element.style.height=h+"px";
		// ELS: match textarea width (which can change due to document scrollbars)
		this.handle.style.width=this.element.offsetWidth+"px";
		// ELS: when manually resizing, disable autoresizing (without restoring saved height)
		if (this.element.maxed!=undefined && this.element.maxed) config.commands.autosizeEditor.stop(this.element,false);
	},
	dragStop : function(evt) {
		// ELS: fixup event for IE
		if (!evt) var evt=window.event;
		// ELS: IE doesn't support removeEventListener()...
		// document.removeEventListener("mousemove", this.dragMoveHdlr, false);
		// document.removeEventListener("mouseup", this.dragStopHdlr, false);
		document.onmousemove=(document.savedmousemove!=undefined)?document.savedmousemove:null;
		document.onmousemove=(document.savedmouseup!=undefined)?document.savedmouseup:null;
	},
	destroy : function() {
		var elt = this.element;
		elt.parentNode.removeChild(this.handle);
		elt.style.height = "";
	}
};

// automatically tweak shadow EditTemplate to add "resizeEditor" macro and "autosizeEditor" toolbar command
config.shadowTiddlers.EditTemplate = "<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler copyTiddler deleteTiddler autosizeEditor'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit text'></div>\n<div class='editor' macro='edit tags'></div>\n<div class='editorFooter'>\n<span macro='message views.editor.tagPrompt'></span>\n<span macro='tagChooser'></span>\n</div><span macro='resizeEditor'></span>";
//}}}
◆コメント、トラックバック
<<haloscan comments>>	Add/view comments
<<haloscan trackbacks>>	Add/view trackbacks

◆RSS
<<rssfeed http://groups.google.com/group/TiddlyWiki/feed/rss_v2_0_msgs.xml 5>>
<<rssfeed http://kuraku.net/krk/index.xml 5>>

◆SaveAndReloadMacro
セーブしてリロードする。
{{{
<<saveAndReload>>
}}}
<<saveAndReload>>

◆ShowClockMacro
|Local|<<showClock>>|
|Queensland|<<showClock +10>>|
|England (DST)|<<showClock +1>>|
|California (DST)|<<showClock -7>>|

◆NewerTiddler
 * <<newerTiddler button:"Inbox" name:"Inbox YYYY/MM/DD" tags:"Journal, inbox" text:"New stuff for today:">>
 * <<newerTiddler button:"@Action" name:"Action: what" tags:"@Action" text:"Add project and describe action">>
 * <<newerTiddler button:"New Project" name:"Project Name?" tags:"My Projects, My Inbox, Journal" template:"MyTemplate">>

◆内容引用
<<<
<<tiddler GettingStarted>>
<<<

◆inlineテスト
<script label="click here" show>
 if (!window.story) window.story=window;
 alert("Hello World!\nlinktext='"+place.firstChild.data+"'\ntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");
</script>

◇リロード
<script label="reload">
 if (!window.story) window.story=window;
 location.reload()
</script>


◆nestedslider
+++^[get info...=I|click for information or press Alt-I]
 put some general information here, plus a floating slider with more specific info:
 +++^10em^[view details...|click for details]
 put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===
 ===
===

を応用して。

+++^[tagCloud...]
 <<tagCloud>>
===

+++(testc)[test cookie >]
Cookie で開閉を覚える。
===


◆new feature 2.1
# Added 'emdash' formatter for --
# Added <br>, and deprecated existing <<br>> macro 

◆tag dropdown
{{{
<<tag Plugins|plugins>>
}}}
という記述で「plugins」タグリストを持つボタンになる。
<<tag Plugins|plugins>>

◆レイアウト変更
tag をタイトルの上に表示。編集時もタイトルの下に。
EditTemplate ViewTemplate StyleSheetColors を変更

◆RenameTagsPlugin
Tag のページを開いてタイトルを変えてしまう。done のときに良いか訊かれる。

◆favicon 付けた。
サイトの favicon.ico を置いて、
> <link rel="shortcut icon" href="favicon.ico">
を <head> に追加。

◆ver 2.1 に upgrade (061002)

◆emptyファイル保存
<<saveMyEmpty>>

◆checkbox
[ ]チェックボックス
[x]Todo とかに
[x(メモ|memo2)] memo2 という tag が付く↑

◆~
~~kuraku くらく~~
文字が小さくなる。もともとあったが使っていなかった。subscript

◆日付のみ表示
<<today "YYYY.0MM.0DD">>

◆7項目だけ
<<timeline "modified" 7>>

◆SideBar を隠す
<<toggleSideBar "Toggle Sidebar" "サイドバーを隠します">>

◆ジャーナルに タグをデフォルトで付ける(カレンダーからはダメ)
<<newJournal "YYYY.0MM.0DD-2" "tagtag" >>

◆Calendarplugin
<<calendar thismonth>>
今日がハイライトされない。メニューに入れると日付ドキュメントがあるか無いか分からない。
→DatePlugin を入れることでうまく行くようになる。

◆highlight マクロ。
<<hl 「hl」という名前>>。文字列にスペースが入ると駄目らしい。
<<hl "「hl」 という 名前">>。「"」で囲めば良いらしい。

new マクロ。作る <<newnew>>
なにかに応用できるか?

保存パスにスペースが入っていても大丈夫な patch を入れる。

ListTag マクロ。
<<list tag systemConfig システム設定>>

Box マクロ。
<<box マクロ>> でどぉ。

br タグとは。
*ここでおりかえす<<br>>おりかえした?

TabTimeline を60日指定にした。

Shift+確定で、@@bgcolor(#0ff):修正日付が変わらない@@。

TagCloud plugin 入れてみた。

TiddlyWiki 1.x から TiddlyWiki 2.0 へうまくバージョンアップできなかったのは、日本語メニューのせいらしい。
/***
| Name|SaveCloseTiddlerPlugin|
| Description|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these you must add them to the tool bar in your EditTemplate
***/
//{{{
merge(config.commands,{

	saveCloseTiddler: {
		text: 'done / X',
		tooltip: 'Undo changes to this tiddler and close it',
		handler: function(e,src,title) {
			config.commands.saveTiddler.handler(e,src,title);
			config.commands.closeTiddler.handler(e,src,title);
			return false;
		}
	},

	cancelCloseTiddler: {
		text: 'cancel / X',
		tooltip: 'Save changes to this tiddler and close it',
		handler: function(e,src,title) {
			config.commands.cancelTiddler.handler(e,src,title);
			config.commands.closeTiddler.handler(e,src,title);
			return false;
		}
	}

});

//}}}
//{{{
config.macros.saveMyEmpty = {
 tag: "myEmpty",
 filename: "myempty.html",
 label: "設定済み空ファイル保存",
 prompt: "設定済み空ファイルを保存する",
 message: "設定済み空ファイルを保存しました"
};

config.macros.saveMyEmpty.handler = function(place)
{
 if (!readOnly)
 createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,null);
}

config.macros.saveMyEmpty.onClick = function(e)
{
 saveMyEmpty();
 return false;
}

function taggedTiddlersAsHtml()
{
 var savedTiddlers = [];
 var tiddlers = store.reverseLookup("tags", config.macros.saveMyEmpty.tag, true, "title");
 for (var t = 0; t < tiddlers.length; t++)
 savedTiddlers.push(tiddlers[t].saveToDiv());
 return savedTiddlers.join("\n");
}

function saveMyEmpty()
{
 clearMessage();
 // Get the URL of the document
 var originalPath = document.location.toString();
 // Check we were loaded from a file URL
 if(originalPath.substr(0,5) != "file:")
 {
 alert(config.messages.notFileUrlError);
 if(store.tiddlerExists(config.messages.saveInstructions))
 displayTiddler(null,config.messages.saveInstructions);
 return;
 }
 var localPath = getLocalPath(originalPath);
 // Load the original file
 var original = loadFile(localPath);
 if(original == null)
 {
 alert(config.messages.cantSaveError);
 if(store.tiddlerExists(config.messages.saveInstructions))
 displayTiddler(null,config.messages.saveInstructions);
 return;
 }
 // Locate the storeArea div's
 var posOpeningDiv = original.indexOf(startSaveArea);
 var posClosingDiv = original.lastIndexOf(endSaveArea);
 if((posOpeningDiv == -1) || (posClosingDiv == -1))
 {
 alert(config.messages.invalidFileError.format([localPath]));
 return;
 }
 // Save new file
 var emptyPath,p;
 if((p = localPath.lastIndexOf("/")) != -1)
 emptyPath = localPath.substr(0,p) + "/" + config.macros.saveMyEmpty.filename;
 else if((p = localPath.lastIndexOf("\\")) != -1)
 emptyPath = localPath.substr(0,p) + "\\" + config.macros.saveMyEmpty.filename;
 else
 emptyPath = localPath + "." + config.macros.saveMyEmpty.filename;

 var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + 
 convertUnicodeToUTF8(taggedTiddlersAsHtml()) + "\n\t\t" +
 original.substr(posClosingDiv);
 var newSiteTitle = convertUnicodeToUTF8((wikifyPlain("SiteTitle") + " - " + wikifyPlain("SiteSubtitle")).htmlEncode());
 revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
 revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\n" + store.getTiddlerText("MarkupPreHead","") + "\n");
 revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\n" + store.getTiddlerText("MarkupPostHead","") + "\n");
 revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\n" + store.getTiddlerText("MarkupPreBody","") + "\n");
 revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\n" + store.getTiddlerText("MarkupPostBody","") + "\n");
 var save = saveFile(emptyPath,revised);
 if(save)
 {
 displayMessage(config.macros.saveMyEmpty.message,"file://" + emptyPath);
 store.setDirty(false);
 }
 else
 alert(config.messages.mainFailed);
}
//}}}
!説明
AdvancedOptionsには、empty.htmlを保存するオプションがありますが、これで保存されるファイルはダウンロードしたときと同じ全くtiddlerがない状態のHTMLファイルであり、自分でカスタマイズした内容は反映されていません。そこで、レイアウト、配色、各種基本プラグイン等といった、カスタマイズ項目のみを含んだ状態の空ファイルを保存するマクロを作成しました。このマクロを使うことで、はじめから自分用に使いやすい状態に設定されているテンプレートファイルを生成することができます。

!使用方法
#SaveMyEmptyMacroを新規tiddlerにペーストして「systemConfig」タグを付加します
#マクロを有効にするために、保存してから一度リロードします
#設定済み空ファイルに保存したいtiddlerに「myEmpty」のタグを付加します。PageTemplate、StyleSheetColors、StyleSheetLayout、[[日本語化パッチ|Opt02:日本語メッセージ]]などのtiddlerに付加するのがお勧めです
#以下のようにして設定済み空ファイル保存ボタンを設置します。設置場所はMainMenu、SideBarOptions、OptionsPanelあたりがお勧めです<<br>>{{{<<saveMyEmpty>>}}}
#設定済み空ファイル保存ボタンを押すと、元ファイルと同じフォルダにmyempty.htmlというファイルが作成されます

注.本機能は、ローカル使用の場合のみ有効です
!ソース
SaveMyEmptyMacro

やっていることはsaveChanges()の変更保存処理とほぼ同じです。allTiddlersAsHtmlで全tiddlerを取得する代わりに、指定タグのtiddlerのみ取得するtaggedTiddlersAsHtml関数を作って置き換えました。
__あらかじめ [[HaloScan|http://www.haloscan.com/]] に log In しておく必要があります。__ ~~(複数アカウントを持っている方も気をつけてください)~~

<html>
<h2>Send Trackback Pings</h2>

<form name="tbmanping" method="post" action="http://www.haloscan.com/members/tbping.php" target="_blank"><p><label for="tbBlogName"><b>Your Blog Name</b></label>  <a target="_blank" href="http://www.haloscan.com/members/help.php?type=trackback_BlogName" onclick="window.open(this.href, 'popupwindow', 'width=400,height=400,scrollbars,resizable'); return false;" class="helpbutton">?</a>:<br />

<input id="tbBlogName" name="tbBlogName" type="text" size="48" maxlength="50" value="KRK CLip - よしなしこと、" /></p><p><label for="tbURL"><b>Your Blog Post Address (Permalink URL)</b></label>  <a target="_blank" href="http://www.haloscan.com/members/help.php?type=trackback_URL" onclick="window.open(this.href, 'popupwindow', 'width=400,height=400,scrollbars,resizable'); return false;" class="helpbutton">?</a>:<br />
<input  id="tbURL" name="tbURL" type="text" size="78" value="copy & paste permalink" maxlength="200" /></p><p><label for="tbEntryTitle"><b>Your Blog Post Title</b></label>  <a target="_blank" href="http://www.haloscan.com/members/help.php?type=trackback_EntryTitle" onclick="window.open(this.href, 'popupwindow', 'width=400,height=400,scrollbars,resizable'); return false;" class="helpbutton">?</a>: <br />
<input id="tbEntryTitle" name="tbEntryTitle" type="text" size="78" maxlength="50" value="" /></p><p><label for="tbExcerpt"><b>Your Blog Post Excerpt</b></label>  <a target="_blank" href="http://www.haloscan.com/members/help.php?type=trackback_Excerpt" onclick="window.open(this.href, 'popupwindow', 'width=400,height=400,scrollbars,resizable'); return false;" class="helpbutton">?</a>: <br /><textarea class="editor" id='tbExcerpt' name='tbExcerpt' rows='6' cols='60'></textarea></p><p><label for="tbTargets"><b>URL(s) to Ping</b></label>  <a target="_blank" href="http://www.haloscan.com/members/help.php?type=trackback_Targets" onclick="window.open(this.href, 'popupwindow', 'width=400,height=400,scrollbars,resizable'); return false;" class="helpbutton">?</a>: <br /><textarea class="editor" id='tbTargets' name='tbTargets' rows='5' cols='60'></textarea></p><p><input name="submit" type="submit" class="button" value="Send Pings" /></p></form><img src="http://www.haloscan.com/forum/stats.php?login=krkclip" width="1" height="1" alt="" title="" />
</html>
{{button{goto}}}
<<goto width:6.5em>><<search>><<calendar thismonth>><<closeAll>><<collapseAll>><<permaview>><<newTiddler>><<newJournal "YYYY.0MM.0DD">>/%<<upload http://tw.kuraku.net/store.cgi clip.html backup .>><html><a href='http://tw.kuraku.net/download.cgi?file=clip.html' class='button'>download</a></html><<fontSize font-size: >>%/<<slider chkSliderFileMenu FileMenu 'file »' 'Manage TiddlyWiki file'>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
<<tabs txtMainTab Timeline Timeline TabTimeline All 'Alphabet list' A-Z Tags 'All tags' TabTags More 'More lists' TabMore >>
/% ----- Counter ----- %/~~<html><div align="right">
total:<img src="http://sv78.lolipop.jp/cnt/accnt.php?cnt_id=1228246&ac_id=LA11052066&mode=total"><br>
today:<img src="http://sv78.lolipop.jp/cnt/accnt.php?cnt_id=1228246&ac_id=LA11052066&mode=today"> / yesterday:<img src="http://sv78.lolipop.jp/cnt/accnt.php?cnt_id=1228246&ac_id=LA11052066&mode=yesterday">
</div></html>~~
proxy.cgi?url=
よしなしこと、
<<dirtyflag>>[[KRK CLip|@FrontPage]]
http://tw.kuraku.net/clip.html
さきほどうまく行かなかったのでテスト。
どうしてだろう??
/***
!!SpecialMark

特殊なマーク (KuRaKu)
{{{
[+] Dagger
[*] Comment
[>] Arrow
}}}

[+] Dagger
[*] Comment
[>] Arrow

!!!history
*2007.08.23 - replace setAttribute to style.cssText.
***/

/*{{{*/
version.extensions.SpMark= {major: 0, minor: 0, revision:1 , date: new Date(2007,4,6)};
 
config.formatters.push( {
  name: "SpMark",
  match: "\\[[\\+\\*\\>]\\]",
  lookahead: "\\[([\\+\\*\\>])\\]",

  handler: function(w) {
    var lookaheadRegExp = new RegExp(this.lookahead,"mg");
    lookaheadRegExp.lastIndex = w.matchStart;
    var lookaheadMatch = lookaheadRegExp.exec(w.source);

    if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
      var inside=lookaheadMatch[1];
      var style = "color:#333;display:inline;font-weight:bold;font-size:0.8em;";

      if ( inside == "+" ) { // dagger
        style += "color:#00f;";
        inside = "&nbsp;<sup>&dagger;</sup>";
      }
      else if ( inside == "*" ) { // *
        style += "color:#f00;";
        inside = "&nbsp;<sup>*</sup>";
      }
      else if ( inside == ">" ) { // ⇒
        style += "color:#f00;font-size:1.0em;";
        inside = "&nbsp;⇒&nbsp;";
      }

      var c = document.createElement("span");
      //c.setAttribute("style",style);
      c.style.cssText = style;
      c.innerHTML = inside;
      w.output.appendChild(c);
    }
  }
 } );
/*}}}*/
/***

''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''

|Name|SplashScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://lewcid.googlepages.com/lewcid.html#SplashScreenPlugin|
|Version|0.21 |
|Requires|~TW2.08+|
!Description:
Provides a simple splash screen that is visible while the TW is loading.

!Installation
Copy 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.

!Customizing
Once 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.

!History
* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.
* 26-06-06 : version 0.2, first release

!Code
***/
//{{{
var old_lewcid_splash_restart=restart;

restart = function()
{   if (document.getElementById("SplashScreen"))
        document.getElementById("SplashScreen").style.display = "none";
      if (document.getElementById("contentWrapper"))
        document.getElementById("contentWrapper").style.display = "block";
    
    old_lewcid_splash_restart();
   
    if (splashScreenInstall)
       {if(config.options.chkAutoSave)
			{saveChanges();}
        displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");
        }
}


var oldText = store.getTiddlerText("MarkupPreHead");
if (oldText.indexOf("SplashScreen")==-1)
   {var siteTitle = store.getTiddlerText("SiteTitle");
   var splasher='\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>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';
   if (! store.tiddlerExists("MarkupPreHead"))
       {var myTiddler = store.createTiddler("MarkupPreHead");}
   else
      {var myTiddler = store.getTiddler("MarkupPreHead");}
      myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);
      store.setDirty(true);
      var splashScreenInstall = true;
}
//}}}
[[GoodFlickr]]
/***
!Sidebars /%====================================================================================%/
***/
/*{{{*/
#mainMenu{
 position: static;
 text-align: left;
 width: 17em;
}

#mainMenu h1,#mainMenu h2,#mainMenu h3{
 color: #ff0084;
 font-weight: bold;
 padding: 2px 0px;
 font-size: 1.1em;
 letter-spacing: .1em;
 border-bottom: dotted 1px #ccc;
 background-color: transparent;
}

#sidebar{
 width: 20em;
}

#sidebar ul,
#sidebar li{
 padding: 0;
 margin: 0;
 list-style: none;
}

#sidebar .tabContents{
 width: 18em;
}

#sidebar .sliderPanel{
 border: 2px dashed #ccc;
 background: transparent;
 margin: 0;
}

#sidebar .sliderPanel a{
 display:block;
}

#sidebar .sliderPanel .sliderPanel a{
 display:inline;
}


/* TIDDLER DISPLAY/EDIT SPACE ========================================================== */

#contentWrapper .tiddler {
 margin: 10px 10px 10px 10px;
//krk
// margin: 0 0 10px 0;
 padding: 0 15px !important;
 border: dotted 1px #fff;
 color: #666;
}

.tiddler .title {
 background-color: #e9e9e9;
}

.selected {
 border: dotted 1px #ccc;
 margin: -1px;
}

.selected .viewer {
 color: #000 !important; 
}

.selected .viewer * {
 color: #000;
}

.selected .viewer h2, .selected .viewer h4, .selected .viewer h6, .selected .viewer h3, .selected .viewer h5 {
 color: #0063dc;
}

.selected .viewer pre,.selected .viewer li{
 color: #000 !important;
}

.selected .title {
 color: #ff0084;
 background-color: #e9e9e9;
}

#contentWrapper .selected .viewer a {
 color: #0063dc;
 background-color: transparent;
}

#contentWrapper .selected .viewer a:hover {
 color: #ff0084;
 
}

#messageArea {
 font-size: 13px;
 font-weight: bold;
 padding: 5px;
 margin: 10px 20px;
 color: #ff0084;
 border: dotted 1px #ccc;
 <!-- text-align: center; -->
 background: #fff;
}

#messageArea a {
 color: #0063dc !important;
}

#messageArea a:hover {
 color: #ff0084 !important;
}

#displayArea .tiddlyLinkExisting {
 font-weight: bold;
 text-decoration: none;
}

#displayArea .tiddlyLinkNonExisting {
 font-style: italic;
 text-decoration: none;
}

#displayArea .externalLink {
 text-decoration: underline;
}

.title {
 font-size: 1.3em;
 padding: 0 0 0 0;
 font-weight: bold;
 display: block;
 color: #0063dc;
}

.toolbar {
 font-weight: normal;
 font-size: 11px;
 // visibility: hidden;
 text-align: right;
 padding: 0 0 5px 0;
 margin: 0;
}

.selected .toolbar a.button {
 padding: 1px 5px;
 color: #fff;
 text-decoration: none;
 border: 1px outset #0063dc;
 background: #0063dc;
 margin: 1px;
}
.toolbar a.button {
 padding: 1px 5px;
 color: #fff;
 text-decoration: none;
 background: #87cefa;
 margin: 2px;
}

.toolbar a.button:hover {
 color: #fff;
 background: #ff0084;
 border: 1px outset #ff0084;
}

.toolbar a.button:active {
 color: #fff;
 background: #ff0084;
 border: 1px inset #ff0084;
}

.tagLinks {
 padding-top: 5px;
 margin-top: 10px;
 border-top: 1px dotted #ccc;
 color: #aaa;
}

.tagLinks a {
 color: #aaa;
}

.selected .tagLinks a {
 color: #0063dc;
}

.tagLinks a:hover {
 color: #ff0084;
}


#contentWrapper .viewer {
 line-height: 140%;
 color: #666;
}

#contentWrapper .viewer a{
 font-weight: bold;
 color: #666;
 text-decoration: none;
 background-color: transparent;
}

#contentWrapper .viewer h1, #contentWrapper .viewer h2, #contentWrapper .viewer h3, #contentWrapper .viewer h4, #contentWrapper .viewer h5, #contentWrapper .viewer h6{
 background-color: transparent;
 border-bottom: 1px dotted #666;
 margin-bottom: .25em;
}

.viewer blockquote {
 border-left: 3px solid #777;
 margin: 5px;
 padding: 5px;
}

.viewer ul {
 padding-left: 30px;
}

.viewer ol {
 padding-left: 30px;
}

ol
{
 list-style-type: decimal;
}

ol ol
{
 list-style-type: lower-alpha;
}

ol ol ol
{
 list-style-type: lower-roman;
}

.viewer ul, .viewer ol, .viewer p {
 margin: 5px 0 12px 0;
}

.viewer li {
 margin: 3px 0;
}

.viewer pre{
 font-family: monspace;
}

#contentWrapper .viewer *{
 color: #666;
}


.viewer h2 {
 font-size: 1.2em;
}

.viewer h3 {
 font-size: 1.1em;
 font-style: italic;
}

.viewer h4 {
 font-size: 1em;
}

.viewer h5 {
 font-size: .9em;
 font-style: italic;
}

.viewer h6 {
 font-size: .8em;
}

.viewer table {
 border-collapse: collapse;
 border: 2px solid #303030;
 font-size: 11px;
 margin: 10px 0;
}

.viewer th {
 background: #eee;
 border: 1px solid #aaa;
 padding: 3px;
}

.viewer td {
 border: 1px solid #aaa;
 padding: 3px;
}

.viewer caption {
 padding: 3px;
}

.viewer hr {
 border: none;
 border-top: dotted 1px #777;
 height: 1px;
 color: #fff;
 margin: 7px 0;
}

.body {
 margin: 5px 0 0px 0;
 padding: 5px 0;
}

.highlight {
 color: #000;
 background: #ffe72f;
}

.editor {
 font-size: 8pt;
 color: #402c74;
 font-weight: normal;
 padding: 10px 0;
}

.editor input, .editor textarea {
 display: block;
 font: 13px/130% "Andale Mono", "Monaco", "Lucida Console", "Courier New", monospace;
 margin: 0;
 border: 1px inset #333;
 padding: 2px 0;
}

.footer a.button,.editorFooter a.button{
 color: #e6e6e6;
}

.selected .footer a.button,
.selected .editorFooter a.button{
 color: #0063dc;
}

.selected .footer a.button:hover,
.selected .editorFooter a.button:hover{
 color: #ff0084;
 background-color: transparent;
}

input:focus, textarea:focus {
 background: #ffe;
 border: 1px solid #000 !important;
}
/*}}}*/
/***
!tags horizontally /%==================================================%/
***/
/*{{{*/
/* displays the list of a tiddler's tags horizontally. used in ViewTemplate */
.tagglyTagged li.listTitle {
 display:none
}
.tagglyTagged li {
 display: inline; font-size:90%;
}
.tagglyTagged ul {
 margin:0px; padding:0px;
}
/*}}}*/

/*{{{*/
.viewer pre { //krk
// padding: 0.5em;
// margin-left: 0.5em;

 font-size: 1.0em;
 line-height: 1.2em;
 overflow: auto;
}

.viewer code { //krk
 font-size: 1.0em;
 line-height: 1.2em;
}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
.header {display:none;}
#hoverMenu {display:none;}
}
/*}}}*/
<<timeline modified>>
<<tagCloud>>
/***
|''Name:''|TagCloudPlugin|
|''Source:''|http://www.TiddlyTools.com/#TagCloudPlugin|
|''Author:''|Clint Checketts|
|''License:''|unknown|
|''~CoreVersion:''|2.0.10|

!Usage
<<tagCloud>>

!Code
***/
//{{{
version.extensions.tagCloud = {major: 1, minor: 0 , revision: 0, date: new Date(2006,2,04)};
//Created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman

config.macros.tagCloud = {
 noTags: "No tag cloud created because there are no tags.",
 tooltip: "%1 tiddlers tagged with '%0'"
};

config.macros.tagCloud.handler = function(place,macroName,params) {
 
var tagCloudWrapper = createTiddlyElement(place,"div",null,"tagCloud",null);

var tags = store.getTags();
for (var t=0; t<tags.length; t++) {
 for (var p=0;p<params.length; p++) if (tags[t][0] == params[p]) tags[t][0] = "";
}

 if(tags.length == 0) 
 createTiddlyElement(tagCloudWrapper,"span",null,null,this.noTags);
 //Findout the maximum number of tags
 var mostTags = 0;
 for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){
 if (tags[t][1] > mostTags) mostTags = tags[t][1];
 }
 //divide the mostTags into 4 segments for the 4 different tagCloud sizes
 var tagSegment = mostTags / 4;

 for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){
 var tagCloudElement = createTiddlyElement(tagCloudWrapper,"span",null,null,null);
 tagCloudWrapper.appendChild(document.createTextNode(" "));
 var theTag = createTiddlyButton(tagCloudElement,tags[t][0],this.tooltip.format(tags[t]),onClickTag,"tagCloudtag tagCloud" + (Math.round(tags[t][1]/tagSegment)+1));
 theTag.setAttribute("tag",tags[t][0]);
 }

};

//setStylesheet(".tagCloud span{height: 1.8em;margin: 3px;}.tagCloud1{font-size: 1.2em;}.tagCloud2{font-size: 1.4em;}.tagCloud3{font-size: 1.6em;}.tagCloud4{font-size: 1.8em;}.tagCloud5{font-size: 1.8em;font-weight: bold;}","tagCloudsStyles");

setStylesheet(".tagCloud span{height: 1.4em;margin: 3px !important;}.tagCloud1{font-size: 0.9em;color: #aaaaff;}.tagCloud2{font-size: 1.2em;color: #6666ff;}.tagCloud3{font-size: 1.4em;font-weight: bold;color: #6666ff;}.tagCloud4{font-size: 1.6em;color: #6666ff;}.tagCloud5{font-size: 1.6em;font-weight: bold;color: #0000ff;}","tagCloudsStyles");
//}}}
/***
|''Name:''|TiddlerListMacro|
|''Version:''|2.0.10 (01-May-2006)|
|''Source''|http://jackparke.googlepages.com/jtw.html#TiddlerListMacro ([[del.icio.us|http://del.icio.us/post?url=http://jackparke.googlepages.com/jtw.html%23TiddlerListMacro]])|
|''Author:''|[[Jack]]|
|''Type:''|Macro|
|''Documentation:''|[[TiddlerListMacroDocumentation]] >>[[TiddlerListMacroExamples]](add krk) |
!Usage
{{{<<tiddlerList parameter1:"value1" parameter2:"value2" ...>>}}}
See TiddlerListMacroDocumentation and TiddlerListMacroExamples
!Code
***/
//{{{
version.extensions.tiddlerList = {major: 2, minor: 0, revision: 10, date: new Date("May 2, 2006")};
// template = [header, item, separator, group, footer]
config.macros.tiddlerList={
 formats : {list:true, nlist:true, span:true, stack:true, csv:true, table:true},
 templates : {
 list : [ "%0\n", "* %0\n", "", "%group\n", "%0\n"],
 nlist : [ "%0", "# %0\n", "", "%group\n", "%0\n"],
 span : [ "%0", "%0", " ", "%group", "%0"],
 stack : [ "%0", "%0", "\n", "%group", "%0"],
 csv : [ "%0", "%0", ", ", "%0", "%0\n"],
 table : ["|!%0|\n", "|%0|\n", "", "|%group|\n", "|%0|\n"]
 },
 dateFormat : "DD MMM YYYY"
}

if (!gCurrentTiddler)
 var gCurrentTiddler;

config.macros.tiddlerList.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
 // Some globals
 var count=0, groupCount=0, theGroup="", lastGroup="";
 var currentTiddler = tiddler;
 gCurrentTiddler = tiddler;
 var listWikiText="";
 var formats = this.formats;
 
 // SQL-Like parameters
 var parameters = paramString.parseParams("name",null,true);
 var pTags = parameters[0]["tags"]?parameters[0]["tags"][0].split(","):[];
 var pOrder = parameters[0]["order"]?parameters[0]["order"][0]:"title";
 var pTop = parameters[0]["top"]?parameters[0]["top"][0]:-1;
 var pText = parameters[0]["text"]?parameters[0]["text"][0]:"";
 var pTitle = parameters[0]["title"]?parameters[0]["title"][0]:"";
 var pSearch = parameters[0]["search"]?parameters[0]["search"][0]:"";
 var pFilter = parameters[0]["filter"]?parameters[0]["filter"][0]:"";
 var pHeader = parameters[0]["header"]?paramFormat(parameters[0]["header"][0]):"";
 var pFooter = parameters[0]["footer"]?paramFormat(parameters[0]["footer"][0]):"";
 var pGroup = parameters[0]["group"]?parameters[0]["group"][0]:"";
 var pDateFormat = parameters[0]["dateFormat"]?parameters[0]["dateFormat"][0]:this.dateFormat;
 var pCustomParameter = parameters[0]["customParameter"]?parameters[0]["customParameter"][0]:"";
 var pFormat = parameters[0]["format"]?parameters[0]["format"][0]:"list";
 pFormat = formats[pFormat]?pFormat:"list"
 
 // Separator
 var pSeparator = parameters[0]["separator"]?paramFormat(parameters[0]["separator"][0]):(parameters[0]["seperator"]?paramFormat(parameters[0]["seperator"][0]):this.templates[pFormat][2])

 // Template for group
 var pGroupTemplate = this.templates[pFormat][3];
 if (parameters[0]["groupTemplate"])
 pGroupTemplate = paramFormat(parameters[0]["groupTemplate"][0])
 pGroupTemplate = pGroupTemplate.replace("$))", ">>")
 
 // Template for group footer
 var pGroupFooterTemplate = "";
 if (parameters[0]["groupFooterTemplate"])
 pGroupFooterTemplate = paramFormat(parameters[0]["groupFooterTemplate"][0])
 pGroupFooterTemplate = pGroupFooterTemplate.replace("$))", ">>")
 
 // Template for item
 var pItemTemplate = this.templates[pFormat][1];
 if (parameters[0]["itemTemplate"])
 pItemTemplate = paramFormat(parameters[0]["itemTemplate"][0])
 pItemTemplate = pItemTemplate.replace("$))", ">>").replace("%link", "%0").replace("%item", "%1").replace("%abstract", "%2").replace("%text", "%3").replace("%created", "%4").replace("%modified", "%5").replace("%modifier", "%6").replace("%group", "%7").replace("%title", "%8").replace("%tags", "%9").replace("%nolink", "%10").replace("%custom", "%11")
 // Template for footer
 var pFooterTemplate = this.templates[pFormat][4].replace("%count", "%1")

 // Get all tiddlers
 var tiddlers = store.reverseLookup("tags","excludeLists",false);

 // Sorting
 if(!pOrder)
 pOrder = "title";
 if (pOrder.match(/^\-/i)) {
 pOrder = pOrder.substr(1)
 var sortDesc = true;
 }
 if (sortDesc)
 tiddlers.sort(function (a,b) {if(a[pOrder] == b[pOrder]) return(0); else return (a[pOrder] > b[pOrder]) ? -1 : +1; });
 else
 tiddlers.sort(function (a,b) {if(a[pOrder] == b[pOrder]) return(0); else return (a[pOrder] < b[pOrder]) ? -1 : +1; });

 // Header
 if (pHeader)
 listWikiText += formatItem(this.templates[pFormat][0], [pHeader], pFormat)
 
 for(var t=0; t<tiddlers.length; t++) {
 tiddler = tiddlers[t];
 if (pTop==-1 || count<pTop) {
 if (pText=="" || tiddler.text.match(pText)) {
 if (pTitle=="" || tiddler.title.match(pTitle)) {
 if (pSearch=="" || (tiddler.title.match(pSearch) || tiddler.text.match(pSearch))) {
 if (pFilter=="" || eval(pFilter)) {
 if (pTags.length==0 || compareArrays(tiddler.tags, pTags, "all")) {
 count++;
 // Grouping
 if (pGroup) {
 theGroup = eval(pGroup);
 if(theGroup != lastGroup) {
 groupCount++;
 if (pGroupFooterTemplate && groupCount>1)
 listWikiText += pGroupFooterTemplate.replace("%group", theGroup)
 listWikiText += pGroupTemplate.replace("%group", theGroup)
 lastGroup = theGroup;
 }
 }
 // Separators
 if (count>1) listWikiText += pSeparator;
 //Plaintext title
 var noLink = tiddler.title.match(config.textPrimitives.wikiLink)?"~" + tiddler.title:tiddler.title;
 // Custom parameter
 if (pCustomParameter)
 var custom="";
 try {
 custom = eval(pCustomParameter)
 } catch (e) {}
 // List individual tiddler

 listWikiText += formatItem(pItemTemplate,["[[" + tiddler.title + "]]",count,tiddler.text.substr(0,100),tiddler.text,tiddler.created.formatString(pDateFormat),tiddler.modified.formatString(pDateFormat),tiddler.modifier,theGroup,tiddler.title,tiddler.tags.join(" "),noLink,custom], pFormat)
 }
 }
 }
 }
 }
 }
 }
// patch krk for CheckboxPlugin
 //listWikiText = listWikiText.replace(/\[([Xx_ ])\]/g,"\($1\)");
 listWikiText = listWikiText.replace(/\[([Xx_ ])\]/g,"\[ $1 \]");
// end
 
 // Last group footer
 if (pGroup && pGroupFooterTemplate && count>0)
 listWikiText += pGroupFooterTemplate.replace("%group", theGroup)

 // Footer
 if (pFooter) {
 pFooter = pFooter.replace("%count", count)
 listWikiText += formatItem(pFooterTemplate, [pFooter], pFormat)
 }
 
 // Render result
 if (!parameters[0]["debug"])
 wikify(listWikiText,place, null, currentTiddler)
 else
 place.innerHTML = "<textarea style=\"width:100%;\" rows=30>" + listWikiText + "</textarea>"
 
 
 // Local functions
 
 function paramFormat(param) {
 // Allow "\n" in non evalled parameters
 return param.replace(/\\n/g, "\n");
 }
 
 function formatItem(template, values, format) {
 // Fill template with values (depending on list format)
 if (format.match(/table/) && values[0].match(/\|/))
 return ("%0\n").format(values)
 else
 return template.format(values)
 }
 
 function compareArrays(array, values, logic) {
 // Compare items in array with AND("all") or OR("any") logic
 var matches=0;
 for(var v=0; v<values.length; v++)
 if(values[v].match(/^\-/) && !array.contains(values[v].substr(1)))
 matches++;
 else if (array.contains(values[v]))
 matches++;
 return ((logic=="all" && matches==values.length) || (logic!="all" && matches>0))
 }
 
}

String.prototype.prettyTrim = function(len,prefix,postfix) {
 var result = this.trim().replace(/\r\n/g,' ').replace(/\n/g,' ');
 if (!prefix) prefix = '';
 if (!postfix) postfix = '';
 if (result.length > len - 3)
 return prefix + result.substr(0,len) + '...' + postfix;
 else if (result.length > 0)
 return prefix + result + postfix;
 else
 return result;
}

//}}}
!Description
The TiddlerListMacro lists tiddlers with ~SQL-Like features:
* List tiddlers containing a word in the title or text (case-sensitive)
* List tiddlers tagged with given tags or exclude certain tags
* Ascending and descending sorting of single fields
* Limit number of tiddlers displayed
* Specify different HTML formats for the lists
* Grouping of items in a list
* Customizable wiki templates
* Numbering and totals
!Revision History
* Original by [[Jack]] 17-Apr-2006
* Added formatting (v2.0.1 18-Apr-2006)
* Added grouping (v2.0.2 18-Apr-2006)
* Added flexible filtering (v2.0.3 19-Apr-2006)
* Added custom item templates (v2.0.4 20-Apr-2006)
* Added custom templates (v2.0.5 21-Apr-2006)
* Allow evalled parameters (v2.0.7 23-Apr-2006)
* Allow groupFooterTemplate (v2.0.9 30-Apr-2006)
* Added the customParameter (v2.0.10 2-May-2006)
!To Do
* Case-insensitive searching
* Sorting on multiple fields
!Usage
{{{<<tiddlerList parameter1:"value1" parameter2:"value2" ...>>}}}
!Examples ([[TiddlerListMacroExamples]])
List all tiddlers tagged with "Plugin"
{{{<<tiddlerList tags:Plugin>>}}}
List newest 3 plugins which are not templates:
{{{<<tiddlerList tags:"Plugin,-Template" top:3 order:"-created">>}}}
List all tiddlers containing "Jack" in their title or text (last modified first):
{{{<<tiddlerList search:"Jack" order:"-modified">>}}}
List all tiddlers starting with "T" in a table:
{{{<<tiddlerList title:"^T" format:"table" header:"Tiddlers beginning with T" footer:"%count items listed">>}}}
Group tiddlers by first letter
{{{<<tiddlerList top:"15" group:"tiddler.title.substr(0,1)" groupTemplate:"''%group''">>}}}
Show a list of all tiddlers with creation date (overrides default item template)
{{{<<tiddlerList itemTemplate:"* %link (%created)\n">>}}}
Show all tiddlers that have the host's tiddler title in their tag list
{{{<<tiddlerList filter:"tiddler.tags.contains(currentTiddler.title)">>}}}
!Parameters
|!Parameter|!Type|!Meaning|!Example|
|top|Integer|Number of tiddlers to display|"10"|
|tags|String|List tiddlers with matching tags (AND Logic). Leading - to exclude.|"~ToDo,Urgent,-Done"|
|title|~RegEx|List tiddlers with matching title|"^[Pp]"|
|text|~RegEx|List tiddlers with matching text|"Searchtext"|
|search|~RegEx|List tiddlers with matching title OR text|"Problem"|
|filter*|~JavaScript|List tiddlers according to boolean expression)|"tiddler.title.length<4 && tiddler.tags.contains('Idea')"|
|format|String (fixed list)|HTML formatting of list. list (ul, default), nlist (ol), span, stack (div), csv, table.|"list"|
|order|String|Sort order of tiddlers. - is descending, + ascending|"-created"|
|group*|~JavaScript|Grouping field|tiddler.title.substr(0,1)|
|customParameter*|~JavaScript|Custom parameter to be evalled for use in the itemTemplate|tiddler.text.match(/Version: (.*)/)[1]|
|header|String|Top caption|"Tiddlers beginning with T"|
|footer|String|Bottom caption|"End of list"|
|itemTemplate|~WikiTemplate|~WikiText with %placeholders|"%link\n%abstract\n%modified"|
|groupTemplate|~WikiTemplate|~WikiText with %placeholders for the start of each group|"!!%group"|
|groupFooterTemplate|~WikiTemplate|~WikiText with %placeholders for the end of each group|"----\n"|
|dateFormat|String|Date formatting string when displaying dates|~YYYY-MM-DD|
|separator|String|Define a string or character to be inserted between items listed|" "|
|debug|Boolean|Set to 1 or true for debug mode where only wikitext will be output|debug:1|
{{{*}}} Parameter will be evalled (do not pass with {{{{{ }} }}} unless you want it evalled twice!)
!Template Placeholders
Placeholder values for itemTemplate parameter
|!Placeholder|!Field|
|%item|List item number|
|%link|Link to Tiddler {{{[[MyTiddler]]}}}|
|%title|Tiddler Name {{{MyTiddler}}}|
|%nolink|Unlinked Tiddler Title {{{~MyTiddler}}}|
|%abstract|First 100 chars of tiddler text|
|%text|All tiddler text|
|%tags|Tags separated by space|
|%created|Creation date|
|%modified|Modified date|
|%modifier|Last modifier|
|%group|Name of group field|
|%custom|The result of your evalled customParameter|
|%count|Number of items listed (footer only)|
!Variables
{{{{{currentTiddler}} }}}refers to the current (host) tiddler in function scope (i.e. within the filter or group parameters)
{{{{{gCurrentTiddler}} }}}refers to the current (host) tiddler in global scope (i.e. within{{{ {{}} }}}evalled parameters. Example:
{{{<<tiddlerList tags:{{gCurrentTiddler.title}}>>}}}
!Style
No styles are pre-assigned to the lists. Use {{{@@}}} notation to define custom styles in the header, footer, groupTemplate and itemTemplate parameters.
Examples using the TiddlerListMacro:
!List Formatting
List all tiddlers tagged with "Plugin"
{{{<<tiddlerList tags:Plugin>>}}}
<<tiddlerList tags:Plugin>>
List top 1 plugins which are not templates:
{{{<<tiddlerList tags:"Plugin,-Template" top:1>>}}}
<<tiddlerList tags:"Plugin,-Template" top:1>>
List all tiddlers containing "Plugin" in their title and text (newest first):
{{{<<tiddlerList title:"Plugin" text:"Plugin" order:"-created">>}}}
<<tiddlerList title:"Plugin" text:"Plugin" order:"-created">>
List all tiddlers containing "Jack" in their title or text (oldest first):
{{{<<tiddlerList search:"Jack" order:"created">>}}}
<<tiddlerList search:"Jack" order:"created">>
List all tiddlers starting with "T":
{{{<<tiddlerList title:"^T">>}}}
<<tiddlerList title:"^T">>
!Other Formats
Simple unnumbered list of tiddlers
{{{<<tiddlerList top:"3" format:"list">>}}}
<<tiddlerList top:"3" format:"list">>
Numbered list of tiddlers
{{{<<tiddlerList top:"3" format:"nlist">>}}}
<<tiddlerList top:"3" format:"nlist">>
Table with header and footer
{{{<<tiddlerList top:"3" format:"table" header:"Plugins" footer:"Tiddlers: %count">>}}}
<<tiddlerList top:"3" format:"table" header:"Plugins" footer:"Tiddlers: %count">>
Simple horizontal list:
{{{<<tiddlerList top:"3" format:"span">>}}}
<<tiddlerList top:"3" format:"span">>
Comma Separated list
{{{<<tiddlerList top:"3" format:"csv" header:"Plugins: [ " footer:" ]">>}}}
<<tiddlerList top:"3" format:"csv" header:"Plugins: [ " footer:" ]">>
Custom Separated list
{{{<<tiddlerList top:"10" separator:" - " format:"span">>}}}
<<tiddlerList top:"10" separator:" - " format:"span">>
!Grouping
Group tiddlers by first letter
{{{<<tiddlerList top:"7" group:"tiddler.title.substr(0,1)">>}}}
<<tiddlerList top:"7" group:"tiddler.title.substr(0,1)">>
!Custom Item Templates
List tiddlers in a custom format (title, date, abstract)
{{{<<tiddlerList tags:"News,-Template" itemTemplate:"* %link (%created)<<br>>%abstract\n" order:"-created">>}}}
<<tiddlerList tags:"News,-Template" filter:"tiddler.title!=currentTiddler.title" itemTemplate:"%link (%created)\n%abstract" order:"-created">>
!!!Beware of infinite recursion!!
!Advanced
Tiddlers created today
{{{<<tiddlerList format:table filter:"tiddler.created.formatString('YYYYMMDD')==(new Date()).formatString('YYYYMMDD')" header:{{'Tiddlers created on ' + (new Date()).formatString('DDD, DD MMM YYYY')}}>>}}}
<<tiddlerList format:table filter:"tiddler.created.formatString('YYYYMMDD')==(new Date()).formatString('YYYYMMDD')" header:{{'Tiddlers created on ' + (new Date()).formatString('DDD, DD MMM YYYY')}}>>
Fancy table with grouping on modified date
{{{<<tiddlerList top:"10" header:"|>|!Tiddlers|\n|bgcolor(#ddf):''Title''|bgcolor(#ddf):''Created''|" itemTemplate:"|%0|%4|\n" format:"table" group:"tiddler.created.formatString('DD MMM YYYY')" groupTemplate:"|>|bgcolor(#eef): ''Updated: %group'' |\n" dateFormat:"DDD, DD MM YYYY">>}}}
<<tiddlerList top:"10" header:"|>|!Tiddlers|\n|bgcolor(#ddf):''Title''|bgcolor(#ddf):''Created''|" itemTemplate:"|%0|%4|\n" format:"table" group:"tiddler.created.formatString('DD MMM YYYY')" groupTemplate:"|>|bgcolor(#eef): ''Updated: %group'' |\n" dateFormat:"DDD, DD MM YYYY">>
/%
|Name|TiddlerTweaker|
|Source|http://www.TiddlyTools.com/#TiddlerTweaker|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|select multiple tiddlers and modify author, created, modified and/or tag values|

TiddlerTweaker is a tool for TiddlyWiki authors.  It allows you to select multiple tiddlers from a listbox, and then modify the author, created, modified and/or tag values of those tiddlers using a compact set of form fields.  The values you enter into the fields overwrite the existing values in all tiddlers you have selected.

TiddlerTweaker also allows you to quickly filter specified tags from the selected tiddlers, while leaving any other tags assigned to those tiddlers unchanged.  Any tag preceded by a "+" (plus) or "-" (minus), will be added or removed from the existing tags instead of simply *replacing* the entire tag definition of each tiddler (e.g., enter "-excludeLists" to remove that tag from all selected tiddlers.

Note: because you may be working with many tags on many tiddlers, selecting and updating all tiddlers in a document operation may take a while and FireFox might warn about an "unresponsive script"... you should give it a whole bunch of time to 'continue'... it will complete the processing... eventually.

Also, by design, TiddlerTweaker does NOT update the 'modified' date of tiddlers simply by making changes to their tags.  The tiddlers' dates are ONLY updated when the corresponding 'created' and/or 'modified' checkboxes are selected.  Be sure to SAVE YOUR DOCUMENT WHEN YOU ARE DONE tweaking tiddlers, even if the tiddler timeline tab does not show any recently modified tiddlers.

Finally: inasmuch as TiddlerTweaker is a 'power user' tool that can perform 'batch' functions (operating on many tiddlers at once), you should always have a recent backup of your document (or "save changes" just *before* tweaking the tiddlers), just in case you "shoot yourself in the foot".

%/{{small smallform{<<tiddler HideTiddlerTags>><html><form style="display:inline"><!--
--><table style="padding:0;margin:0;border:0;width:100%"><tr valign="top" style="padding:0;margin:0;border:0"><td  style="text-align:center;white-space:nowrap;width:99%;padding:0;margin:0;border:0"><!--
	--><font size=-2><div style="text-align:left;">select tiddlers:</div><!--
	--></font><select multiple name=list size="8" style="width:99.99%" 
		title="use click, shift-click and/or ctrl-click to select multiple tiddler titles"
		onclick="tiddlertweaker.selecttiddlers(this)"
		onchange="tiddlertweaker.setfields(this)"><!--
	--></select><br><!--
	-->show<input type=text size=1 value="8"
		onchange="this.form.list.size=this.value; this.form.list.multiple=(this.value>1);"><!--
	-->by<!--
	--><select name=sortby size=1 
		onchange="tiddlertweaker.init(this.form,this.value)"><!--
	--><option value="title">title</option><!--
	--><option value="modified">date</option><!--
	--><option value="size">size</option><!--
	--></select><!--
	--><input type="button" value="refresh"
		onclick="tiddlertweaker.init(this.form,this.form.sortby.value)"<!--
	--> <input type=button name=stats disabled value='totals...' 
		onclick="tiddlertweaker.stats(this)"><!--
--></td><td style="white-space:nowrap;padding:0;margin:0;border:0;width:1%"><!--
	--><div style="text-align:left"><font size=-2>modify values</font></div><!--

	--><table border=0 style="width:100%;padding:0;margin:0;border:0;"><tr style='padding:0;border:0;'><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=checkbox name=settitle unchecked 
			title="allow changes to tiddler title (rename tiddler)"
			onclick="this.form.title.disabled=!this.checked">title<!--
	--></td><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=text name=title size=35 style="width:98%" disabled><!--
	--></td></tr><tr style='padding:0;border:0;'><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=checkbox name=setwho unchecked 
			title="allow changes to tiddler author"
			onclick="this.form.who.disabled=!this.checked">author<!--
	--></td><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=text name=who size=35 style="width:98%" disabled><!--
	--></td></tr><tr style='padding:0;border:0;'><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=checkbox name=setcdate unchecked 
			title="allow changes to created date" onclick="this.form.cm.disabled=this.form.cd.disabled=this.form.cy.disabled=this.form.ch.disabled=this.form.cn.disabled=!this.checked"><!--
			-->created on<!--
	--></td><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=text name=cm size=2 style='width:2em;padding:0;text-align:center' disabled><!--
		--> / <input type=text name=cd size=2 style='width:2em;padding:0;text-align:center' disabled><!--
		--> / <input type=text name=cy size=4 style='width:3em;padding:0;text-align:center' disabled><!--
		--> at <input type=text name=ch size=2 style='width:2em;padding:0;text-align:center' disabled><!--
		--> : <input type=text name=cn size=2 style='width:2em;padding:0;text-align:center' disabled><!--
	--></td></tr><tr style='padding:0;border:0;'><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=checkbox name=setmdate unchecked 
			title="allow changes to modified date" onclick="this.form.mm.disabled=this.form.md.disabled=this.form.my.disabled=this.form.mh.disabled=this.form.mn.disabled=!this.checked"><!--
			-->modified on<!--
	--></td><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=text name=mm size=2 style='width:2em;padding:0;text-align:center' disabled><!--
		--> / <input type=text name=md size=2 style='width:2em;padding:0;text-align:center' disabled><!--
		--> / <input type=text name=my size=4 style='width:3em;padding:0;text-align:center' disabled><!--
		--> at <input type=text name=mh size=2 style='width:2em;padding:0;text-align:center' disabled><!--
		--> : <input type=text name=mn size=2 style='width:2em;padding:0;text-align:center' disabled><!--
	--></td></tr><tr style='padding:0;border:0;'><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=checkbox name=settags checked 
			title="allow changes to tiddler tags"
			onclick="this.form.tags.disabled=!this.checked">tags<!--
	--></td><td style="padding:1px;border:0;white-space:nowrap"><!--
		--><input type=text name=tags size=35 value='' style="width:98%"
			title="enter new tags or use '+tag' and '-tag' to add/remove tags from existing tags"><!--
	--></td></tr></table><!--
	--><div style="margin-top:.8em;text-align:center"><!--
	--><nobr><input type=button name=display disabled style='width:32%' value='display tiddlers' 
		onclick="tiddlertweaker.displaytiddlers(this)"><!--
	--> <input type=button name=del disabled style='width:32%' value='delete tiddlers' 
		onclick="tiddlertweaker.deltiddlers(this)"><!--
	--> <input type=button name=set disabled style='width:32%' value='update tiddlers' 
		onclick="tiddlertweaker.settiddlers(this)"></nobr><!--
	--></div><!--
--></td></tr></table><!--
--></form><span id="TiddlerTweaker_stats" style="display:none"></span></html><script>
window.tiddlertweaker = {

	init: // load tiddler titles into multi-select listbox
	function(form,sortby) { 
		while (form.list.options[0]) form.list.options[0]=null; // empty current list content
		var tids=store.getTiddlers(sortby);
		if (sortby=="size")
			tids.sort(function(a,b) {return a.text.length < b.text.length ? -1 : (a.text.length == b.text.length ? 0 : +1);});
		for (i=0; i<tids.length; i++) {
			var label=tids[i].title; var value=tids[i].title;
			if (sortby=="modified") {
				label=tids[tids.length-i-1].modified.formatString("YY.0MM.0DD 0hh:0mm ")+tids[tids.length-i-1].title;
				value=tids[tids.length-i-1].title;
			}
			if (sortby=="size") label="["+tids[i].text.length+"] "+label;
			form.list.options[form.list.length]=new Option(label,value,false,false);
		}
		form.title.value=form.who.value=form.tags.value="";
		form.cm.value=form.cd.value=form.cy.value=form.ch.value=form.cn.value="";
		form.mm.value=form.md.value=form.my.value=form.mh.value=form.mn.value="";
		form.stats.disabled=form.set.disabled=form.del.disabled=form.display.disabled=true;
		form.settitle.disabled=false;
	},

	selecttiddlers: // enable/disable tweaker fields based on number of items selected
	function(here) { 
		// count how many tiddlers are selected
		var list=here.form.list; var c=0; for (i=0;i<list.length;i++) if (list.options[i].selected) c++;
		if (c>1) here.form.title.disabled=true;
		if (c>1) here.form.settitle.checked=false;
		here.form.set.disabled=(c==0);
		here.form.del.disabled=(c==0);
		here.form.display.disabled=(c==0);
		here.form.settitle.disabled=(c>1);
		here.form.stats.disabled=(c==0);
		var msg=(c==0)?'select tiddlers:':(c+' tiddler'+(c!=1?'s':'')+' selected');
		here.previousSibling.firstChild.innerHTML=msg;
	},

	setfields: // set tweaker edit fields from first selected tiddler
	function(here) {
		var form=here.form;
		if (!here.value.length) {
			form.title.value=form.who.value=form.tags.value="";
			form.cm.value=form.cd.value=form.cy.value=form.ch.value=form.cn.value="";
			form.mm.value=form.md.value=form.my.value=form.mh.value=form.mn.value="";
			return;
		}
		var tid=store.getTiddler(here.value); if (!tid) return;
		form.title.value=tid.title;
		form.who.value=tid.modifier;
		form.tags.value=tid.tags.join(' ');
		var c=tid.created; var m=tid.modified;
		form.cm.value=c.getMonth()+1;
		form.cd.value=c.getDate();
		form.cy.value=c.getFullYear();
		form.ch.value=c.getHours();
		form.cn.value=c.getMinutes();
		form.mm.value=m.getMonth()+1;
		form.md.value=m.getDate();
		form.my.value=m.getFullYear();
		form.mh.value=m.getHours();
		form.mn.value=m.getMinutes();
	},

	settiddlers: 
	function(here) {
		var form=here.form; var list=form.list;	var tids=[];
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		var cdate=new Date(form.cy.value,form.cm.value-1,form.cd.value,form.ch.value,form.cn.value);
		var mdate=new Date(form.my.value,form.mm.value-1,form.md.value,form.mh.value,form.mn.value);
		if (tids.length>1 && !confirm("Are you sure you want to update these tiddlers:\n\n"+tids.join(', '))) return;
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			var title=!form.settitle.checked?tid.title:form.title.value;
			var who=!form.setwho.checked?tid.modifier:form.who.value;
			var tags=tid.tags
			if (form.settags.checked) { 
				var intags=form.tags.value.readBracketedList();
				var addtags=[]; var deltags=[]; var reptags=[];
				for (i=0;i<intags.length;i++) {
					if (intags[i].substr(0,1)=='+')
						addtags.push(intags[i].substr(1));
					else if (intags[i].substr(0,1)=='-')
						deltags.push(intags[i].substr(1));
					else
						reptags.push(intags[i]);
				}
				if (reptags.length)
					tags=reptags;
				if (addtags.length)
					tags=Array.concat(tags,addtags);
				if (deltags.length)
					for (i=0;i<deltags.length;i++)
						{ var pos=tags.indexOf(deltags[i]); if (pos!=-1) tags.splice(pos,1); }
// DEBUG alert("original tags="+tid.tags+"\n"+"reptags="+reptags+"\n"+"addtags="+addtags+"\n"+"deltags="+deltags+"\n"+"final tags="+tags+"\n");
			}
			if (!form.setcdate.checked) cdate=tid.created;
			if (!form.setmdate.checked) mdate=tid.modified;
			store.saveTiddler(tid.title,title,tid.text,who,mdate,tags,tid.fields);
			if (form.setcdate.checked) tid.assign(null,null,null,null,null,cdate); // set create date
		}
		this.init(form,form.sortby.value);
	},

	displaytiddlers: 
	function(here) {
		var form=here.form; var list=form.list;	var tids=[];
		for (i=0; i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		story.displayTiddlers(story.findContainingTiddler(form),tids)
	},

	deltiddlers: 
	function(here) {
		var form=here.form; var list=form.list;	var tids=[];
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		if (!confirm("Are you sure you want to delete these tiddlers:\n\n"+tids.join(', '))) return;
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			if (tid.tags.contains("systemConfig"))
				if (!confirm("'"+tid.title+"' is tagged with 'systemConfig'.\n\nRemoving this tiddler may cause unexpected results.  Are you sure?"))
					continue;
			store.removeTiddler(tid.title);
		}
		this.init(form,form.sortby.value);
	},

	stats: 
	function(here) {
		var form=here.form; var list=form.list; var tids=[]; var out=''; var tot=0;
		var target=document.getElementById("TiddlerTweaker_stats");
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			out+='[['+tid.title+']] '+tid.text.length+'\n'; tot+=tid.text.length;
		}
		var avg=tot/tids.length;
		out=tot+' bytes in '+tids.length+' selected tiddlers ('+avg+' bytes/tiddler)\n<<<\n'+out+'<<<\n';
		removeChildren(target);
		target.innerHTML="<hr><font size=-2><a href='javascript:;' style='float:right' onclick='this.parentNode.parentNode.style.display=\"none\"'>close</a></font>";
		wikify(out,target);
		target.style.display="block";
	}
}
// get THIS form...
var here=place.lastChild.firstChild;
// tweaker might be wrappered in a surrounding form (e.g., TidIDE) , so...
while(here && here.nodeName.toLowerCase()!="form") here=here.parentNode; // find containing form
// initialize tweaker controls
tiddlertweaker.init(here,here.sortby.value);
</script>}}}
!!TiddlySnip
Firefox の extension。
Firefox から直接 Tiddlywiki に tiddler を追加できるエクステンション。

文章を選択した状態で右クリックすると「TiddlySnip selection」が現われる。
ダイアログにて内容を確認して save する。
<<<
TiddlySnip: ¶

For now, you can grab the current beta release here: http://lewcid.googlepages.com/tiddlysnip.xpi

TiddlySnip is a firefox extension that aims to facilitate saving text to your TW, primarily from your browser. It's as simple as select some text, right click, and choose "TiddlySnip Selection". Each selection is saved in a new tiddler.

For now we are trying to make sure that the extension is very flexible and it's easy to turn settings on and off. Eventually we will decide on the best default configuration depending on community feedback.

Source: [[TiddlySnip - TiddyWiki - Trac|http://trac.tiddlywiki.org/tiddlywiki/wiki/TiddlySnip]]
<<<
TiddlySpot でも使用できるようだが、どうもうまく行かない。もうちょっと調べます。
Tiddlywiki のテーマが置いてある
*[[TiddlyThemes - Home|http://tiddlythemes.com/#Home]]
テーマごとにファイルになっているので(サイトになっている) そのサイトから ImportTiddler でまるごと持ってくると、自分の tw にテーマが反映される。

SelectTheme を使うなら、XXXStyleSheet と名前を付けて、tag:StyleSheet を付けると選べるようになる。
http://www.tiddlywiki.com/
<<showtoc>>
!文字装飾
{{{
''太字''
}}}
''太字''
{{{
--取消線--
}}}
--取消線--
{{{
__下線__
}}}
__下線__
{{{
//斜体//
}}}
//斜体//
{{{
2^^3^^=8
}}}
2^^3^^=8
{{{
a~~ij~~ = -a~~ji~~
}}}
a~~ij~~ = -a~~ji~~
{{{
@@ハイライト@@
}}}
@@ハイライト@@
{{{
@@color(green):着色(ここでは緑)@@
}}}
@@color(green):着色(ここでは緑)@@
{{{
@@bgcolor(#000000):color(#00FFFF):a背景色の設定もできます。@@
}}}
@@bgcolor(#000000):color(#00FFFF):a背景色の設定もできます。@@

{{{ {{{ }}} /%}}}%/
で囲む
/%{{{%/{{{ }}} }}}

{{{
 <monospacedtext>固定幅な表示</monospacedtext>
 if($hogehoge != ''){
 /*
 ほげほげ
 */
 }
}}}

!水平線
文書の区切りを明示する時に。
{{{
----
}}}
----

!通常リスト
箇条書きなんかに使うやつです。
{{{
* 一段目
** 階層化もできます。
** 同一レベルに記述するとこんなかんじ。
* そして元に戻ります。
}}}
* 一段目
** 階層化もできます。
** 同一レベルに記述するとこんなかんじ。
* そして元に戻ります。
!番号リスト
序数を付けたリストです。
{{{
#item1
#item2
##item2.1
##item2.2
##item2.3
#item3
##item3.1
###item3.1.1
###item3.1.2
}}}
#item1
#item2
##item2.1
##item2.2
##item2.3
#item3
##item3.1
###item3.1.1
###item3.1.2
!見出し
いわゆる{{{<h2>...</h2>}}}などに相当する見出しです。五段階に対応してます。
{{{
 !Header 1
 !!Header 2
 !!!Header 3
 !!!!Header 4
 !!!!!Header 5
}}}
!Header 1
!!Header 2
!!!Header 3
!!!!Header 4
!!!!!Header 5

!外部リンク
{{{
他のサイトへのリンクをする場合、[[Google|http://www.google.com/]]などと記載します。
}}}
他のサイトへのリンクをする場合、[[Google|http://www.google.com/]]などと記載します。

!画像の埋込み
{{{
[img[Google|http://www.google.co.jp/images/logo_sm.gif]]なんてことも可能です。
}}}
[img[Google|http://www.google.co.jp/images/logo_sm.gif]]なんてことも可能です。

{{{
[img[Google|http://www.google.co.jp/images/logo_sm.gif][http://google.co.jp/]]
}}}
さらにリンクも貼ると。
[img[Google|http://www.google.co.jp/images/logo_sm.gif][http://google.co.jp/]]

同じフォルダにある場合はパス名は不要なようです。

!引用
{{{
JeremyRuston said:
<<<
A TiddlyWiki is like a blog because it's divided up into neat little chunks, but it encourages you to read it by hyperlinking rather than sequentially: if you like, a non-linear blog analogue that binds the individual microcontent items into a cohesive whole. I think that TiddlyWiki represents a novel medium for writing, and will promote it's own distinctive WritingStyle. This is the first version of TiddlyWiki and so, as discussed in TiddlyWikiDev, it's bound to be FullOfBugs, have many MissingFeatures and fail to meet all of the DesignGoals. And of course there's NoWarranty, and it might be judged a StupidName.
<<<
}}}
JeremyRuston said:
<<<
A TiddlyWiki is like a blog because it's divided up into neat little chunks, but it encourages you to read it by hyperlinking rather than sequentially: if you like, a non-linear blog analogue that binds the individual microcontent items into a cohesive whole. I think that TiddlyWiki represents a novel medium for writing, and will promote it's own distinctive WritingStyle. This is the first version of TiddlyWiki and so, as discussed in TiddlyWikiDev, it's bound to be FullOfBugs, have many MissingFeatures and fail to meet all of the DesignGoals. And of course there's NoWarranty, and it might be judged a StupidName.
<<<

{{{
>level 1
>level 1
>>level 2
>>level 2
>>>level 3
>>>level 3
>>level 2
>level 1
}}}

>level 1
>level 1
>>level 2
>>level 2
>>>level 3
>>>level 3
>>level 2
>level 1

!表組
{{{
|!th1111111111|!th2222222222|
|>| colspan |
| rowspan |left|
|~| right|
|bgcolor(#a0ffa0):colored| center |
|caption|c
}}}
|!th1111111111|!th2222222222|
|>| colspan |
| rowspan |left|
|~| right|
|bgcolor(#a0ffa0):colored| center |
|caption|c

!ドキュメント内リンク (追加)
{{{
[[GettingStarted]]
[[スタートのメモ|GettingStarted]]
}}}

[[GettingStarted]]
[[スタートのメモ|GettingStarted]]

!他
本家へのリンク集→[[TextFormatting]]
/***
| Name|ToggleTagPlugin|
| Description|Makes a checkbox which toggles a tag in a tiddler|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://tiddlyspot.com/mptw/#ToggleTagMacro|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)

Examples:

|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
Notes:
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2

!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing

***/
//{{{

merge(config.macros,{

	toggleTag: {

		doRefreshAll: true,
		createIfRequired: true,
		shortLabel: "[[%0]]",
		longLabel: "[[%0]] [[%1]]",

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;
			var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			label = (label == '-' ? '' : label);
			var theTiddler =  title == tiddler.title ? tiddler : store.getTiddler(title);
			var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
				if (!store.tiddlerExists(title)) {
					if (config.macros.toggleTag.createIfRequired) {
						var content = store.getTiddlerText(title); // just in case it's a shadow
						store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
					}
					else 
						return false;
				}
				store.setTiddlerTag(title,this.checked,tag);
				return true;
			});
		}
	}
});

//}}}

Type the text for 'upload'
| Username:|<<option txtUploadUserName>>|
| Password:|<<option pasUploadPassword>>|
| site management:|<<upload http://tw.kuraku.net/store.cgi clip.html backup .>>//(requires tiddlywiki password)//<<br>>[[download (go offline)|http://tw.kuraku.net/download.cgi?file=clip.html]]|

!Upload Macro parameters
{{{
<<upload [storeUrl [toFilename [backupDir [uploadDir [username]]]]]>>
	Optional positional parameters can be passed to overwrite 
	UploadOptions. 
}}}
| 1/4/2007 23:49:11 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 1/4/2007 23:59:27 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 2/4/2007 0:2:30 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 3/4/2007 7:2:18 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 3/4/2007 16:23:48 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 3/4/2007 17:52:26 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 3/4/2007 17:57:13 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 3/4/2007 17:58:37 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 4/4/2007 7:6:46 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 4/4/2007 15:22:32 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 4/4/2007 22:37:55 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 4/4/2007 22:41:59 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 4/4/2007 22:51:37 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html#%5B%5B2007.04.03%20%E6%B3%A3%E3%81%8B%E3%82%8C%E3%82%8B%E3%81%A8%E3%83%84%E3%83%A9%E3%81%84%5D%5D]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 4/4/2007 22:55:2 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html#%5B%5B2007.04.03%20%E6%B3%A3%E3%81%8B%E3%82%8C%E3%82%8B%E3%81%A8%E3%83%84%E3%83%A9%E3%81%84%5D%5D]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 4/4/2007 22:56:22 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html#%5B%5B2007.04.03%20%E6%B3%A3%E3%81%8B%E3%82%8C%E3%82%8B%E3%81%A8%E3%83%84%E3%83%A9%E3%81%84%5D%5D]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 4/4/2007 23:14:10 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html#%5B%5B2007.04.03%20%E6%B3%A3%E3%81%8B%E3%82%8C%E3%82%8B%E3%81%A8%E3%83%84%E3%83%A9%E3%81%84%5D%5D]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 4/4/2007 23:35:18 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html#%5B%5B2007.04.03%20%E6%B3%A3%E3%81%8B%E3%82%8C%E3%82%8B%E3%81%A8%E3%83%84%E3%83%A9%E3%81%84%5D%5D]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 5/4/2007 0:17:5 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/4/2007 14:53:55 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/4/2007 17:26:45 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/4/2007 17:53:50 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/4/2007 18:29:50 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/4/2007 18:57:37 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/4/2007 19:23:38 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 7/4/2007 0:25:11 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 8/4/2007 7:15:8 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 9/4/2007 0:16:43 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 9/4/2007 0:20:33 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 9/4/2007 23:50:57 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/4/2007 0:3:5 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 10/4/2007 0:12:29 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/4/2007 22:28:32 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/4/2007 22:29:54 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 10/4/2007 22:31:13 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 10/4/2007 23:45:11 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/4/2007 23:49:59 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/4/2007 23:59:20 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 11/4/2007 0:1:56 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 11/4/2007 0:12:42 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 11/4/2007 0:13:7 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 11/4/2007 0:27:54 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 12/4/2007 6:45:9 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 12/4/2007 7:46:25 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 12/4/2007 7:58:19 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 13/4/2007 0:16:56 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 14/4/2007 22:40:47 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 14/4/2007 22:44:22 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 15/4/2007 0:30:4 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 15/4/2007 23:13:56 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 15/4/2007 23:15:33 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 15/4/2007 23:25:12 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 15/4/2007 23:27:30 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 15/4/2007 23:28:56 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 15/4/2007 23:29:25 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 15/4/2007 23:30:41 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 17/4/2007 13:18:29 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 18/4/2007 22:37:42 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 18/4/2007 22:52:3 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 18/4/2007 22:55:55 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 18/4/2007 22:59:11 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 18/4/2007 23:9:9 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 18/4/2007 23:18:3 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 19/4/2007 0:18:5 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 19/4/2007 0:23:5 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 19/4/2007 0:23:27 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 19/4/2007 0:30:34 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 19/4/2007 13:15:40 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 20/4/2007 16:14:32 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 22/4/2007 2:12:4 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 22/4/2007 2:12:41 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 23/4/2007 0:22:26 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 23/4/2007 15:59:6 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 23/4/2007 23:35:31 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 23/4/2007 23:37:24 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 23/4/2007 23:39:21 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/4/2007 0:43:54 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/4/2007 9:58:53 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 25/4/2007 11:34:50 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 25/4/2007 20:15:22 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 27/4/2007 0:35:49 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 27/4/2007 7:15:36 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 27/4/2007 22:10:52 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 27/4/2007 22:11:44 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 30/4/2007 2:43:2 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 30/4/2007 2:45:15 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/5/2007 5:18:10 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 6/5/2007 5:37:52 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/5/2007 23:26:26 | masuda | [[clip.html|file:///D:/TiddlyWiki/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 6/5/2007 23:52:6 | masuda | [[clip.html|file:///D:/TiddlyWiki/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 7/5/2007 0:0:0 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 8/5/2007 19:10:18 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 9/5/2007 18:19:39 | 九楽 | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/5/2007 6:17:59 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/5/2007 9:57:24 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/5/2007 9:59:55 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/5/2007 10:6:42 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 14/5/2007 5:4:28 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 16/5/2007 0:11:24 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 17/5/2007 19:52:38 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/5/2007 12:56:54 | akira | [[clip.html|http://kuraku.net/tw/clip.html#tackbacktest]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/5/2007 13:58:34 | akira | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/5/2007 14:10:53 | akira | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/5/2007 15:31:34 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/5/2007 15:47:16 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html#%5B%5B2007.05.24%20%E5%AE%B6%E3%81%94%E3%81%AF%E3%82%93%5D%5D]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/5/2007 15:58:1 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html#%5B%5B2007.05.24%20%E5%AE%B6%E3%81%94%E3%81%AF%E3%82%93%5D%5D]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/5/2007 17:36:33 | 九楽 | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 30/5/2007 17:41:5 | 九楽 | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 30/5/2007 19:31:12 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 1/6/2007 0:34:22 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 1/6/2007 0:40:35 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 1/6/2007 9:48:39 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 4/6/2007 23:27:15 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 4/6/2007 23:28:49 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 4/6/2007 23:42:41 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 4/6/2007 23:44:33 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/6/2007 15:56:37 | 九楽 | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 6/6/2007 16:35:29 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 7/6/2007 9:38:32 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 9/6/2007 0:52:30 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 9/6/2007 0:53:43 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/6/2007 22:47:59 | masuda | [[clip.html|file:///D:/TiddlyWiki/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/6/2007 22:48:17 | masuda | [[clip.html|file:///D:/TiddlyWiki/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/6/2007 22:54:51 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/6/2007 22:59:53 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 11/6/2007 22:33:31 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 11/6/2007 22:35:59 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 11/6/2007 22:49:22 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 11/6/2007 23:7:10 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 13/6/2007 18:24:30 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 13/6/2007 18:43:53 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 14/6/2007 12:21:40 | 九楽 | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 14/6/2007 12:22:7 | 九楽 | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 14/6/2007 15:55:37 | 九楽 | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 18/6/2007 21:57:11 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 20/6/2007 23:22:6 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 21/6/2007 13:39:16 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 21/6/2007 21:11:44 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 26/6/2007 19:21:49 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 12/7/2007 9:44:18 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 18/7/2007 19:47:21 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup | Ok |
| 18/7/2007 19:48:20 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 20/7/2007 9:57:11 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 23/7/2007 14:5:30 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 24/7/2007 19:8:49 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 9/8/2007 11:48:23 | 九楽 | [[clip.html|http://kuraku.net/tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/8/2007 10:50:18 | Yourname | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://kuraku.net/tw/store.cgi]] | . | clip.html | backup |
| 10/8/2007 18:15:14 | Yourname | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 10/8/2007 18:22:59 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup | Ok |
| 10/8/2007 18:25:7 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 13/8/2007 23:51:42 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 22/8/2007 22:52:22 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 23/8/2007 10:1:18 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 28/8/2007 13:24:43 | kuraku | [[clip.html|file:///C:/home/masuda/onkrk-tw/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 28/8/2007 13:33:10 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 28/8/2007 23:41:13 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 30/8/2007 19:23:15 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 5/9/2007 0:40:10 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup | Ok |
| 5/9/2007 0:40:39 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 11/9/2007 0:21:46 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 12/9/2007 18:38:59 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 12/9/2007 19:18:44 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 16/9/2007 1:6:49 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 19/9/2007 18:32:53 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 19/9/2007 18:34:18 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 19/9/2007 18:40:20 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 21/9/2007 9:48:41 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 25/9/2007 19:55:36 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 27/9/2007 0:0:46 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 28/9/2007 17:44:38 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 29/9/2007 2:15:25 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup | Ok |
| 29/9/2007 2:16:59 | YourName | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 1/10/2007 16:11:23 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 2/10/2007 15:17:43 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
| 10/10/2007 10:49:26 | 九楽 | [[clip.html|http://tw.kuraku.net/clip.html]] | [[store.cgi|http://tw.kuraku.net/store.cgi]] | . | clip.html | backup |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|3.4.5|
|''Date:''|Oct 15, 2006|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.0.0|
|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|
|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|
|''Require:''|[[UploadService|http://tiddlywiki.bidix.info/#UploadService]]|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 3, minor: 4, revision: 5, 
	date: new Date(2006,9,15),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	documentation: 'http://tiddlywiki.bidix.info/#UploadDoc',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.0.0',
	browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'
};
//}}}

////+++!![config.lib.file]

//{{{
if (!config.lib) config.lib = {};
if (!config.lib.file) config.lib.file= {
	author: 'BidiX',
	version: {major: 0, minor: 1, revision: 0}, 
	date: new Date(2006,3,9)
};
config.lib.file.dirname = function (filePath) {
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};
config.lib.file.basename = function (filePath) {
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};
window.basename = function() {return "@@deprecated@@";};
//}}}
////===

////+++!![config.lib.log]

//{{{
if (!config.lib) config.lib = {};
if (!config.lib.log) config.lib.log= {
	author: 'BidiX',
	version: {major: 0, minor: 1, revision: 1}, 
	date: new Date(2006,8,19)
};
config.lib.Log = function(tiddlerTitle, logHeader) {
	if (version.major < 2)
		this.tiddler = store.tiddlers[tiddlerTitle];
	else
		this.tiddler = store.getTiddler(tiddlerTitle);
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = tiddlerTitle;
		this.tiddler.text = "| !date | !user | !location |" + logHeader;
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
	if (version.major < 2)
		store.tiddlers[tiddlerTitle] = this.tiddler;
	else
		store.addTiddler(this.tiddler);
	}
	return this;
};

config.lib.Log.prototype.newLine = function (line) {
	var now = new Date();
	var newText = "| ";
	newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";
	newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";
	newText += config.options.txtUserName + " | ";
	var location = document.location.toString();
	var filename = config.lib.file.basename(location);
	if (!filename) filename = '/';
	newText += "[["+filename+"|"+location + "]] |";
	this.tiddler.text = this.tiddler.text + "\n" + newText;
	this.addToLine(line);
};

config.lib.Log.prototype.addToLine = function (text) {
	this.tiddler.text = this.tiddler.text + text;
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	if (version.major < 2)
	store.tiddlers[this.tiddler.tittle] = this.tiddler;
	else {
		store.addTiddler(this.tiddler);
		story.refreshTiddler(this.tiddler.title);
		store.notify(this.tiddler.title, true);
	}
	if (version.major < 2)
		store.notifyAll(); 
};
//}}}
////===

////+++!![config.lib.options]

//{{{
if (!config.lib) config.lib = {};
if (!config.lib.options) config.lib.options = {
	author: 'BidiX',
	version: {major: 0, minor: 1, revision: 0}, 
	date: new Date(2006,3,9)
};

config.lib.options.init = function (name, defaultValue) {
	if (!config.options[name]) {
		config.options[name] = defaultValue;
		saveOptionCookie(name);
	}
};
//}}}
////===

////+++!![PasswordTweak]

//{{{
version.extensions.PasswordTweak = {
	major: 1, minor: 0, revision: 3, date: new Date(2006,8,30),
	type: 'tweak',
	source: 'http://tiddlywiki.bidix.info/#PasswordTweak'
};
//}}}
/***
!!config.macros.option
***/
//{{{
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordType = "password"; // password | text

config.macros.option.onChangeOption = function(e)
{
	var opt = this.getAttribute("option");
	var elementType,valueField;
	if(opt) {
		switch(opt.substr(0,3)) {
			case "txt":
				elementType = "input";
				valueField = "value";
				break;
			case "pas":
				elementType = "input";
				valueField = "value";
				break;
			case "chk":
				elementType = "input";
				valueField = "checked";
				break;
		}
		config.options[opt] = this[valueField];
		saveOptionCookie(opt);
		var nodes = document.getElementsByTagName(elementType);
		for(var t=0; t<nodes.length; t++) 
			{
			var optNode = nodes[t].getAttribute("option");
			if (opt == optNode) 
				nodes[t][valueField] = this[valueField];
			}
		}
	return(true);
};

config.macros.option.handler = function(place,macroName,params)
{
    var opt = params[0];
    if(config.options[opt] === undefined) {
        return;}
    var c;
    switch(opt.substr(0,3)) {
		case "txt":
			c = document.createElement("input");
			c.onkeyup = this.onChangeOption;
			c.setAttribute ("option",opt);
			c.className = "txtOptionInput "+opt;
			place.appendChild(c);
			c.value = config.options[opt];
			break;
		case "pas":
			// input password
			c = document.createElement ("input");
			c.setAttribute("type",config.macros.option.passwordType);
			c.onkeyup = this.onChangeOption;
			c.setAttribute("option",opt);
			c.className = "pasOptionInput "+opt;
			place.appendChild(c);
			c.value = config.options[opt];
			// checkbox link with this password "save this password on this computer"
			c = document.createElement("input");
			c.setAttribute("type","checkbox");
			c.onclick = this.onChangeOption;
			c.setAttribute("option","chk"+opt);
			c.className = "chkOptionInput "+opt;
			place.appendChild(c);
			c.checked = config.options["chk"+opt];
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
			break;
		case "chk":
			c = document.createElement("input");
			c.setAttribute("type","checkbox");
			c.onclick = this.onChangeOption;
			c.setAttribute("option",opt);
			c.className = "chkOptionInput "+opt;
			place.appendChild(c);
			c.checked = config.options[opt];
			break;
	}
};
//}}}
/***
!! Option cookie stuff
***/
//{{{
window.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;
window.loadOptionsCookie = function()
{
	var cookies = document.cookie.split(";");
	for(var c=0; c<cookies.length; c++) {
		var p = cookies[c].indexOf("=");
		if(p != -1) {
			var name = cookies[c].substr(0,p).trim();
			var value = cookies[c].substr(p+1).trim();
			switch(name.substr(0,3)) {
				case "txt":
					config.options[name] = unescape(value);
					break;
				case "pas":
					config.options[name] = unescape(value);
					break;
				case "chk":
					config.options[name] = value == "true";
					break;
			}
		}
	}
};

window.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;
window.saveOptionCookie = function(name)
{
	var c = name + "=";
	switch(name.substr(0,3)) {
		case "txt":
			c += escape(config.options[name].toString());
			break;
		case "chk":
			c += config.options[name] ? "true" : "false";
			// is there an option link with this chk ?
			if (config.options[name.substr(3)]) {
				saveOptionCookie(name.substr(3));
			}
			break;
		case "pas":
			if (config.options["chk"+name]) {
				c += escape(config.options[name].toString());
			} else {
				c += "";
			}
			break;
	}
	c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";
	document.cookie = c;
};
//}}}
/***
!! Initializations
***/
//{{{
// define config.options.pasPassword
if (!config.options.pasPassword) {
	config.options.pasPassword = 'defaultPassword';
	window.saveOptionCookie('pasPassword');
}
// since loadCookies is first called befor password definition
// we need to reload cookies
window.loadOptionsCookie();
//}}}
////===

////+++!![config.macros.upload]

//{{{
config.macros.upload = {
	accessKey: "U",
	formName: "UploadPlugin",
	contentType: "text/html;charset=UTF-8",
	defaultStoreScript: "store.php"
};

// only this two configs need to be translated
config.macros.upload.messages = {
	aboutToUpload: "About to upload TiddlyWiki to %0",
	backupFileStored: "Previous file backuped in %0",
	crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",
	errorDownloading: "Error downloading",
	errorUploadingContent: "Error uploading content",
	fileLocked: "Files is locked: You are not allowed to Upload",
	fileNotFound: "file to upload not found",
	fileNotUploaded: "File %0 NOT uploaded",
	mainFileUploaded: "Main TiddlyWiki file uploaded to %0",
	passwordEmpty: "Unable to upload, your password is empty",
	urlParamMissing: "url param missing",
	rssFileNotUploaded: "RssFile %0 NOT uploaded",
	rssFileUploaded: "Rss File uploaded to %0"
};

config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.handler = function(place,macroName,params){
	// parameters initialization
	var storeUrl = params[0];
	var toFilename = params[1];
	var backupDir = params[2];
	var uploadDir = params[3];
	var username = params[4];
	var password; // for security reason no password as macro parameter
	var label;
	if (document.location.toString().substr(0,4) == "http")
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (storeUrl) {
		prompt = this.label.promptParamMacro.toString().format([this.toDirUrl(storeUrl, uploadDir, username)]);
	}
	else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, 
						function () {
							config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); 
							return false;}, 
						null, null, this.accessKey);
};
config.macros.upload.UploadLog = function() {
	return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );
};
config.macros.upload.UploadLog.prototype = config.lib.Log.prototype;
config.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";
	line += uploadDir + " | " + toFilename + " | " + backupDir + " |";
	this.newLine(line);
};
config.macros.upload.UploadLog.prototype.endUpload = function() {
	this.addToLine(" Ok |");
};
config.macros.upload.basename = config.lib.file.basename;
config.macros.upload.dirname = config.lib.file.dirname;
config.macros.upload.toRootUrl = function (storeUrl, username)
{
	return root = (this.dirname(storeUrl)?this.dirname(storeUrl):this.dirname(document.location.toString()));
}
config.macros.upload.toDirUrl = function (storeUrl,  uploadDir, username)
{
	var root = this.toRootUrl(storeUrl, username);
	if (uploadDir && uploadDir != '.')
		root = root + '/' + uploadDir;
	return root;
}
config.macros.upload.toFileUrl = function (storeUrl, toFilename,  uploadDir, username)
{
	return this.toDirUrl(storeUrl, uploadDir, username) + '/' + toFilename;
}
config.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)
{
	// parameters initialization
	storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);
	toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);
	backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);
	uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);
	username = (username ? username : config.options.txtUploadUserName);
	password = config.options.pasUploadPassword; // for security reason no password as macro parameter
	if (!password || password === '') {
		alert(config.macros.upload.messages.passwordEmpty);
		return;
	}
	if (storeUrl === '') {
		storeUrl = config.macros.upload.defaultStoreScript;
	}
	if (config.lib.file.dirname(storeUrl) === '') {
		storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;
	}
	if (toFilename === '') {
		toFilename = config.lib.file.basename(document.location.toString());
	}

	clearMessage();
	// only for forcing the message to display
	 if (version.major < 2)
		store.notifyAll();
	if (!storeUrl) {
		alert(config.macros.upload.messages.urlParamMissing);
		return;
	}
	// Check that file is not locked
	if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {
		if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {
			alert(config.macros.upload.messages.fileLocked);
			return;
		}
	}
	
	var log = new this.UploadLog();
	log.startUpload(storeUrl, toFilename, uploadDir,  backupDir);
	if (document.location.toString().substr(0,5) == "file:") {
		saveChanges();
	}
	var toDir = config.macros.upload.toDirUrl(storeUrl, toFilename, uploadDir, username);
	displayMessage(config.macros.upload.messages.aboutToUpload.format([toDir]), toDir);
	this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);
	if(config.options.chkGenerateAnRssFeed) {
		//var rssContent = convertUnicodeToUTF8(generateRss());
		var rssContent = generateRss();
		var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";
		this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, 
			function (responseText) {
				if (responseText.substring(0,1) != '0') {
					displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));
				}
				else {
					var toFileUrl = config.macros.upload.toFileUrl(storeUrl, rssPath, uploadDir, username);
					displayMessage(config.macros.upload.messages.rssFileUploaded.format(
						[toFileUrl]), toFileUrl);
				}
				// for debugging store.php uncomment last line
				//DEBUG alert(responseText);
			});
	}
	return;
};

config.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, 
		username, password) {
	var original;
	if (document.location.toString().substr(0,4) == "http") {
		original =  this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);
		return;
	}
	else {
		// standard way : Local file
		
		original = loadFile(getLocalPath(document.location.toString()));
		if(window.Components) {
			// it's a mozilla browser
			try {
				netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
				var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
									.createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
				converter.charset = "UTF-8";
				original = converter.ConvertToUnicode(original);
			}
			catch(e) {
			}
		}
	}
	//DEBUG alert(original);
	this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, 
		username, password);
};

config.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, 
		username, password) {
	var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it
	var endSaveArea = '</d' + 'iv>';
	// Locate the storeArea div's
	var posOpeningDiv = original.indexOf(startSaveArea);
	var posClosingDiv = original.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1))
		{
		alert(config.messages.invalidFileError.format([document.location.toString()]));
		return;
		}
	var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + 
				allTiddlersAsHtml() + "\n\t\t" +
				original.substr(posClosingDiv);
	var newSiteTitle;
	if(version.major < 2){
		newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();
	} else {
		newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();
	}

	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\n" + store.getTiddlerText("MarkupPreHead","") + "\n");
	revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\n" + store.getTiddlerText("MarkupPostHead","") + "\n");
	revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\n" + store.getTiddlerText("MarkupPreBody","") + "\n");
	revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\n" + store.getTiddlerText("MarkupPostBody","") + "\n");

	var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, 
		username, password, function (responseText) {
					if (responseText.substring(0,1) != '0') {
						alert(responseText);
						displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));
					}
					else {
						if (uploadDir !== '') {
							toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);
						} else {
							toFilename = config.macros.upload.basename(toFilename);
						}
						var toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);
						if (responseText.indexOf("destfile:") > 0) {
							var destfile = responseText.substring(responseText.indexOf("destfile:")+9, 
							responseText.indexOf("\n", responseText.indexOf("destfile:")));
							toFileUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + destfile;
						}
						else {
							toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);
						}
						displayMessage(config.macros.upload.messages.mainFileUploaded.format(
							[toFileUrl]), toFileUrl);
						if (backupDir && responseText.indexOf("backupfile:") > 0) {
							var backupFile = responseText.substring(responseText.indexOf("backupfile:")+11, 
							responseText.indexOf("\n", responseText.indexOf("backupfile:")));
							toBackupUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + backupFile;
							displayMessage(config.macros.upload.messages.backupFileStored.format(
								[toBackupUrl]), toBackupUrl);
						}
						var log = new config.macros.upload.UploadLog();
						log.endUpload();
						store.setDirty(false);
						// erase local lock
						if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {
							BidiX.GroupAuthoring.lock.eraseLock();
							// change mtime with new mtime after upload
							var mtime = responseText.substr(responseText.indexOf("mtime:")+6);
							BidiX.GroupAuthoring.lock.mtime = mtime;
						}
						
						
					}
					// for debugging store.php uncomment last line
					//DEBUG alert(responseText);
				}
			);
};

config.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, 
		username, password, callbackFn) {
	var boundary = "---------------------------"+"AaB03x";		
	var request;
	try {
		request = new XMLHttpRequest();
		} 
	catch (e) { 
		request = new ActiveXObject("Msxml2.XMLHTTP"); 
		}
	if (window.netscape){
			try {
				if (document.location.toString().substr(0,4) != "http") {
					netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}
			}
			catch (e) {}
		}		
	//DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += config.macros.upload.formName +"\"\r\n\r\n";
	sheader += "backupDir="+backupDir
				+";user=" + username 
				+";password=" + password
				+";uploaddir=" + uploadDir;
	// add lock attributes to sheader
	if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {
		var l = BidiX.GroupAuthoring.lock.myLock;
		sheader += ";lockuser=" + l.user
				+ ";mtime=" + l.mtime
				+ ";locktime=" + l.locktime;
	}
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+toFilename+"\"\r\n";
	sheader += "Content-Type: " + config.macros.upload.contentType + "\r\n";
	sheader += "Content-Length: " + content.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	//strailer = "--" + boundary + "--\r\n";
	var data;
	data = sheader + content + strailer;
	//request.open("POST", storeUrl, true, username, password);
	try {
		request.open("POST", storeUrl, true);		
	}
	catch(e) {
		alert(config.macros.upload.messages.crossDomain + "\nError:" +e);
		exit;
	}
	request.onreadystatechange = function () {
				if (request.readyState == 4) {
				     if (request.status == 200)
						callbackFn(request.responseText);
					else
						alert(config.macros.upload.messages.errorUploadingContent + "\nStatus: "+request.status.statusText);
				}
		};
	request.setRequestHeader("Content-Length",data.length);
	request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);
	request.send(data); 
};


config.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, 
	username, password) {
	var request;
	try {
		request = new XMLHttpRequest();
	} 
	catch (e) { 
		request = new ActiveXObject("Msxml2.XMLHTTP"); 
	}
	try {
		if (uploadUrl.substr(0,4) == "http") {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
			}
		else {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		}
	} catch (e) { }
	//request.open("GET", document.location.toString(), true, username, password);
	try {
		request.open("GET", document.location.toString(), true);
	}
	catch(e) {
		alert(config.macros.upload.messages.crossDomain + "\nError:" +e);
		exit;
	}
	
	request.onreadystatechange = function () {
		if (request.readyState == 4) {
			if(request.status == 200) {
				config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, 
					uploadToFilename, uploadDir, uploadBackupDir, username, password);
			}
			else
				alert(config.macros.upload.messages.errorDownloading.format(
					[document.location.toString()]) + "\nStatus: "+request.status.statusText);
		}
	};
	request.send(null);
};

//}}}
////===

////+++!![Initializations]

//{{{
config.lib.options.init('txtUploadStoreUrl','store.php');
config.lib.options.init('txtUploadFilename','');
config.lib.options.init('txtUploadDir','');
config.lib.options.init('txtUploadBackupDir','');
config.lib.options.init('txtUploadUserName',config.options.txtUserName);
config.lib.options.init('pasUploadPassword','');
setStylesheet(
	".pasOptionInput {width: 11em;}\n"+
	".txtOptionInput.txtUploadStoreUrl {width: 25em;}\n"+
	".txtOptionInput.txtUploadFilename {width: 25em;}\n"+
	".txtOptionInput.txtUploadDir {width: 25em;}\n"+
	".txtOptionInput.txtUploadBackupDir {width: 25em;}\n"+
	"",
	"UploadOptionsStyles");
if (document.location.toString().substr(0,4) == "http") {
	config.options.chkAutoSave = false; 
	saveOptionCookie('chkAutoSave');
}
config.shadowTiddlers.UploadDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadDoc ]]\n"; 

//}}}
////===

////+++!![Core Hijacking]

//{{{
config.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;
config.macros.saveChanges.label = config.macros.upload.label.saveToDisk;

config.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;

config.macros.saveChanges.handler = function(place)
{
	if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))
		createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);
};

//}}}
////===
/***
|''Name:''|UploadToFileMacro|
|''Description:''|Upload a tiddler as a file using UploadPlugin context. Used with the SimonBaird's RunMacroIfTagged in [[ViewTemplate|BidiXStyleViewTemplate]] provides a new command in the tiddler toolbar.|
|''Version:''|1.0.0|
|''Date:''|Mar 14, 2006|
|''Source:''|http://tiddlywiki.bidix.info/#UploadToFileMacro|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadToFileMacroDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.0.0|
|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|
|''Include:''|none|
|''Require:''|UploadPlugin|
***/
//{{{
version.extensions.UploadToFileMacro = {
	major: 1, minor: 0, revision: 0, 
	date: new Date(2006,3,13),
	source: 'http://tiddlywiki.bidix.info/#UploadToFilePlugin',
	documentation: 'http://tiddlywiki.bidix.info/#UploadToFilePluginDoc',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.0.0',
	browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'
};

config.macros.uploadToFile = {
	label: "uploadToFile",
	prompt: "upload tiddler '%0' to file '%1' ",
	warning: "Are you sure you want to upload '%0'?",
	dirname: config.lib.file.dirname,
	basename: config.lib.file.dirname
};

config.macros.uploadToFile.messages = {
	fileUploaded: "tiddler '%0' uploaded to file '%1'",
	fileNotUploaded: "tiddler '%0' NOT uploaded"
};

config.macros.uploadToFile.handler = function(place, macroName, params, wikifier,paramString, tiddler) {
	// parameters initialization
	var toFilename = params[0];
	var tiddlerTitle = params[1];
	if (!tiddlerTitle) { 
		tiddlerTitle = tiddler.title;
	} else {
		tiddler = store.getTiddler(tiddlerTitle);
	}
	if (!toFilename) { 
		toFilename = tiddlerTitle;
	} 
	var prompt = this.prompt.format([tiddlerTitle, toFilename]);
	createTiddlyButton(place, this.label, this.prompt.format([tiddlerTitle, toFilename]), 
						function () {
							config.macros.uploadToFile.upload(tiddler, toFilename); 
							return false;}, 
						null, null, null);
};

config.macros.uploadToFile.upload = function(tiddler, toFilename, storeUrl, toFilename, uploadDir, backupDir, username, password) {
		var uploadIt = true; 
		if (this.warning)
			uploadIt = confirm(this.warning.format([tiddler.title])); 
		if (uploadIt) {
			if (!tiddler)	{
				alert("Tiddler not found.");
				return;
			}
			if (!config.macros.upload.uploadContent) {
				alert ("no UploadPlugin extension");
				return;
			}
			// parameters initialization
			storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);
			toFilename = (toFilename ? toFilename : tiddler.title);
			backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);
			uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);
			username = (username ? username : config.options.txtUploadUserName);
			password = (password ? password :config.options.pasUploadPassword); 
			config.macros.upload.uploadContent(tiddler.text, storeUrl, toFilename, uploadDir, backupDir, username, password, 
					function (responseText) {
						if (responseText.substring(0,1) != '0') {
							displayMessage(config.macros.uploadToFile.messages.fileNotUploaded.format([tiddler.title]));
						}
						else {
							if (uploadDir) {
								toFilename = uploadDir + "/" + config.macros.uploadToFile.basename(toFilename);
							} 
							displayMessage(config.macros.uploadToFile.messages.fileUploaded.format(
								[tiddler.title, config.macros.uploadToFile.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);
						}
						// for debugging store.php uncomment last line
						//DEBUG alert(responseText);
					});
		}
		return false;
};

config.shadowTiddlers.UploadToFileMacroDoc= "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadToFileMacroDoc]]\n"; 
//}}}
<div class='toolbar' macro='toolbar +editTiddler permalink references jump closeOthers refresh collapseTiddler -closeTiddler'></div>
<div><span class='tagglyTagged' macro='tags'></span></div>
<div><span class="title" macro="view title"></span></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[YYYY.0MM.0DD-0hh:0mm]]'></span> (created <span macro='view created date [[YYYY.0MM.0DD-0hh:0mm]]'></span>)&nbsp;&nbsp;&nbsp;<span style="font-size:0.8em;" macro="showWhen tiddler.title.match(/^\d\d\d\d.\d\d.\d\d/)">
<span macro="toggleTag toRSS . 'toRSS'"></span> <span macro="toggleTag today . 'today'"></span></span></div>
<div class='tagging' macro='tagging'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class="toolbar" macro="showWhen tiddler.title.match(/^\d\d\d\d.\d\d.\d\d/)">
  <span macro="navitiddler -1"></span> <span macro="navitiddler +1"></span>
</div>
<div class="viewer" style="text-align:right;padding-top:0.8em;font-size:0.9em;" macro="hideWhen tiddler.title.match(/^(FrontPage|Whats new)$/)">
  <span macro="haloscan comments"></span>
  <span macro="haloscan trackbacks"></span>
</span>

さいきんの日記5件です。
これは一覧です。コメント/トラックバックボタンはタイトルをクリックした内容にあります。

<<tiddlerList search:"^200\d.\d\d.\d\d" tiddlerList top:"5" itemTemplate:"!!≫【%item: %link】~~(%tags)~~\n^^created: %created modified: %modified - %modifier^^\n%text\n\n" dateFormat:"YYYY.0MM.0DD" order:"-created">>
Here are some examples that show the usage of the scriptClause in the ForEachTiddlerMacro.

<<forEachTiddler
 where
 'tiddler.tags.contains("scriptClauseExample")'
>>

See also ForEachTiddlerExamples.
/***
|''Name:''|YourSearchPlugin|
|''Version:''|2.1.1 (2007-03-11)|
|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin ([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23YourSearchPlugin]])|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2006 [[abego Software|http://www.abego-software.de]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; ~InternetExplorer 6.0|
!About YourSearch
YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!

For more information see [[Help|YourSearch Help]].
!Compatibility
This plugin requires TiddlyWiki 2.1. 
Check the [[archive|http://tiddlywiki.abego-software.de/archive]] for ~YourSearchPlugins supporting older versions of TiddlyWiki.
!Source Code
***/
/***
This plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/YourSearchPlugin/Plugin-YourSearch-src.2.1.1.js]] to get the readable source code.
***/
///%
if(!version.extensions.YourSearchPlugin){version.extensions.YourSearchPlugin={major:2,minor:1,revision:1,source:"http://tiddlywiki.abego-software.de/#YourSearchPlugin",licence:"[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",copyright:"Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"};if(!window.abego){window.abego={};}if(!Array.forEach){Array.forEach=function(_1,_2,_3){for(var i=0,len=_1.length;i<len;i++){_2.call(_3,_1[i],i,_1);}};Array.prototype.forEach=function(_5,_6){for(var i=0,len=this.length;i<len;i++){_5.call(_6,this[i],i,this);}};}abego.toInt=function(s,_9){if(!s){return _9;}var n=parseInt(s);return (n==NaN)?_9:n;};abego.createEllipsis=function(_b){var e=createTiddlyElement(_b,"span");e.innerHTML="&hellip;";};abego.shallowCopy=function(_d){if(!_d){return _d;}var _e={};for(var n in _d){_e[n]=_d[n];}return _e;};abego.copyOptions=function(_10){return !_10?{}:abego.shallowCopy(_10);};abego.countStrings=function(_11,s){if(!s){return 0;}var len=s.length;var n=0;var _15=0;while(1){var i=_11.indexOf(s,_15);if(i<0){return n;}n++;_15=i+len;}return n;};abego.getBracedText=function(_17,_18,_19){if(!_18){_18=0;}var re=/\{([^\}]*)\}/gm;re.lastIndex=_18;var m=re.exec(_17);if(m){var s=m[1];var _1d=abego.countStrings(s,"{");if(!_1d){if(_19){_19.lastIndex=re.lastIndex;}return s;}var len=_17.length;for(var i=re.lastIndex;i<len&&_1d;i++){var c=_17.charAt(i);if(c=="{"){_1d++;}else{if(c=="}"){_1d--;}}}if(!_1d){if(_19){_19.lastIndex=i-1;}return _17.substring(m.index+1,i-1);}}};abego.select=function(_21,_22,_23,_24){if(!_24){_24=[];}_21.forEach(function(t){if(_22.call(_23,t)){_24.push(t);}});return _24;};abego.TiddlerFilterTerm=function(_26,_27){if(!_27){_27={};}var _28=_26;if(!_27.textIsRegExp){_28=_26.escapeRegExp();if(_27.fullWordMatch){_28="\\b"+_28+"\\b";}}var _29=new RegExp(_28,"m"+(_27.caseSensitive?"":"i"));this.tester=new abego.MultiFieldRegExpTester(_29,_27.fields,_27.withExtendedFields);};abego.TiddlerFilterTerm.prototype.test=function(_2a){return this.tester.test(_2a);};abego.parseNewTiddlerCommandLine=function(s){var m=/(.*?)\.(?:\s+|$)([^#]*)(#.*)?/.exec(s);if(!m){m=/([^#]*)()(#.*)?/.exec(s);}if(m){var r;if(m[3]){var s2=m[3].replace(/#/g,"");r=s2.parseParams("tag");}else{r=[[]];}var _2f=m[2]?m[2].trim():"";r.push({name:"text",value:_2f});r[0].text=[_2f];return {title:m[1].trim(),params:r};}else{return {title:s.trim(),params:[[]]};}};abego.parseTiddlerFilterTerm=function(_30,_31,_32){var re=/\s*(?:(?:\{([^\}]*)\})|(?:(=)|([#%!])|(?:(\w+)\s*\:(?!\/\/))|(?:(?:("(?:(?:\\")|[^"])+")|(?:\/((?:(?:\\\/)|[^\/])+)\/)|(\w+\:\/\/[^\s]+)|([^\s\)\-\"]+)))))/mg;var _34={"!":"title","%":"text","#":"tags"};var _35={};var _36;re.lastIndex=_31;while(1){var i=re.lastIndex;var m=re.exec(_30);if(!m||m.index!=i){throw "Word or String literal expected";}if(m[1]){var _39={};var _3a=abego.getBracedText(_30,0,_39);if(!_3a){throw "Invalid {...} syntax";}var f=Function("tiddler","return ("+_3a+");");return {func:f,lastIndex:_39.lastIndex,markRE:null};}if(m[2]){_36=true;}else{if(m[3]){_35[_34[m[3]]]=1;}else{if(m[4]){_35[m[4]]=1;}else{var _3c=m[6];var _3d=m[5]?window.eval(m[5]):m[6]?m[6]:m[7]?m[7]:m[8];var _3e=abego.copyOptions(_3e);_3e.fullWordMatch=_36;_3e.textIsRegExp=_3c;var _3f=[];for(var n in _35){_3f.push(n);}if(_3f.length==0){_3e.fields=_3e.defaultFields;}else{_3e.fields=_3f;_3e.withExtendedFields=false;}var _41=new abego.TiddlerFilterTerm(_3d,_3e);var _42=_3c?_3d:_3d.escapeRegExp();if(_42&&_36){_42="\\b"+_42+"\\b";}return {func:function(_43){return _41.test(_43);},lastIndex:re.lastIndex,markRE:_42?"(?:"+_42+")":null};}}}}};abego.BoolExp=function(s,_45,_46){this.s=s;var _47=_46&&_46.defaultOperationIs_OR;var _48=/\s*(?:(\-|not)|(\())/gi;var _49=/\s*\)/g;var _4a=/\s*(?:(and|\&\&)|(or|\|\|))/gi;var _4b=/\s*[^\)\s]/g;var _4c=/\s*(\-|not)?(\s*\()?/gi;var _4d;var _4e=function(_4f){_4c.lastIndex=_4f;var m=_4c.exec(s);var _51;var _52;if(m&&m.index==_4f){_4f=_4c.lastIndex;_51=m[1];if(m[2]){var e=_4d(_4f);_49.lastIndex=e.lastIndex;if(!_49.exec(s)){throw "Missing ')'";}_52={func:e.func,lastIndex:_49.lastIndex,markRE:e.markRE};}}if(!_52){_52=_45(s,_4f,_46);}if(_51){_52.func=(function(f){return function(_55){return !f(_55);};})(_52.func);_52.markRE=null;}return _52;};_4d=function(_56){var _57=_4e(_56);while(1){var l=_57.lastIndex;_4a.lastIndex=l;var m=_4a.exec(s);var _5a;var _5b;if(m&&m.index==l){_5a=!m[1];_5b=_4e(_4a.lastIndex);}else{try{_5b=_4e(l);}catch(e){return _57;}_5a=_47;}_57.func=(function(_5c,_5d,_5e){return _5e?function(_5f){return _5c(_5f)||_5d(_5f);}:function(_60){return _5c(_60)&&_5d(_60);};})(_57.func,_5b.func,_5a);_57.lastIndex=_5b.lastIndex;if(!_57.markRE){_57.markRE=_5b.markRE;}else{if(_5b.markRE){_57.markRE=_57.markRE+"|"+_5b.markRE;}}}};var _61=_4d(0);this.evalFunc=_61.func;if(_61.markRE){this.markRegExp=new RegExp(_61.markRE,_46.caseSensitive?"mg":"img");}};abego.BoolExp.prototype.exec=function(){return this.evalFunc.apply(this,arguments);};abego.BoolExp.prototype.getMarkRegExp=function(){return this.markRegExp;};abego.BoolExp.prototype.toString=function(){return this.s;};abego.MultiFieldRegExpTester=function(re,_63,_64){this.re=re;this.fields=_63?_63:["title","text","tags"];this.withExtendedFields=_64;};abego.MultiFieldRegExpTester.prototype.test=function(_65){var re=this.re;for(var i=0;i<this.fields.length;i++){var s=store.getValue(_65,this.fields[i]);if(typeof s=="string"&&re.test(s)){return this.fields[i];}}if(this.withExtendedFields){return store.forEachField(_65,function(_69,_6a,_6b){return typeof _6b=="string"&&re.test(_6b)?_6a:null;},true);}return null;};abego.TiddlerQuery=function(_6c,_6d,_6e,_6f,_70){if(_6e){this.regExp=new RegExp(_6c,_6d?"mg":"img");this.tester=new abego.MultiFieldRegExpTester(this.regExp,_6f,_70);}else{this.expr=new abego.BoolExp(_6c,abego.parseTiddlerFilterTerm,{defaultFields:_6f,caseSensitive:_6d,withExtendedFields:_70});}this.getQueryText=function(){return _6c;};this.getUseRegExp=function(){return _6e;};this.getCaseSensitive=function(){return _6d;};this.getDefaultFields=function(){return _6f;};this.getWithExtendedFields=function(){return _70;};};abego.TiddlerQuery.prototype.test=function(_71){if(!_71){return false;}if(this.regExp){return this.tester.test(_71);}return this.expr.exec(_71);};abego.TiddlerQuery.prototype.filter=function(_72){return abego.select(_72,this.test,this);};abego.TiddlerQuery.prototype.getMarkRegExp=function(){if(this.regExp){return "".search(this.regExp)>=0?null:this.regExp;}return this.expr.getMarkRegExp();};abego.TiddlerQuery.prototype.toString=function(){return (this.regExp?this.regExp:this.expr).toString();};abego.PageWiseRenderer=function(){this.firstIndexOnPage=0;};merge(abego.PageWiseRenderer.prototype,{setItems:function(_73){this.items=_73;this.setFirstIndexOnPage(0);},getMaxPagesInNavigation:function(){return 10;},getItemsCount:function(_74){return this.items?this.items.length:0;},getCurrentPageIndex:function(){return Math.floor(this.firstIndexOnPage/this.getItemsPerPage());},getLastPageIndex:function(){return Math.floor((this.getItemsCount()-1)/this.getItemsPerPage());},setFirstIndexOnPage:function(_75){this.firstIndexOnPage=Math.min(Math.max(0,_75),this.getItemsCount()-1);},getFirstIndexOnPage:function(){this.firstIndexOnPage=Math.floor(this.firstIndexOnPage/this.getItemsPerPage())*this.getItemsPerPage();return this.firstIndexOnPage;},getLastIndexOnPage:function(){return Math.min(this.getFirstIndexOnPage()+this.getItemsPerPage()-1,this.getItemsCount()-1);},onPageChanged:function(_76,_77){},renderPage:function(_78){if(_78.beginRendering){_78.beginRendering(this);}try{if(this.getItemsCount()){var _79=this.getLastIndexOnPage();var _7a=-1;for(var i=this.getFirstIndexOnPage();i<=_79;i++){_7a++;_78.render(this,this.items[i],i,_7a);}}}finally{if(_78.endRendering){_78.endRendering(this);}}},addPageNavigation:function(_7c){if(!this.getItemsCount()){return;}var _7d=this;var _7e=function(e){if(!e){var e=window.event;}var _81=abego.toInt(this.getAttribute("page"),0);var _82=_7d.getCurrentPageIndex();if(_81==_82){return;}var _83=_81*_7d.getItemsPerPage();_7d.setFirstIndexOnPage(_83);_7d.onPageChanged(_81,_82);};var _84;var _85=this.getCurrentPageIndex();var _86=this.getLastPageIndex();if(_85>0){_84=createTiddlyButton(_7c,"Previous","Go to previous page (Shortcut: Alt-'<')",_7e,"prev");_84.setAttribute("page",(_85-1).toString());_84.setAttribute("accessKey","<");}for(var i=-this.getMaxPagesInNavigation();i<this.getMaxPagesInNavigation();i++){var _88=_85+i;if(_88<0){continue;}if(_88>_86){break;}var _89=(i+_85+1).toString();var _8a=_88==_85?"currentPage":"otherPage";_84=createTiddlyButton(_7c,_89,"Go to page %0".format([_89]),_7e,_8a);_84.setAttribute("page",(_88).toString());}if(_85<_86){_84=createTiddlyButton(_7c,"Next","Go to next page (Shortcut: Alt-'>')",_7e,"next");_84.setAttribute("page",(_85+1).toString());_84.setAttribute("accessKey",">");}}});abego.LimitedTextRenderer=function(){var _8b=40;var _8c=4;var _8d=function(_8e,_8f,_90){var n=_8e.length;if(n==0){_8e.push({start:_8f,end:_90});return;}var i=0;for(;i<n;i++){var _93=_8e[i];if(_93.start<=_90&&_8f<=_93.end){var r;var _95=i+1;for(;_95<n;_95++){r=_8e[_95];if(r.start>_90||_8f>_93.end){break;}}var _96=_8f;var _97=_90;for(var j=i;j<_95;j++){r=_8e[j];_96=Math.min(_96,r.start);_97=Math.max(_97,r.end);}_8e.splice(i,_95-i,{start:_96,end:_97});return;}if(_93.start>_90){break;}}_8e.splice(i,0,{start:_8f,end:_90});};var _99=function(_9a){var _9b=0;for(var i=0;i<_9a.length;i++){var _9d=_9a[i];_9b+=_9d.end-_9d.start;}return _9b;};var _9e=function(c){return (c>="a"&&c<="z")||(c>="A"&&c<="Z")||c=="_";};var _a0=function(s,_a2){if(!_9e(s[_a2])){return null;}for(var i=_a2-1;i>=0&&_9e(s[i]);i--){}var _a4=i+1;var n=s.length;for(i=_a2+1;i<n&&_9e(s[i]);i++){}return {start:_a4,end:i};};var _a6=function(s,_a8,_a9){var _aa;if(_a9){_aa=_a0(s,_a8);}else{if(_a8<=0){return _a8;}_aa=_a0(s,_a8-1);}if(!_aa){return _a8;}if(_a9){if(_aa.start>=_a8-_8c){return _aa.start;}if(_aa.end<=_a8+_8c){return _aa.end;}}else{if(_aa.end<=_a8+_8c){return _aa.end;}if(_aa.start>=_a8-_8c){return _aa.start;}}return _a8;};var _ab=function(s,_ad){var _ae=[];if(_ad){var _af=0;var n=s.length;var _b1=0;do{_ad.lastIndex=_af;var _b2=_ad.exec(s);if(_b2){if(_af<_b2.index){var t=s.substring(_af,_b2.index);_ae.push({text:t});}_ae.push({text:_b2[0],isMatch:true});_af=_b2.index+_b2[0].length;}else{_ae.push({text:s.substr(_af)});break;}}while(true);}else{_ae.push({text:s});}return _ae;};var _b4=function(_b5){var _b6=0;for(var i=0;i<_b5.length;i++){if(_b5[i].isMatch){_b6++;}}return _b6;};var _b8=function(s,_ba,_bb,_bc,_bd){var _be=Math.max(Math.floor(_bd/(_bc+1)),_8b);var _bf=Math.max(_be-(_bb-_ba),0);var _c0=Math.min(Math.floor(_bb+_bf/3),s.length);var _c1=Math.max(_c0-_be,0);_c1=_a6(s,_c1,true);_c0=_a6(s,_c0,false);return {start:_c1,end:_c0};};var _c2=function(_c3,s,_c5){var _c6=[];var _c7=_b4(_c3);var pos=0;for(var i=0;i<_c3.length;i++){var t=_c3[i];var _cb=t.text;if(t.isMatch){var _cc=_b8(s,pos,pos+_cb.length,_c7,_c5);_8d(_c6,_cc.start,_cc.end);}pos+=_cb.length;}return _c6;};var _cd=function(s,_cf,_d0){var _d1=_d0-_99(_cf);while(_d1>0){if(_cf.length==0){_8d(_cf,0,_a6(s,_d0,false));return;}else{var _d2=_cf[0];var _d3;var _d4;if(_d2.start==0){_d3=_d2.end;if(_cf.length>1){_d4=_cf[1].start;}else{_8d(_cf,_d3,_a6(s,_d3+_d1,false));return;}}else{_d3=0;_d4=_d2.start;}var _d5=Math.min(_d4,_d3+_d1);_8d(_cf,_d3,_d5);_d1-=(_d5-_d3);}}};var _d6=function(_d7,s,_d9,_da,_db){if(_da.length==0){return;}var _dc=function(_dd,s,_df,_e0,_e1){var t;var _e3;var pos=0;var i=0;var _e6=0;for(;i<_df.length;i++){t=_df[i];_e3=t.text;if(_e0<pos+_e3.length){_e6=_e0-pos;break;}pos+=_e3.length;}var _e7=_e1-_e0;for(;i<_df.length&&_e7>0;i++){t=_df[i];_e3=t.text.substr(_e6);_e6=0;if(_e3.length>_e7){_e3=_e3.substr(0,_e7);}if(t.isMatch){createTiddlyElement(_dd,"span",null,"marked",_e3);}else{createTiddlyText(_dd,_e3);}_e7-=_e3.length;}if(_e1<s.length){abego.createEllipsis(_dd);}};if(_da[0].start>0){abego.createEllipsis(_d7);}var _e8=_db;for(var i=0;i<_da.length&&_e8>0;i++){var _ea=_da[i];var len=Math.min(_ea.end-_ea.start,_e8);_dc(_d7,s,_d9,_ea.start,_ea.start+len);_e8-=len;}};this.render=function(_ec,s,_ee,_ef){if(s.length<_ee){_ee=s.length;}var _f0=_ab(s,_ef);var _f1=_c2(_f0,s,_ee);_cd(s,_f1,_ee);_d6(_ec,s,_f0,_f1,_ee);};};(function(){function alertAndThrow(msg){alert(msg);throw msg;}if(version.major<2||(version.major==2&&version.minor<1)){alertAndThrow("YourSearchPlugin requires TiddlyWiki 2.1 or newer.\n\nCheck the archive for YourSearch plugins\nsupporting older versions of TiddlyWiki.\n\nArchive: http://tiddlywiki.abego-software.de/archive");}abego.YourSearch={};var _f3;var _f4;var _f5=function(_f6){_f3=_f6;};var _f7=function(){return _f3?_f3:[];};var _f8=function(){return _f3?_f3.length:0;};var _f9=4;var _fa=10;var _fb=2;var _fc=function(s,re){var m=s.match(re);return m?m.length:0;};var _100=function(_101,_102){var _103=_102.getMarkRegExp();if(!_103){return 1;}var _104=_101.title.match(_103);var _105=_104?_104.length:0;var _106=_fc(_101.getTags(),_103);var _107=_104?_104.join("").length:0;var _108=_101.title.length>0?_107/_101.title.length:0;var rank=_105*_f9+_106*_fb+_108*_fa+1;return rank;};var _10a=function(_10b,_10c,_10d,_10e,_10f,_110){_f4=null;var _111=_10b.reverseLookup("tags",_110,false);try{var _112=[];if(config.options.chkSearchInTitle){_112.push("title");}if(config.options.chkSearchInText){_112.push("text");}if(config.options.chkSearchInTags){_112.push("tags");}_f4=new abego.TiddlerQuery(_10c,_10d,_10e,_112,config.options.chkSearchExtendedFields);}catch(e){return [];}var _113=_f4.filter(_111);var _114=abego.YourSearch.getRankFunction();for(var i=0;i<_113.length;i++){var _116=_113[i];var rank=_114(_116,_f4);_116.searchRank=rank;}if(!_10f){_10f="title";}var _118=function(a,b){var _11b=a.searchRank-b.searchRank;if(_11b==0){if(a[_10f]==b[_10f]){return (0);}else{return (a[_10f]<b[_10f])?-1:+1;}}else{return (_11b>0)?-1:+1;}};_113.sort(_118);return _113;};var _11c=80;var _11d=50;var _11e=250;var _11f=50;var _120=25;var _121=10;var _122="yourSearchResult";var _123="yourSearchResultItems";var _124;var _125;var _126;var _127;var _128;var _129=function(){if(version.extensions.YourSearchPlugin.styleSheetInited){return;}version.extensions.YourSearchPlugin.styleSheetInited=true;setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");};var _12a=function(){return _125!=null&&_125.parentNode==document.body;};var _12b=function(){if(_12a()){document.body.removeChild(_125);}};var _12c=function(e){_12b();var _12e=this.getAttribute("tiddlyLink");if(_12e){var _12f=this.getAttribute("withHilite");var _130=highlightHack;if(_12f&&_12f=="true"&&_f4){highlightHack=_f4.getMarkRegExp();}story.displayTiddler(this,_12e);highlightHack=_130;}return (false);};var _131=function(){if(!_126){return;}var root=_126;var _133=findPosX(root);var _134=findPosY(root);var _135=root.offsetHeight;var _136=_133;var _137=_134+_135;var _138=findWindowWidth();if(_138<_125.offsetWidth){_125.style.width=(_138-100)+"px";_138=findWindowWidth();}var _139=_125.offsetWidth;if(_136+_139>_138){_136=_138-_139-30;}if(_136<0){_136=0;}_125.style.left=_136+"px";_125.style.top=_137+"px";_125.style.display="block";};var _13a=function(){if(_125){window.scrollTo(0,ensureVisible(_125));}if(_126){window.scrollTo(0,ensureVisible(_126));}};var _13b=function(){_131();_13a();};var _13c;var _13d;var _13e=new abego.PageWiseRenderer();var _13f=function(_140){this.itemHtml=store.getTiddlerText("YourSearchItemTemplate");if(!this.itemHtml){alertAndThrow("YourSearchItemTemplate not found");}this.place=document.getElementById(_123);if(!this.place){this.place=createTiddlyElement(_140,"div",_123);}};merge(_13f.prototype,{render:function(_141,_142,_143,_144){_13c=_144;_13d=_142;var item=createTiddlyElement(this.place,"div",null,"yourSearchItem");item.innerHTML=this.itemHtml;applyHtmlMacros(item,null);refreshElements(item,null);},endRendering:function(_146){_13d=null;}});var _147=function(){if(!_125||!_126){return;}var html=store.getTiddlerText("YourSearchResultTemplate");if(!html){html="<b>Tiddler YourSearchResultTemplate not found</b>";}_125.innerHTML=html;applyHtmlMacros(_125,null);refreshElements(_125,null);var _149=new _13f(_125);_13e.renderPage(_149);_13b();};_13e.getItemsPerPage=function(){var n=(config.options.chkPreviewText)?abego.toInt(config.options.txtItemsPerPageWithPreview,_121):abego.toInt(config.options.txtItemsPerPage,_120);return (n>0)?n:1;};_13e.onPageChanged=function(){_147();};var _14b=function(){if(_126==null||!config.options.chkUseYourSearch){return;}if((_126.value==_124)&&_124&&!_12a()){if(_125&&(_125.parentNode!=document.body)){document.body.appendChild(_125);_13b();}else{abego.YourSearch.onShowResult(true);}}};var _14c=function(){_12b();_125=null;_124=null;};var _14d=function(self,e){while(e!=null){if(self==e){return true;}e=e.parentNode;}return false;};var _150=function(e){if(e.target==_126){return;}if(e.target==_127){return;}if(_125&&_14d(_125,e.target)){return;}_12b();};var _152=function(e){if(e.keyCode==27){_12b();}};addEvent(document,"click",_150);addEvent(document,"keyup",_152);var _154=function(text,_156,_157){_124=text;_f5(_10a(store,text,_156,_157,"title","excludeSearch"));abego.YourSearch.onShowResult();};var _158=function(_159,_15a,_15b,_15c,_15d,_15e){_129();_124="";var _15f=null;var _160=function(txt){if(config.options.chkUseYourSearch){_154(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}else{story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}_124=txt.value;};var _162=function(e){_160(_126);return false;};var _164=function(e){if(!e){var e=window.event;}_126=this;switch(e.keyCode){case 13:if(e.ctrlKey&&_128&&_12a()){_128.onclick.apply(_128,[e]);}else{_160(this);}break;case 27:if(_12a()){_12b();}else{this.value="";clearMessage();}break;}if(String.fromCharCode(e.keyCode)==this.accessKey||e.altKey){_14b();}if(this.value.length<3&&_15f){clearTimeout(_15f);}if(this.value.length>2){if(this.value!=_124){if(!config.options.chkUseYourSearch||config.options.chkSearchAsYouType){if(_15f){clearTimeout(_15f);}var txt=this;_15f=setTimeout(function(){_160(txt);},500);}}else{if(_15f){clearTimeout(_15f);}}}if(this.value.length==0){_12b();}};var _168=function(e){this.select();clearMessage();_14b();};var args=_15d.parseParams("list",null,true);var _16b=getFlag(args,"buttonAtRight");var _16c=getParam(args,"sizeTextbox",this.sizeTextbox);var btn;if(!_16b){btn=createTiddlyButton(_159,this.label,this.prompt,_162);}var txt=createTiddlyElement(_159,"input",null,null,null);if(_15b[0]){txt.value=_15b[0];}txt.onkeyup=_164;txt.onfocus=_168;txt.setAttribute("size",_16c);txt.setAttribute("accessKey",this.accessKey);txt.setAttribute("autocomplete","off");if(config.browser.isSafari){txt.setAttribute("type","search");txt.setAttribute("results","5");}else{txt.setAttribute("type","text");}if(_16b){btn=createTiddlyButton(_159,this.label,this.prompt,_162);}_126=txt;_127=btn;};var _16f=function(){_12b();var _170=_f7();var n=_170.length;if(n){var _172=[];for(var i=0;i<n;i++){_172.push(_170[i].title);}story.displayTiddlers(null,_172);}};var _174=function(_175,_176,_177,_178){invokeMacro(_175,"option",_176,_177,_178);var elem=_175.lastChild;var _17a=elem.onclick;elem.onclick=function(e){var _17c=_17a.apply(this,arguments);_147();return _17c;};return elem;};var _17d=function(s){var _17f=["''","{{{","}}}","//","<<<","/***","***/"];var _180="";for(var i=0;i<_17f.length;i++){if(i!=0){_180+="|";}_180+="("+_17f[i].escapeRegExp()+")";}return s.replace(new RegExp(_180,"mg"),"").trim();};var _182=function(){var i=_13c;return (i>=0&&i<=9)?(i<9?(i+1):0):-1;};var _184=new abego.LimitedTextRenderer();var _185=function(_186,s,_188){_184.render(_186,s,_188,_f4.getMarkRegExp());};var _189=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_18a,_18b,_18c,_18d,_18e,tags,_190){_189.apply(this,arguments);_14c();};var _191=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_192){_191.apply(this,arguments);_14c();};config.macros.yourSearch={label:"yourSearch",prompt:"Gives access to the current/last YourSearch result",handler:function(_193,_194,_195,_196,_197,_198){if(_195.length==0){return;}var name=_195[0];var func=config.macros.yourSearch.funcs[name];if(func){func(_193,_194,_195,_196,_197,_198);}},tests:{"true":function(){return true;},"false":function(){return false;},"found":function(){return _f8()>0;},"previewText":function(){return config.options.chkPreviewText;}},funcs:{itemRange:function(_19b){if(_f8()){var _19c=_13e.getLastIndexOnPage();var s="%0 - %1".format([_13e.getFirstIndexOnPage()+1,_19c+1]);createTiddlyText(_19b,s);}},count:function(_19e){createTiddlyText(_19e,_f8().toString());},query:function(_19f){if(_f4){createTiddlyText(_19f,_f4.toString());}},version:function(_1a0){var t="YourSearch %0.%1.%2".format([version.extensions.YourSearchPlugin.major,version.extensions.YourSearchPlugin.minor,version.extensions.YourSearchPlugin.revision]);var e=createTiddlyElement(_1a0,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#YourSearchPlugin");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">"+t+"<font>";},copyright:function(_1a3){var e=createTiddlyElement(_1a3,"a");e.setAttribute("href","http://www.abego-software.de");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">&copy; 2005-2006 <b><font color=\"red\">abego</font></b> Software<font>";},newTiddlerButton:function(_1a5){if(_f4){var r=abego.parseNewTiddlerCommandLine(_f4.getQueryText());var btn=config.macros.newTiddler.createNewTiddlerButton(_1a5,r.title,r.params,"new tiddler","Create a new tiddler based on search text. (Shortcut: Ctrl-Enter; Separators: '.', '#')",null,"text");var _1a8=btn.onclick;btn.onclick=function(){_12b();_1a8.apply(this,arguments);};_128=btn;}},linkButton:function(_1a9,_1aa,_1ab,_1ac,_1ad,_1ae){if(_1ab<2){return;}var _1af=_1ab[1];var text=_1ab<3?_1af:_1ab[2];var _1b1=_1ab<4?text:_1ab[3];var _1b2=_1ab<5?null:_1ab[4];var btn=createTiddlyButton(_1a9,text,_1b1,_12c,null,null,_1b2);btn.setAttribute("tiddlyLink",_1af);},closeButton:function(_1b4,_1b5,_1b6,_1b7,_1b8,_1b9){var _1ba=createTiddlyButton(_1b4,"close","Close the Search Results (Shortcut: ESC)",_12b);},openAllButton:function(_1bb,_1bc,_1bd,_1be,_1bf,_1c0){var n=_f8();if(n==0){return;}var _1c2=n==1?"open tiddler":"open all %0 tiddlers".format([n]);var _1c3=createTiddlyButton(_1bb,_1c2,"Open all found tiddlers (Shortcut: Alt-O)",_16f);_1c3.setAttribute("accessKey","O");},naviBar:function(_1c4,_1c5,_1c6,_1c7,_1c8,_1c9){_13e.addPageNavigation(_1c4);},"if":function(_1ca,_1cb,_1cc,_1cd,_1ce,_1cf){if(_1cc.length<2){return;}var _1d0=_1cc[1];var _1d1=(_1d0=="not");if(_1d1){if(_1cc.length<3){return;}_1d0=_1cc[2];}var test=config.macros.yourSearch.tests[_1d0];var _1d3=false;try{if(test){_1d3=test(_1ca,_1cb,_1cc,_1cd,_1ce,_1cf)!=_1d1;}else{_1d3=(!eval(_1d0))==_1d1;}}catch(ex){}if(!_1d3){_1ca.style.display="none";}},chkPreviewText:function(_1d4,_1d5,_1d6,_1d7,_1d8,_1d9){var _1da=_1d6.slice(1).join(" ");var elem=_174(_1d4,"chkPreviewText",_1d7,_1d9);elem.setAttribute("accessKey","P");elem.title="Show text preview of found tiddlers (Shortcut: Alt-P)";return elem;}}};config.macros.foundTiddler={label:"foundTiddler",prompt:"Provides information on the tiddler currently processed on the YourSearch result page",handler:function(_1dc,_1dd,_1de,_1df,_1e0,_1e1){var name=_1de[0];var func=config.macros.foundTiddler.funcs[name];if(func){func(_1dc,_1dd,_1de,_1df,_1e0,_1e1);}},funcs:{title:function(_1e4,_1e5,_1e6,_1e7,_1e8,_1e9){if(!_13d){return;}var _1ea=_182();var _1eb=_1ea>=0?"Open tiddler (Shortcut: Alt-%0)".format([_1ea.toString()]):"Open tiddler";var btn=createTiddlyButton(_1e4,null,_1eb,_12c,null);btn.setAttribute("tiddlyLink",_13d.title);btn.setAttribute("withHilite","true");_185(btn,_13d.title,_11c);if(_1ea>=0){btn.setAttribute("accessKey",_1ea.toString());}},tags:function(_1ed,_1ee,_1ef,_1f0,_1f1,_1f2){if(!_13d){return;}_185(_1ed,_13d.getTags(),_11d);},text:function(_1f3,_1f4,_1f5,_1f6,_1f7,_1f8){if(!_13d){return;}_185(_1f3,_17d(_13d.text),_11e);},field:function(_1f9,_1fa,_1fb,_1fc,_1fd,_1fe){if(!_13d){return;}var name=_1fb[1];var len=_1fb.length>2?abego.toInt(_1fb[2],_11f):_11f;var v=store.getValue(_13d,name);if(v){_185(_1f9,_17d(v),len);}},number:function(_202,_203,_204,_205,_206,_207){var _208=_182();if(_208>=0){var text="%0)".format([_208.toString()]);createTiddlyElement(_202,"span",null,"shortcutNumber",text);}}}};var opts={chkUseYourSearch:true,chkPreviewText:true,chkSearchAsYouType:true,chkSearchInTitle:true,chkSearchInText:true,chkSearchInTags:true,chkSearchExtendedFields:true,txtItemsPerPage:_120,txtItemsPerPageWithPreview:_121};for(var n in opts){if(config.options[n]==undefined){config.options[n]=opts[n];}}config.shadowTiddlers.AdvancedOptions+="\n<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]]) ([[help|YourSearch Help]])// ";config.shadowTiddlers["YourSearch Help"]="!Field Search\nWith the Field Search you can restrict your search to certain fields of a tiddler, e.g"+" only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e."+"g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard field"+"s {{{title}}}, {{{text}}} and {{{tags}}}:\n|!What you want|!What you type|!Example|\n|Search ''titles "+"only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|\n|Search ''contents/text "+"only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|\n|Search ''tags only"+"''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|\n\nUsing this feature you may"+" also search the extended fields (\"Metadata\") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1"+"}}} to find all tiddlers with the priority field set to \"1\".\n\nYou may search a word in more than one"+" field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the \"long form\") finds tiddlers containin"+"g \"Plugin\" either in the title or in the tags (but does not look for \"Plugin\" in the text). \n\n!Boole"+"an Search\nThe Boolean Search is useful when searching for multiple words.\n|!What you want|!What you "+"type|!Example|\n|''All words'' must exist|List of words|{{{jonny jeremy}}} (or {{{jonny and jeremy}}}"+")|\n|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\n|A word ''must "+"not exist''|Start word with ''-''|{{{-jonny}}} (or {{{not jonny}}})|\n\n''Note:'' When you specify two"+" words, separated with a space, YourSearch finds all tiddlers that contain both words, but not neces"+"sarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need"+" to put the words into quotes. I.e. you type: {{{\"john brown\"}}}.\n\nUsing parenthesis you may change "+"the default \"left to right\" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds"+" all tiddlers that contain neither \"jonny\" nor \"jeremy. In contrast to this {{{not jonny or jeremy}}"+"} (i.e. without parenthesis) finds all tiddlers that either don't contain \"jonny\" or that contain \"j"+"eremy\".\n\n!'Exact Word' Search\nBy default a search result all matches that 'contain' the searched tex"+"t. E.g. if you search for {{{Task}}} you will get all tiddlers containing 'Task', but also '~Complet"+"edTask', '~TaskForce' etc.\n\nIf you only want to get the tiddlers that contain 'exactly the word' you"+" need to prefix it with a '='. E.g. typing '=Task' will find the tiddlers that contain the word 'Tas"+"k', ignoring words that just contain 'Task' as a substring.\n\n!~CaseSensitiveSearch and ~RegExpSearch"+"\nThe standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearc"+"h. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\n\nIn addition you m"+"ay do a \"regular expression\" search even with the ''~RegExpSearch'' set to false by directly enterin"+"g the regular expression into the search field, framed with {{{/.../}}}. \n\nExample: {{{/m[ae][iy]er/"+"}}} will find all tiddlers that contain either \"maier\", \"mayer\", \"meier\" or \"meyer\".\n\n!~JavaScript E"+"xpression Filtering\nIf you are familiar with JavaScript programming and know some TiddlyWiki interna"+"ls you may also use JavaScript expression for the search. Just enter a JavaScript boolean expression"+" into the search field, framed with {{{ { ... } }}}. In the code refer to the variable tiddler and e"+"valuate to {{{true}}} when the given tiddler should be included in the result. \n\nExample: {{{ { tidd"+"ler.modified > new Date(\"Jul 4, 2005\")} }}} returns all tiddler modified after July 4th, 2005.\n\n!Com"+"bined Search\nYou are free to combine the various search options. \n\n''Examples''\n|!What you type|!Res"+"ult|\n|{{{!jonny !jeremy -%football}}}|all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its tit"+"les, but no {{{football}}} in content.|\n|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact wor"+"d). Tags named '~CompletedTask', '~TaskForce' etc. are not considered.|\n\n!Access Keys\nYou are encour"+"aged to use the access keys (also called \"shortcut\" keys) for the most frequently used operations. F"+"or quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\n\n|"+"!Key|!Operation|\n|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search in"+"put field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the pr"+"evious search result. This way you can quickly display multiple tiddlers using \"Press {{{Alt-F}}}. S"+"elect tiddler.\" sequences.|\n|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Resul"+"t]] is already closed and the cursor is in the search input field the field's content is cleared so "+"you start a new query.|\n|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second e"+"tc. tiddler from the result list.|\n|{{{Alt-O}}}|Opens all found tiddlers.|\n|{{{Alt-P}}}|Toggles the "+"'Preview Text' mode.|\n|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[Your"+"Search Result]].|\n|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the "+"{{{Return}}} key actually starts the search (as does pressing the 'search' button).|\n\n//If some of t"+"hese shortcuts don't work for you check your browser if you have other extensions installed that alr"+"eady \"use\" these shortcuts.//";config.shadowTiddlers["YourSearch Options"]="|>|!YourSearch Options|\n|>|<<option chkUseYourSearch>> Use 'Your Search'|\n|!|<<option chkPreviewText"+">> Show Text Preview|\n|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required"+" to start search)|\n|!|Default Search Filter:<<option chkSearchInTitle>>Title ('!')     <<option chk"+"SearchInText>>Text ('%')     <<option chkSearchInTags>>Tags ('#')    <<option chkSearchExtendedFiel"+"ds>>Extended Fields<html><br><font size=\"-2\">The fields of a tiddlers that are searched when you don"+"'t explicitly specify a filter in the search text <br>(Explictly specify fields using one or more '!"+"', '%', '#' or 'fieldname:' prefix before the word/text to find).</font></html>|\n|!|Number of items "+"on search result page: <<option txtItemsPerPage>>|\n|!|Number of items on search result page with pre"+"view text: <<option txtItemsPerPageWithPreview>>|\n";config.shadowTiddlers["YourSearchStyleSheet"]="/***\n!~YourSearchResult Stylesheet\n***/\n/*{{{*/\n.yourSearchResult {\n\tposition: absolute;\n\twidth: 800"+"px;\n\n\tpadding: 0.2em;\n\tlist-style: none;\n\tmargin: 0;\n\n\tbackground: #ffd;\n\tborder: 1px solid DarkGra"+"y;\n}\n\n/*}}}*/\n/***\n!!Summary Section\n***/\n/*{{{*/\n.yourSearchResult .summary {\n\tborder-bottom-width:"+" thin;\n\tborder-bottom-style: solid;\n\tborder-bottom-color: #999999;\n\tpadding-bottom: 4px;\n}\n\n.yourSea"+"rchRange, .yourSearchCount, .yourSearchQuery   {\n\tfont-weight: bold;\n}\n\n.yourSearchResult .summary ."+"button {\n\tfont-size: 10px;\n\n\tpadding-left: 0.3em;\n\tpadding-right: 0.3em;\n}\n\n.yourSearchResult .summa"+"ry .chkBoxLabel {\n\tfont-size: 10px;\n\n\tpadding-right: 0.3em;\n}\n\n/*}}}*/\n/***\n!!Items Area\n***/\n/*{{{*"+"/\n.yourSearchResult .marked {\n\tbackground: none;\n\tfont-weight: bold;\n}\n\n.yourSearchItem {\n\tmargin-to"+"p: 2px;\n}\n\n.yourSearchNumber {\n\tcolor: #808080;\n}\n\n\n.yourSearchTags {\n\tcolor: #008000;\n}\n\n.yourSearc"+"hText {\n\tcolor: #808080;\n\tmargin-bottom: 6px;\n}\n\n/*}}}*/\n/***\n!!Footer\n***/\n/*{{{*/\n.yourSearchFoote"+"r {\n\tmargin-top: 8px;\n\tborder-top-width: thin;\n\tborder-top-style: solid;\n\tborder-top-color: #999999;"+"\n}\n\n.yourSearchFooter a:hover{\n\tbackground: none;\n\tcolor: none;\n}\n/*}}}*/\n/***\n!!Navigation Bar\n***/"+"\n/*{{{*/\n.yourSearchNaviBar a {\n\tfont-size: 16px;\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n\tcolor: bla"+"ck;\n\ttext-decoration: underline;\n}\n\n.yourSearchNaviBar a:hover {\n\tbackground-color: none;\n}\n\n.yourSe"+"archNaviBar .prev {\n\tfont-weight: bold;\n\tcolor: blue;\n}\n\n.yourSearchNaviBar .currentPage {\n\tcolor: #"+"FF0000;\n\tfont-weight: bold;\n\ttext-decoration: none;\n}\n\n.yourSearchNaviBar .next {\n\tfont-weight: bold"+";\n\tcolor: blue;\n}\n/*}}}*/\n";config.shadowTiddlers["YourSearchResultTemplate"]="<!--\n{{{\n-->\n<span macro=\"yourSearch if found\">\n<!-- The Summary Header ============================"+"================ -->\n<table class=\"summary\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">"+"<tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Result <span class=\"yourSearchRange\" macro=\"yourSearc"+"h itemRange\"></span>\n\t\t&nbsp;of&nbsp;<span class=\"yourSearchCount\" macro=\"yourSearch count\"></span>\n"+"\t\tfor&nbsp;<span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>\n\t</td>\n\t<td class=\"yourSea"+"rchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch chkPreviewText\"></span><span class=\"chkBoxLabel"+"\">preview text</span>\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch openAllButton\"></span>\n\t\t<span macro=\"yourSearch lin"+"kButton 'YourSearch Options' options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkB"+"utton 'YourSearch Help' help 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch clo"+"seButton\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n\n<!-- The List of Found Tiddlers ================="+"=========================== -->\n<div id=\"yourSearchResultItems\" itemsPerPage=\"25\" itemsPerPageWithPr"+"eview=\"10\"></div>\n\n<!-- The Footer (with the Navigation) ==========================================="+"= -->\n<table class=\"yourSearchFooter\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody"+">\n  <tr>\n\t<td align=\"left\">\n\t\tResult page: <span class=\"yourSearchNaviBar\" macro=\"yourSearch naviBar"+"\"></span>\n\t</td>\n\t<td align=\"right\"><span macro=\"yourSearch version\"></span>, <span macro=\"yourSearc"+"h copyright\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n<!-- end of the 'tiddlers found' case ========="+"================================== -->\n</span>\n\n\n<!-- The \"No tiddlers found\" case ================="+"========================== -->\n<span macro=\"yourSearch if not found\">\n<table class=\"summary\" border="+"\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Resu"+"lt: No tiddlers found for <span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>.\n\t</td>\n\t<t"+"d class=\"yourSearchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Options'"+" options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Help' help"+" 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch closeButton\"></span>\n\t</td>\n  <"+"/tr>\n</tbody></table>\n</span>\n\n\n<!--\n}}}\n-->\n";config.shadowTiddlers["YourSearchItemTemplate"]="<!--\n{{{\n-->\n<span class='yourSearchNumber' macro='foundTiddler number'></span>\n<span class='yourSea"+"rchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;\n<span class='yourSearchTags' macro='found"+"Tiddler field tags 50'/></span>\n<span macro=\"yourSearch if previewText\"><div class='yourSearchText' macro='fo"+"undTiddler field text 250'/></div></span>\n<!--\n}}}\n-->";config.shadowTiddlers["YourSearch"]="<<tiddler [[YourSearch Help]]>>";config.shadowTiddlers["YourSearch Result"]="The popup-like window displaying the result of a YourSearch query.";config.macros.search.handler=_158;var _20c=function(){if(config.macros.search.handler!=_158){alert("Message from YourSearchPlugin:\n\n\nAnother plugin has disabled the 'Your Search' features.\n\n\nYou may "+"disable the other plugin or change the load order of \nthe plugins (by changing the names of the tidd"+"lers)\nto enable the 'Your Search' features.");}};setTimeout(_20c,5000);abego.YourSearch.getStandardRankFunction=function(){return _100;};abego.YourSearch.getRankFunction=function(){return abego.YourSearch.getStandardRankFunction();};abego.YourSearch.getCurrentTiddler=function(){return _13d;};abego.YourSearch.closeResult=function(){_12b();};abego.YourSearch.getFoundTiddlers=function(){return _f3;};abego.YourSearch.getQuery=function(){return _f4;};abego.YourSearch.onShowResult=function(_20d){highlightHack=_f4?_f4.getMarkRegExp():null;if(!_20d){_13e.setItems(_f7());}if(!_125){_125=createTiddlyElement(document.body,"div",_122,"yourSearchResult");}else{if(_125.parentNode!=document.body){document.body.appendChild(_125);}}_147();highlightHack=null;};})();}
//%/
YourSearchPlugin は拡張した検索が提供される。

インストールすることで default の search を拡張する。

[[YourSearch Options]] にて詳細な設定をする。
tiddler が多くなってくると、'Search As You Type' Mode が重宝する。リターンを押すまで検索しないモード。
これのお陰で検索を頻繁に使うようになった。

タグ(#)の検索、タイトル(!)の検索、内容(%)の検索をすることが可能。

検索時点で内容を表示することもできる。「preview text」のチェック。
www.tiddlywiki.com
www.osmosoft.com
www.google.fr
tiddlyspot.com
www.tiddlytools.com
news.com.com
www.lemonde.fr
www.lesechos.fr
www.liberation.fr
www.nytimes.com
rss.news.yahoo.com
del.icio.us
www.tiddlyforge.net
yann.perrin.googlepages.com
mptw-beta.tiddlyspot.com
www.haloscan.com
tiddlywiki.abego-software.de

!Useful links
* [[4096 Color Wheel|http://ficml.awardspace.com/jemimap/style/color/wheel.html]] - hover over a wheel to view colors and click to choose a web-smart color
* [[Color Names|http://coloria.net/bonus/colornames.htm]] - c o l o r a t u r e
!RGB hexadecimal 216-color "Web safe" palette
Source: Paul Petterson, revised by Eric Shulman
|bgcolor(#FFF):FFF |bgcolor(#CCC):CCC |bgcolor(#999):999 |bgcolor(#666):@@color(white):666@@ |bgcolor(#333):@@color(white):333@@ |bgcolor(#000):@@color(white):000@@ |bgcolor(#FC0):~FC0 |bgcolor(#F90):F90 |bgcolor(#F60):@@color(white):F60@@ |bgcolor(#F30):@@color(white):F30@@ |>|>|>|>|>| |
|bgcolor(#9C0):9C0 |>|>|>| |bgcolor(#C90):C90 |bgcolor(#FC3):~FC3 |bgcolor(#FC6):~FC6 |bgcolor(#F96):F96 |bgcolor(#F63):@@color(white):F63@@ |bgcolor(#C30):@@color(white):C30@@ |>|>|>| |bgcolor(#C03):@@color(white):C03@@ |
|bgcolor(#CF0):~CF0 |bgcolor(#CF3):~CF3 |bgcolor(#330):@@color(white):330@@ |bgcolor(#660):@@color(white):660@@ |bgcolor(#990):990 |bgcolor(#CC0):~CC0 |bgcolor(#FF0):~FF0 |bgcolor(#C93):C93 |bgcolor(#C63):@@color(white):C63@@ |bgcolor(#300):@@color(white):300@@ |bgcolor(#600):@@color(white):600@@ |bgcolor(#900):@@color(white):900@@ |bgcolor(#C00):@@color(white):C00@@ |bgcolor(#F00):@@color(white):F00@@ |bgcolor(#F36):@@color(white):F36@@ |bgcolor(#F03):@@color(white):F03@@ |
|bgcolor(#9F0):9F0 |bgcolor(#CF6):~CF6 |bgcolor(#9C3):9C3 |bgcolor(#663):@@color(white):663@@ |bgcolor(#993):993 |bgcolor(#CC3):~CC3 |bgcolor(#FF3):~FF3 |bgcolor(#960):@@color(white):960@@ |bgcolor(#930):@@color(white):930@@ |bgcolor(#633):@@color(white):633@@ |bgcolor(#933):@@color(white):933@@ |bgcolor(#C33):@@color(white):C33@@ |bgcolor(#F33):@@color(white):F33@@ |bgcolor(#C36):@@color(white):C36@@ |bgcolor(#F69):@@color(white):F69@@ |bgcolor(#F06):@@color(white):F06@@ |
|bgcolor(#6F0):6F0 |bgcolor(#9F6):9F6 |bgcolor(#6C3):6C3 |bgcolor(#690):690 |bgcolor(#996):996 |bgcolor(#CC6):~CC6 |bgcolor(#FF6):~FF6 |bgcolor(#963):@@color(white):963@@ |bgcolor(#630):@@color(white):630@@ |bgcolor(#966):@@color(white):966@@ |bgcolor(#C66):@@color(white):C66@@ |bgcolor(#F66):@@color(white):F66@@ |bgcolor(#903):@@color(white):903@@ |bgcolor(#C39):@@color(white):C39@@ |bgcolor(#F6C):@@color(white):~F6C@@ |bgcolor(#F09):@@color(white):F09@@ |
|bgcolor(#3F0):3F0 |bgcolor(#6F3):6F3 |bgcolor(#390):390 |bgcolor(#6C0):6C0 |bgcolor(#9F3):9F3 |bgcolor(#CC9):~CC9 |bgcolor(#FF9):~FF9 |bgcolor(#C96):C96 |bgcolor(#C60):@@color(white):C60@@ |bgcolor(#C99):C99 |bgcolor(#F99):F99 |bgcolor(#F39):@@color(white):F39@@ |bgcolor(#C06):@@color(white):C06@@ |bgcolor(#906):@@color(white):906@@ |bgcolor(#F3C):@@color(white):~F3C@@ |bgcolor(#F0C):@@color(white):~F0C@@ |
|bgcolor(#0C0):0C0 |bgcolor(#3C0):3C0 |bgcolor(#360):@@color(white):360@@ |bgcolor(#693):693 |bgcolor(#9C6):9C6 |bgcolor(#CF9):~CF9 |bgcolor(#FFC):FFC |bgcolor(#FC9):~FC9 |bgcolor(#F93):F93 |bgcolor(#FCC):FCC |bgcolor(#F9C):~F9C |bgcolor(#C69):@@color(white):C69@@ |bgcolor(#936):@@color(white):936@@ |bgcolor(#603):@@color(white):603@@ |bgcolor(#C09):@@color(white):C09@@ |bgcolor(#303):@@color(white):303@@ |
|bgcolor(#3C3):3C3 |bgcolor(#6C6):6C6 |bgcolor(#0F0):0F0 |bgcolor(#3F3):3F3 |bgcolor(#6F6):6F6 |bgcolor(#9F9):9F9 |bgcolor(#CFC):CFC |>|>| |bgcolor(#C9C):~C9C |bgcolor(#969):@@color(white):969@@ |bgcolor(#939):@@color(white):939@@ |bgcolor(#909):@@color(white):909@@ |bgcolor(#636):@@color(white):636@@ |bgcolor(#606):@@color(white):606@@ |
|bgcolor(#060):@@color(white):060@@ |bgcolor(#363):@@color(white):363@@ |bgcolor(#090):090 |bgcolor(#393):393 |bgcolor(#696):696 |bgcolor(#9C9):9C9 |>|>| |bgcolor(#FCF):FCF |bgcolor(#F9F):~F9F |bgcolor(#F6F):@@color(white):~F6F@@ |bgcolor(#F3F):@@color(white):~F3F@@ |bgcolor(#F0F):@@color(white):~F0F@@ |bgcolor(#C6C):@@color(white):~C6C@@ |bgcolor(#C3C):@@color(white):~C3C@@ |
|bgcolor(#030):@@color(white):030@@ |bgcolor(#0C3):0C3 |bgcolor(#063):@@color(white):063@@ |bgcolor(#396):396 |bgcolor(#6C9):6C9 |bgcolor(#9FC):9FC |bgcolor(#CFF):CFF |bgcolor(#39F):39F |bgcolor(#9CF):9CF |bgcolor(#CCF):CCF |bgcolor(#C9F):~C9F |bgcolor(#96C):@@color(white):96C@@ |bgcolor(#639):@@color(white):639@@ |bgcolor(#306):@@color(white):306@@ |bgcolor(#90C):@@color(white):90C@@ |bgcolor(#C0C):@@color(white):~C0C@@ |
|bgcolor(#0F3):0F3 |bgcolor(#3F6):3F6 |bgcolor(#093):093 |bgcolor(#0C6):0C6 |bgcolor(#3F9):3F9 |bgcolor(#9FF):9FF |bgcolor(#9CC):9CC |bgcolor(#06C):@@color(white):06C@@ |bgcolor(#69C):69C |bgcolor(#99F):99F |bgcolor(#99C):99C |bgcolor(#93F):@@color(white):93F@@ |bgcolor(#60C):@@color(white):60C@@ |bgcolor(#609):@@color(white):609@@ |bgcolor(#C3F):@@color(white):~C3F@@ |bgcolor(#C0F):@@color(white):~C0F@@ |
|bgcolor(#0F6):0F6 |bgcolor(#6F9):6F9 |bgcolor(#3C6):3C6 |bgcolor(#096):096 |bgcolor(#6FF):6FF |bgcolor(#6CC):6CC |bgcolor(#699):699 |bgcolor(#036):@@color(white):036@@ |bgcolor(#369):@@color(white):369@@ |bgcolor(#66F):@@color(white):66F@@ |bgcolor(#66C):@@color(white):66C@@ |bgcolor(#669):@@color(white):669@@ |bgcolor(#309):@@color(white):309@@ |bgcolor(#93C):@@color(white):93C@@ |bgcolor(#C6F):@@color(white):~C6F@@ |bgcolor(#90F):@@color(white):90F@@ |
|bgcolor(#0F9):0F9 |bgcolor(#6FC):6FC |bgcolor(#3C9):3C9 |bgcolor(#3FF):3FF |bgcolor(#3CC):3CC |bgcolor(#399):399 |bgcolor(#366):@@color(white):366@@ |bgcolor(#069):@@color(white):069@@ |bgcolor(#039):@@color(white):039@@ |bgcolor(#33F):@@color(white):33F@@ |bgcolor(#33C):@@color(white):33C@@ |bgcolor(#339):@@color(white):339@@ |bgcolor(#336):@@color(white):336@@ |bgcolor(#63C):@@color(white):63C@@ |bgcolor(#96F):@@color(white):96F@@ |bgcolor(#60F):@@color(white):60F@@ |
|bgcolor(#0FC):0FC |bgcolor(#3FC):3FC |bgcolor(#0FF):0FF |bgcolor(#0CC):0CC |bgcolor(#099):099 |bgcolor(#066):@@color(white):066@@ |bgcolor(#033):@@color(white):033@@ |bgcolor(#39C):39C |bgcolor(#36C):@@color(white):36C@@ |bgcolor(#00F):@@color(white):00F@@ |bgcolor(#00C):@@color(white):00C@@ |bgcolor(#009):@@color(white):009@@ |bgcolor(#006):@@color(white):006@@ |bgcolor(#003):@@color(white):003@@ |bgcolor(#63F):@@color(white):63F@@ |bgcolor(#30F):@@color(white):30F@@ |
|bgcolor(#0C9):0C9 |>|>|>| |bgcolor(#09C):09C |bgcolor(#3CF):3CF |bgcolor(#6CF):6CF |bgcolor(#69F):69F |bgcolor(#36F):@@color(white):36F@@ |bgcolor(#03C):@@color(white):03C@@ |>|>|>| |bgcolor(#30C):@@color(white):30C@@ |
|>|>|>|>|>| |bgcolor(#0CF):0CF |bgcolor(#09F):09F |bgcolor(#06F):@@color(white):06F@@ |bgcolor(#03F):@@color(white):03F@@ |>|>|>|>|>| |
Type the text for 'macro'
[[SaveMyEmptyMacro]] を使用して、個人用の empty TW を作成するためのコントロール。
チェックすることで、myEmpty タグが付く。
参考:[[SaveMyEmptyMacro Document]]

<<saveMyEmpty>>
<<forEachTiddler 
 where 'tiddler.title!="UploadLog" && tiddler.title!="toRSS"'
 sortBy 'tiddler.title'
 write '(index==0?"| ! | !sys | !title | !modified date |\n":"")
 +(index>0?"|[ ("+tiddler.title+"|myEmpty)]|"
 +(tiddler.tags.contains("systemConfig")?" @@color(red):S@@ |":"|")
 +"[["+tiddler.title+"]]|"
 +tiddler.modified.formatString("YY.0MM.0DD-0hh:0mm")
 +"|\n":"")'
>>
<<saveMyEmpty>>
<html>ちょいと、ろしゅつオーバーギミだねぃ。<div align="right"><a href="http://www.flickr.com/photos/kuraku/379253743/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/174/379253743_68e3528de9_m.jpg" width="161" height="240" alt="FH000030" align=top/></a></div></html>
Type the text for 'plugin'
<<saveMyEmpty>>
* @@{{{leadtime:NUMBER}}}@@ or @@{{{leadtime:NUMBER...NUMBER}}}@@ - Use this to specify a lower and upper bound for reminders that will be shown.  If only one number is specified, then it is treated as the upper bound, and zero is assumed for the lower bound.  These bounds can be negative, in order to show past due reminders.  For example, {{{leadtime:-5...-1}}} will show all reminders that matched in the last five days.  If reminders specify a leadtime, then they may show up, even when they don't fit into showReminder's leadtime bounds.  Use the limit argument to showReminders to override this behavior.  If the leadtime parameter is missing, then {{{leadtime:0...14}}} will be assumed.

* @@{{{nolinks}}}@@ - Deprecated.  Override the format argument to control what the output looks like.

* @@{{{limit}}}@@ - By default, individual reminders can override the leadtime specified by showReminders.  Use this argument to override that behavior.

* @@{{{tag:"STRING"}}}@@ - This filters out tiddlers based on the tag applied to them.  Supply a space-separated list of tags.  If a tag name begins with an {{{!}}}, then only tiddlers which do not have that tag will be considered.  For example {{{tag:"examples holidays"}}} will search for reminders in any tiddlers that are tagged with examples or holidays and {{{tag:"!examples !holidays"}}} will search for reminders in any tiddlers that are not tagged with examples or holidays.

* @@{{{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.
** 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.  
** TITLE will be replaced with the title of the reminder
** DATE will be replaced with the matched date of the reminder.
** ANNIVERSARY will be replaced with the number of years since between the matched date and firstyear
** TIDDLER will be replaced with a link to the tiddler that contains the reminder. For example: [[Hello there]]
** TIDDLERNAME will be replaced with the text of the tiddler title contains the reminder.  For example: Hello there
The default string is "DIFF: TITLE on DATE ANNIVERSARY -- TIDDLER"
Type the text for 'New Tiddler'
@@bgcolor:#0ff;toRSS@@ をタグに付けると、RSS へ書き出す tiddler となる。
GenerateRssHijack を使用。

!!!toRSS tag check
さいきんの 30 tiddlers。チェックを外せば toRSS の tag が取れる (RSS へ書かなくなる)。
<<tiddlerList tiddlerList top:"30" format:"table" header:"| !toRSS | !Title | !modified |" itemTemplate:"| [ (%title:toRSS)] |%link |%modified |\n" dateFormat: "YY.0MM.0DD-0hh:0mm" order:"-created">>
/% <<forEachTiddler 
 where 'tiddler.title!="UploadLog" && tiddler.title!="toRSS"'
 sortBy 'tiddler.modified' descending 
 write '(index==0?"| !toRSS | !title | !modified date |\n":"")+(index<20?"|[ ("+tiddler.title+"|toRSS)]|[["+tiddler.title+"]]|"+tiddler.modified.formatString("YY.0MM.0DD-0hh:0mm")+"|\n":"")'
>>%/
*[[ペースター|http://homepage2.nifty.com/autumn-soft/paster.htm]] (via http://homepage2.nifty.com/autumn-soft/paster.htm)
Windows のツール。拡張クリップボードと云うのかな?
定型文の入力ツール。shift shift (2回押す) するとメニューが出るのが思ったより良い。

TW と組み合わせて使うと良さそう。まずは TiddlySnip のタイトルに [[2007.02.08]] を簡単に入れられるようにした。
どうよ。

!!設定を追加
{{{
+TiddlyWiki(&W)
	日付 2007.02.08(&W)    | [Y1].[T2].[D2]
	日付 [[2007.02.08]](&D)    | [&1][&1][Y1].[T2].[D2][&2][&2]
	-
	*リスト記号*(&C)        | [E *xxxn]
	#ナンバー記号*(&N)        | [E #xxxn]
	*リスト記号* 削除   | [E- *xxxn]
	#ナンバー記号* 削除   | [E- #xxxn]
	リマインダ(&R) | <<reminder year:2007 month: day: title:" ">>
	リマインダ入力...|
[#|タイトルを入力して下さい。|年を入力して下さい。|月を入力して下さい。|日を入力して下さい。]
<<reminder year:[#2] month:[#3] day:[#4] title:"[#1]">>
/E
	-
	+文字修飾(&T)
		[[かっこ]]*(&T) | [E [[xxx]]]
		太字*(&B) | [E ''xxx'']
		下線*(&U) | [E __xxx__]
		取消*(&E) | [E --xxx--]
		斜体*(&I) | [E //xxx//]
		強調*(&S) | [E @@xxx@@]
		{{{かっこ}}}*(&M) | [E {{{xxx}}}]
		赤*(&R) | [E @@color(red):xxx@@]
		緑*(&G) | [E @@color(green):xxx@@]
		青*(&O) | [E @@color(blue):xxx@@]
		^^上つき* | [E ^^xxx^^]
		~~下つき* | [E ~~xxx~~]
	..
	-
	TWリンク*(&L) | [!X1][$[[][C1][$|]]][!K2 "LEFT"]
	Anchor | <html><a name="akr00"/></html>
	anchor jump | <html><a href="javascript:;" onclick="scrollAnchorVisible('akr00',null, event)"> </a></html>[!K12 "LEFT"]
	引用(複数行)*(&A) | [!X1][$<<<][&R][C1][&R][$<<<]
	ソース(複数行)*(&K) | [!X1][${{{][&R][C1][&R][$}}}]
	スライダ(Open)* | [!X1]++++[&R][C1][&R]===
	スライダ* | [!X1]+++[&R][C1][&R]===
	+クリップボード(&P)
		引用(複数行)*(&A) | [$<<<][&R][C1][&R][$<<<]
		固定幅(複数行)*(&K) | [${{{][&R][C1][&R][$}}}]
		スライダ(Open)* | ++++[&R][C1][&R]===
		スライダ* | +++[&R][C1][&R]===
	..
	-
	引用(複数行)の定義 |
[$<<<]

[$<<<]
[!K2 "UP"]
/E
	固定幅(複数行)の定義 |
[${{{]

[$}}}]
[!K2 "UP"]
/E
	スライダ定義(open) |
[$++++]

[$===]
[!K2 "UP"]
/E
	スライダ定義(close) |
[$+++]

[$===]
[!K2 "UP"]
/E
	チェックボックス[_](&O) | [&1]_[&2]
	チェックボックス[X](&X) | [&1]X[&2]
	矢印⇒(&Y) | @@color(#ff6633):'' ⇒ ''@@
	水平線(&-) | ----
..
}}}
(2007.02.23 修正)
[[kuraku@kuraku.net|mailto:kuraku@kuraku.net]]