/***\n|''Name:''|ApplyStylesMacro|\n|''Version:''|1.0.5 (5-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#ApplyStylesMacro)|\n|''Author:''|[[Simon Baird]]|\n|''Type:''|Macro|\n|''Requires:''|TiddlyWiki 1.2.33 or higher|\n!Description\nA macro that creates a button which you can click to apply a stylesheet. Also a macro that creates a list of buttons for all (tagged) stylesheets. You can use it as a style chooser.\n\n!Syntax/Examples\nApply the named tiddler as a stylesheet. Use quotes for tiddlers with spaces in their name.\n>{{{<<applystyle "Blue Mist">>}}} <<applystyle "Blue Mist">>\nApply the named tiddler with a different title on the button.\n>{{{<<applystyle "my favourite|Zeldman Orange">>}}} <<applystyle "my favourite|Zeldman Orange">>\nApply the current tiddler as a stylesheet. (Won't work here of course)\n>{{{<<applystyle>>}}} <<applystyle>>\nList applystyle buttons for all tiddlers tagged as [[stylesheets]]\n>{{{<<stylechooser>>}}}\n><<stylechooser>>\n\n!Known issues/Todos\n* Most of the stylesheets need a little TLC\n* Maybe ChooseTheme should be a shadowTiddler and also maybe add link in SideBarOptions shadowtiddler.\n\n!Instructions\nI recommend putting {{{[[stylesheet|ChooseTheme]]}}} in your SideBarOptions and making a ChooseTheme tiddler like mine. You will need extra styles though to make it match the buttons, eg:\n{{{#sidebarOptions .tiddlyLink { color:#eef; padding: 0.3em 0.2em 0.3em 1em; display:block;} }}}\n{{{#sidebarOptions .tiddlyLink:hover { color:#fff; background:#252;} }}}\n{{{#sidebarOptions .sliderPanel .tiddlyLink {color:#242;display:inline;padding:0;} }}}\n{{{#sidebarOptions .sliderPanel .tiddlyLink:hover {color:#242; background:#dfd;} }}}\nThe second pair are to override the first pair in the options slider.\n\n!Notes\n* [[Eric Shulman]] has a very good style chooser with a lot more features than this one. I wrote this because I wanted something simpler to hack on and because I like my plugins to be as short (and sweet?) as possible. :)\n* There is a neat little bit of integration with this in [[Auto Pre Formatting]]. Take a look at the button near the top of a stylesheet, eg [[Blue Mist]].\n\n!Revision history\n* v0.9, 28 Sep 2005\n** Started out with an "Apply This" button in toolbar. Decided to make it a macro instead.\n* v1.0, 29 Sep 2005\n** I like it! Even the cookies and the notify stuff seems to be working. \n* v1.0.1, 29 Sep 2005\n** Styled the buttons based on stylesheet name\n** Added bullets to stylechooser output\n* v1.0.2, 29 Sep 2005\n** Pushed stuff like formats into config. format is cool\n* v1.0.5, 5 Oct 2005\n** Forked experimental stuff into ApplyStylesMacro2\n** Added {{{<<applystyles none>>}}}\n\n!Code\n***/\n//{{{\n\nconfig.macros.applystyle = {\n label: "Apply %0",\n prompt: "Apply the stylesheet contained in the tiddler called %0",\n classFormat: "Apply%0Button"\n};\n\nif (config.options.txtStyleSheet == undefined)\n config.options.txtStyleSheet="StyleSheet";\n\nfunction updateAndRememberStyleSheet(tiddlerName,force) {\n if (tiddlerName != config.options.txtStyleSheet || force) {\n store.namedNotifications[config.options.txtStyleSheet] = null; // remove notification on old stylesheet\n store.addNotification(tiddlerName,refreshStyles);\n config.options["txtStyleSheet"] = tiddlerName;\n saveOptionCookie("txtStyleSheet");\n if (tiddlerName != "")\n store.notify(tiddlerName);\n else\n refreshStyles(null);\n }\n}\n\nupdateAndRememberStyleSheet(config.options.txtStyleSheet,true);\n\nconfig.macros.applystyle.handler = function(place,macroName,params) {\n var theTiddler = "";\n var theTitle = "";\n if (params.length == 0) {\n theTiddler = findContainingTiddler(place).id.substr(7);\n theTitle = theTiddler + " (this tiddler)";\n }\n else if (params[0].indexOf("|") != -1) {\n // presume no tiddlers have a | in their actual title\n var sp = params[0].split("|");\n theTiddler = sp[1];\n theTitle = sp[0];\n }\n else {\n theTiddler = params[0];\n theTitle = theTiddler ;\n }\n\n if (theTitle == "StyleSheet")\n theTitle = theTitle + " (default custom stylesheet)";\n\n if (theTitle == "none") {\n theTitle = "TiddlyWiki Standard (no custom stylesheet)";\n theTiddler = "";\n }\n\n var applyIt = function() {\n updateAndRememberStyleSheet(theTiddler);\n return false;\n };\n\n // special request for Clint :)\n var className = this.classFormat.format([theTiddler.replace(/\ss/g,"")]);\n\n createTiddlyButton(place,this.label.format([theTitle]), this.prompt.format([theTitle]), applyIt,className,null,null);\n\n};\n\nconfig.macros.stylechooser = {\n singleItemFormat: "* %0\sn",\n //wholeListFormat: "Choose stylesheet:\sn%0", \n wholeListFormat: "%0", // had an extra \sn here but I don't think it's needed.\n tag: "stylesheets"\n};\n\nconfig.macros.stylechooser.handler = function(place,macroName,params) {\n var tagged = store.getTaggedTiddlers(this.tag);\n var string = "";\n string += this.singleItemFormat.format(["<<applystyle none>>"]);\n if (store.tiddlerExists("StyleSheet"))\n string += this.singleItemFormat.format(["<<applystyle StyleSheet>>"]);\n for(var i=0;i<tagged.length;i++)\n if (tagged[i].title != "StyleSheet")\n string += this.singleItemFormat.format(["<<applystyle \s"" + tagged[i].title +"\s">>"]);\n wikify(this.wholeListFormat.format([string]), place, null, null);\n};\n\n\n\n\n//}}}\n
/***\n|''Name:''|AutoPreFormatting|\n|''Version:''|1.0.3 (11-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#AutoPreFormatting)|\n|''Author:''|SimonBaird|\n|''Type:''|Plugin|\n!Description\n"Automatically" surrounds stylesheet tiddlers (or any other tiddler based on tag or name) with triple curly brackets before wikifying so they are formatted as code using a technique originally suggested by [[Josh]]. \n\n!Directions\nYou might want to adjust the list of tidders and tags that the formatting is applied to.\n\n!Revision History\n*v1.0.1 (01-Sep-2005)\n** Use config to specify which tags and tiddlers should use auto pre formatting\n*v1.0.2 (02-Sep-2005)\n** fixed bug that affecting viewing a tiddler that doesn't exist yet\n*v1.0.3 (02-Oct-2005)\n** added integration with ApplyStylesMacro to add apply style button to stylesheets\n** added nice doco\n\n!Code\n***/\n//{{{\n\n// adjust this to your preference:\nconfig.mptw_autopre = {\n tiddlers: "StyleSheet",\n tags: "stylesheets,CSS,javascript"\n};\n\nwindow.createTiddlerViewer_orig_mptw_autopre = window.createTiddlerViewer;\n\nwindow.createTiddlerViewer = function(title,highlightText,highlightCaseSensitive) {\n \n var tiddler = store.tiddlers[title];\n var trigger = false; \n\n var isStyleSheet = false;\n\n if (tiddler) {\n\n // check for title match\n var titlestocheck = config.mptw_autopre.tiddlers.split(",");\n for (var j=0;j<titlestocheck.length;j++) {\n if (titlestocheck[j] == title) {\n trigger = true;\n }\n }\n\n // check for tag match\n var tags = tiddler.getTags().readBracketedList();\n for (var i=0;i<tags.length;i++) {\n var tagstocheck = config.mptw_autopre.tags.split(",");\n for (var j=0;j<tagstocheck.length;j++) {\n if (tagstocheck[j] == tags[i]) {\n trigger = true;\n if (config.macros.stylechooser != undefined && config.macros.stylechooser.tag == tags[i]) {\n // see ApplyStylesMacro\n isStyleSheet = true;\n }\n }\n }\n }\n }\n\n if (trigger) {\n var realText = store.getTiddlerText(title);\n var tweakedText = "{{{\sn" + realText + "\sn}}}\sn";\n // see ApplyStylesMacro\n if (isStyleSheet) tweakedText = "<<applystyle>>\sn" + tweakedText;\n tiddler.text = tweakedText;\n createTiddlerViewer_orig_mptw_autopre(title,highlightText,highlightCaseSensitive);\n tiddler.text = realText;\n }\n else {\n createTiddlerViewer_orig_mptw_autopre(title,highlightText,highlightCaseSensitive);\n }\n}\n//}}}
#mainMenu br { display:none; }\n#popup{\n padding-left: 2px !important;\n padding-bottom: 2px !important;\n}\n\n\n#popup *{\n border: 0 !important;\n}\n\n#popup hr {\n border-top: solid 1px #ccc !important; \n border-left: none;\n border-right: none;\n border-bottom: none;\n height: 1px;\n color: #ccc;\n width: 98%;\n}\n\n#popup a:hover{\n color: black !important;\n}\n\nbody {\n margin: 0px;\n background-color: #e4e4e4;\n font-size: 9pt;\n font-family: tahoma,arial,helvetica;\n}\n\na:link, a:visited, a:hover, a:active {\n text-decoration: none;\n}\n\n#header {\n border-bottom: 1px solid #458;\n margin-bottom: 0em;\n}\n\n#titleLine {\n color: #fff;\n background: #bcd;\n padding: 0.7em 1em 1em 1em;\n}\n\n#titleLine a {\n text-decoration: none;\n color: #9ab;\n}\n\n#siteTitle {\n font-size: 40pt;\n font-weight: bold;\n padding-left: 20px;\n color: #9ab;\n}\n\n#siteSubtitle {\n font-size: 12pt;\n font-family: georgia,times;\n font-style: italic;\n color: #457;\n display: block;\n position: relative;\n bottom: 5px;\n left: 0px;\n padding-left: 70px;\n}\n\n#mainMenu {\n font-size: 12px;\n float: left;\n width: 13em;\n border: 1px solid #aaa;\n margin: .5em 1em .5em 1em;\n background: #f3f3f3;\n line-height: 125%;\n color: black;\n text-align: right;\npadding: 0;\n}\n\n#mainMenu .tiddlyLink, #mainMenu a.button{\n display: block; \n text-decoration: none;\n width: 12em;\n padding: .25em .5em;\n color: #444;\n text-transform: capitalize;\n}\n\n#mainMenu a:hover {\n color: #000 !important;\n background-color: #bcd !important;\n}\n\n#displayArea {\n margin: 1em 14em 0em 15em;\n}\n\n#messageArea {\n background-color: #5a84ad;\n color: #fff;\n padding: 0.5em 0.5em 0.5em 0.5em;\n margin: 0em 0em 0.6em 0em;\n border-bottom: 1px solid #458;\n display: none;\n}\n\n#messageArea a:link, #messageArea a:visited {\n display: inline;\n text-decoration: underline;\n color: #ddf;\n}\n\n#messageArea a:hover, #messageArea a:active{\n color: #fff;\n}\n\n.tiddler {\n border: 1px solid #aaa;\n margin: 0 10px 20px;\n padding: 8px;\n padding-top:0;\n font-family: arial,georgia,times;\n background-color: white;\n width: auto;\n overflow: hidden;\n}\n\n.innerTiddler {\n padding: 0.7em 1em 1em 0.8em;\n font-size: 9pt;\n}\n\n#displayArea .tiddlyLinkExisting {\n font-weight: bold;\n}\n\n#displayArea .tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n#displayArea .externalLink {\n text-decoration: underline;\n}\n.title {\n font-family: tahoma,arial,helvetica;\n font-size: 13pt;\n color: #469;\n font-weight: bold;\n }\n\n.toolbar {\n font-family: tahoma,arial,helvetica;\n font-weight: normal;\n font-size: 8pt;\n padding: 0em 0em 0em 1em;\n color: #aaa !important;\n visibility: hidden;\n}\n\n.toolbar a{\n padding: 0.2em 0.4em 0.2em 0.4em;\n color: #888 !important;\n}\n\n.toolbar a:hover{\n color: black;\n background-color: #e4e4e4 !important;\n border: 1px solid #aaa !important;\n margin-left: -1px; \n margin-right: -1px;\n}\n\n.toolbar a:active{\n color: #666;\n}\n\n.viewer a.button{\n border: 0;\n background-color: transparent !important;\n padding: 0em;\n color: #888 !important;\n border: 1px solid transparent;\n}\n\n.editorFooter a:hover, .footer a.button {\n color: #888 !important;\n}\n\n.editorFooter a:hover, .footer a:hover{\n color: black;\n background-color: #e4e4e4 !important;\n border: 1px solid #aaa !important;\n margin-left: -1px; \n margin-right: -1px;\n}\n\n.viewer a.button:hover{\n color: black;\n background-color: #e4e4e4 !important;\n border: 1px solid #aaa !important;\n}\n\n.viewer a.button,.editorFooter a:hover, .footer a.button {\n color: #666;\n}\n\n#popup {\n display: none;\n position: absolute;\n top: 1.5em;\n left: 13.25em;\n font-size: 8pt;\n color: #888;\n background-color: #e4e4e4;\n padding: 0;\n border-top: 1px solid #aaa;\n border-bottom: 1px solid #330000;\n border-right: 1px solid #330000;\n border-left: 1px solid #aaa;\n}\n\n#popup a {\n display: block;\n color: #888;\n min-width: 8em;\n border: 0;\n margin: 0;\n}\n\n#popup a:hover {\n background-color: #e4e4e4;\n color: black;\n}\n\n.body {\n border-top:1px solid #ccc;\n padding-top: 0.5em;\n margin-top:0.3em;\n overflow: hidden;\n}\n\n.viewer {\n color: black;\n line-height: 140%;\n}\n\n.viewer a:link, .body a:visited{\n color: #922;\n}\n\n.viewer a:hover {\n color: #b44;\n background-color: transparent;\n text-decoration: none;\n}\n\n.viewer blockquote {\n font-size: 8pt;\n line-height: 150%;\n border-left: 1px solid #ccc;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul {\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer ol {\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n/*==============================================Headings================*/\n\n.viewer h1,.viewer h2,h3,h4,h5,h6 {\n font-weight: bold;\n text-decoration: none;\n color: #469;\n padding-left: .6em;\nbackground-color: transparent !important;\nborder-bottom: 3px dotted #ccc;\n}\n\n.viewer h2 {\n font-size: 12pt;\n}\n\n.viewer h3 {\n font-size: 11pt;\n}\n\n.viewer h4 {\n font-size: 10pt;\n}\n\n.viewer h5 {\n font-size: 9pt;\n}\n\n.viewer h6 {\n font-size: 8pt;\n}\n\n.viewer table {\n font-size: 10pt;\n border-collapse: collapse;\n border: 2px solid #303030;\n margin-left: 1.0em;\n margin-right: 1.0em;\n margin-top: 0.8em;\n margin-bottom: 0.8em;\n}\n\n.viewer th {\n background-color: #bcd;\n border: 1px solid #606060;\n padding: 3px;\n}\n\n.viewer td, tr {\n border: 1px solid #606060;\n padding: 3px;\n}\n\n.viewer caption {\n font-size: smaller;\n padding: 3px;\n}\n\n.viewer hr {\n border-top: dashed 1px #606060;\n border-left: none;\n border-right: none;\n border-bottom: none;\n height: 1px;\n color: #666666;\n}\n\n.highlight {\n color: #000000;\n background-color: #bcd;\n}\n\n.editor {\n font-size: 8pt;\n color: #402c74;\n font-weight: normal;\n}\n\n.editor input {\n display: block;\n border: 1px solid black;\n}\n\n.editor textarea {\n display: block;\n font: inherit;\n border: 1px solid black;\n}\n\n/*\n=================Sidebar==========\n=================================\n*/\n\n\n#sidebar {\n float: right;\n width: 14em;\n font-size: 8pt;\n border-left: 1px solid #aaa;\n border-bottom:1px solid #aaa;\n}\n\n#sidebarOptions {\n color: #666 !important;\n background-color: #f3f3f3 !important;\n}\n\n#sidebar #sidebarOptions a:hover{\n background-color: #f3f3f3;\n}\n\n#contentWrapper #sidebar a:hover{\n color: #b44;\n text-decoration: underline;\n}\n\n#contentWrapper .sidebarSubHeading {\n font-size: 0.95em;\n color: #236;\n}\n\n#contentWrapper #commandPanel {\n padding-top: 0.5em;\n background-color: #f3f3f3;\n color: black;\n font-size: 8pt;\n}\n\n#contentWrapper #commandPanel a {\n display: block;\n padding: 0.3em 0.2em 0.3em 1em;\n color: #666;\n text-decoration: none;\n}\n\n#contentWrapper #commandPanel a:hover {\n color: #922;\n text-decoration: underline;\n background-color: transparent;;\n}\n\n#contentWrapper #commandPanel input {\n margin: 0.4em 0em 0.3em 1em;\n border: 1px solid black;\n}\n\n#contentWrapper #optionsPanel {\n display: none;\n background-color: #f3f8ff;\n padding: 0.5em 0.5em 0em 0.5em;\n font-size: 7pt;\n color: black;\n}\n\n#contentWrapper #optionsPanel a:link, #optionsPanel a:visited {\n color: #666;\n font-weight: bold;\n}\n\n#contentWrapper #optionsPanel a:hover {\n color: #922;\n text-decoration: underline;\n background-color: transparent;\n}\n\n.optionsText {\n margin-top: 0.25em;\n margin-bottom: 0.75em;\n}\n\n.optionsItem {\n}\n/*========================================================================*/\n#contentWrapper #sidebarTabs {\n background-color: #f3f3f3;\n padding: 0em;\n}\n\n#contentWrapper #sidebarTabs a {\n color: black;\n background-color: transparent;\n}\n\n#contentWrapper #sidebarTabs a:hover {\n color: #922; text-decoration: underline;\n background-color: transparent;\n}\n\n#contentWrapper #sidebarTabs a:active {\n color: black;\n}\n\n#contentWrapper .tabContentTags #popup {\n display: none;\n position: absolute;\n top: 1em;\n left: 13.25em;\n font-size: 8pt;\n color: #888;\n background-color: #e4e4e4;\n padding: 0;\n margin-top: -2px;\n border-top: 1px solid #aaa;\n border-bottom: 1px solid #330000;\n border-right: 1px solid #330000;\n border-left: 1px solid #aaa;\n}\n\n#contentWrapper .tabContentTags #popup hr {\n color: #ccc;\n}\n\nhr{\n color: black !important;\n}\n\n#contentWrapper .tabContentTags #popup a {\n display: block;\n color: #888;\n min-width: 8em;\n border: 0;\n margin: 0;\n height: 1.2em;\n}\n\n#contentWrapper .tabContentTags #popup a:hover {\n background-color: #e4e4e4;\n color: black;\n}\n\n#contentWrapper a.tab {\n font-weight: normal;\n display: inline;\n margin: 0px 1px; \n border:1px solid #aaa;\n border-bottom:none;\n}\n\n#contentWrapper a.tabSelected {\n background-color: #e6e6e6 !important;\n padding: 2px 4px 2px 4px;\n}\n\n#contentWrapper a.tabUnselected {\n background-color: #f3f3f3;\n padding: 2px 4px 0px 4px;\n}\n\n/*===========================================================================================*/\n/*===========================================================================================*/\n#sidebarTabs{\n margin: 0;\n padding: 0;\n}\n\n#contentWrapper .tabContents {\n background-color: #e6e6e6;\n border-bottom: solid #aaa 1px;\n}\n\n#contentWrapper .tabContents a.tiddlyLink, #contentWrapper .tabContents a.button{\n background-color: #e6e6e6;\n color: #922 !important;\n}\n\n#contentWrapper .tabContents a:hover{\n color: #b44 !important;\n}\n\n#contentWrapper .txtMoreTab a.tabUnselected {\n background-color: #e6e6e6;\n padding: 2px 4px 0px 4px;\n}\n\n#contentWrapper .txtMoreTab a.tabSelected {\n background-color: #ccc !important;\n padding: 2px 4px 2px 4px;\n}\n\n.txtMoreTab .tabContents {\n background-color: #ccc !important;\n border-bottom: solid #aaa 1px;\n}\n\n.txtMoreTab .tabContents a{\n background-color: transparent !important;\n}\n\n#licensePanel {\n padding: 0.5em 0.2em 0.5em 0.2em;\n}\n\n#licensePanel a {\n display: block;\n padding: 0.2em 0.2em 0.2em 0.2em;\n color: #555;\n}\n\n#licensePanel a:hover {\n text-decoration: none;\n color: #922;\n background-color: transparent;\n}\n\n#storeArea, #copyright {\n display: none;\n}\n\n#floater {\n font-size: 10pt;\n visibility: hidden;\n color: white;\n border: 1px solid #666;\n background-color: white;\n position: absolute;\n padding: 1em 1em 1em 1em;\n display:none;\n}\n\n@media print {\n\n#mainMenu {\n display: none;\n}\n\n#displayArea {\n margin: 1em 1em 0em 1em;\n}\n\n#sidebar {\n display: none;\n}\n\n}
You can apply any of these [[stylesheets]] by clicking below. \n<<stylechooser>>\n
/***\n|''Name:''|CloseOthersButton|\n|''Version:''|1.0.1 (11-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#CloseOthersButton)|\n|''Author:''|SimonBaird|\n|''Type:''|Plugin|\n!Description\nAdds a button to the toolbar that closes all other tiddlers but this one. Sometimes when you're finding the tiddlers you want you end up with many tiddlers on screen that you don't really need. This lets you "declutter" quickly and easily.\n\n!Revision History\n* This was my first ever TW hack (and the beginning of my TW addiction. :) \n* (July 2005)\n** Made into a plugin for MPTW launch\n* v1.0.1 (11-Oct-2005)\n** Added doco\n\n!Code\n***/\n\nwindow.onClickToolbarCloseOthers = function(e) {\n if (!e) var e = window.event;\n clearMessage();\n if(this.parentNode.id)\n closeAllOtherTiddlers(this.parentNode.id.substr(7));\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n\nfunction closeAllOtherTiddlers(thisTitle) {\n clearMessage();\n var place = document.getElementById("tiddlerDisplay");\n var tiddler = place.firstChild;\n var nextTiddler;\n while(tiddler) {\n nextTiddler = tiddler.nextSibling;\n if(tiddler.id) {\n if(tiddler.id.substr(0,7) == "tiddler") {\n var title = tiddler.id.substr(7);\n if(!document.getElementById("editorWrapper" + title) && title != thisTitle) {\n place.removeChild(tiddler);\n }\n }\n }\n tiddler = nextTiddler;\n }\n window.scrollTo(0,0);\n}\n\nconfig.views.wikified.toolbarCloseOthers = {text: "close others", tooltip: "Close all tiddlers except this one"};\n\nwindow.createTiddlerToolbar_orig_mptw_closeothers = window.createTiddlerToolbar;\nwindow.createTiddlerToolbar = function(title,isEditor) {\n createTiddlerToolbar_orig_mptw_closeothers(title,isEditor);\n var theToolbar = document.getElementById("toolbar" + title);\n var lingo = config.views.wikified;\n if(!isEditor) {\n var newButton = createTiddlyButton(theToolbar, lingo.toolbarCloseOthers.text, lingo.toolbarCloseOthers.tooltip, onClickToolbarCloseOthers);\n var newSpacer = insertSpacer(theToolbar);\n\n secondButton = theToolbar.childNodes[3];\n\n\n theToolbar.insertBefore(newSpacer,secondButton);\n theToolbar.insertBefore(newButton,newSpacer);\n\n }\n}\n\n\n
/***\n|''Name:''|CloseUnsavedOnCancel|\n|''Version:''|1.0.1 (11-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#CloseUnsavedOnCancel)|\n|''Author:''|SimonBaird|\n|''Type:''|Plugin|\n!Description\nWhen you click new tiddler then click cancel I think the new tiddler should close automatically. This plugin implements that behavious.\n\n!Issues/Todos\n* Ideally you should get the same behavious if you press escape instead of clicking cancel. Would have to do something in onEditKey()\n* I couldn't get the [[Function Hijacking]] version of this to work properly, so it's a whole function replacement\n\n!Revision History\n* 1.0.1 (11-Oct-2005)\n** Added this doco\n\n!Code\n***/\n//{{{\n\n/* original function as of 1.2.35 */\n/*\n// Event handler for clicking on toolbar save\nfunction onClickToolbarUndo(e)\n{\n if(this.parentNode.id)\n displayTiddler(null,this.parentNode.id.substr(7),1,null,null,false,false);\n return false;\n}\n*/\n\n\nwindow.onClickToolbarUndo = function(e)\n{\n var tiddlerName = this.parentNode.id.substr(7);\n if(this.parentNode.id)\n displayTiddler(null,tiddlerName,1,null,null,false,false);\n\n // === this is the extra bit ============\n if (!store.tiddlerExists(tiddlerName))\n closeTiddler(tiddlerName,false);\n //===============================\n\n return false;\n}\n\n//}}}\n
/***\n|''Name:''|CommaSeparatedTags|\n|''Version:''|1.0.1 (11-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#CommaSeparatedTags)|\n|''Author:''|SimonBaird|\n|''Type:''|Plugin|\n!Description\nThis plugin lets you use comma separated tags instead of using space separated tags with {{{[[}}} and {{{]]}}} for tags with spaces. Note that this doesn't change how the tags are stored so that it can be switched on and off without any harmful effects.\n\n!Examples\nWith this plugin installed you enter this: \n{{{tag1, tag2, tag with a space, another one}}}\ninstead of this:\n{{{tag1 tag2 [[tag with a space]] [[another one]]}}}\n\n!Revision history\n* v0.9.x (Jul-2005)\n* v1.0.1 (11-Oct-2005)\n** added this doco\n\n!Code\n***/\n//{{{\n\nconfig.views.editor.tagPrompt = "Type tags separated by commas above, or add existing";\n\nfunction uncommafyTags(tagsString) {\n // converts from "foo,bar,baz qux" to "[[foo]] [[bar]] [[baz qux]]"\n var trimmed = tagsString.trim();\n if (trimmed == "" || trimmed == null) {\n return "";\n }\n else {\n if (trimmed.substring(trimmed.length-1) == ",") {\n // remove trailing comma to be nice\n trimmed = trimmed.substring(0,trimmed.length-1);\n }\n var tagsArray = trimmed.split(",");\n var result = "";\n for (var i=0;i<tagsArray.length;i++) {\n // put square brackets on all of them because readBracketedList can handle it\n // don't want leading or trailing spaces\n result = result + (i==0?"":" ") + "[[" + tagsArray[i].trim() + "]]";\n }\n return result;\n }\n}\n\nfunction commafyTags(tagsString) {\n var tagsArray = tagsString.readBracketedList();\n return tagsArray.join(", ");\n}\n\nwindow.saveTiddler_orig_mptw_commatags = window.saveTiddler;\nwindow.saveTiddler = function(title) {\n // tweak the tags text in the tags input box after editing\n var tagsBox = document.getElementById("editorTags" + title);\n tagsBox.style.display = "none"; // otherwise you see it flash up briefly\n tagsBox.value = uncommafyTags(tagsBox.value);\n saveTiddler_orig_mptw_commatags(title);\n}\n\nwindow.createTiddlerEditor_orig_mptw_commatags = window.createTiddlerEditor;\nwindow.createTiddlerEditor = function(title) {\n // tweak the tags text in the tags input box before editing\n createTiddlerEditor_orig_mptw_commatags(title);\n var tagsBox = document.getElementById("editorTags" + title);\n tagsBox.value = commafyTags(tagsBox.value);\n\n}\n\n// Event handler for clicking on a tag in the 'add tag' popup\nwindow.onClickAddTagPopup = function(e) {\n // here we'll just replace the whole lot\n // hopefull this won't hurt too much during upgrades\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var tiddler = this.getAttribute("tiddler");\n var tag = this.getAttribute("tag");\n var tagsBox = document.getElementById("editorTags" + tiddler);\n\n //// mod\n if(tagsBox) {\n if (tagsBox.value.trim() == "") {\n tagsBox.value = tag;\n }\n else {\n tagsBox.value += ", " + tag;\n }\n }\n //// end mod\n\n //// replaced bit\n /*\n if(tagsBox)\n tagsBox.value += " " + String.encodeTiddlyLink(tag);\n */\n //// end replaced bit\n\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n\n\n//}}}\n
/***\n/***\n|''Name:''|ConfirmDelete|\n|''Author:''|[[Clint Checketts]]|\n|''Source:''|Posted to TiddlyWikiDev?|\n|''Type:''|Plugin|\n!Description\nAdds an option in AdvancedOptions which enables an "Are you sure..." confirmation on every delete.\n!Code\n***/\n//{{{\nconfig.options.chkConfirmDelete= true;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkConfirmDelete>> ConfirmBeforeDeleting";\n\nwindow.deleteTiddler_orig_confirmDelete = window.deleteTiddler;\nwindow.deleteTiddler= function(title) {\n var deleteIt = true;\n if (config.options.chkConfirmDelete) {\n deleteIt = confirm("Are you sure you want to delete " + title + "?");\n }\n if (deleteIt) {\n deleteTiddler_orig_confirmDelete(title);\n }\n}\n//}}}\n
[[Links]]
/***\n|''Name:''||\n|''Version:''|1.0.1 (11-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#FocusTweak)|\n|''Author:''|SimonBaird|\n|''Type:''|Plugin|\n!Description\nA convenience for creating a new tiddler. It automatically focuses and selects the edit box content you probably want to change.\n\n!Revision History\n* 1.0.1 (11-Oct-2005)\n** added this doco\n\n!Code\n***/\n//{{{\n\nwindow.createTiddlerEditor_orig_mptw_focustweak = window.createTiddlerEditor;\nwindow.createTiddlerEditor = function(title)\n{\n // open the window\n createTiddlerEditor_orig_mptw_focustweak(title);\n\n // get the input boxes\n var theTitleBox = document.getElementById("editorTitle" + title);\n var theBodyBox = document.getElementById("editorBody" + title);\n\n // tweak the focus\n if (title == 'New Tiddler') {\n theTitleBox.focus();\n theTitleBox.select();\n }\n else if (theBodyBox.value == config.views.editor.defaultText.format([title]) ||\n theBodyBox.value == config.views.editor.defaultText.format(["New Tiddler"])) {\n theBodyBox.focus();\n theBodyBox.select();\n }\n else {\n theBodyBox.focus();\n }\n}\n\n//}}}\n
/* Style created by Nathan Bowers http://shared.snapgrid.com/gtd_tiddlywiki.html\n Imported and improved upon by Clint Checketts\nchecketts [at] gmail -dot- com */\n\n#mainMenu br,#mainMenu hr {\n display:none;\n}\n\n*{\n margin: 0;\n padding: 0;\n}\nbody {\n background: #464646 url('http://shared.snapgrid.com/images/tiddlywiki/bodygradient.png') repeat-x top fixed;\n color: #000;\n font: 13px/125% "Lucida Grande", "Trebuchet MS", "Bitstream Vera Sans", Verdana, Helvetica, sans-serif;\n _text-align: center;\n}\n#contentWrapper {\n position: relative;\n margin: 0 auto;\n padding: 0;\n border: 1px black;\n width: 775px;\n _width: 770px; /* CSS UNDERSCORE HACK FOR PROPER WIN/IE DISPLAY */\n _text-align: left; /* CSS UNDERSCORE HACK FOR PROPER WIN/IE DISPLAY */ \n}\n#header{\n color: #fff;\n padding: 20px 20px 10px 0;\n}\n#mainMenu {\n position: static;\n line-height: 166%;\n background: #600;\n border-right: 3px solid #500;\n margin: 1em 0 0 0;\n width: 215px;\n padding: 0;\n text-align: left;\n}\n#sidebar {\n position: static;\n margin: 2em 0 0 0;\n float: left;\n clear: left;\n color: #000000;\n width: 218px;\n}\n#displayArea {\n float: right;\n margin: 0 2em 0 0;\n _margin: 0;\n width: 520px;\n _width: 545px; /* CSS UNDERSCORE HACK FOR PROPER WIN/IE DISPLAY */\n}\n#messageArea\n{\n font-size: 13px;\n font-weight: bold;\n padding: 5px;\n width: 41em;\n margin: 5px 0px;\n background: #ffe72f;\n border-right: 3px solid #da1;\n border-bottom: 3px solid #a80;\n text-align: center;\n display: none;\n}\na:link, a:visited, a:hover, a:active {\n text-decoration: none;\n}\n\n/* HEADER ========================================================== */\n#titleLine{\n background: transparent;\n margin: 0;\n padding: 0;\n}\n#siteTitle {\n font-size: 30px;\n}\n#siteSubtitle {\n font-size: 13px;\n padding-left: 10px;\n}\n#titleLine a {\n color: #cf6;\n}\n/* SIDEBARS ========================================================== */\n#mainMenu a {\n color: #fff !important;\n background: #700;\n display: block;\n padding: 0 5px 0 10px;\n height: 22px;\n line-height: 22px;\n border-bottom: 1px solid #500;\n border-top: 1px solid #900;\n text-transform: capitalize;\n}\n#mainMenu a.tiddlyLink:hover, #mainMenu a.button:hover{\n background: #b00 !important;\n}\n#sidebarTabs {\n background: transparent;\n padding: 8px 0 0 10px;\n}\n#sidebarTabs a {\n color: #fff;\n padding: 2px 8px 1px 8px;\n height: 22px;\n}\n#sidebarTabs a:hover {\n background: #000;\n color: #fff;\n}\n#sidebarTabs a:active {\n color: #000000;\n}\n#sidebarContent{\n padding: 0 10px 10px 10px;\n font-size: 11px;\n clear: both;\n}\n#sidebarContent br{\n display: none;\n}\n.sidebarSubHeading {\n padding: 8px 0 0 0;\n display: block;\n width: 100%;\n color: #000;\n}\n#sidebarContent a {\n color: #fff;\n display: block;\n margin: 1px 0 1px 5px;\n padding: 0;\n width: 100%;\n}\n#sidebarContent a:hover {\n color: #fff;\n background: #000;\n}\n#licensePanel {\n padding: 0px 10px;\n font-size: 11px;\n}\n#licensePanel a {\n color: #960;\n display: block;\n margin-top: 10px;\n}\n#licensePanel a:hover {\n color: #fff;\n}\n#licensePanel a:active {\n color: #fff;\n}\n#sidebarOptions {\n background: #eeb !important;\n border-right: 3px solid #bb8;\n color: #b4c675 !important;\n padding: 5px 0;\n}\n#sidebarOptions a {\n color: #700 !important;\n display: block;\n padding: 0 !important;\n margin: 3px 10px;\n}\n#sidebarOptions a:hover, #sidebarOptions a:active {\n color: #fff !important;\n background: #700 !important;\n}\n#sidebarOptions input {\n margin: 2px 10px;\n border: 1px inset #333;\n}\n#sidebarOptions .sliderPanel {\n display: none;\n background: #fff;\n color: #000;\n padding: 5px 10px;\n font-size: 11px;\n}\n.sliderPanel div{\n margin: 5px 0;\n}\n#sidebarOptions .sliderPanel a:link, #sidebarOptions .sliderPanel a:visited {\n color: #17b !important;\n font-weight: normal;\n margin: 0;\n display: inline;\n}\n#sidebarOptions .sliderPanel a:hover, #sidebarOptions .sliderPanel a:active {\n color: #fff !important;\n background: #000;\n}\n.optionsText {\n margin: 2px 0;\n}\n#tabTimeline {\n font-weight: bold;\n display: inline;\n background: #960;\n border-right: 1px solid #740;\n}\n#popup{\n background-color: #cf6;\n color: #000;\n}\n\n.tabset{\n border-right: 3px solid #bb8;\n background-color: #eeb;\n}\n#contentWrapper a.tab {\n font-weight: bold;\n display: inline;\n margin: 0px 2px; \n border-right:1px solid #aaa;\n font-size: 12px;\n color: #fff !important;\n text-decoration: none;\n}\n#contentWrapper a.tab:hover {\n background: #000 !important;\n}\n#contentWrapper a.tabSelected {\n background-color: #960 !important;\n border-right: 1px solid #740;\n padding: 4px 4px 2px 4px;\n}\n#contentWrapper a.tabUnselected {\n background-color: #660 !important;\n border-right: 1px solid #440;\n padding: 4px 4px 0px 4px;\n color: #fff !important;\n}\n/*===================================================================*/\n/*=====================================================================*/\n#sidebarTabs{\n margin: 0;\n padding: 0;\n}\n#contentWrapper .tabContents {\n background-color: #960;\n border-bottom: solid #520 2px;\n border-right: 3px #740 solid;\n}\n#contentWrapper .tabContents a.tiddlyLink, #contentWrapper .tabContents a.button{\n height: auto;\n margin: 0 0 0 1em !important;\n padding: 0 !important; \n background-color: transparent;\n color: #fff !important;\n font-weight: normal;\n text-decoration: none;\n}\n#contentWrapper .tabContents a.tiddlyLink:hover,#contentWrapper .tabContents a.button:hover{\n background-color: #000;\n}\n#contentWrapper .txtMoreTab .tabset{\n border: 0;\n background-color: transparent;\n}\n#contentWrapper .txtMoreTab a.tabUnselected {\n background-color: #b00 !important;\n padding: 2px 4px 0px 4px;\n color: #fff !important;\n border-right: 1px solid #900;\n}\n#contentWrapper .txtMoreTab a.tabSelected {\n background-color: #700 !important;\n padding: 2px 4px 2px 4px;\n color: #fff !important;\n border-right: 1px solid #500;\n}\n#contentWrapper .txtMoreTab a.tab:hover {\n background-color: #000 !important;\n border-right: 1px solid #500;\n}\n.txtMoreTab .tabContents {\n background-color: #700 !important;\n border-right: 3px solid #500 !important;\n border-bottom: 3px solid #500 !important;\n color: #fff;\n font-weight: bold;\n}\n.txtMoreTab .tabContents a{\n font-weight: normal;\n background-color: transparent !important;\n}\n.txtMoreTab .tabContents a:hover{\n background-color: #000 !important;\n}\n#sidebar popup{\n padding: 0;\n}\n\n#contentWrapper .viewer #popup *{\n color: #000 !important;\n}\n#contentWrapper #popup a{\n color: #000 !important;\n margin: 0 !important;\n padding: 0;\n}\n#contentWrapper #popup hr{\n border-top: solid 1px #000;\n border-left: 0;\n border-right: 0;\n border-bottom: none;\n height: 1px;\n color: #000;\n margin: 5px 0 !important;\n}\n#contentWrapper #popup a:hover{\n background-color: #ef9 !important;\n}\n\n\n\n\n\n\n\n\n/* TIDDLER DISPLAY/EDIT SPACE ============================================= */\n.tiddler {\n margin: 0 0 10px 0;\n padding: 0 15px;\n width: 99%;\n border-right: 3px solid #aaa;\n border-bottom: 3px solid #555;\n background: #fff;\n}\n#displayArea .tiddlyLinkExisting {\n font-weight: bold;\n text-decoration: none;\n}\n#displayArea .tiddlyLinkNonExisting {\n font-style: italic;\n text-decoration: none;\n}\n#displayArea .externalLink {\n text-decoration: underline;\n}\n.title {\n font-size: 1.5em;\n padding: 0 0 0 0;\n font-weight: bold;\n display: block;\n color: #900;\n}\n.toolbar {\n font-weight: normal;\n font-size: 11px;\n visibility: hidden;\n text-align: right;\n padding: 5px 0;\n}\n.toolbar a {\n padding: 1px 5px;\n color: #000 !important;\n text-decoration: none;\n border: 1px outset #cf6;\n background: #cf6;\n}\n.toolbar a:hover {\n background: #ef9 !important;\n}\n.toolbar a:active {\n background: #ff0 !important;\n}\n.viewer .tabset{\n background: transparent;\n border: 0;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n.viewer a.button{\n background-color: transparent !important;\n color: #700 !important;\n}\n\n.viewer {\n line-height: 140%;\n}\n.viewer a:link, .body a:visited {\n color: #15b;\n text-decoration: underline;\n}\n.viewer a:hover {\n color: #fff;\n background: #000;\n}\n.viewer blockquote {\n border-left: 3px solid #777;\n margin: 5px;\n padding: 5px;\n}\n.viewer ul {\n padding-left: 30px;\n}\n.viewer ol {\n padding-left: 30px;\n}\nol\n{ \n list-style-type: decimal;\n}\nol ol\n{ \n list-style-type: lower-alpha;\n}\nol ol ol\n{ \n list-style-type: lower-roman;\n}\n.viewer ul, .viewer ol, .viewer p {\n margin: 5px 0 12px 0;\n}\n.viewer li {\n margin: 3px 0;\n}\n.viewer h2,h3,h4,h5,h6 {\n font-weight: bold;\n background: #eee;\n padding: 2px 10px;\n margin: 5px 0;\n}\n.viewer h2 {\n font-size: 1.3em;\n}\n.viewer h3 {\n font-size: 1.2em;\n}\n.viewer h4 {\n font-size: 1.1em;\n}\n.viewer h5 {\n font-size: 1em;\n}\n.viewer h6 {\n font-size: .9em;\n}\n.viewer table {\n border-collapse: collapse;\n border: 2px solid #303030;\n font-size: 11px;\n margin: 10px 0;\n}\n.viewer th {\n background: #eee;\n border: 1px solid #aaa;\n padding: 3px;\n}\n.viewer td {\n border: 1px solid #aaa;\n padding: 3px;\n}\n.viewer caption {\n padding: 3px;\n}\n.viewer hr {\n border: none;\n border-top: dotted 1px #777;\n height: 1px;\n color: #777;\nmargin: 7px 0;\n}\n.body\n{\n margin: 5px 0 15px 0;\n padding: 5px 0;\n border-top: 1px solid #ccc;\n}\n.highlight {\n color: #000;\n background: #ffe72f;\n}\n.editor {\n font-size: 8pt;\n color: #402C74;\n font-weight: normal;\n padding: 10px 0;\n}\n.editor input, .editor textarea {\n display: block;\n font: 10px/130% "Andale Mono", "Monaco", "Lucida Console", "Courier New", monospace;\n margin: 0 0 10px 0;\n border: 1px inset #333;\n padding: 2px 0;\n}\n.editor textarea {\n height: 500px;\n}\ninput:focus, textarea:focus\n{\n background: #ffe;\n border: 1px solid #000 !important;\n}\n.editorFooter, .footer{\n font-size: 10px;\n}\n.editorFooter a.button:hover, .footer a.button:hover{\n color: #fff;\n}\n#storeArea, #copyright, .site_description {\n display: none;\n}\n#floater {\n background: #df9;\n border: 3px solid #999;\n color: #df9;\n position: absolute;\n left: -99999999px;\n top: -99999999px;\n width: 1px;\n display: none;\n}\n\n@media print{\n*\n{\n margin: 0;\n padding: 0;\n}\nbody {\n background: #fff;\n color: #000;\n width: 2.5in;\n height: 4.7in;\n font-size: 6.2pt;\n font-family: "Lucida Grande", "Bitstream Vera Sans", Helvetica, Verdana, Arial, sans-serif;\n}\nimg {\n max-width: 2.2in;\n max-height: 4.3in;\n}\n#header, #side_container, #storeArea, #copyright, .toolbar, #floater, #messageArea, .save_accesskey, .site_description\n{\n display: none;\n}\n#tiddlerDisplay, #displayArea\n{\n display: inline;\n}\n.tiddler {\n margin: 0 0 2em 0;\n border-top: 1px solid #000;\n page-break-before: always;\n}\n.tiddler:first-child {\n page-break-before: avoid;\n}\n.title {\n font-size: 1.6em;\n font-weight: bold;\n margin-bottom: .3em;\n padding: .2em 0;\n border-bottom: 1px dotted #000;\n}\np, blockquote, ul, li, ol, dt, dd, dl, table\n{\n margin: 0 0 .3em 0;\n}\nh1, h2, h3, h4, h5, h6\n{\n margin: .2em 0;\n} \nh1\n{\n font-size: 1.5em;\n}\nh2\n{\n font-size: 1.3em;\n}\nh3\n{\n font-size: 1.25em;\n}\nh4\n{\n font-size: 1.15em;\n}\nh5\n{\n font-size: 1.1em;\n}\nblockquote\n{\n margin: .6em;\n padding-left: .6em;\n border-left: 1px solid #ccc;\n}\nul\n{\n list-style-type: circle;\n}\nli\n{\n margin: .1em 0 .1em 2em;\n line-height: 1.4em; \n}\ntable\n{\n border-collapse: collapse;\n font-size: 1em;\n}\ntd, th\n{\n border: 1px solid #999;\n padding: .2em;\n}\nhr {\n border: none;\n border-top: dotted 1px #777;\n height: 1px;\n color: #777;\n margin: .6em 0;\n}}
Like most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\n\n//For backwards compatibility, the following highlight syntax is also accepted://\n{{{\n@@bgcolor(#ff0000):color(#ffffff):red coloured@@\n}}}\n@@bgcolor(#ff0000):color(#ffffff):red coloured@@
<html>\n<TABLE BORDER="1">\n <caption align="bottom"></caption>\n <TR> <TH> Wikipedia: <TH> Podcasts: <TH> Other: </TH> </TR>\n <TR> \n <TD> \n<a href="http://en.wikipedia.org/wiki/Taiwanese_language" target="_blank">Taiwanese Language</a>\n<br>\n<a href="http://en.wikipedia.org/wiki/Pe̍h-oē-jī" target="_blank">Pe̍h-oē-jī</a>\n </TD>\n <TD>\n<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=73329568" target="_blank">[Misadventures in Taiwan]</a>\n<br>\n<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=79931075" target="_blank">Taiwan News</a>\n<br>\n<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=79033990&s=143441" target="_blank">Penang Hokkien</a>\n<br>\n<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=82299988&s=143441" target="_blank">My Taiwanese</a>\n </TD>\n <TD>\n<a href="http://ocf.berkeley.edu/~taioanoe" target="_blank">Berkeley Class</a>\n<br>\n<a href="http://www.ocf.berkeley.edu/~taioanoe/culture.htm#dl" target="_blank">Berkeley Phonetics Audio Files</a>\n<br>\n<a href="http://www.chinalanguage.com/forums/viewforum.php?f=6" target="_blank">Hokkien Language forum</a>\n </TD>\n</TR>\n </TABLE>\n</html>
''Wikipedia:''\n<html>\n<a href="http://en.wikipedia.org/wiki/Taiwanese_language" target="_blank">Taiwanese Language</a>\n<br>\n<a href="http://en.wikipedia.org/wiki/Pe̍h-oē-jī" target="_blank">Pe̍h-oē-jī</a>\n</html>\n\n''Podcasts:''\n<html>\n<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=73329568" target="_blank">[Misadventures in Taiwan]</a>\n<br>\n<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=79931075" target="_blank">Taiwan News</a>\n<br>\n<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=79033990&s=143441" target="_blank">Penang Hokkien</a>\n<br>\n<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=82299988&s=143441" target="_blank">My Taiwanese</a>\n</html>\n\n''Others:''\n<html>\n<a href="http://www.ocf.berkeley.edu/~taioanoe" target="_blank">Berkeley Class</a>\n<br>\n<a href="http://www.ocf.berkeley.edu/~taioanoe/culture.htm#dl" target="_blank">Berkeley Phonetics Audio Files</a>\n<br>\n<a href="http://www.chinalanguage.com/forums/viewforum.php?f=6" target="_blank">Hokkien Language forum</a>\n</html>
.gradient {padding:1em;}\n\n.viewer pre, .viewer code {\n color:#040;\n font-family:'lucida console',monospace;\n border-style:none;\n line-height:1.2em;\n}\n\n.titleBox { font-size:120%; font-weight:bold; }\n\n.viewer pre {\n padding:1em;\n font-size:90%;\n background-color:#f8f8f8;\n}\n\n\n\n#sidebarOptions .sliderPanel {\n background-color: #9b9;\n}\n\n.editor textarea { height:20em; }\n\n#sidebarOptions .tiddlyLink { color:#eef; padding: 0.3em 0.2em 0.3em 1em; display:block;}\n#sidebarOptions .tiddlyLink:hover { color:#fff; background:#252;}\n/* need these to override the above for the options slider */\n#sidebarOptions .sliderPanel .tiddlyLink {color:#242;display:inline;padding:0;}\n#sidebarOptions .sliderPanel .tiddlyLink:hover {color:#242; background:#dfd;}\n\n\n\n#sidebarTabs .tabContents { overflow:visible; white-space:normal; width:auto; }\n\ndiv#mainmenu hr {margin:0px;padding:0px;padding-top:10px;\n border-style:none;\n border-width:1px;\n border-color:#ccc;\n border-bottom-style:solid;\n}\n.viewer pre { font-size:75%; }\n\n/* colour scheme begin */ \ndiv#titleLine { background:#135;}\ndiv#sidebarOptions { background:#696; }\ndiv#sidebarOptions .button { color:#eef;}\ndiv#sidebarOptions .button:hover { color:#fff; background:#252;}\n\n\n\n\ndiv#mainmenu .tiddlyLink { font-weight:bold;color:#369; }\ndiv#mainmenu .tiddlyLink:hover { background:#369;color:white; }\ndiv#mainmenu .button { font-weight:bold; color:#363; }\ndiv#mainmenu .button:hover { background:#363;color:white; }\ndiv.viewer a.tiddlyLink { color:#369; }\ndiv.viewer a.tiddlyLink:hover { background:#acd; }\ndiv.footer a.tiddlyLink { color:#369; }\ndiv.footer a.tiddlyLink:hover { background:#acd; }\n.editorFooter a.button, .tiddler .button { color: #369; background:#eee; }\n.editorFooter a.button:hover, .tiddler .button:hover { color: #fff; background: #369; }\n.editorFooter a.button:active, .tiddler .button:active { color: #fff; background: #369; }\n.editorFooter a:link { color: #369; } \n#popup {color:#eee; background:#369;}\n#popup a {color:#fff; background:#369; }\n#popup a:hover {color:black; background:#eee;}\n#mainMenu .externalLink { color:#252; }\n#mainMenu .externalLink:hover { color:white;background:#696; }\n.tiddler .externalLink { color:#252; }\n.tiddler .externalLink:visited { color:#252; }\n.tiddler .externalLink:hover { color:#252;background:#ada; }\n.viewer a:link { color: #252; } \n.viewer a:visited { color: #252; } \n.viewer a:hover { color:#252; background:#ada; }\n#titleLine a {color:white;}\n\n.viewer .tabSelected {background-color: white;font-weight:bold; border:solid 2px #ddd;border-bottom-color:white;}\n.viewer .tabContents {background-color: white; border:solid 2px #ddd;}\n.viewer .tabset {background-color:white;}\n.viewer .tabUnselected {color:#999;background-color:#ddd;}\n\n#sidebarTabs .txtMainTab .tabSelected {color: white;background-color: #69c;font-weight:bold;}\n#sidebarTabs .txtMainTab .tabContents {background-color: #69c;}\n#sidebarTabs .txtMainTab .tabset {background-color:#696;}\n#sidebarTabs .txtMainTab .tabUnselected {color:#ace;background-color:#369;}\n\n#sidebarTabs .txtMoreTab .tabSelected {color:white;background-color: #7ad;font-weight:bold;}\n#sidebarTabs .txtMoreTab .tabUnselected {color:#ace;background-color:#369;}\n#sidebarTabs .txtMoreTab .tabContents {background-color: #7ad;}\n#sidebarTabs .txtMoreTab .tabset {background-color: #69c;}\n\n#sidebarTabs .tabContents .tiddlyLink {color: #135;}\n#sidebarTabs .tabContents .tiddlyLink:hover {background-color: #eee;color: black;}\n#sidebarTabs .tabContents .button {color: #eee;}\n#sidebarTabs .tabContents .button:hover {color: #white;background-color: #252;}\n\n\n\n/* colour scheme end */\n\n#displayArea {\n margin-right: 15.5em;\n margin-left: 13em;\n}\n\n// this works great in firefox but breaks something with ie. help??\n// .toolbar { float:right; }\n\n\n.viewer h1,\n.viewer h2,\n.viewer h3,\n.viewer h4,\n.viewer h5 { font-family: 'Trebuchet MS' Arial sans-serif; background:transparent;}\n\n.viewer h1 { font-size:1.2em; }\n.viewer h2 { font-size:1.1em; }\n.viewer h3 { font-size:1.0em; }\n.viewer h4 { font-size:0.9em; }\n.viewer h5 { font-size:0.8em; }\n\n.viewer h1 {border-bottom:solid #eee 2px;}\n\nbody {\n background:#eee;\n}\n\ndiv.tiddler {\n background:white;\n border-top:solid #ccc 2px;\n border-left:solid #ccc 2px;\n border-bottom:solid #aaa 2px;\n border-right:solid #aaa 2px;\n margin-bottom:5px;\n padding-bottom:10px;\n}\n\n\ndiv.title {\n font-family:'Trebuchet MS' Arial sans-serif;\n font-size:150%;\n}\n\ndiv.editor input,\ndiv.editor textarea {\n background:#ffe;\n border:solid #aa9 2px;\n margin:4px;\n}\n\ndiv#adsense {\n background:#ffd; border:solid 2px #bb9; text-align:center;\n margin-bottom:0.5em; \n padding:0.7em; \n overflow:hidden;\n}\n\n@media print {\n div.tiddler {border:none white 0px; border-top:solid #bbb 1px;}\n div.tagged {border:none white 0px;}\n #titleLine { display:none; }\n #displayArea { margin-right: 0px; margin-left: 0px; }\n .toolbar { display:none; }\n div#adsense { display:none; }\n}\n\n
ChooseTheme\nHowToFormat\n----\n\n[[Contact]]\n----\n<<newTiddler>>\n----\n[[tiddlywiki.com|http://www.tiddlywiki.com/]] (<<version>>)\n
<html>\n<a href="http://jasonmcdowell.libsyn.com">My Taiwanese blog</a>\n</html>
/***\n|''Name:''|NewHereButton|\n|''Version:''|1.0.1 (7-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#NewHereButton)|\n|''Author:''|SimonBaird|\n|''Type:''|Plugin|\n|''Requires:''|No special requirements but works well with TagglyTagging|\n!Description\nAdds a toolbar button which lets you create a new tiddler with a pre-entered tag of the name of the tiddler where you clicked the button. (Not as confusing as it sounds!).\n\n!Revision history\n* v1.0.0 (Jul-2005)\n** first version\n* v1.0.1 (7-Oct-2005)\n** added some this doco\n** fixed bug where it didn't add the necessary {{{[[}}} and {{{]]}}} when the current tiddler had a space in its title and you weren't using CommaSeparatedTags. Thanks Dan Knapp for this fix.\n\n!Code\n***/\n//{{{\n\nwindow.onClickToolbarNewHere = function(e) {\n if (!e) var e = window.event;\n clearMessage();\n if(this.parentNode.id) {\n displayTiddler(this.parentNode,"New Tiddler",2,null,null,false,false);\n tagBox = document.getElementById("editorTagsNew Tiddler"); \n var tagString = this.parentNode.id.substring(7);\n if (!window.commafyTags) // we aren't using comma separated tags plugin (commafyTags is a function)\n if(tagString.indexOf(" ") != -1)\n tagString = "[[" + tagString + "]]";\n tagBox.value = tagString;\n }\n e.cancelBubble = true; // do I need this?\n if (e.stopPropagation) e.stopPropagation(); // do I need this?\n return false;\n}\n\nconfig.views.wikified.toolbarNewHere = {\n text: "new here",\n tooltip: "Create a new tiddler tagged as this tiddler"\n};\n\nwindow.createTiddlerToolbar_mptw_newhere = window.createTiddlerToolbar;\n\nwindow.createTiddlerToolbar = function(title,isEditor) {\n // first create regular toolbar\n createTiddlerToolbar_mptw_newhere(title,isEditor);\n\n if(!isEditor) {\n // now add extra button\n var theToolbar = document.getElementById("toolbar" + title);\n var lingo = config.views.wikified;\n createTiddlyButton(theToolbar, lingo.toolbarNewHere.text, lingo.toolbarNewHere.tooltip, onClickToolbarNewHere);\n insertSpacer(theToolbar); // in case we wanna add any more buttons after this one\n }\n}\n\n//}}}\n
// //Use this if you get tired of deleting the default text when you create a tiddler.\n//{{{\nconfig.views.editor.defaultText = ""; // was "Type the text for '%0'"\n//}}}
Pe̍h-oē-jī is the romanization system I use.\n\nIt has different sounds and 6 tone marks.\n\n
// //''Name:'' Reminder plugin\n// //''Version:'' 2.2 (Sept 9, 2005)\n// //''Author:'' JeremySheeley\n// //''Contact:'' pop1280 [at] excite [dot] com\n\n// //''Installation'' \n// //1. Create a new tiddler in your tiddlywiki titled\n// // ReminderPlugin and give it the {{{systemConfig}}} \n// // tag. The tag is important because it tells TW \n// // that this is executable code.\n// //2. Double click this tiddler, and copy all the \n// // text from the tiddler's body.\n// //3. Paste the text into the body of the new tiddler \n// // in your TW.\n// //4. Save and reload your TW.\n// //5. You can copy some examples into your TW as well. // // See [[Simple Examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]\n\n// //''Syntax:'' \n// // There are three macros defined here\n// //* reminder - see [[ReminderSyntax]]\n// //* showReminders - see [[showRemindersSyntax]]\n// //* displayTiddlersWithReminders - see [[showRemindersSyntax]]\n\n// //''Description:'' \n// // This plugin provides macros for tagging a date with \n// // a reminder. Use the {{{reminder}}} macro to do \n// // this. The {{{showReminders}}} and \n// // {{{displayTiddlersWithReminder}}} macros \n// // automatically search through all available tiddlers \n// // looking for upcoming reminders.\n\n// //''Todo:''\n// //* Provide a user interface to creating a reminder.\n// //* \n\n// //''Configuration:''\n// //Modify this section to change the defaults for \n// //leadtime and display strings\n//{{{\n\nconfig.macros.reminders = {};\nconfig.macros["reminder"] = {};\nconfig.macros["showReminders"] = {};\nconfig.macros["displayTiddlersWithReminders"] = {};\n\nconfig.macros.reminders["defaultLeadTime"] = [0,6000];\n//config.macros.reminders["defaultReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY";\nconfig.macros.reminders["defaultReminderMessage"] = "|DIFF|TITLE|DATE ANNIVERSARY|";\n//config.macros.reminders["defaultShowReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY -- TIDDLER";\nconfig.macros.reminders["defaultShowReminderMessage"] = "|DIFF|TITLE |DATE ANNIVERSARY|TIDDLER|";\nconfig.macros.reminders["defaultAnniversaryMessage"] = "(DIFF)";\nconfig.macros.reminders["untitledReminder"] = "Untitled Reminder";\nconfig.macros.reminders["noReminderFound"] = "Couldn't find a match for TITLE in the next LEADTIMEUPPER days."\nconfig.macros.reminders["todayString"] = "Today";\nconfig.macros.reminders["tomorrowString"] = "Tomorrow";\nconfig.macros.reminders["ndaysString"] = "DIFF days";\n\n//}}}\n// // Code section. You should not need to edit anything // // below this. Make sure to edit this tiddler and copy \n// // the code from the text box, to make sure that \n// // tiddler rendering doesn't interfere with the copy \n// // and paste.\n//{{{\nconfig.macros.showReminders.handler = function(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var type = "";\n var num = 0;\n var leadtime = [0,14];\n var paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) \n || (paramHash["month"] != null) \n || (paramHash["day"] != null) \n || (paramHash["dayofweek"] != null)\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the \n //leadtime a few lines down.\n paramHash["leadtime"] = [-10000, 10000]\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n matchedDate = findDateForReminder(paramHash); \n }\n\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = "";\n for (j = 0; j < arr.length; j++)\n {\n if (paramHash["format"] != null)\n arr[j]["params"]["format"] = paramHash["format"];\n else\n arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];\n mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);\n mess += "\sn";\n }\n wikify(mess, elem, null, null);\n}\n\n\nconfig.macros.displayTiddlersWithReminders.handler = function(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var type = "";\n var num = 0;\n var leadtime = [0,14];\n var paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) \n || (paramHash["month"] != null) \n || (paramHash["day"] != null) \n || (paramHash["dayofweek"] != null)\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the leadtime \n //a few lines down.\n paramHash["leadtime"] = [-10000,10000];\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n matchedDate = findDateForReminder(paramHash); \n }\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n for (j = 0; j < arr.length; j++)\n {\n displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false)\n }\n}\n\nconfig.macros.reminder.handler = function(place,macroName,params)\n{\n var dateHash = getParamsForReminder(params);\n if (dateHash["hidden"] != null)\n return;\n var matchedDate = findDateForReminder(dateHash);\n var leadTime = dateHash["leadtime"];\n if (leadTime == null)\n leadTime = config.macros.reminders["defaultLeadTime"]; \n\n if (matchedDate != null)\n {\n var diff = matchedDate.getDifferenceInDays(new Date())\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate);\n wikify(mess, elem, null, null);\n }\n else\n createTiddlyElement(place,"span",null,null, config.macros.reminders["noReminderFound"].replace("TITLE", dateHash["title"]).replace("LEADTIMEUPPER", leadTime[1]).replace("LEADTIMELOWER", leadTime[0]) );\n}\n\nhasTag = function(tiddlerTags, tagFilters)\n{\n var bHasTag = false;\n var bNegative = false;\n for (var t3 = 0; t3 < tagFilters.length; t3++)\n {\n if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!')\n bHasTag = true;\n for(var t2=0; t2<tiddlerTags.length; t2++)\n {\n if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!')\n {\n if (tiddlerTags[t2] == tagFilters[t3].substring(1))\n {\n bHasTag = false;\n return false;\n }\n else\n bHasTag = true;\n }\n else if (tiddlerTags[t2] == tagFilters[t3])\n {\n bHasTag = true;\n return true;\n }\n }\n }\n return bHasTag;\n}\n\n//This function searches all tiddlers for the reminder //macro. It is intended that other plugins (like //calendar) will use this function to query for \n//upcoming reminders.\n//The arguments to this function filter out reminders //based on when they will fire.\n//\n//ARGUMENTS:\n//baseDate is the date that is used as "now". \n//leadtime is a two element int array, with leadtime[0] \n// as the lower bound and leadtime[1] as the\n// upper bound. A reasonable default is [0,14]\n//tags is a space-separated list of tags to use to filter \n// tiddlers. If a tag name begins with an !, then \n// only tiddlers which do not have that tag will \n// be considered. For example "examples holidays" \n// will search for reminders in any tiddlers that \n// are tagged with examples or holidays and \n// "!examples !holidays" will search for reminders \n// in any tiddlers that are not tagged with \n// examples or holidays. Pass in null to search \n// all tiddlers.\n//limit. If limit is null, individual reminders can \n// override the leadtime specified earlier. \n// Pass in 1 in order to override that behavior.\n\nfindTiddlersWithReminders = function(baseDate, leadtime, tags, limit)\n{\n var matches = store.search("reminder",false,false,"title","excludeSearch");\n var macroPattern = "<<([^>\s\ss]+)(?:\s\ss*)([^>]*)>>";\n var macroRegExp = new RegExp(macroPattern,"mg");\n var arr = [];\n var tagsArray = null;\n if (tags != null)\n tagsArray = tags.split(" ");\n for(var t=matches.length-1; t>=0; t--)\n {\n if (tagsArray != null)\n {\n //If they specified tags to filter on, and this tiddler doesn't \n //match, skip it entirely.\n if ( ! hasTag(matches[t].tags, tagsArray))\n continue;\n }\n\n var targetText = matches[t].text;\n do {\n // Get the next formatting match\n var formatMatch = macroRegExp.exec(targetText);\n var matchPos = formatMatch ? formatMatch.index : targetText.length;\n var level;\n var theBlockquote;\n if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")\n {\n //Find the matching date.\n var params = formatMatch[2].readMacroParams();\n var dateHash = getParamsForReminder(params);\n\n if (limit != null || dateHash["leadtime"] == null)\n dateHash["leadtime"] = leadtime;\n\n var matchedDate = findDateForReminder(dateHash, baseDate);\n if (matchedDate != null)\n {\n var hash = {};\n hash["diff"] = matchedDate.getDifferenceInDays(baseDate);\n hash["matchedDate"] = matchedDate;\n hash["params"] = dateHash;\n hash["tiddler"] = matches[t].title;\n hash["tags"] = matches[t].tags;\n arr.pushUnique(hash);\n }\n }\n }while(formatMatch);\n }\n if(arr.length > 1) //Sort the array by number of days remaining.\n arr.sort(function (a,b) {if(a["diff"] == b["diff"]) return(0); else return (a["diff"] < b["diff"]) ? -1 : +1; });\n return arr;\n}\n\n//This function takes the reminder macro parameters and\n//generates the string that is used for display.\n//This function is not intended to be called by \n//other plugins.\ngetReminderMessageForDisplay = function(diff, params, matchedDate, tiddlerTitle)\n{\n var anniversaryString = "";\n var reminderTitle = params["title"];\n if (reminderTitle == null)\n reminderTitle = config.macros.reminders["untitledReminder"];\n if (params["firstyear"] != null)\n anniversaryString = config.macros.reminders["defaultAnniversaryMessage"].replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));\n var mess = "";\n if (diff == 0)\n diffString = config.macros.reminders["todayString"];\n else if (diff == 1)\n diffString = config.macros.reminders["tomorrowString"];\n else\n diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);\n var format = config.macros.reminders["defaultReminderMessage"];\n if (params["format"] != null)\n format = params["format"];\n mess = format;\n if (tiddlerTitle != null)\n mess = mess.replace("TIDDLER", "[[" + tiddlerTitle + "]]");\n mess = matchedDate.formatString(mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("DDD MMM DD, YYYY")).replace("ANNIVERSARY", anniversaryString));\n return mess;\n}\n\n// Parse out the macro parameters into a hashtable. This\n// handles the arguments for reminder, showReminders and \n// displayTiddlersWithReminders.\ngetParamsForReminder = function(params)\n{\n var dateHash = {};\n var type = "";\n var num = 0;\n var title = "";\n for(var t=0; t<params.length; t++)\n {\n split = params[t].split(":");\n type = split[0].toLowerCase();\n var value = split[1];\n for (i=2; i < split.length; i++)\n value += ":" + split[i];\n if (type == "nolinks" || type == "limit" || type == "hidden")\n num = 1;\n else if (type == "leadtime")\n {\n leads = value.split("...");\n if (leads.length == 1)\n {\n leads[1]= leads[0];\n leads[0] = 0;\n }\n leads[0] = parseInt(leads[0]);\n leads[1] = parseInt(leads[1]);\n num = leads;\n }\n else if (type != "title" && type != "tag" && type != "format")\n num = parseInt(value);\n else\n {\n title = value;\n while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"')\n title += " " + params[++t];\n //Trim off the leading and trailing quotes\n if (title.substr(0,1) == "\s"" && title.substr(title.length - 1,1)== "\s"")\n title = title.substr(1, title.length - 2);\n num = title;\n }\n dateHash[type] = num;\n }\n //date is synonymous with day\n if (dateHash["day"] == null)\n dateHash["day"] = dateHash["date"];\n return dateHash;\n}\n\n//This function finds the date specified in the reminder \n//parameters. It will return null if no match can be\n//found. This function is not intended to be used by\n//other plugins.\nfindDateForReminder = function( dateHash, baseDate)\n{\n if (baseDate == null)\n baseDate = new Date().getMidnight();\n var leadTime = dateHash["leadtime"];\n var bOffsetSpecified = dateHash["offsetyear"] != null \n || dateHash["offsetmonth"] != null\n || dateHash["offsetday"] != null\n || dateHash["offsetdayofweek"] != null\n || dateHash["recurdays"] != null;\n \n if (leadTime == null)\n leadTime = config.macros.reminders["defaultLeadTime"]; \n var matchedDate = baseDate.findMatch(dateHash, bOffsetSpecified ? [0, 6000] : leadTime);\n if (matchedDate != null)\n {\n var newMatchedDate = matchedDate;\n if (dateHash["recurdays"] != null)\n {\n while (newMatchedDate.getTime() < baseDate.getTime())\n {\n newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);\n }\n }\n else if (dateHash["offsetyear"] != null \n || dateHash["offsetmonth"] != null\n || dateHash["offsetday"] != null\n || dateHash["offsetdayofweek"] != null)\n {\n dateHash["year"] = dateHash["offsetyear"];\n dateHash["month"] = dateHash["offsetmonth"];\n dateHash["day"] = dateHash["offsetday"];\n dateHash["dayofweek"] = dateHash["offsetdayofweek"];\n newMatchedDate = matchedDate.findMatch(dateHash, leadTime);\n //The offset couldn't be matched. return null.\n if (newMatchedDate == null)\n return null;\n }\n var diff2 = newMatchedDate.getDifferenceInDays(baseDate);\n if (diff2 <= leadTime[1] && diff2 >= leadTime[0])\n return newMatchedDate;\n }\n return null;\n}\n\n//This does much the same job as findDateForReminder, but\n//this one doesn't deal with offsets or recurring \n//reminders.\nDate.prototype.findMatch = function(dateHash, leadTime)\n{\n var bSpecifiedYear = (dateHash["year"] != null);\n var bSpecifiedMonth = (dateHash["month"] != null);\n var bSpecifiedDay = (dateHash["day"] != null);\n var bSpecifiedDayOfWeek = (dateHash["dayofweek"] != null);\n if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)\n return Date.convertFromYYYYMMDDHHMM("" + dateHash["year"] + String.zeroPad(dateHash["month"],2) + String.zeroPad(dateHash["day"],2) + "0000");\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n var searchInterval = 1;\n if (bSpecifiedDayOfWeek && dateHash["dayofweek"] < 0)\n {\n dateHash["dayofweek"] = dateHash["dayofweek"] * -1;\n searchInterval = -1;\n }\n if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)\n {\n\n //Shortcut -- First try this year. If it's too small, try next year.\n var tmpMidnight = this.getMidnight();\n var tmpLeadTime = this.addDays(leadTime[0]).getMidnight();\n var tmpDate = Date.convertFromYYYYMMDDHHMM("" + this.getFullYear() + String.zeroPad(dateHash["month"],2) + String.zeroPad(dateHash["day"],2) + "0000");\n if (tmpDate.getTime() < tmpLeadTime.getTime())\n tmpDate = Date.convertFromYYYYMMDDHHMM("" + (this.getFullYear() + 1) + String.zeroPad(dateHash["month"],2) + String.zeroPad(dateHash["day"],2) + "0000");\n var diff2 = tmpDate.getDifferenceInDays(tmpMidnight);\n\n if (diff2 <= leadTime[1] && diff2 >= leadTime[0])\n return tmpDate;\n else\n return null;\n }\n\n for (i = 0; i <= leadTime[1]; i+=searchInterval)\n {\n var newDate = this.addDays(i);\n if (bSpecifiedYear)\n bMatchedYear = ((dateHash["year"] - 1900) == newDate.getYear());\n if (bSpecifiedMonth)\n bMatchedMonth = ((dateHash["month"] - 1) == newDate.getMonth() );\n if (bSpecifiedDay)\n bMatchedDay = (dateHash["day"] == newDate.getDate());\n if (bSpecifiedDayOfWeek)\n bMatchedDayOfWeek = (dateHash["dayofweek"] == newDate.getDay());\n\n if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)\n return newDate;\n }\n//Only search backwards if we're not just trying to match the dayofweek\nif (leadTime[0] < 0 && (bSpecifiedYear || bSpecifiedMonth || bSpecifiedDay))\n for (i = 0; i >= leadTime[0]; i+=(searchInterval * -1))\n {\n var newDate = this.addDays(i);\n if (bSpecifiedYear)\n bMatchedYear = ((dateHash["year"] - 1900) == newDate.getYear());\n if (bSpecifiedMonth)\n bMatchedMonth = ((dateHash["month"] - 1) == newDate.getMonth() );\n if (bSpecifiedDay)\n bMatchedDay = (dateHash["day"] == newDate.getDate());\n if (bSpecifiedDayOfWeek)\n bMatchedDayOfWeek = (dateHash["dayofweek"] == newDate.getDay());\n\n if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)\n return newDate;\n }\n}\n\n//Return a new date, with the time set to midnight (0000)\nDate.prototype.getMidnight = function()\n{\n return Date.convertFromYYYYMMDDHHMM("" + this.getFullYear() + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + "0000");\n}\n// Add the specified number of days to a date.\nDate.prototype.addDays = function(numberOfDays)\n{\n return(new Date(this.getTime() + (86400000 * numberOfDays)));\n}\n//Return the number of days between two dates.\nDate.prototype.getDifferenceInDays = function(otherDate)\n{\n return Math.floor((this.getMidnight().getTime() - otherDate.getMidnight().getTime()) / 86400000);\n \n}\n\n//}}}\n
/***\n|''Name:''|ShortenTabLinks|\n|''Version:''|1.0.2 (11-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#ShortenTabLinks)|\n|''Author:''|SimonBaird|\n|''Type:''|Plugin|\n!Description\nTruncate Tiddler links in the sideBarTabs. Add ... to end of truncated links. \n\n!Directions:\nYou might want to adjust the length to truncate at. See config section in code below.\n\n!Revision History\n* v1.0.1 (09-Sep-2005)\n** Added this documentation. Fixed bug where it was triggering inside tabs macro (the parent3 stuff).\n* v1.0.2 (11-Oct-2005)\n** Updated documentation\n\n!Code\n***/\n//{{{\n\n// adjust this to your preference:\nconfig.mptw_shortnames = {\n trimAt: 20\n};\n\nwindow.createTiddlyLink_orig_mptw_shortnames = window.createTiddlyLink;\n\nwindow.createTiddlyLink = function(place,title,includeText) {\n\n // first create the button using the standard create function\n // this will survive upgrades better than the my old way which\n // was to replace the entire function\n var btn = createTiddlyLink_orig_mptw_shortnames(place,title,includeText);\n\n // use this trick to check if we are in a sidebar\n\n var parent3id = null;\n var parent5id = null;\n var parent7id = null;\n\n try {\n parent3id = btn.parentNode.parentNode.parentNode.id;\n parent5id = btn.parentNode.parentNode.parentNode.parentNode.parentNode.id;\n parent7id = btn.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id;\n }\n catch (e) {}\n\n // three gets the timeline\n // five gets the all and tags?\n // seven gets the stuff in the More tab\n // apologies for ugliness. must be a better way to determine if in sidebar???\n\n if (parent3id == "sidebarTabs" || parent5id == "sidebarTabs" || parent7id == "sidebarTabs") {\n // we must be in a sidebar\n // so lets do our thing\n\n var trimAt = config.mptw_shortnames.trimAt;\n \n // check if we need to trim\n if (title.length > trimAt) {\n shortTitle = title.substring(0,trimAt).trim(); // why doesn't this trim seem to work???\n // um, wouldn't need this bit if the trim worked.\n while (shortTitle.substr(shortTitle.length-1) == " ") {\n shortTitle = shortTitle.substr(0,shortTitle.length-1);\n }\n removeChildren(btn); // btn is an a element and only has one child, the text node\n btn.appendChild(document.createTextNode(shortTitle+"…")); // it's a &hellip;\n }\n }\n return btn;\n}\n\n//}}}\n
//{{{\nconfig.shadowTiddlers.SideBarOptions = config.shadowTiddlers.SideBarOptions.replace(\n /gradient vert #...... #....../,\n "gradient vert #447744 #88aa88"\n );\n//}}}\n
[[Jason McDowell's experiences learning Taiwanese|SiteSubtitle]]
[[My Taiwanese Podcast]]
[[MPTWStyle]]
/***\n|''Name:''|TagglyTagging|\n|''Version:''|1.0.3 (11-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#TagglyTagging)|\n|''Author:''|SimonBaird|\n|''Type:''|Plugin|\n!Description\nSee TagglyTaggingFAQ (http://homes.jcu.edu.au/~ccscb/mptw/#TagglyTaggingFAQ)\n\n!Issues\n* Suffers from the same mouseover glitch in IE as the tiddler toolbar buttons. Makes it hard to get your sort controls visible in IE. You have to put the mouse over the "Tagged as" label.\n\n!Directions\n* You can changed your preferred default sort order and format by editing defaultOptions below.\n\n!Revision history\n* v1.0.0 (Jul-2005)\n** first working version\n** (probably a bunch of unrecorded changes between 1.0.0 and 1.0.1)\n* v1.0.1 (9-Oct-2005)\n** added this doco\n** add ability to change sort and format\n* v1.0.2 (10-Oct-2005)\n** fixed missing tag count in tags tab (thanks [[Clint]] for this fix)\n* v1.0.3 (11-Oct-2005)\n** fixed bug in part that interacts with [[ShortenTabLinks]]. (Thanks to [[Paul Petterson]] for locating this.)\n\n!Code\n***/\n//{{{\nif (!config.plugins) config.plugins = [];\n\nconfig.plugins.TagglyTagging = {\n\n // edit this to your preference. name|date-asc|desc-bullets|commas\n defaultOptions: "name-asc-bullets", \n\n formats: {\n bullets: "*[[%0]]\sn",\n commas: "[[%0]], "\n },\n\n tiddlerFields: {\n name: "title",\n date: "modified"\n }\n\n};\n\nfunction TagglyOptions(optionsString) {\n var opts = optionsString.split("-");\n this.sortField = opts[0];\n this.sortOrder = opts[1];\n this.listFormat = opts[2];\n return this;\n}\n\nTagglyOptions.prototype.toggleListFormat = function() {\n return (this.listFormat == "bullets")?"commas":"bullets";\n}\n\nTagglyOptions.prototype.optionsString = function() {\n return [this.sortField,this.sortOrder,this.listFormat].join("-");\n}\n\nTagglyOptions.prototype.toggleSortOrder = function() {\n return (this.sortOrder == "asc")?"desc":"asc";\n}\n\nTagglyOptions.prototype.formatString = function() {\n return config.plugins.TagglyTagging.formats[this.listFormat];\n}\n\nTagglyOptions.prototype.tiddlerField = function() {\n return config.plugins.TagglyTagging.tiddlerFields[this.sortField];\n}\n\n\nTagglyOptions.prototype.buttonLabels = function() {\n var upArrow = "↑";\n var downArrow = "↓";\n var result = { name: "name", date: "date", format: this.toggleListFormat() };\n // asc means down the page hence arrows are reverse what you might first expect\n if (this.sortField == "name")\n result.name += (this.sortOrder == "desc")?upArrow:downArrow;\n else if (this.sortField == "date")\n result.date += (this.sortOrder == "desc")?upArrow:downArrow; \n return result;\n}\n\n// override function in prototype to allow asc or desc sorting\nstore.reverseLookup_mptw_ascdesc = store.reverseLookup;\nstore.reverseLookup = function(lookupField,lookupValue,lookupMatch,sortField,sortAscDesc) {\n var results = this.reverseLookup_mptw_ascdesc(lookupField,lookupValue,lookupMatch,sortField);\n if (sortAscDesc && sortAscDesc == "desc")\n results.reverse();\n return results;\n}\n\n// This is a short function I will just replace it rather than try to hijack. hence may break in future TWs\nstore.getTaggedTiddlers = function(tag,sortField,ascdesc) {\n return this.reverseLookup("tags",tag,true,sortField,ascdesc);\n}\n\nsetStylesheet(\n".tiny {color:#bbb; font-size:80%;padding:0px;margin:0px;margin-right:0.7em;}\sn"+\n"a.tiny {color:#999!important; padding:2px; }\sn"+\n"a.tiny:hover {background:#ddd!important; }\sn"+\n".hideTaggedControls {display:none;}\sn"+\n".showTaggedControls { }\sn"+\n"","taggedControls");\n\nfunction getTaggedTiddlersText(title,options) {\n var tags = store.getTaggedTiddlers(title,options.tiddlerField(),options.sortOrder)\n var str=""; \n for (i=0; i<tags.length; i++)\n str += options.formatString().format([tags[i].title]);\n return str;\n}\n\nfunction getTagglyOptionsString(theTiddler) {\n var element = document.getElementById("taggedOptions"+theTiddler);\n if (element)\n return element.firstChild.nodeValue;\n else \n return null;\n}\nfunction handleOptionClickAndRefresh(theTiddler,thingClicked) {\n\n // get the optionsString out of the taggedOptions invisible span\n var options = new TagglyOptions(getTagglyOptionsString(theTiddler));\n \n if (thingClicked == "name" && options.sortField == "name") \n options.sortOrder = options.toggleSortOrder();\n else if (thingClicked == "date" && options.sortField == "date") \n options.sortOrder = options.toggleSortOrder();\n else if (thingClicked == "date" && options.sortField == "name") \n options.sortField = "date";\n else if (thingClicked == "name" && options.sortField == "date") \n options.sortField = "name";\n else if (thingClicked == "format")\n options.listFormat = options.toggleListFormat();\n\n refreshTaggedList(theTiddler,options,true);\n}\n\nfunction onClickOptName(e) {\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theTiddler = findContainingTiddler(theTarget).id.substr(7);\n var state = handleOptionClickAndRefresh(theTiddler,"name");\n return false;\n}\n\nfunction onClickOptDate(e) {\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theTiddler = findContainingTiddler(theTarget).id.substr(7);\n var state = handleOptionClickAndRefresh(theTiddler,"date");\n return false;\n}\n\nfunction onClickOptFormat(e) {\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theTiddler = findContainingTiddler(theTarget).id.substr(7);\n var state = handleOptionClickAndRefresh(theTiddler,"format");\n return false;\n}\n\n\nconfig.macros.taggedSortControls = {};\nconfig.macros.taggedSortControls.handler = function(place,macroName,params) {\n var opts = new TagglyOptions(params[0]);\n var labels = opts.buttonLabels();\n var b1 = createTiddlyButton(place,labels.name,"Click to sort",onClickOptName,"tiny");\n var b2 = createTiddlyButton(place,labels.date,"Click sort",onClickOptDate,"tiny");\n var b3 = createTiddlyButton(place,labels.format,"Click to change format",onClickOptFormat,"tiny");\n}\n\nfunction onMouseOverTaggedContainer(e) {\n if (!e) var e = window.event;\n var tiddler = findContainingTiddler(resolveTarget(e)).id.substr(7);\n var foo = document.getElementById("taggedControls"+tiddler);\n if (foo) {\n foo.className = "showTaggedControls"; \n }\n\n}\n\nfunction onMouseOutTaggedContainer(e) {\n if (!e) var e = window.event;\n var tiddler = findContainingTiddler(resolveTarget(e)).id.substr(7);\n var foo = document.getElementById("taggedControls"+tiddler);\n if (foo)\n foo.className = "hideTaggedControls";\n}\n\n// use this to (re)build the tagged list for a tiddler\nfunction refreshTaggedList(title,options,donthide) {\n\n if (!options) {\n // must be refreshing already on screen tiddler\n // so read existing options\n // not changing any of them\n var optStr = getTagglyOptionsString(title);\n if (optStr) \n options = new TagglyOptions(optStr);\n }\n if (!options) {\n // must be creating for the first time\n // so read default options\n options = new TagglyOptions(config.plugins.TagglyTagging.defaultOptions);\n }\n\n if (!donthide) donthide = false; // normally hide waiting for mouseover\n var theViewer = document.getElementById("viewer"+title);\n if (theViewer) {\n\n var theTagged = document.getElementById("tagged"+title);\n if (theTagged)\n theTagged.parentNode.removeChild(theTagged);\n\n var taggedText = getTaggedTiddlersText(title,options);\n\n if (taggedText != "") {\n var newTaggedList = createTiddlyElement(theViewer,"div","tagged" + title,"tagged",null); \n createTiddlyElement(newTaggedList,"span",null,"tiny","Tagged as "+title+":"); \n\n // will put the options string in this hidden span so we can read it later\n var newTaggedOptions = createTiddlyElement(newTaggedList,\n "span","taggedOptions" + title, "hideTaggedControls",options.optionsString()); \n\n var newTaggedControls = createTiddlyElement(newTaggedList,\n "span","taggedControls" + title, donthide?"showTaggedControls":"hideTaggedControls",null); \n\n wikify('<<taggedSortControls '+options.optionsString()+'>>', newTaggedControls); \n\n if (options.listFormat == "commas")\n taggedText = taggedText.replace(/^/,"\sn").replace(/, $/,"\sn");\n\n wikify(taggedText, newTaggedList); \n\n newTaggedList.onmouseover = onMouseOverTaggedContainer;\n newTaggedList.onmouseout = onMouseOutTaggedContainer;\n }\n }\n}\n\n// I want to refresh the tagged list in other visible tiddlers\n// this is to refresh if we remove a tiddler\nwindow.deleteTiddler_orig_mptw_tagglytagging = window.deleteTiddler;\nwindow.deleteTiddler = function(title) {\n var oldtags = [];\n var tiddler = store.tiddlers[title];\n if (tiddler) {\n var oldtags = tiddler.tags;\n }\n\n deleteTiddler_orig_mptw_tagglytagging(title);\n\n for (i=0; i<oldtags.length; i++) {\n refreshTaggedList(oldtags[i]);\n }\n}\n\n// this is if we edit a tiddler\n// refresh tags on screen\nwindow.saveTiddler_orig_mptw_tagglytagging = window.saveTiddler;\nwindow.saveTiddler = function(title) {\n\n var newTitle = document.getElementById("editorTitle"+title).value;\n\n var oldtags = [];\n var tiddler = store.tiddlers[title];\n if (tiddler) {\n var oldtags = tiddler.tags;\n }\n \n saveTiddler_orig_mptw_tagglytagging(title);\n\n var newtags = store.tiddlers[newTitle].tags;\n\n for (i=0; i<newtags.length; i++) {\n refreshTaggedList(newtags[i]);\n }\n\n // will do lots twice. should do a unique on oldtags and newtags\n // probably its fast enough that we don't care\n\n for (i=0; i<oldtags.length; i++) {\n refreshTaggedList(oldtags[i]);\n }\n\n}\n\n//==========================================================\n\nwindow.createTiddlerViewer_orig_mptw_tagging = window.createTiddlerViewer;\nwindow.createTiddlerViewer = function(title,highlightText,highlightCaseSensitive) {\n createTiddlerViewer_orig_mptw_tagging(title,highlightText,highlightCaseSensitive);\n refreshTaggedList(title);\n}\n\n\n//==========================================================\n// only change in this is to put the footer above the title... \n// I know that's a bit strange but it's the easiest way to move the tag buttons\n\nwindow.createTiddlerSkeleton_orig_mptw_tagging = window.createTiddlerSkeleton;\nwindow.createTiddlerSkeleton = function(place,before,title)\n{\n var theTiddler = createTiddlerSkeleton_orig_mptw_tagging(place,before,title);\n theFooter = document.getElementById("footer"+title);\n theTitle = document.getElementById("title"+title);\n // want to put the footer up above the title\n theTiddler.childNodes[0].insertBefore(theFooter,theTitle);\n return(theTiddler);\n}\n\n\n//==========================================================\n// I want a TiddlyLink in place of a TagButton\n\nwindow.createTagButton = function(place,tag,excludeTiddler) {\n return createTiddlyLink(place,tag,tag);\n}\n\n//==========================================================\n// this is to make the Tags tab work the same. TiddlyLink instead of Tag button\n\nconfig.macros.allTags.handler = function(place,macroName,params) {\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul",null,null,null);\n if(tags.length == 0) {\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n }\n\n // bad hack so the shorten tab links plugin shortens these a little shorter :)\n var adjustShorten = 2;\n if (config.mptw_shortnames) config.mptw_shortnames.trimAt -= adjustShorten;\n\n for (t=0; t<tags.length; t++) {\n var theListItem=createTiddlyElement(theDateList,"li",null,"listLink",null);\n // not sure why the following doesn't show the count\n var theTag = createTiddlyLink(theListItem,tags[t][0],tags[t][0] + "(" + tags[t][1] + ")");\n // but this puts it in anyway (thanks Clint for this fix).\n theTag.appendChild(document.createTextNode(" ("+tags[t][1]+")")); \n theTag.setAttribute("tag",tags[t][0]);\n }\n\n // other part of bad hack \n if (config.mptw_shortnames) config.mptw_shortnames.trimAt += adjustShorten;\n}\n\n\nconfig.views.wikified.tag.labelNoTags = "";\nconfig.views.wikified.tag.labelTags = "";\n\nsetStylesheet(\n".tagged {background:#f8f8f8;margin-top:0.5em;border: solid #f0f0f0 3px; margin-bottom:0px;padding-bottom:0.5em;padding-left:0.5em;}\sn"+\n".tagged ul {padding-top:0px;margin-top:0px;margin-bottom:2px;list-style-type:square;margin-left:1.2em;padding-left:0;}\sn"+\n".footer a.tiddlyLink { padding-top:0px;margin-right:2em;}\sn"+\n".footer {margin-top:0px;padding-top:0px;}\sn"+\n"",'tagglyTaggingStyles');\n\n\n//}}}\n\n
/***\n|''Name:''|TagsBoxAtTop|\n|''Version:''|1.0.3 (11-Oct-2005)|\n|''Source:''|MonkeyPirateTiddlyWiki (http://homes.jcu.edu.au/~ccscb/mptw/#TagsBoxAtTop)|\n|''Author:''|SimonBaird|\n|''Type:''|Plugin|\n!Description\nThis puts the tags box up under the title box when you edit a tiddler. Also adds some labels. This layout emulates the original TagglyWiki editing layout.\n\n!Revision History\n* 1.0.2 (09-Oct-2005)\n** Added classes to title and tags box so they can be styled (as suggested by [[Clint]])\n** Added labels\n* 1.0.3 (11-Oct-2005)\n** Added documentation\n\n!Code\n***/\n//{{{\n\nwindow.createTiddlerEditor_mptw_tagstop = window.createTiddlerEditor;\nwindow.createTiddlerEditor = function(title) {\n\n createTiddlerEditor_mptw_tagstop(title);\n\n var theEditor = document.getElementById("editorWrapper"+title);\n var theTitleBox = document.getElementById("editorTitle"+title);\n var theTagsBox = document.getElementById("editorTags"+title);\n var theBodyBox = document.getElementById("editorBody"+title);\n var tagPrompt = document.getElementById("editorFooter"+title);\n\n // so we can style them if we like\n theTitleBox.className += " titleBox";\n theTagsBox.className += " tagsBox";\n\n // put tags box above body\n theEditor.insertBefore(theTagsBox,theBodyBox);\n\n // put "Type tags..." message above body too\n theEditor.insertBefore(theEditor.childNodes[3],theBodyBox);\n\n // add some labels\n var titleLabel = createTiddlyElement(theEditor,"span",null,"titleLabel","Title:");\n var tagsLabel = createTiddlyElement(theEditor,"span",null,"tagsLabel","Tags:");\n var contentLabel = createTiddlyElement(theEditor,"span",null,"contentLabel","Content:");\n\n // put them in the right place\n theEditor.insertBefore(tagsLabel,theTagsBox);\n theEditor.insertBefore(titleLabel,theTitleBox);\n theEditor.insertBefore(contentLabel,theBodyBox);\n\n}\n//}}}
I created a Taiwanese keyboard layout for Mac OS X\n\nYou can download it at my website here: http://libsyn.com/podcasts/jasonmcdowell/_static/Taiwanese.keylayout\n\nTo install the Taiwanese keyboard layout:\n* put it in the "Keyboard Layouts" folder in your Library folder.\n* Go to the "International" Pane in System Preferences and click on "Taiwanese" for your Input Menu.\n\nThis keyboard layout makes it easier to type in [[Pe̍h-oē-jī]], the [[romanization]] system I use.\n\nThe layout is based on the regular US Extended keyboard layout but I am using the number keys 0-9 for tones.\nIn my layout to create a letter with a tone mark over it:\n''Tones:''\n1. Push the number key corresponding to the tone you want\n2. Push the letter you want.\n''Nasal and O-dot''\n1. Push the ''9'' key to create the nasal character ⁿ.\n2. Push the ''0'' key to create the O-dot character o.\n\n\n''Example''\nThe word for "monkey" is //kâu//.\nThe letter a in //kâu// has the 5th tone mark above it.\nTo type â in my keyboard layout, push ''5'' then ''a''.\n\n
#sidebarTabs .tabContents { overflow:visible; white-space:normal; width:auto; }\n\n#contentWrapper div.tagged {\n background: #33180a;\n border: 1px solid #613725;\n margin-bottom:1em;\n}\n\n\nbody{\n background: #000;\n}\n\n#contentWrapper{\n margin: 0 10px;\n background: #321c10;\n border: 1px solid #613725;\n}\n\n#mainMenu{\n position: relative;\n float: left;\n font-size: 12px;\n text-align: left;\n background: #321c10;\n color: #c5886b;\n width: 15em;\n padding: .2em .5em .2em 0;\n}\n\n#MainMenu h1{\n font-size: 13px;\n font-weight: normal;\n margin: 0 0 0 2px;\n}\n\n#mainMenu li, #mainMenu ul{\n padding: 0;\n margin: 0;\n}\n\n#mainMenu ul, #messageArea{\n display: block;\n border: 1px solid #905437;\n padding: 0 0 0 1em;\n background: #522d1e;\n margin: 0 0 1em 0;\n}\n\n#messageArea{\n display: none;\n padding: 1em;\n}\n\n#mainMenu li{\n list-style: none;\n}\n\n#contentWrapper #mainMenu a.button,\n#contentWrapper #mainMenu a.tiddlyLink,\n#contentWrapper #mainMenu a.externalLink,\n#messageArea a:link, #sidebar .button{\n color: #fb9950;\n text-decoration: none;\n}\n\n#contentWrapper #mainMenu a.button:hover,\n#contentWrapper #mainMenu a.tiddlyLink:hover,\n#contentWrapper #mainMenu a.externalLink:hover,\n#messageArea a:hover, #sidebar .button:hover{\n color: #c17135;\n background: transparent;\n text-decoration: underline;\n}\n\n#sidebar .sliderPanel{\n background: #000;\n color: #94532d;\n}\n\n#titleLine{\n color: #94532d;\n background: #000;\n padding: 1em;\n border-bottom: 1px solid #613725;\n}\n\n#siteTitle{\n font-size: 24px;\n font-weight: bold;\n}\n\n#titleLine a{\n color: #fb9950;\n}\n\n#sidebar, #sidebarOptions, #sidebarTabs{\n background: transparent;\n}\n\n#contentWrapper .tabSelected{\n background: #522d1e;\n border: 1px solid #905437;\n border-bottom: 0;\n padding-bottom: 3px;\n cursor: default;\n color: #fb9950;\n font-weight: bold;\n}\n\n#contentWrapper .tabUnselected, #contentWrapper .tabcontents .tabSelected{\n background: #2a170d;\n border: 1px solid #542e21;\n border-bottom: 0;\n padding-bottom: 0px;\n color: #fb9950;\n}\n\n#contentWrapper .tabUnselected:hover{\n color: #c17135\n}\n\n#contentWrapper .tabcontents .tabSelected{\n padding-bottom: 3px;\n border: 1px solid #905437;\n border-bottom: 0;\n}\n\n#contentWrapper .tabcontents .tabUnselected{\nbackground: #522d1e;\n border: 1px solid #613725;\n border-bottom: 0;\n padding-bottom: 0;\n}\n\n/* TiddlySinister was desgined by Clint Checketts (http://15black.bluedepot.com) and inspired from Minz Meyer (http://www.minzweb.de) */\n\n\n#contentWrapper .tabContents{\n background: #522d1e;\n border: 1px solid #905437;\n border-width: 1px 0;\n}\n\n#contentWrapper .tabContents .tabContents{\nbackground: #2a170d;\n border: 1px solid #905437;\n}\n\n#contentWrapper .tabContents li.listTitle{\n color: #c5886b;\n}\n\n#contentWrapper .tabContents li a.tiddlyLink,#contentWrapper .tabContents li a.button{\n color: #fb9950\n}\n\n#contentWrapper .tabContents li a.tiddlyLink:hover, #contentWrapper .tabContents li a.button:hover{\n color: #c17135;\n background: transparent;\n text-decoration: underline;\n}\n\n#popup{\n background: #522d1e;\n border: 1px solid #905437;\n z-index: 50;\n}\n\n.toolbar #popup{\n min-width: 12em;\n}\n\n#popup hr{\n border-top: 1px solid #905437;\n width: 75%;\n}\n\n#popup a.button,#popup a.tiddlyLink{\n color: #fb9950\n}\n\n#popup a.button:hover,#popup a.tiddlyLink:hover{\n color: #c17135;\n background: transparent;\n text-decoration: underline;\n}\n\n#displayArea{\n position: relative;\n margin: 0 14em 0em 15.5em;\n padding: 1em 2em 0 2em;\n background: #33180a;\n border: 1px solid #613725;\n min-height: 400px;\n _position: static;\n}\n\ndiv.unselectedTiddler, div.selectedTiddler{\n border-top: 25px solid #000;\n}\n\n.tiddler{\n background: #2a170d;\n border: 1px solid #542e21;\n margin: 0 0 2em 0;\n position: relative;\n _position; static;\n}\n\n.title{\n position: absolute;\n top:1px;\n left: 5px;\n color: #fb9950;\n font-size: 14px;\n font-weight: normal;\n line-height: 23px;\n _position: static;\n}\n\n.toolbar{\n position: absolute;\n top: 5px;\n right: 2px;\n _position: static; /* Dumb IE hack */\n}\n\n\n.viewer h1, h2, h3, h4, h5, h6{\n background: transparent;\n}\n\n#contentWrapper #displayArea a.button,#contentWrapper #displayArea a.tiddlyLink,#contentWrapper #displayArea a.externalLink{\n color: #fb9950;\n background: transparent;\n border: 0;\n}\n\n\n#contentWrapper #displayArea a.button:hover,#contentWrapper #displayArea a.tiddlyLink:hover,#contentWrapper #displayArea a.externalLink:hover{\n color: #c17135;\n background: transparent;\n text-decoration: underline;\n}\n\n.viewer, .editer, .editorFooter{\n color: #c5886b;\n}\n\n.editor textarea, input{\n max-height: 35em;\n background: #c5886b;\n border: 2px inset #613725;\n}\n\n.editor textarea:focus, input:focus{\n background: #ddb9a8;\n}\n\n\n
The original, revolutionary, super cool, 100% javascript, microcontent, wiki in a web page, created and maintained by JeremyRuston. For more information visit http://www.tiddlywiki.com/.\n\nSo what is TiddlyWiki? In short it's a wiki implemented in javascript and stored in a single html file. But you can think of it as ''an electronic notepad from the future''. Try these links for more information:\n*http://www.tiddlywiki.com/#TiddlyWiki\n*http://euicho.com/index.php?p=123\n*http://www.blogjones.com/TiddlyWikiTutorial.html\n*http://homes.jcu.edu.au/~ccscb/mptw/
Ukelele: Unicode Keyboard Layout Editor\n\nThis is the application I used to make my TaiwaneseKeyboardLayout.\n\nYou can find the program here: http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=ukelele\n
.ApplyZeldmanOrangeButton:after {\n font-weight: bold;\n content:"\s00A0\s221A";\n}\n\n\n#popup{\n padding-left: 2px !important;\n padding-bottom: 2px !important;\n}\n\n#popup *{\n border: 0 !important;\n}\n\n#popup hr {\n border-top: solid 1px #f5d7b8!important; \n border-left: none;\n border-right: none;\n border-bottom: none;\n height: 1px;\n color: #f5d7b8;\n width: 98%;\n}\n\nbody {\n margin: 0px;\n background-color: #fff;\n font-size: 9pt;\n font-family: tahoma,arial,helvetica;\n padding: 0;\ncolor: #867663;\n}\n\na:link, a:visited, a:hover, a:active {\n text-decoration: none;\n color: #be540b;\n}\n\n#header {\n display: block;\n width: 100%;\n border-top: 100px solid #c51\n}\n\n#header a{\n color: white !important;\n line-height: .8em;\n}\n\n#header a:hover{\nborder-bottom: 2px dotted;\nmargin-bottom: -2px;\n}\n\n#titleLine {\n color: #fff;\n background: #bcd;\n padding: 0px;\n border-top: 8px solid #b8764c;\n background-color: #cf936c;\n border-bottom: 3px solid #f5d7b4;\n height: 5px;\n\n}\n\n#titleLine a {\n text-decoration: none;\n color: #9ab;\n}\n\n#siteTitle {\n font-size: 40pt;\n font-weight: bold;\nposition: absolute;\n right: 20px;\n top: .2em;\n color: #fff;\n float: right;\n}\n\n#siteSubtitle {\n font-size: 12pt;\n font-family: georgia,times;\n color: #fff;\n display: block;\n position: absolute;\n top: 4.5em;\n right: 40px;\ntext-align: right;\n}\n\n#mainMenu {\n font-size: 12px;\n //float: left;\n width: 13em;\n margin: 1em 1em .5em 1em;\n background: #fff;\n color: black;\n text-align: center;\npadding: 0;\nborder: 1px solid #f5d7b4;\n}\n\n#mainMenu br{\ndisplay:none;\n}\n\n#mainMenu b a {\ncolor: #fff;\nbackground-color: #d16400;\nfont-weight: normal;\ndisplay:block;\n}\n\n#mainMenu a.tiddlyLink, #mainMenu a.button{\ndisplay: block; \n text-decoration: none;\n width: 13em;\ncolor: #f79b60;\n border-top: 1px solid #f5d7b4;\n border-bottom: 1px solid #f5d7b4;\nmargin: -1px auto 0px auto;\nline-height: 1.5em;\n text-transform: capitalize;\n}\n\n#mainMenu a:hover {\n color: #930 !important;\n background-color: #f5d7b4 !important;\n}\n\n#displayArea {\n margin: 1em 14em 0em 15em;\n}\n\n#messageArea {\n background-color: #f5d7b4;\n color: #867663;\n padding: 0.5em 0.5em 0.5em 0.5em;\n margin: 0em 0em 0.6em 0em;\n border-bottom: 1px solid #458;\n display: none;\n}\n\n#messageArea a:link, #messageArea a:visited {\n display: inline;\n text-decoration: underline;\n color: #c51;\n}\n\n#messageArea a:hover {\n color: #f79b60;\n}\n\n#messageArea a:active {\n color: #fff;\n}\n\n.tiddler {\n border: 1px solid #fff;\n margin: 0 10px 20px;\n padding: 8px;\n padding-top:0;\n font-family: arial,georgia,times;\n background-color: #fff;\n}\n\n#tiddlerDisplay div.tiddler:hover {\n border: 1px solid #ccc;\n}\n\n.innerTiddler {\n padding: 0.7em 1em 1em 0.8em;\n font-size: 9pt;\n background-color: #fff;\n}\n\n#displayArea .tiddlyLinkExisting {\n font-weight: bold;\n}\n\n#displayArea .tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n#displayArea .externalLink {\n text-decoration: underline;\n}\n\n.title {\n font-family: tahoma,arial,helvetica;\n font-size: 13pt;\n color: #867663;\n font-weight: bold;\n display: inline;\n padding-bottom: 1em;\n margin-bottom: 1em;\n}\n\n.toolbar {\n font-family: tahoma,arial,helvetica;\n font-weight: normal;\n font-size: 8pt;\n padding: 0em 0em 0em 1em;\n margin-top: -2em;\n color: color: #aaa;\n visibility: hidden;\n position: relative;\n bottom: -1.5em;\n}\n\n.toolbar a {\n padding: 0.2em 0.4em 0.2em 0.4em;\n color: #f79b60;\n border: 1px solid #f5d7b4;\n}\n\n.toolbar a:hover {\n color: #930 !important;\n background-color: #f5d7b4 !important;\n border-color: #f79b60 !important;\n}\n\n.toolbar a:active {\n color: #666;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nviewer a.button{\n border: 0;\n background-color: transparent; !important;\n padding: 0em;\n color: #888 !important;\n border: 1px solid transparent;\n}\n\n.footer a.button {\n color: #888 !important;\n}\n\n.editorFooter a:hover, .footer a:hover{\n color: #f79b60 !important;\n border: 1px solid #f5d7b4;\n background-color: #fff !important;\n margin-left: -1px; \n margin-right: -1px;\n}\n\n.editorFooter a:hover, .footer #popup a:hover{\n margin: 0;\n}\n\n.viewer a.button:hover{\n color: #f79b60 !important;\n background-color: #transparent !important;\n}\n\n.viewer a.button, .viewer a.tiddlyLink,.editorFooter a:hover, .footer a.button {\n color: #f79b60 ;\n background-color: transparent !important;\n}\n\n#popup {\n display: none;\n position: absolute;\n top: 1.5em;\n left: 13.25em;\n font-size: 8pt;\n color: #f79b60;\n background-color: #fff;\n padding: 0;\n border: 1px solid #f5d7b4;\n}\n\n#popup a {\n display: block;\n color: #f79b60 !important;\n border: 0;\n margin-bottom: -1px;\n}\n\n#popup a:hover {\n background-color: #f5d7b4;\n color: #930 !important;\n}\n\n.body {\n border-top:1px solid #ccc;\n padding-top: 0.5em;\n margin-top:0.3em;\n}\n\n.viewer {\n color: #867663;\n line-height: 140%;\n}\n\n.viewer a:link, .body a:visited{\n color: #be540b;;\n}\n\n.viewer a:hover {\n background-color: transparent;\n text-decoration: underline;\ncolor: #f79b60;\n}\n\n.viewer blockquote {\n font-size: 8pt;\n line-height: 150%;\n border-left: 1px solid #ccc;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul {\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer ol {\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer h1, .viewer h2,h3,h4,h5,h6 {\n font-weight: bold;\n text-decoration: none;\n color: #867663;\n padding-left: 0em;\nbackground-color: transparent;\n}\n\n.viewer h2 {\n font-size: 12pt;\nborder-bottom: 2px dotted #ccc;\n}\n\n.viewer h3 {\n font-size: 11pt;\nborder-bottom: 1px dotted #ccc;\n}\n\n.viewer h4 {\n font-size: 10pt;\n}\n\n.viewer h5 {\n font-size: 9pt;\n}\n\n.viewer h6 {\n font-size: 8pt;\n}\n\n.viewer table {\n font-size: 10pt;\n border-collapse: collapse;\n border: 2px solid #303030;\n margin-left: 1.0em;\n margin-right: 1.0em;\n margin-top: 0.8em;\n margin-bottom: 0.8em;\n}\n\n.viewer th {\n background-color: #bcd;\n border: 1px solid #606060;\n padding: 3px;\n}\n\n.viewer td, tr {\n border: 1px solid #606060;\n padding: 3px;\n}\n\n.viewer caption {\n font-size: smaller;\n padding: 3px;\n}\n\n.viewer hr {\n border-top: dashed 1px #606060;\n border-left: none;\n border-right: none;\n border-bottom: none;\n height: 1px;\n color: #666666;\n}\n\n.highlight {\n color: #000000;\n background-color: #bcd;\n}\n\n.editor {\n font-size: 8pt;\n color: #402c74;\n font-weight: normal;\n}\n\n.editor input {\n display: block;\n border: 1px solid black;\n}\n\n.editor textarea {\n display: block;\n font: inherit;\n border: 1px solid black;\n}\n\n#sidebar {\n float: right;\n width: 14em;\n color: #666;\n font-size: 8pt;\n border-left: 1px solid #aaa;\n border-bottom:1px solid #aaa;\n background-color: #fdf8f2;\n}\n\n.sidebarSubHeading {\n font-size: 0.95em;\n color: #236;\n}\n\n#commandPanel {\n padding-top: 0.5em;\n background-color: #fdf8f2;\n color: black;\n font-size: 8pt;\n}\n\n#commandPanel a {\n display: block;\n padding: 0.3em 0.2em 0.3em 1em;\ncolor: #f79b60;\n text-decoration: none;\n background-color: white !important;\n}\n\n#commandPanel a:hover {\n color: #930;\n background-color: transparent;\n}\n\n#commandPanel input {\n margin: 0.4em 0em 0.3em 1em;\n border: 1px solid black;\n}\n\n#optionsPanel {\n display: none;\n background-color: #f3f8ff;\n padding: 0.5em 0.5em 0.5em 0.5em;\n font-size: 7pt;\n color: black;\n}\n\n#optionsPanel a:link, #optionsPanel a:visited {\n color: #666;\n font-weight: bold;\n}\n\n#optionsPanel a:hover {\n color: #922;\n text-decoration: underline;\n background-color: transparent;\n}\n\n.optionsText {\n margin-top: 0.25em;\n margin-bottom: 0.75em;\n}\n\n.optionsItem {\n}\n\n#tabTimeline {\n background-color: #f5d7b4;\n}\n\n#tabTags {\n background-color: #cf936c;\n}\n\n#tabMore {\n background-color: #b8764c;\n}\n\n/*\n=================Sidebar==========\n=================================\n*/\n\n\n#sidebar {\n width: 14em;\n font-size: 8pt;\n border-left: 1px solid #aaa;\n border-bottom:1px solid #aaa;\n}\n\n#sidebarOptions a.button,#contentWrapper #sidebarOptions a.tiddlyLink{\n color: #f79b60;\n background-color: #fff !important;\n text-decoration: none;\n padding: 0.3em 0.2em 0.3em 1em;\n display: block;\n}\n\n#sidebarOptions a.tiddlyLink, #sidebarOptions{\n color: #666;\n background-color: #fff !important;\n}\n\n#sidebar #sidebarOptions a.button:hover{\n color: #930;\n background-color: #fff;\n text-decoration: none;\n}\n\n#sidebar #sidebarOptions a.tiddlyLink:hover{\n color: #930;\n background-color: #fff;\n text-decoration: underline;\n}\n\n#contentWrapper #sidebar a:hover{\n color: #c51;\n text-decoration: underline;\n}\n\n#contentWrapper .sidebarSubHeading {\n font-size: 0.95em;\n color: #236;\n}\n\n#contentWrapper #commandPanel {\n padding-top: 0.5em;\n background-color: #f3f3f3;\n color: black;\n font-size: 8pt;\n}\n\n#contentWrapper #commandPanel a {\n display: block;\n padding: 0.3em 0.2em 0.3em 1em;\n color: #c51;\n text-decoration: none;\n}\n\n#contentWrapper #commandPanel a:hover {\n color: #922;\n text-decoration: underline;\n background-color: transparent;;\n}\n\n#contentWrapper #commandPanel input {\n margin: 0.4em 0em 0.3em 1em;\n border: 1px solid black;\n}\n\n#contentWrapper #optionsPanel {\n display: none;\n background-color: #f3f8ff;\n padding: 0.5em 0.5em 0em 0.5em;\n font-size: 7pt;\n color: black;\n}\n\n#contentWrapper #optionsPanel a:link, #optionsPanel a:visited {\n color: #c51;\n font-weight: bold;\n}\n\n#contentWrapper #optionsPanel a:hover {\n color: #922;\n text-decoration: underline;\n background-color: transparent;\n}\n\n.optionsText {\n margin-top: 0.25em;\n margin-bottom: 0.75em;\n}\n\n.optionsItem {\n}\n/*========================================================================*/\n#contentWrapper #sidebarTabs {\n background-color: #fff;\n padding: 0em;\n}\n\n#contentWrapper #sidebarTabs a {\n color: black;\n background-color: transparent;\n}\n\n#contentWrapper #sidebarTabs a:hover {\n color: #922; text-decoration: underline;\n background-color: transparent;\n}\n\n#contentWrapper #sidebarTabs a:active {\n color: black;\n}\n\n#contentWrapper .tabContentTags #popup {\n display: none;\n position: absolute;\n top: 1em;\n left: 13.25em;\n font-size: 8pt;\n color: #888;\n background-color: #e4e4e4;\n padding: 0;\n margin-top: -2px;\n border-top: 1px solid #aaa;\n border-bottom: 1px solid #330000;\n border-right: 1px solid #330000;\n border-left: 1px solid #aaa;\n}\n\n#contentWrapper .tabContentTags #popup hr {\n color: #aaa;\n}\n\nhr{\n color: black !important;\n}\n\n#contentWrapper .tabContentTags #popup a {\n display: block;\n color: #888;\n min-width: 8em;\n border: 0;\n margin: 0;\n height: 1.2em;\n}\n\n#contentWrapper .tabContentTags #popup a:hover {\n background-color: #e4e4e4;\n color: black;\n}\n\n#contentWrapper a.tab {\n font-weight: normal;\n display: inline;\n margin: 0px 1px; \n border:1px solid #aaa;\n border-bottom:none;\n}\n\n#contentWrapper a.tab:hover {\n text-decoration: none !important;\n border-color: black;\n}\n\n#contentWrapper a.tabSelected {\n background-color: #f5d7b4 !important;\n padding: 2px 4px 2px 4px;\n}\n\n#contentWrapper a.tabUnselected {\n background-color: #c51 !important;\n padding: 2px 4px 0px 4px;\n color: #fff !important;\n}\n\n/*===========================================================================================*/\n/*===========================================================================================*/\n#sidebarTabs{\n margin: 0;\n padding: 0;\n}\n\n#contentWrapper .tabContents {\n background-color: #f5d7b4;\n border-bottom: solid #aaa 1px;\n}\n\n#contentWrapper .tabContents a.tiddlyLink, #contentWrapper .tabContents a.button{\n background-color: #e6e6e6;\n color: #922 !important;\n}\n\n#contentWrapper .tabContents a:hover{\n color: #b44 !important;\n}\n\n#contentWrapper .txtMoreTab a.tabUnselected {\n background-color: #f5d7b4 !important;\n padding: 2px 4px 0px 4px;\n color: #000 !important;\n display: block;\n}\n\n#contentWrapper .txtMoreTab a.tabSelected {\n background-color: #cf936c !important;\n padding: 2px 4px 2px 4px;\n color: #000 !important;\n}\n\n.txtMoreTab .tabContents {\n background-color: #cf936c !important;\n border-bottom: solid #aaa 1px;\n color: #fff;\n}\n\n.txtMoreTab .tabContents a{\n background-color: transparent !important;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n.\n\n#popup a {\n display: block;\n color: #888;\n min-width: 8em;\n border: 0;\n margin: 0;\n}\n\n#popup a:hover {\n background-color: #e4e4e4;\n color: black;\n}\n\n.body {\n border-top:1px solid #ccc;\n padding-top: 0.5em;\n margin-top:0.3em;\n overflow: hidden;\n}\n\n.viewer {\n color: black;\n line-height: 140%;\n}\n\n.viewer a:link, .body a:visited{\n color: #922;\n}\n\n.viewer a:hover {\n color: #b44;\n background-color: transparent;\n text-decoration: none;\n}\n\n.viewer blockquote {\n font-size: 8pt;\n line-height: 150%;\n border-left: 1px solid #ccc;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul {\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer ol {\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n/*==============================================Headings================*/\n\n.viewer h1,.viewer h2,h3,h4,h5,h6 {\n font-weight: bold;\n text-decoration: none;\n color: #469;\n padding-left: .6em;\nbackground-color: transparent !important;\nborder-bottom: 3px dotted #ccc;\n}\n\n.viewer h2 {\n font-size: 12pt;\n}\n\n.viewer h3 {\n font-size: 11pt;\n}\n\n.viewer h4 {\n font-size: 10pt;\n}\n\n.viewer h5 {\n font-size: 9pt;\n}\n\n.viewer h6 {\n font-size: 8pt;\n}\n\n.viewer table {\n font-size: 10pt;\n border-collapse: collapse;\n border: 2px solid #303030;\n margin-left: 1.0em;\n margin-right: 1.0em;\n margin-top: 0.8em;\n margin-bottom: 0.8em;\n}\n\n.viewer th {\n background-color: #bcd;\n border: 1px solid #606060;\n padding: 3px;\n}\n\n.viewer td, tr {\n border: 1px solid #606060;\n padding: 3px;\n}\n\n.viewer caption {\n font-size: smaller;\n padding: 3px;\n}\n\n.viewer hr {\n border-top: dashed 1px #606060;\n border-left: none;\n border-right: none;\n border-bottom: none;\n height: 1px;\n color: #666666;\n}\n\n.highlight {\n color: #000000;\n background-color: #bcd;\n}\n\n.editor {\n font-size: 8pt;\n color: #402c74;\n font-weight: normal;\n}\n\n.editor input {\n display: block;\n border: 1px solid black;\n}\n\n.editor textarea {\n display: block;\n font: inherit;\n border: 1px solid black;\n}\n\n*/\n@media print {\n\n#mainMenu {\n display: none;\n}\n\n#displayArea {\n margin: 1em 1em 0em 1em;\n}\n\n#sidebar {\n display: none;\n}\n\n}
<html>\n<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=82299988&s=143441"><img src="http://libsyn.com/podcasts/jasonmcdowell/images/itunes_subscribe.gif" alt="subscribe with itunes" border="0" width="75" height="18" align="absmiddle"></a>\n</html>