{{fr{\n~TiddlyWiki est le savant mélange d'une base de donnée relationnelle et d'une page internet dopée au javascript. Le résultat est assez proche d'un moteur de [[wiki|http://fr.wikipedia.org/wiki/Wiki]] traditionnel, à quelques importantes exceptions près :\n*~TiddlyWiki à été conçu pour être utilisé hors-ligne sans avoir à installer un serveur, et ne permet pas (dans sa version de base) d'enregistrer vos changements sur internet.\n*Il a aussi été pensé comme une application autonome, ce qui veut dire que tout le wiki est contenu dans un seul fichier, facilement transportable.\n}}}{{hide{\n----}}}{{en{\n~TiddlyWiki is the ingenious mix of a relationnal database and a javascript enhanced webpage. The result is almost like a traditionnal [[wiki|http://en.wikipedia.org/wiki/Wiki]] software. However, there are some important differences :\n* It was designed to be an offline application that doesn't require a web server. And as such, it does not allow saving changes when online (in it's basic version)\n* It was also designed to be a single file application. That means that all the ~TiddlyWiki is contained in one unique easily transferable file.\n}}}
#''lisez la documentation''\n#trouvez la source du plugin en haut de cette documentation.\n#ouvrez cette source dans votre navigateur internet (cela vous assurera d'obtenir sa dernière version)\n#double-cliquez sur le tiddler du plugin ou cliquez sur la commande editer (ou voir) de sa barre d'outil.\n#vous devriez maintenant voir le code source complet du plugin, sélectionnez-le entièrement et copiez-le\n#ouvrez le TiddlyWiki dans lequel le plugin doit être installé\n#créez un nouveau tiddler, et collez-y le code source du plugin en tant que texte\n#indexez-le <<tag systemConfig>> (sensible à la casse)\n#nommez-le comme vous le souhaitez (il est toutefois recommandé de conserver le nom d'origine du plugin)\n#cliquez sur le bouton valider de la barre d'outils\n#sauvegardez les changements et rechargez le document\n\nLa procédure ci-dessus est la procédure d'installation classique d'un plugin. Toutefois, cretains d'entre eux requièrent des étapes supplémentaires qui sont décrites dans leur documentation. Vous devriez réellement la lire.
#''read the plugin's documentation''\n#locate the plugin source near the top of it's documentation\n#open this source in a web browser (it will ensure you'll get the latest version)\n#either double-click on the plugin tiddler or click on the edit (or view) command in it's toolbar\n#you should now see the complete source code of the plugin, select it all and copy it\n#open the TiddlyWiki in which the plugin is to be installed\n#create a new tiddler, and paste the plugin code in it's body\n#tag it with <<tag systemConfig>> (case sensitive)\n#give it the name you want (however it's recommended to keep the original plugin name)\n#click the done button of the toolbar\n#save your changes and reload\nThe above procedure is the basic one to install a plugin. However, some of them requires additionnal steps that are described in the plugin documentation, so you should really read it.
{{fr{\nCorrection de bugs affectant :\n*[[N.E.W.S.]]\n*[[Send]]\n*[[socialBookmark]]\ndans Internet Explorer}}}{{hide{\n----}}}{{en{\nCorrected some bugs affecting :\n*[[N.E.W.S.]]\n*[[Send]]\n*[[socialBookmark]]\nin Internet Explorer}}}
|''URL:''|http://tiddlywiki.abego-software.de/|\n|''Description:''|UdoBorkowski's Extensions for TiddlyWiki|\n|''Author:''|UdoBorkowski|
<<calendar thismonth>>\n!Contacts <<newTiddler label:'+' title:'New Contact' tag:'Contacts' text:'enter notes about this contact'>>\n<<tiddler Contacts>>
Copyright (c) 2007, Yann Perrin\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n* Neither the name of the TWkd nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/***\n|!''Name:''|!''Batch''|\n|''Description:''|this framework allows you to easily create macros that work on the dislayed tiddlers|\n|''Version:''|0.1.0|\n|''Date:''|24/01/2007|\n|''Source:''|http://yann.perrin.googlepages.com/twkd.html#Batch|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n***/\n//{{{\nif (!window.TWkd) window.TWkd={context:{}};\nif (!TWkd.Batch)\n TWkd.Batch = function (macroName,label,prompt,labelIfParam,promptIfParam,action,showWhenReadOnly,ask) {\n if (showWhenReadOnly == undefined) showWhenReadOnly = true;\n this.macroName = macroName;\n this.label = label;\n this.prompt = prompt;\n this.labelIfParam = labelIfParam;\n this.promptIfParam = promptIfParam;\n this.action = action;\n this.showWhenReadOnly = showWhenReadOnly;\n this.ask = ask;\n this.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if ((!readOnly)||(this.showWhenReadOnly)) {\n if (params[0]) {\n var Btn = createTiddlyButton(place,this.labelIfParam.format(params),this.promptIfParam.format(params),this.operation);\n Btn.setAttribute("param",params[0]);\n } else {\n var Btn = createTiddlyButton(place,this.label,this.prompt,this.operation);\n Btn.setAttribute("ask",this.ask);\n }\n Btn.setAttribute("macroName", this.macroName);\n }\n }\n this.operation = function() {\n var macroName = this.getAttribute("macroName");\n var param = this.getAttribute("param");\n if ((!param)&&(this.getAttribute("ask")!=undefined)) var param=window.prompt(this.getAttribute("ask"));\n story.forEachTiddler(function(title) {\n var tiddler = store.getTiddler(title);\n if(tiddler) {\n config.macros[macroName].action(tiddler,param);\n }\n });\n store.notifyAll();\n if(config.options.chkAutoSave)\n saveChanges(true);\n return(false);\n }\n}\n//}}}
|''URL:''|http://tiddlywiki.bidix.info/|\n|''Description:''|Repository for BidiX's TiddlyWiki Extensions|\n|''Author:''|BidiX|
{{fr{\nL'objectif de ce site est de montrer comment [[TiddlyWiki|1 - TiddlyWiki ?]] peut être adapté à différentes tâches au moyen d'[[extensions|systemConfig]] ou tout simplement en modifiant sa [[présentation|Style]]. Vous y trouverez donc non seulement des scripts, des gabarits et des feuilles de style à [[importer|ImportTiddlers]], mais aussi des conseils quand à leur utilisation.\nD'autre part, même si [[TiddlyWiki|1 - TiddlyWiki ?]] à été conçu par Jeremy Ruston pour être autonome, certains logiciels ou sites internets peuvent interagir avec d'une manière intéressante. J'essayerais donc de présenter comme il convient les plus intéressants d'entre eux.}}}{{hide{\n----}}}{{en{\nThis site vocation is to show you how [[TiddlyWiki|1 - TiddlyWiki ?]] can be adapted to different tasks, by using [[plugins|systemConfig]] or by modifying his [[Style]]. You'll find here not only scripts, templates and stylesheets, but also some advices about their uses.\nAlso, even if Jeremy Ruston designed [[TiddlyWiki|1 - TiddlyWiki ?]] as a standalone application, some softwares and web applications can interact with it in interresting ways. I'll try my best to cover the most interesting ones.}}}
{{fr{Comme vous pouvez le voir, TiddlyWiki se prête assez bien à la tenue d'un blog.\nToutefois, pour me faciliter encore plus la tâche, je met à profit quelques un des plugins que j'ai crée :\n*[[easyFormat]]^^<html><abbr title="qui requiert 'E.A.S.E.' pour fonctionner">1</abbr></html>^^ m'aide à mettre mon texte en forme\n*[[N.E.W.S.]] permet l'affichage des nouveaux articles en première page et sert aussi dans le menu.\n*et enfin, [[socialBookmark]]^^<html><abbr title="qui requiert 'Send' pour fonctionner">2</abbr></html>^^ , utilisé dans le --ViewTemplate-- StandardViewTemplate //(pour être exact)//, vous permet de sauvegarder rapidement les articles qui vous intéressent dans les principaux site de bookmarking, simplement en cliquant sur leur icone.\n}}}{{hide{\n----}}}{{en{\nAs, you can see, Tiddlywiki is relatively easy to use as a blogging tool.\nHowever, to make it even easier, i created these tools :\n*[[easyFormat]]^^<html><abbr title="which require 'E.A.S.E.' to function properly">1</abbr></html>^^ helps me getting my text formatted the way i like.\n*[[N.E.W.S.]] manage pushing the news to the front page, and is also used in the menu.\n*last, [[socialBookmark]]^^<html><abbr title="which require 'Send' to function properly">2</abbr></html>^^ , used in --ViewTemplate-- StandardViewTemplate //(for exactitude)//, allow you to quickly save anything you like, by clicking on your favorite social bookmarking site icon.\n}}}
/***\n|''Name:''|CalendarPlugin|\n|''Source:''|http://www.TiddlyTools.com/#CalendarPlugin|\n|''Author:''|SteveRumsby|\n|''License:''|unknown|\n|''~CoreVersion:''|2.0.10|\n\n// // updated by Jeremy Sheeley to add cacheing for reminders\n// // see http://www.geocities.com/allredfaq/reminderMacros.html\n// // ''Changes by ELS 2006.08.23:''\n// // added handling for weeknumbers (code supplied by Martin Budden. see "wn**" comment marks)\n// // ''Changes by ELS 2005.10.30:''\n// // config.macros.calendar.handler()\n// // ^^use "tbody" element for IE compatibility^^\n// // ^^IE returns 2005 for current year, FF returns 105... fix year adjustment accordingly^^\n// // createCalendarDays()\n// // ^^use showDate() function (if defined) to render autostyled date with linked popup^^\n// // calendar stylesheet definition\n// // ^^use .calendar class-specific selectors, add text centering and margin settings^^\n\n\n!!!!!Configuration:\n<<option chkDisplayWeekNumbers>> Display week numbers //(note: Monday will be used as the start of the week)//\n|''First day of week:''|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|\n|''First day of weekend:''|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|\n\n!!!!!Syntax:\n|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|\n|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|\n|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|\n|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|\n|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|\n|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|\n\n***/\n// //Modify this section to change the text displayed for the month and day names, to a different language for example. You can also change the format of the tiddler names linked to from each date, and the colours used.\n\n//{{{\nconfig.macros.calendar = {};\n\nconfig.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];\nconfig.macros.calendar.daynames = ["M", "T", "W", "T", "F", "S", "S"];\n\nconfig.macros.calendar.weekendbg = "#c0c0c0";\nconfig.macros.calendar.monthbg = "#e0e0e0";\nconfig.macros.calendar.holidaybg = "#ffc0c0";\n\n//}}}\n// //''Code section:''\n// (you should not need to alter anything below here)//\n//{{{\nif(config.options.txtCalFirstDay == undefined)\n config.options.txtCalFirstDay = 0;\nif(config.options.txtCalStartOfWeekend == undefined)\n config.options.txtCalStartOfWeekend = 5;\nif(config.options.chkDisplayWeekNumbers == undefined)//wn**\n config.options.chkDisplayWeekNumbers = false;\nif(config.options.chkDisplayWeekNumbers)\n config.options.txtCalFirstDay = 0;\n\nconfig.macros.calendar.tiddlerformat = "0DD/0MM/YYYY"; // This used to be changeable - for now, it isn't// <<smiley :-(>> \n\nversion.extensions.calendar = { major: 0, minor: 6, revision: 0, date: new Date(2006, 1, 22)};\nconfig.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nconfig.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead\n//}}}\n\n// //Is the given date a holiday?\n//{{{\nfunction calendarIsHoliday(date)\n{\n var longHoliday = date.formatString("0DD/0MM/YYYY");\n var shortHoliday = date.formatString("0DD/0MM");\n\n for(var i = 0; i < config.macros.calendar.holidays.length; i++) {\n if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday) {\n return true;\n }\n }\n return false;\n}\n//}}}\n\n// //The main entry point - the macro handler.\n// //Decide what sort of calendar we are creating (month or year, and which month or year)\n// // Create the main calendar container and pass that to sub-ordinate functions to create the structure.\n// ELS 2005.10.30: added creation and use of "tbody" for IE compatibility and fixup for year >1900//\n// ELS 2005.10.30: fix year calculation for IE's getYear() function (which returns '2005' instead of '105')//\n// ELS 2006.05.29: add journalDateFmt handling//\n//{{{\nconfig.macros.calendar.handler = function(place,macroName,params)\n{\n var calendar = createTiddlyElement(place, "table", null, "calendar", null);\n var tbody = createTiddlyElement(calendar, "tbody", null, null, null);\n var today = new Date();\n var year = today.getYear();\n if (year<1900) year+=1900;\n \n // get format for journal link by reading from SideBarOptions (ELS 5/29/06 - based on suggestion by Martin Budden)\n var text = store.getTiddlerText("SideBarOptions");\n this.journalDateFmt = "DD-MMM-YYYY";\n var re = new RegExp("<<(?:newJournal)([^>]*)>>","mg"); var fm = re.exec(text);\n if (fm && fm[1]!=null) { var pa=fm[1].readMacroParams(); if (pa[0]) this.journalDateFmt = pa[0]; }\n\n if (params[0] == "thismonth")\n {\n cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, today.getMonth());\n } \n else if (params[0] == "lastmonth") {\n var month = today.getMonth()-1; if (month==-1) { month=11; year--; }\n cacheReminders(new Date(year, month, 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, month);\n }\n else if (params[0] == "nextmonth") {\n var month = today.getMonth()+1; if (month>11) { month=0; year++; }\n cacheReminders(new Date(year, month, 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, month);\n }\n else {\n if (params[0]) year = params[0];\n if(params[1])\n {\n cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, params[1]-1);\n }\n else\n {\n cacheReminders(new Date(year, 0, 1, 0, 0), 366);\n createCalendarYear(tbody, year);\n }\n }\n window.reminderCacheForCalendar = null;\n}\n//}}}\n//{{{\n//This global variable is used to store reminders that have been cached\n//while the calendar is being rendered. It will be renulled after the calendar is fully rendered.\nwindow.reminderCacheForCalendar = null;\n//}}}\n//{{{\nfunction cacheReminders(date, leadtime)\n{\n if (window.findTiddlersWithReminders == null)\n return;\n window.reminderCacheForCalendar = {};\n var leadtimeHash = [];\n leadtimeHash [0] = 0;\n leadtimeHash [1] = leadtime;\n var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);\n for(var i = 0; i < t.length; i++) {\n //just tag it in the cache, so that when we're drawing days, we can bold this one.\n window.reminderCacheForCalendar[t[i]["matchedDate"]] = "reminder:" + t[i]["params"]["title"]; \n }\n}\n//}}}\n//{{{\nfunction createCalendarOneMonth(calendar, year, mon)\n{\n var row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);\n row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarDayHeader(row, 1);\n createCalendarDayRowsSingle(calendar, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonth(calendar, year, mon)\n{\n var row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);\n row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarDayHeader(row, 1);\n createCalendarDayRowsSingle(calendar, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarYear(calendar, year)\n{\n var row;\n row = createTiddlyElement(calendar, "tr", null, null, null);\n var back = createTiddlyElement(row, "td", null, null, null);\n var backHandler = function() {\n removeChildren(calendar);\n createCalendarYear(calendar, year-1);\n };\n createTiddlyButton(back, "<", "Previous year", backHandler);\n back.align = "center";\n\n var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);\n yearHeader.align = "center";\n //yearHeader.setAttribute("colSpan", 19);\n yearHeader.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?22:19);//wn**\n\n var fwd = createTiddlyElement(row, "td", null, null, null);\n var fwdHandler = function() {\n removeChildren(calendar);\n createCalendarYear(calendar, year+1);\n };\n createTiddlyButton(fwd, ">", "Next year", fwdHandler);\n fwd.align = "center";\n\n createCalendarMonthRow(calendar, year, 0);\n createCalendarMonthRow(calendar, year, 3);\n createCalendarMonthRow(calendar, year, 6);\n createCalendarMonthRow(calendar, year, 9);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonthRow(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDayHeader(row, 3);\n createCalendarDayRows(cal, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonthHeader(cal, row, name, nav, year, mon)\n{\n var month;\n if(nav) {\n var back = createTiddlyElement(row, "td", null, null, null);\n back.align = "center";\n back.style.background = config.macros.calendar.monthbg;\n\n/*\n back.setAttribute("colSpan", 2);\n\n var backYearHandler = function() {\n var newyear = year-1;\n removeChildren(cal);\n cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, mon);\n };\n createTiddlyButton(back, "<<", "Previous year", backYearHandler);\n*/\n var backMonHandler = function() {\n var newyear = year;\n var newmon = mon-1;\n if(newmon == -1) { newmon = 11; newyear = newyear-1;}\n removeChildren(cal);\n cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, newmon);\n };\n createTiddlyButton(back, "<", "Previous month", backMonHandler);\n\n\n month = createTiddlyElement(row, "td", null, "calendarMonthname", name)\n// month.setAttribute("colSpan", 3);\n// month.setAttribute("colSpan", 5);\n month.setAttribute("colSpan", config.options.chkDisplayWeekNumbers?6:5);//wn**\n\n var fwd = createTiddlyElement(row, "td", null, null, null);\n fwd.align = "center";\n fwd.style.background = config.macros.calendar.monthbg; \n\n// fwd.setAttribute("colSpan", 2);\n var fwdMonHandler = function() {\n var newyear = year;\n var newmon = mon+1;\n if(newmon == 12) { newmon = 0; newyear = newyear+1;}\n removeChildren(cal);\n cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, newmon);\n };\n createTiddlyButton(fwd, ">", "Next month", fwdMonHandler);\n/*\n var fwdYear = createTiddlyElement(row, "td", null, null, null);\n var fwdYearHandler = function() {\n var newyear = year+1;\n removeChildren(cal);\n cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, mon);\n };\n createTiddlyButton(fwd, ">>", "Next year", fwdYearHandler);\n*/\n } else {\n month = createTiddlyElement(row, "td", null, "calendarMonthname", name)\n //month.setAttribute("colSpan", 7);\n month.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?8:7);//wn**\n }\n month.align = "center";\n month.style.background = config.macros.calendar.monthbg;\n}\n//}}}\n\n//{{{\nfunction createCalendarDayHeader(row, num)\n{\n var cell;\n for(var i = 0; i < num; i++) {\n if (config.options.chkDisplayWeekNumbers) createTiddlyElement(row, "td");//wn**\n for(var j = 0; j < 7; j++) {\n var d = j + (config.options.txtCalFirstDay - 0);\n if(d > 6) d = d - 7;\n cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);\n if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))\n cell.style.background = config.macros.calendar.weekendbg;\n }\n }\n}\n//}}}\n\n//{{{\nfunction createCalendarDays(row, col, first, max, year, mon)\n{\n var i;\n if (config.options.chkDisplayWeekNumbers){\n if (first<=max) {\n var ww = new Date(year,mon,first);\n createTiddlyElement(row, "td", null, null, "w"+ww.getWeek());//wn**\n }\n else createTiddlyElement(row, "td", null, null, null);//wn**\n }\n for(i = 0; i < col; i++) {\n createTiddlyElement(row, "td", null, null, null);\n }\n var day = first;\n for(i = col; i < 7; i++) {\n var d = i + (config.options.txtCalFirstDay - 0);\n if(d > 6) d = d - 7;\n var daycell = createTiddlyElement(row, "td", null, null, null);\n var isaWeekend = ((d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))? true:false);\n\n if(day > 0 && day <= max) {\n var celldate = new Date(year, mon, day);\n // ELS 2005.10.30: use <<date>> macro's showDate() function to create popup\n if (window.showDate) {\n showDate(daycell,celldate,"popup","DD",config.macros.calendar.journalDateFmt,true, isaWeekend); // ELS 5/29/06 - use journalDateFmt \n } else {\n if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;\n var title = celldate.formatString(config.macros.calendar.tiddlerformat);\n if(calendarIsHoliday(celldate)) {\n daycell.style.background = config.macros.calendar.holidaybg;\n }\n if(window.findTiddlersWithReminders == null) {\n var link = createTiddlyLink(daycell, title, false);\n link.appendChild(document.createTextNode(day));\n } else {\n var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);\n }\n }\n }\n day++;\n }\n}\n//}}}\n\n// //We've clicked on a day in a calendar - create a suitable pop-up of options.\n// //The pop-up should contain:\n// // * a link to create a new entry for that date\n// // * a link to create a new reminder for that date\n// // * an <hr>\n// // * the list of reminders for that date\n//{{{\nfunction onClickCalendarDate(e)\n{\n var button = this;\n var date = button.getAttribute("title");\n var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));\n\n date = dat.formatString(config.macros.calendar.tiddlerformat);\n var popup = createTiddlerPopup(this);\n popup.appendChild(document.createTextNode(date));\n var newReminder = function() {\n var t = store.getTiddlers(date);\n displayTiddler(null, date, 2, null, null, false, false);\n if(t) {\n document.getElementById("editorBody" + date).value += "\sn<<reminder day:" + dat.getDate() +\n " month:" + (dat.getMonth()+1) +\n " year:" + (dat.getYear()+1900) + " title: >>";\n } else {\n document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +\n " month:" + (dat.getMonth()+1) +\n " year:" + (dat.getYear()+1900) + " title: >>";\n }\n };\n var link = createTiddlyButton(popup, "New reminder", null, newReminder); \n popup.appendChild(document.createElement("hr"));\n\n var t = findTiddlersWithReminders(dat, [0,14], null, 1);\n for(var i = 0; i < t.length; i++) {\n link = createTiddlyLink(popup, t[i].tiddler, false);\n link.appendChild(document.createTextNode(t[i].tiddler));\n }\n}\n//}}}\n\n//{{{\nfunction calendarMaxDays(year, mon)\n{\n var max = config.macros.calendar.monthdays[mon];\n if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) {\n max++;\n }\n return max;\n}\n//}}}\n\n//{{{\nfunction createCalendarDayRows(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n\n var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first1 < 0) first1 = first1 + 7;\n var day1 = -first1 + 1;\n var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first2 < 0) first2 = first2 + 7;\n var day2 = -first2 + 1;\n var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first3 < 0) first3 = first3 + 7;\n var day3 = -first3 + 1;\n\n var max1 = calendarMaxDays(year, mon);\n var max2 = calendarMaxDays(year, mon+1);\n var max3 = calendarMaxDays(year, mon+2);\n\n while(day1 <= max1 || day2 <= max2 || day3 <= max3) {\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;\n createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;\n createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;\n }\n}\n//}}}\n\n//{{{\nfunction createCalendarDayRowsSingle(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n\n var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first1 < 0) first1 = first1+ 7;\n var day1 = -first1 + 1;\n var max1 = calendarMaxDays(year, mon);\n\n while(day1 <= max1) {\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;\n }\n}\n//}}}\n\n// //ELS 2005.10.30: added styles\n//{{{\nsetStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td { text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");\n//}}}\n
/***\n| Name:|CloseOnCancelPlugin|\n| Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|\n| Version:|6.9.3|\n| Date:|30-Sep-2006|\n| Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\nmerge(config.commands.cancelTiddler,{\n\n handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,\n\n handler: function(event,src,title) {\n this.handler_orig_closeUnsaved(event,src,title);\n if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))\n story.closeTiddler(title,true);\n return false;\n }\n\n});\n\n//}}}\n\n
<div class='toolbar'>\n <!-- regular toolbar -->\n <span macro='toolbar closeTiddler closeOthers +editTiddler undoChanges permalink references jump'></span>\n</div>\n<!-- regular tags macro but uses taggly css -->\n<div class="tagglyTagged" macro="tags"></div>\n<div>\n <span class='title' macro='view title'></span>\n <span macro="miniTag"></span>\n</div>\n<div class='subtitle'>\n <span macro='view modifier link'></span>,\n <span macro='view modified date [[DD-MMM-YY]]'></span>\n (<span macro='message views.wikified.createdPrompt'></span>\n <span macro='view created date [[DD-MMM-YY]]'></span>)\n</div>\n<!-- using taggly versions of these two\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div> -->\n<div class='viewer'><pre macro='view text'></pre></div>\n<div class="tagglyTagging" macro="tagglyTagging"></div>\n<div class='tagClear'></div>
Background: #fff\nForeground: #000\nPrimaryPale: #8fc\nPrimaryLight: #1f8\nPrimaryMid: #0b4\nPrimaryDark: #041\nSecondaryPale: #ffc\nSecondaryLight: #ef8\nSecondaryMid: #bd4\nSecondaryDark: #481\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n
<html><iframe width="90%" border="0" frameborder="0" src="http://yubnub.org/example/echo?text=%3Chtml%3E%3Cbody%3E%3Cp%3E$1%3C%2Fp%3E%3Cdiv+id%3D%22js-kit-comments%22+path%3D%22a1f4j7%2F$1%22%3E%3C%2Fdiv%3E%3Cscript+src%3D%22http%3A%2F%2Fjs-kit.com%2Fcomments.js%22%3E%3C%2Fscript%3E%3C%2Fbody%3E%3C%2Fhtml%3E"></iframe></html>
//{{{\n//config.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit\nconfig.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler\nconfig.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist\nconfig.views.editor.defaultText = ""; // don't need message when creating a new tiddler \n//}}}\n
<div class='toolbar'>\n <!-- regular toolbar -->\n <span macro='toolbar closeTiddler closeOthers +editTiddler undoChanges permalink references jump'></span>\n</div>\n<!-- regular tags macro but uses taggly css -->\n<div class="tagglyTagged" macro="tags"></div>\n<div>\n <span class='title' macro='view title'></span>\n <span macro="miniTag"></span>\n</div>\n<div class='subtitle'>\n <span macro='view modifier link'></span>,\n <span macro='view modified date [[DD-MMM-YY]]'></span>\n (<span macro='message views.wikified.createdPrompt'></span>\n <span macro='view created date [[DD-MMM-YY]]'></span>)\n</div>\n<!-- using taggly versions of these two\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div> -->\n<div class='viewer'>\n<table>\n<tr><th>Name</th><td><span macro='view ContactFirstName'></span> <span macro='view ContactLastName'></span></td><td rowspan='4' macro='view text wikified'></td></tr>\n<tr><th>Adress</th><td><span macro='view ContactStreetNumber'></span> <span macro='view ContactStreetName'></span><br /><span macro='view ContactZipCode'></span> <span macro='view ContactCity'></span></td></tr>\n<tr><th>Phone</th><td><span macro='view ContactPhone'></span></td></tr>\n<tr><th>Email</th><td><span macro='view ContactMail'><span></td></tr>\n</table>\n<div class="tagglyTagging" macro="tagglyTagging"></div>\n<div class='tagClear'></div>
<<forEachTiddler where tiddler.tags.contains('Contacts') write '"[["+tiddler.title+"]]\sn"'>>
<<tiddler SideBarTabs>>\n<<deleteTagged>>
/***\n|''Name:''|DatePlugin|\n|''Source:''|http://www.TiddlyTools.com/#DatePlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nThere are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.\n\nThis plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to changes made on that date as well as links to any pending reminders for the coming 31 days (if the RemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc.\n!!!!!Usage\n<<<\nWhen installed, this plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.\n\nHowever, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:\n* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.\n* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values. \n* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"\n>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^\n>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^\n>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^\n>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^\n* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format\n\nIn addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:\n\n''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}'' \n\nNote that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:\n* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.\n* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.\n<<<\n!!!!!Examples\n<<<\nThe current date: <<date>>\nThe current time: <<date today "0hh:0mm:0ss">>\nToday's blog: <<date link today "DDD, MMM DDth, YYYY">>\nRecent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>\nThe first day of next month will be a <<date Y M+1 1 "DDD">>\nThis tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>\nThe SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>\nThis document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>\n<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DatePlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.05.09 [2.2.1]'' added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.\n''2006.05.05 [2.2.0]'' added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.\n''2006.03.08 [2.1.2]'' add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.\n''2006.03.06 [2.1.0]'' hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").\n''2006.02.14 [2.0.5]'' when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.\n''2006.02.05 [2.0.4]'' added var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables\n''2006.01.18 [2.0.3]'' In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.\n''2006.01.11 [2.0.2]'' correct 'weekend' override detection logic in showDate()\n''2006.01.10 [2.0.1]'' allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)\nadded flag param to showDate() API to override internal weekend[] array\n''2005.12.27 [2.0.0]'' Update for TW2.0\nAdded parameter handling for 'linkformat'\n''2005.12.21 [1.2.2]'' FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.\n''2005.11.07 [1.2.1]'' added support for "tiddler" dynamic date parameter\n''2005.11.06 [1.2.0]'' added support for "tiddler:title" dynamic date parameter\n''2005.11.03 [1.1.2]'' when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.\n''2005.11.03 [1.1.1]'' Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).\n''2005.11.01 [1.1.0]'' corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...\n''2005.10.31 [1.0.1]'' documentation and code cleanup\n''2005.10.31 [1.0.0]'' initial public release\n''2005.10.30 [0.9.0]'' pre-release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.date = {major: 2, minor: 2, revision: 1, date: new Date(2006,5,9)};\n//}}}\n\n//{{{\nconfig.macros.date = {\n format: "YYYY.0MM.0DD", // default date display format\n linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format\n linkedbg: "#babb1e", // "babble"\n todaybg: "#ffab1e", // "fable"\n weekendbg: "#c0c0c0", // "cocoa"\n holidaybg: "#ffaace", // "face"\n modifiedsbg: "#bbeeff", // "beef"\n remindersbg: "#c0ffee", // "coffee"\n holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\n weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]\n};\n//}}}\n\n//{{{\nconfig.macros.date.handler = function(place,macroName,params)\n{\n // do we want to see a link, a popup, or just a formatted date?\n var mode="display";\n if (params[0]=="display") { mode=params[0]; params.shift(); }\n if (params[0]=="popup") { mode=params[0]; params.shift(); }\n if (params[0]=="link") { mode=params[0]; params.shift(); }\n // get the date\n var now = new Date();\n var date = now;\n if (!params[0] || params[0]=="today")\n { params.shift(); }\n else if (params[0]=="filedate")\n { date=new Date(document.lastModified); params.shift(); }\n else if (params[0]=="tiddler")\n { date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }\n else if (params[0].substr(0,8)=="tiddler:")\n { var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }\n else {\n var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));\n var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));\n var d = eval(params.shift().replace(/D/ig,now.getDate()+0));\n date = new Date(y,m-1,d);\n }\n // date format with optional custom override\n var format=this.format; if (params[0]) format=params.shift();\n var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();\n showDate(place,date,mode,format,linkformat);\n}\n//}}}\n\n//{{{\nwindow.showDate=showDate;\nfunction showDate(place,date,mode,format,linkformat,autostyle,weekend)\n{\n if (!mode) mode="display";\n if (!format) format=config.macros.date.format;\n if (!linkformat) linkformat=config.macros.date.linkformat;\n if (!autostyle) autostyle=false;\n\n // format the date output\n var title = date.formatString(format);\n var linkto = date.formatString(linkformat);\n\n // just show the formatted output\n if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }\n\n // link to a 'dated tiddler'\n var link = createTiddlyLink(place, linkto, false);\n link.appendChild(document.createTextNode(title));\n link.title = linkto;\n link.date = date;\n link.format = format;\n link.linkformat = linkformat;\n\n // if using a popup menu, replace click handler for dated tiddler link\n // with handler for popup and make link text non-italic (i.e., an 'existing link' look)\n if (mode=="popup") {\n link.onclick = onClickDatePopup;\n link.style.fontStyle="normal";\n }\n\n // format the popup link to show what kind of info it contains (for use with calendar generators)\n if (!autostyle) return;\n if (hasModifieds(date))\n { link.style.fontStyle="normal"; link.style.fontWeight="bold"; }\n if (hasReminders(date))\n { link.style.textDecoration="underline"; }\n if(isToday(date))\n { link.style.border="1px solid black"; }\n\n if( (weekend!=undefined?weekend:isWeekend(date)) && (config.macros.date.weekendbg!="") )\n { place.style.background = config.macros.date.weekendbg; }\n if(isHoliday(date)&&(config.macros.date.holidaybg!=""))\n { place.style.background = config.macros.date.holidaybg; }\n if (hasModifieds(date)&&(config.macros.date.modifiedsbg!=""))\n { place.style.background = config.macros.date.modifiedsbg; }\n if (store.tiddlerExists(linkto)&&(config.macros.date.linkedbg!=""))\n { place.style.background = config.macros.date.linkedbg; }\n if (hasReminders(date)&&(config.macros.date.remindersbg!=""))\n { place.style.background = config.macros.date.remindersbg; }\n if(isToday(date)&&(config.macros.date.todaybg!=""))\n { place.style.background = config.macros.date.todaybg; }\n}\n//}}}\n\n//{{{\nfunction isToday(date) // returns true if date is today\n { var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }\n\nfunction isWeekend(date) // returns true if date is a weekend\n { return (config.macros.date.weekend[date.getDay()]); }\n\nfunction isHoliday(date) // returns true if date is a holiday\n{\n var longHoliday = date.formatString("0MM/0DD/YYYY");\n var shortHoliday = date.formatString("0MM/0DD");\n for(var i = 0; i < config.macros.date.holidays.length; i++) {\n var holiday=config.macros.date.holidays[i];\n if (holiday==longHoliday||holiday==shortHoliday) return true;\n }\n return false;\n}\n//}}}\n\n//{{{\n// Event handler for clicking on a day popup\nfunction onClickDatePopup(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var popup = createTiddlerPopup(this);\n if(popup) {\n // always show dated tiddler link (or just date, if readOnly) at the top...\n if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))\n createTiddlyLink(popup,this.date.formatString(this.linkformat),true);\n else\n createTiddlyText(popup,this.date.formatString(this.linkformat));\n addModifiedsToPopup(popup,this.date,this.format);\n addRemindersToPopup(popup,this.date,this.linkformat);\n }\n scrollToTiddlerPopup(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n//{{{\nfunction indexModifieds() // build list of tiddlers, hash indexed by modification date\n{\n var modifieds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].modified.formatString("YYYY0MM0DD")\n if (!modifieds[date])\n modifieds[date]=new Array();\n modifieds[date].push(tiddlers[t].title);\n }\n return modifieds;\n}\nfunction hasModifieds(date) // returns true if date has modified tiddlers\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addModifiedsToPopup(popup,when,format)\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var mods = config.macros.date.modifieds[when.formatString("YYYY0MM0DD")];\n if (mods) {\n mods.sort();\n var e=createTiddlyElement(popup,"div",null,null,"changes:");\n for(var t=0; t<mods.length; t++) {\n var link=createTiddlyLink(popup,mods[t],false);\n link.appendChild(document.createTextNode(indent+mods[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date\n{\n var reminders = { };\n if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed\n // DEBUG var starttime=new Date();\n var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);\n for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;\n // DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\sn";\n // DEBUG out+="startdate: "+date.toLocaleDateString()+"\sn"+"leadtime: "+leadtime+" days\sn\sn";\n // DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\sn"; }\n // DEBUG alert(out);\n }\n return reminders;\n}\n\nfunction hasReminders(date) // returns true if date has reminders\n{\n if (window.reminderCacheForCalendar)\n return window.reminderCacheForCalendar[date]; // use calendar cache\n if (!config.macros.date.reminders)\n config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache\n return (config.macros.date.reminders[date]);\n}\n\nfunction addRemindersToPopup(popup,when,format)\n{\n if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed\n\n var indent = String.fromCharCode(160)+String.fromCharCode(160);\n var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);\n var e=createTiddlyElement(popup,"div",null,null,"reminders:"+(!reminders.length?" none":""));\n for(var t=0; t<reminders.length; t++) {\n link = createTiddlyLink(popup,reminders[t].tiddler,false);\n var diff=reminders[t].diff;\n diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");\n var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;\n link.appendChild(document.createTextNode(indent+diff+" - "+txt));\n createTiddlyElement(popup,"br",null,null,null);\n }\n if (readOnly) return; // omit "new reminder..." link\n var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");\n var title = when.formatString(format);\n link.title="add a reminder to '"+title+"'";\n link.onclick = function() {\n // show tiddler editor\n story.displayTiddler(null, title, 2, null, null, false, false);\n // find body 'textarea'\n var c =document.getElementById("tiddler" + title).getElementsByTagName("*");\n for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;\n // append reminder macro to tiddler content\n if (i<c.length) {\n if (store.tiddlerExists(title)) c[i].value+="\sn"; else c[i].value="";\n c[i].value += "<<reminder";\n c[i].value += " day:"+when.getDate();\n c[i].value += " month:"+(when.getMonth()+1);\n c[i].value += " year:"+when.getFullYear();\n c[i].value += ' title:"Enter a title" >>';\n }\n };\n}\n//}}}\n
config.macros.date = {\n format: "YYYY.0MM.0DD", // default date display format\n linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format\n linkedbg: "#bd4", // "babble"\n todaybg: "#ffc", // "fable"\n weekendbg: "#ccc", // "cocoa"\n holidaybg: "#ef8", // "face"\n modifiedsbg: "#1f8", // "beef"\n remindersbg: "#bd4", // "coffee"\n holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\n weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]\n};
Bienvenue
<<tiddler NotUpdatedTemplate with:"DividedListsPlugin">>
/***\n|!''Name:''|!''E''asily ''A''daptable ''S''ource ''E''ditor|\n|''Description:''|this framework allows you to easily create commands that work on the current tiddler text selection in edit mode|\n|''Version:''|0.1.0|\n|''Date:''|13/01/2007|\n|''Source:''|http://yann.perrin.googlepages.com/twkd.html#E.A.S.E|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n***/\n////Messages Definition\n//{{{\nconfig.messages.Ease = {\nnoselection:"nothing selected",\nasktitle:"enter the new tiddler title",\nexists:" already exists, please enter another title",\naskForTagsLabel:"enter the new tiddler tags",\ntiddlercreated:" tiddler created"\n}\n//}}}\n////\n//{{{\nif (!window.TWkd) window.TWkd={context:{}};\nif (!TWkd.Ease)\n TWkd.Ease = function (text,tooltip){\n this.text = text;\n this.tooltip = tooltip;\n this.modes = [];\n this.addMode = function(modeDefinition) {this.modes.push(modeDefinition);};\n this.handler = function(event,src,title) {\n TWkd.context.command = this;\n TWkd.context.selection=this.getSelection(title);\n if (this.modes.length==1) {\n this.modes[0].operation();\n }\n else {\n var popup = Popup.create(src);\n if(popup) {\n for (var i=0; i<this.modes.length; i++) {\n createTiddlyButton(createTiddlyElement(popup,"li"), this.modes[i].name, this.modes[i].tooltip, this.OperateFromButton, null, 'id'+i, null);\n }\n Popup.show(popup,false);\n event.cancelBubble = true;\n if (event.stopPropagation) event.stopPropagation();\n return false;\n }\n }\n };\n };\n\nTWkd.Ease.prototype.OperateFromButton = function(e){\n var commandMode=this.getAttribute('Id').replace('id','');\n TWkd.context.command.modes[commandMode].operation();\n};\n\nTWkd.Ease.prototype.getTiddlerEditField = function(title,field){\n var tiddler = document.getElementById(story.idPrefix + title);\n if(tiddler != null){\n var children = tiddler.getElementsByTagName("*")\n var e = null;\n for (var t=0; t<children.length; t++){\n var c = children[t];\n if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea"){\n if(!e) {e = c;}\n if(c.getAttribute("edit") == field){e = c;}\n }\n }\n if(e){return e;}\n }\n} // closes getTiddlerEditField function definition\n \nTWkd.Ease.prototype.getSelection = function(title,quiet) {\n var tiddlerTextArea = this.getTiddlerEditField(title,"text");\n var result = {};\n if (document.selection != null && tiddlerTextArea.selectionStart == null) {\n tiddlerTextArea.focus();\n var range = document.selection.createRange();\n var bookmark = range.getBookmark();\n var contents = tiddlerTextArea.value;\n var originalContents = contents;\n var marker = "##SELECTION_MARKER_" + Math.random() + "##";\n while(contents.indexOf(marker) != -1) {\n marker = "##SELECTION_MARKER_" + Math.random() + "##";\n }\n var selection = range.text;\n range.text = marker + range.text + marker;\n contents = tiddlerTextArea.value;\n result.start = contents.indexOf(marker);\n contents = contents.replace(marker, "");\n result.end = contents.indexOf(marker);\n tiddlerTextArea.value = originalContents;\n range.moveToBookmark(bookmark);\n range.select();\n }\n else {\n result.start=tiddlerTextArea.selectionStart;\n result.end=tiddlerTextArea.selectionEnd;\n }\n result.content=tiddlerTextArea.value.substring(result.start,result.end);\n result.source=title;\n if (!result.content&&!quiet) displayMessage(config.messages.Ease.noselection);\n return(result);\n}//closes getSelection function definition\n\n// replace selection or insert new content\nTWkd.Ease.prototype.putInPlace=function(content,workplace) {\n var tiddlerText = this.getTiddlerEditField(workplace.source,"text");\n tiddlerText.value = tiddlerText.value.substring(0,workplace.start)+content+tiddlerText.value.substring(workplace.end);\n}\n\n// asking for title\nTWkd.Ease.prototype.askForTitle = function(suggestion) {\n if (!suggestion)\n suggestion = "";\n var newtitle;\n while (!newtitle||store.tiddlerExists(newtitle))\n {\n if (store.tiddlerExists(newtitle))\n displayMessage(newtitle+config.messages.Ease.exists);\n newtitle = prompt(config.messages.Ease.asktitle,suggestion);\n if (newtitle==null)\n {\n displayMessage(config.messages.Ease.titlecancel);\n return(false);\n }\n }\n return(newtitle);\n}//closes askForTitle function definition\n\n// creation of a new tiddler\nTWkd.Ease.prototype.newTWkdLibTiddler = function(title,content,from,askForTags){\n var tiddler = new Tiddler();\n tiddler.title = title;\n tiddler.modifier = config.options.txtUserName;\n tiddler.text = content;\n (from) ? tiddler.tags = [from] : tiddler.tags=[];\n if (askForTags)\n tiddler.tags = prompt(config.messages.Ease.askForTagsLabel,'[['+from+']]').readBracketedList();\n store.addTiddler(tiddler);\n //store.notifyAll();\n displayMessage(title+config.messages.Ease.tiddlercreated);\n}\n\nif (!TWkd.Mode)\n TWkd.Mode = function (name,tooltip,ask,operation) {\n this.name = name;\n this.tooltip = tooltip;\n this.ask = ask;\n this.operation = operation;\n };\n//}}}
<div class="toolbar" macro="toolbar +saveTiddler closeOthers -cancelTiddler deleteTiddler"></div>\n<div class="title" macro="view title"></div>\n<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>\n<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>\n<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>\n<div macro='hideWhen ((tiddler.tags.contains("Contacts"))||(tiddler.title=="New Contact"))'>[[EditToolbar]]<div class='editor' macro='edit text'></div></div>\n<div macro='showWhen ((tiddler.tags.contains("Contacts"))||(tiddler.title=="New Contact"))'><div class='editor'>\n<table width='100%'>\n<tr><th>Name</th><td><span macro='edit ContactFirstName'></span><span macro='edit ContactLastName'></span></td><td rowspan='4' width='50%' macro='edit text'></td></tr>\n<tr><th>Adress</th><td><span macro='edit ContactStreetNumber'></span><span macro='edit ContactStreetName'></span><span macro='edit ContactZipCode'></span><span macro='edit ContactCity'></span></td></tr>\n<tr><th>Phone</th><td><span macro='edit ContactPhone'></span></td></tr>\n<tr><th>Email</th><td><span macro='edit ContactMail'><span></td></tr>\n</table>\n</div></div>\n
<div macro='toolbar format slice tongue'></div>
<<tiddler NotUpdatedTemplate with:"EncryptionPlugin">>
{{fr{\nLes <<tag Extensions>> complètent les [[Plugins]] en ajoutant des fonctionnalités à TiddlyWiki. Les tiddlers indexés comme tels dans TWkd sont dépendants de l'installation des plugins mentionnés dans leurs entêtes pour fonctionner correctement.}}}{{hide{\n----}}}{{en{\n<<tag Extensions>> are [[Plugins]] addons. Tiddlers tagged as such in Twkd require the plugins listed in their headers to be installed to function properly.}}}
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.6 (2006-09-16)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|\n|''Copyright:''|&copy; 2005-2006 [[abego Software|http://www.abego-software.de]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.6 (2006-09-16)\n** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.\n** Support "begin", "end" and "none" expressions in "write" action\n* v1.0.5 (2006-02-05)\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox 1.5.0.1\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nif (!window.abego) window.abego = {};\n\nversion.extensions.ForEachTiddlerPlugin = {\n major: 1, minor: 0, revision: 6, \n date: new Date(2006,8,16), \n source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",\n licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",\n copyright: "Copyright (c) abego Software GmbH, 2005-2006 (www.abego-software.de)"\n};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {\n major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\nabego.parseNamedParameter = function(name, parameter, i) {\n var beginExpression = null;\n if ((i < parameter.length) && parameter[i] == name) {\n i++;\n if (i >= parameter.length) {\n throw "Missing text behind '%0'".format([name]);\n }\n \n return config.macros.forEachTiddler.paramEncode(parameter[i]);\n }\n return null;\n}\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "begin" option\n var beginExpression = abego.parseNamedParameter("begin", parameter, p);\n if (beginExpression !== null) \n p += 2;\n var endExpression = abego.parseNamedParameter("end", parameter, p);\n if (endExpression !== null) \n p += 2;\n var noneExpression = abego.parseNamedParameter("none", parameter, p);\n if (noneExpression !== null) \n p += 2;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n if (count > 0 && beginExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);\n \n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (count > 0 && endExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);\n\n if (count == 0 && noneExpression) \n text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);\n \n\n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.\n viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var tiddlyWiki = new TiddlyWiki();\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s"); \n return localPath;\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n\n
<<tiddler OutdatedTemplate with:"Format" with:"easyFormat">>
/***\n| Name:|HideWhenPlugin|\n| Description:|Allows conditional inclusion/exclusion in templates|\n| Version:|6.9.3|\n| Date:|30-Sep-2006|\n| Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\nFor use in ViewTemplate and EditTemplate. Eg\n{{{<div macro="showWhen tiddler.tags.contains('Task')">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\nmerge(config.macros,{\n\n hideWhen: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n if (eval(paramString)) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n }},\n\n showWhen: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n config.macros.hideWhen.handler(place,macroName,params,wikifier,'!('+paramString+')',tiddler);\n }}\n\n});\n\n//}}}\n\n
|''URL:''|http://lewcid.googlepages.com/lewcid.html|\n|''Description:''|a repository of my extensions for TW|\n|''Author:''|SaqImtiaz|
<<tiddler NewsManager>>
<script type="text/javascript" src="http://www.reeferss.com/log"></script>
<!--{{{-->\n<link rel='alternate' type='application/rss+xml' title='RSS' href='twkd.xml'/>\n<!--}}}-->
|''URL:''|http://tiddlyspot.com/mptw/|\n|''Description:''|some plugins and hacks for tiddlywiki|\n|''Author:''|SimonBaird|
/***\n|!''Name:''|!''N.E.W.S.''|\n|''Description:''|this plugin ensure that tiddlers with the chosen tag that were modified since your last visit are displayed.<<br>>it also lists the tiddlers it manages as new or archived in a new shadowTiddler called [[NewsManager]]|\n|''Version:''|0.2.0|\n|''Date:''|22/03/2007|\n|''Source:''|http://yann.perrin.googlepages.com/twkd.html#N.E.W.S.|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n***/\n//{{{\nif (!window.TWkd) window.TWkd={context:{}};\nif (!TWkd.News) TWkd.News = {\n tag:"Blog",\n noNews:"No news since your last visit",\n noArchive:"Nothing archived yet",\n restart:window.restart,\n choose:function () {\n var defaultTiddlers = store.getTaggedTiddlers(this.tag,"modified");\n var actualNews = [];\n var archived =[]\n for (var t in defaultTiddlers) {\n var modifDate = defaultTiddlers[t].modified ? defaultTiddlers[t].modified.convertToYYYYMMDDHHMM() : "0";\n if (defaultTiddlers[t].title != undefined) {\n if ((config.options.txtLastVisit==undefined)||(config.options.txtLastVisit < modifDate)) {\n actualNews.push("[["+defaultTiddlers[t].title+"]]");\n } else {\n archived.push("[["+defaultTiddlers[t].title+"]]");\n }\n }\n }\n config.shadowTiddlers.News = actualNews.length ? actualNews.reverse().join("\sn") : this.noNews;\n config.shadowTiddlers.Archive = archived.length ? archived.reverse().join("\sn") : this.noArchive;\n config.shadowTiddlers.NewsManager ="!News <<newJournal 'DD MMM YYYY' label:'+' tag:'"+this.tag+"'>>\sn<<tiddler News>>\sn!Archive\sn<<tiddler Archive>>";\n },\n display:function () {\n invokeParamifier(params,"onstart");\n if(window.story.isEmpty()) {\n if ((config.options.txtLastVisit != undefined)&&(config.shadowTiddlers.News!=this.noNews)) {\n var defaultParams = config.shadowTiddlers.News.parseParams("open",null,false);\n invokeParamifier(defaultParams,"onstart");\n }\n }\n store.notifyAll();\n },\n update:function () {\n config.options.txtLastVisit = new Date().convertToYYYYMMDDHHMM();\n saveOptionCookie("txtLastVisit");\n }\n}\nwindow.restart = function() {\n TWkd.News.choose();\n TWkd.News.display();\n TWkd.News.update();\n TWkd.News.restart();\n}\n//}}}
//{{{\nTWkd.News.noNews = "No news since your last visit";\nTWkd.News.noArchive ="Nothing archived yet";\n//}}}
//{{{\nTWkd.News.noNews = "Pas de news depuis votre dernière visite";\nTWkd.News.noArchive ="Pas d'archive pour l'instant";\n//}}}
/***\n|''Name:''|NewDocumentPlugin|\n|''Source:''|http://www.TiddlyTools.com/#NewDocumentPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nQuickly create new TiddlyWiki documents from your existing document, with just one click! Use the {{{<<newDocument>>}}} macro to place a "new document" link into your sidebar/mainmenu/any tiddler (wherever you like). Select this command to automatically create a "new.html" document containing a specific set of tagged tiddlers. Optional parameters let you specify an alternate path/filename for the new file, or different tags to match. You can also indicate "ask" for either parameter, which will trigger a prompt for input when the command is selected.\n\n!!!!!Usage\n<<<\n{{{<<newDocument label:text filename tag tag tag...>>}}}\n{{{<<newDocument label:text filename all>>}}}\n{{{<<newDocument label:text filename snap>>}}}\n where:\n* ''label:text'' defines //optional// alternative link text (replaces default "new document" display)\n* ''filename'' is any local path-and-filename. If no parameters are provided, the default is to create the file "new.html" in the current directory. If a filename is provided without a path (i.e., there is no "/" in the input), then the current directory is also assumed. Otherwise, this parameter is expected to contain the complete path and filename needed to write the file to your local hard disk. If ''ask'' is used in place of the filename parameter then, when the command link is selected, a message box will be automatically displayed so you can select/enter the path and filename.\n* ''tag tag tag...'' is a list of one or more space-separated tags (use quotes or {{{[[]]}}} around tags that contain spaces). The new document will include all tiddlers that match at least one of the tags in the list. The default is to include tiddlers tagged with <<tag includeNew>>. The special value ''all'' may be used to match every tiddler (even those without tags). If ''ask'' is used in place of the tags then, when the command link is selected, a message box will be automatically displayed so you can enter the desired tags at that time.\n* When the keyword ''snap'' is used in place of tags to match, the plugin generates a file containing the //rendered// CSS-and-HTML for all tiddlers currently displayed in the document.\n\nNote: as of version 1.4.0 of this plugin, support for selecting tiddlers by using tag *expressions* has been replaced with simpler, more efficient "containsAny()" logic. To create new ~TiddlyWiki documents that contain only those tiddlers selected with advanced AND/OR/NOT Boolean expressions, you can use the filtering features provided by the ExportTiddlersPlugin (see www.TiddlyTools.com/#ExportTiddlersPlugin).\n<<<\n!!!!!Examples:\n<<<\n{{{<<newDocument>>}}}\nequivalent to {{{<<newDocument new.htm includeNew systemTiddlers>>}}}\ncreates default "new.html" containing tiddlers tagged with either<<tag includeNew>>or<<tag systemTiddlers>>\ntry it: <<newDocument>>\n\n{{{<<newDocument empty.html systemTiddlers>>}}}\ncreates "empty.html" containing only tiddlers tagged with<<tag systemTiddlers>>\n//(reproduces old-style (pre 2.0.2) empty file)//\ntry it: <<newDocument empty.html systemTiddlers>>\n\n{{{<<newDocument "label:create Import/Export starter" ask importexport>>}}}\nsave importexport tiddlers to a new file, prompts for path/file\ntry it: <<newDocument "label:create Import/Export starter" ask importexport>>\n\n{{{<<newDocument ask ask>>}}}\nprompts for path/file, prompts for tags to match\ntry it: <<newDocument ask ask>>\n\n{{{<<newDocument ask all>>}}}\nsave all current TiddlyWiki contents to a new file, prompts for path/file\ntry it: <<newDocument ask all>>\n\n{{{<<newDocument ask snap>>}}}\ngenerates snapshot of currently displayed document, prompts for path/file\ntry it: <<newDocument ask snap>>\n\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''NewDocumentPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.08.03 [1.4.3]'' in promptForFilename(), for IE (WinXP only), added handling for UserAccounts.CommonDialog\n''2006.07.29 [1.4.2]'' in onClickNewDocument(), okmsg display is now linked to newly created file\n''2006.07.24 [1.4.1]'' in promptForFilename(), check for nsIFilePicker.returnCancel to allow nsIFilePicker.returnOK **OR** nsIFilePicker.returnReplace to be processed.\n''2006.05.23 [1.4.0]'' due to very poor performance, support for tag *expressions* has been removed, in favor of a simpler "containsAny()" scan for tags.\n''2006.04.09 [1.3.6]'' in onClickNewDocument, added call to convertUnicodeToUTF8() to better handle international characters.\n''2006.03.15 [1.3.5]'' added nsIFilePicker() handler for selecting filename in moz-based browsers. IE and other non-moz browsers still use simple prompt() dialog\n''2006.03.15 [1.3.0]'' added "label:text" param for custom link text. added special "all" filter parameter for "save as..." handling (writes all tiddlers to output file)\n''2006.03.09 [1.2.0]'' added special "snap" filter parameter to generate and write "snapshot" files containing static HTML+CSS for currently rendered document.\n''2006.02.24 [1.1.2]'' Fix incompatiblity with TW 2.0.5 by removing custom definition of getLocalPath() (which is now part of TW core)\n''2006.02.03 [1.1.1]'' concatentate 'extra' params so that tag expressions don't have to be quoted. moved all text to 'formatted' string definitions for easier translation.\n''2006.02.03 [1.1.0]'' added support for tag EXPRESSIONS. plus improved documentation and code cleanup\n''2006.02.03 [1.0.0]'' Created.\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.newDocument = {major: 1, minor: 4, revision: 3, date: new Date(2006,8,3)};\n\nconfig.macros.newDocument = {\n newlabel: "new document",\n newprompt: "Create a new TiddlyWiki 'starter' document",\n newdefault: "new.html",\n allparam: "all",\n saveaslabel: "save as...",\n saveasprompt: "Save current TiddlyWiki to a different file",\n snapparam: "snap",\n snaplabel: "create a snapshot",\n snapprompt: "Create a 'snapshot' of the current TiddlyWiki display",\n snapdefault: "snapshot.html",\n askparam: "ask",\n labelparam: "label:",\n fileprompt: "Please enter a filename",\n filter: "includeNew",\n filterprompt: "Match one or more tags:\sn(space-separated, use [[...]] around tags containing spaces)",\n filtererrmsg: "Error in tag filter '%0'",\n snapmsg: "Document snapshot written to %1",\n okmsg: "%0 tiddlers written to %1",\n failmsg: "An error occurred while creating %0"\n};\n\nconfig.macros.newDocument.handler = function(place,macroName,params) {\n\n var path=getLocalPath(document.location.href);\n var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\s\s"); \n if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash\n\n if (params[0] && params[0].substr(0,config.macros.newDocument.labelparam.length)==config.macros.newDocument.labelparam)\n var label=params.shift().substr(config.macros.newDocument.labelparam.length)\n var filename=params.shift(); if (!filename) filename=config.macros.newDocument.newdefault;\n if (params[0]==config.macros.newDocument.snapparam) {\n if (!label) var label=config.macros.newDocument.snaplabel;\n var prompt=config.macros.newDocument.snapprompt;\n var defaultfile=config.macros.newDocument.snapdefault;\n }\n if (params[0]==config.macros.newDocument.allparam) {\n if (!label) var label=config.macros.newDocument.saveaslabel;\n var prompt=config.macros.newDocument.saveasprompt;\n var defaultfile=getLocalPath(document.location.href);\n var slashpos=defaultfile.lastIndexOf("/"); if (slashpos==-1) slashpos=defaultfile.lastIndexOf("\s\s");\n if (slashpos!=-1) defaultfile=defaultfile.substr(slashpos+1); // get filename only\n }\n if (!prompt) var prompt=config.macros.newDocument.newprompt;\n if (!label) var label=config.macros.newDocument.newlabel;\n if (!defaultfile) var defaultfile=config.macros.newDocument.newdefault;\n\n var btn=createTiddlyButton(place,label,prompt,onClickNewDocument);\n btn.path=path;\n btn.file=filename;\n btn.defaultfile=defaultfile;\n btn.filter=params.length?params:[config.macros.newDocument.filter]; \n}\n\n// IE needs explicit global scoping for functions called by browser events\nwindow.onClickNewDocument=function(e)\n{\n if (!e) var e = window.event; var btn=resolveTarget(e);\n\n // assemble document content, write file, report result\n var okmsg=config.macros.newDocument.okmsg;\n var failmsg=config.macros.newDocument.failmsg;\n var count=0;\n var out="";\n if (btn.filter[0]==config.macros.newDocument.snapparam) { // HTML+CSS snapshot\n var styles=document.getElementsByTagName("style");\n out+="<html>\sn<head>\sn<style>\sn";\n for(var i=0; i < styles.length; i++)\n out +="/* stylesheet from tiddler:"+styles[i].getAttribute("id")+" */\sn"+styles[i].innerHTML+"\sn\sn";\n out+="</style>\sn</head>\sn<body>\sn\sn"+document.getElementById("contentWrapper").innerHTML+"\sn\sn</body>\sn</html>";\n okmsg=config.macros.newDocument.snapmsg;\n } else { // TW starter document\n // get the TiddlyWiki core code source\n var sourcefile=getLocalPath(document.location.href);\n var source=loadFile(sourcefile);\n if(source==null) { alert(config.messages.cantSaveError); return null; }\n var posOpeningDiv=source.indexOf(startSaveArea);\n var posClosingDiv=source.lastIndexOf(endSaveArea);\n if((posOpeningDiv==-1)||(posClosingDiv==-1)) { alert(config.messages.invalidFileError.format([sourcefile])); return; }\n // get the matching tiddler divs\n var match=btn.filter;\n if (match[0]==config.macros.newDocument.askparam) {\n var newfilt=prompt(config.macros.newDocument.filterprompt,config.macros.newDocument.filter);\n if (!newfilt) return; // cancelled by user\n match=newfilt.readMacroParams();\n }\n var storeAreaDivs=[];\n var tiddlers=store.getTiddlers('title');\n for (var i=0; i<tiddlers.length; i++)\n if (match[0]==config.macros.newDocument.allparam || (tiddlers[i].tags && tiddlers[i].tags.containsAny(match)) )\n storeAreaDivs.push(tiddlers[i].saveToDiv());\n out+=source.substr(0,posOpeningDiv+startSaveArea.length);\n out+=convertUnicodeToUTF8(storeAreaDivs.join("\sn"))+"\sn\st\st";\n out+=source.substr(posClosingDiv);\n count=storeAreaDivs.length;\n }\n // get output path/filename\n var filename=btn.file;\n if (filename==config.macros.newDocument.askparam)\n filename=promptForFilename(config.macros.newDocument.fileprompt,btn.path,btn.defaultfile);\n if (!filename) return; // cancelled by user\n // if specified file does not include a path, assemble fully qualified path and filename\n var slashpos=filename.lastIndexOf("/"); if (slashpos==-1) slashpos=filename.lastIndexOf("\s\s");\n if (slashpos==-1) filename=btn.path+filename;\n var ok=saveFile(filename,out);\n var msg=ok?okmsg.format([count,filename]):failmsg.format([filename]);\n var link=ok?"file:///"+filename.replace(regexpBackSlash,'/'):""; // change local path to link text\n clearMessage(); displayMessage(msg,link);\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); return(false);\n}\n//}}}\n\n//{{{\nfunction promptForFilename(msg,path,file)\n{\n if(window.Components) { // moz\n try {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\n var nsIFilePicker = window.Components.interfaces.nsIFilePicker;\n var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);\n picker.init(window, msg, nsIFilePicker.modeSave);\n var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);\n thispath.initWithPath(path);\n picker.displayDirectory=thispath;\n picker.defaultExtension='html';\n picker.defaultString=file;\n picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);\n if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;\n }\n catch(e) { alert('error during local file access: '+e.toString()) }\n }\n else { // IE\n try { // XP only\n var s = new ActiveXObject('UserAccounts.CommonDialog');\n s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';\n s.FilterIndex=3; // default to HTML files;\n s.InitialDir=path;\n s.FileName=file;\n if (s.showOpen()) var result=s.FileName;\n }\n catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE\n }\n return result;\n}\n//}}}
{{fr{\n[[$1]] n'a pas encore été mis à jour, toutefois, il est toujours disponible à l'adresse : http://yann.perrin.googlepages.com/twkd1.html#$1}}}{{hide{\n----}}}{{en{\n[[$1]] was not updated yet, however, is is still available at :http://yann.perrin.googlepages.com/twkd1.html#$1}}}
{{fr{\n[[$1]] a été remplacé par [[$2]], toutefois, [[$1]] est toujours disponible à l'adresse : http://yann.perrin.googlepages.com/twkd1.html#$1}}}{{hide{\n----}}}{{en{\n[[$1]] was replaced by [[$2]], however, [[$1]] is still available at :http://yann.perrin.googlepages.com/twkd1.html#$1}}}
<!--{{{-->\n<div class='header'>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div macro='hideWhen (readOnly)'><div id='topMenu' refresh='content' tiddler='TopMenu' ondblclick="story.displayTiddler(null,'TopMenu', DEFAULT_EDIT_TEMPLATE)"></div></div>\n<div macro='showWhen (readOnly)'><div id='topMenu' refresh='content' tiddler='TopMenuReadOnly' ondblclick="story.displayTiddler(null,'TopMenu', DEFAULT_EDIT_TEMPLATE)"></div></div></div>\n<!--<div id='mainMenu' refresh='content' force='true' tiddler='MainMenu'></div>-->\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->
{{fr{\nLes <<tag Plugins>> sont des tiddlers contenant du code javascript qui ajoutent diverses fonctionnalités à TiddlyWiki. Ceux qui sont indéxés comme tels dans TWkd sont mon oeuvre.}}}{{hide{\n----}}}{{en{\n<<tag Plugins>> are tiddlers containing some javascript code that add to TiddlyWiki possibilities. Those that are tagged as such are my creations.}}}
<<tiddler OutdatedTemplate with:"PolyGlotFormat" with:"easyTongue">>
/***\n{{fr{\n<<tiddler PolyGlotPluginDoc_fr>>}}}{{hide{\n----\n}}}{{en{\n<<tiddler PolyGlotPluginDoc_en>>}}}\n!Options\n{{fr{<<option chkPolyglotHijackUrl>> ajouter le paramètre de langues aux url générées par {{{permaview}}} et {{{permalink}}} }}}{{en{<<option chkPolyglotHijackUrl>>add language parameter to {{{permalink}}} and {{{permaview}}} generated urls}}}\n\n!Code\n***/\n// //{{en{ Version Info}}}{{fr{ Informations de version}}}\n//{{{\nversion.extensions.PolyGlotPlugin = { major: 1, minor: 1, revision: 4, date: new Date(2007,31,1),\n source: "http://yann.perrin.googlepages.com/twkd.html#PolyGlotPlugin"\n};\n//}}}\n// //{{en{ Default Settings}}}{{fr{ Paramètres par défaut}}}\n//{{{\nconfig.macros.polyglot = {\ndefaultlang:"fr",\nlanguages:["fr","en"],\npluginTranslationTag:"linguo",\ntooltip:"version ",\nnotfound:" isn't one of the supported languages",\nhijackurl:false,\nhidewhenactive:"hide"\n};\n//}}}\n// //{{en{ generating CSS hiding unselected languages}}}{{fr{ génération des styles qui cachent les langages non séléctionnées}}}\n//{{{\npolyglotCSS = function(lang){\n var langs=[];\n langs=langs.concat(config.macros.polyglot.languages);\n var current=langs.find(lang);\n if (current != null)\n langs.splice(current,1);\n var hlangs="." + langs.join(",.");\n var css=hlangs + ",." + config.macros.polyglot.hidewhenactive + "{display:none;}";\n return css;\n};\n//}}}\n// //{{en{ tag and process translation tiddlers}}}{{fr{ indexation et utilisation des tiddlers de traduction}}}\n//{{{\npolyglotTag = function(tiddler,lang){\n if (!tiddler.isTagged(lang) && tiddler.isTagged('systemConfig'))\n {\n var current = tiddler.tags.find('systemConfig');\n tiddler.tags.splice(current,1);\n tiddler.assign(tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.created);\n };\n if (tiddler.isTagged(lang) && !tiddler.isTagged('systemConfig'))\n {\n var tags=tiddler.getTags();\n tags += " systemConfig";\n window.eval(tiddler.text);\n tiddler.assign(tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tags,tiddler.created);\n };\n};\n//}}}\n// //{{en{ Apply necessary changes}}}{{fr{ Application des changements}}}\n//{{{\npolyglotApply = function(lang) {\n config.options.txtPolyglotLang=lang;\n saveOptionCookie("txtPolyglotLang");\n setStylesheet(polyglotCSS(lang),'language');\n var tiddlers = store.getTaggedTiddlers(config.macros.polyglot.pluginTranslationTag);\n for (var i=0;i<tiddlers.length;i++)\n polyglotTag(tiddlers[i],lang);\n};\n//}}}\n// //{{en{ Hijacking restart() to load selected language tiddlers on startup}}}{{fr{ Détournement de restart() afin de charger les tiddlers de traduction au démarrage}}}\n//{{{\nwindow.polyglotRestart=window.restart;\nwindow.restart = function() {\nif (config.options.txtPolyglotLang==undefined)\n config.options.txtPolyglotLang=config.macros.polyglot.defaultlang;\nif (config.options.chkPolyglotHijackUrl==undefined)\n config.options.chkPolyglotHijackUrl = config.macros.polyglot.hijackurl;\nvar lang = config.options.txtPolyglotLang;\npolyglotApply(lang);\npolyglotRestart();\nstore.notifyAll();\n};\n//}}}\n// //{{en{ refresh displayed tiddlers}}}{{fr{ rafraichit les tiddlers affichés}}}\n//{{{\nrefreshStory = function() {\nstory.forEachTiddler(function(title,element){\n if(element.getAttribute("dirty") != "true")\n story.refreshTiddler(title,null,true);\n });\n};\n//}}}\n// //{{en{ polyglot macro handler}}}{{fr{ affichage de la macro polyglot}}}\n//{{{\nwindow.polyglotOnClickHandler=function(e) {\n var btn=this;\n var lang=btn.getAttribute("id");\n polyglotApply(lang);\n store.notifyAll();\n refreshStory();\n};\nconfig.macros.polyglot.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\nvar langs = config.macros.polyglot.languages;\nfor (var i=0;i<langs.length;i++)\n {\n if (i>0)\n wikify(" | ",place);\n createTiddlyButton(place,langs[i],this.tooltip+langs[i],polyglotOnClickHandler,"polyglotBtn",langs[i]);\n };\n};\n//}}}\n// //{{en{paramifier}}}{{fr{gestion des paramètres passés par l'url}}}\n//{{{\nconfig.paramifiers.lang = {\n onconfig: function(v){\n var current=config.macros.polyglot.languages.find(v);\n if (current !=null)\n {\n config.options.txtPolyglotLang=v;\n saveOptionCookie("txtPolyglotLang");\n }\n else\n alert(v + config.macros.polyglot.notfound);\n}\n}\n//}}}\n// //{{en{hijacking permaview and permalink to add the lang: param to the url}}}{{fr{detournement de permaview et permalink afin d'ajouter le parametre de langue à l'url}}}\n//{{{\nvar addLangToUrl = function() {\nvar param = "lang:"+config.options.txtPolyglotLang;\nif (config.options.chkPolyglotHijackUrl)\n window.location.hash = window.location.hash+" "+param;\n}\nwindow.PolyGlotPermaLink=config.commands.permalink.handler;\nconfig.commands.permalink.handler = function(event,src,title) {\nPolyGlotPermaLink(event,src,title);\naddLangToUrl();\n}\nwindow.PolyGlotPermaView=config.macros.permaview.onClick;\nconfig.macros.permaview.onClick=function(e) {\nPolyGlotPermaView(e);\naddLangToUrl();\nreturn false;\n}\n//}}}\n// //{{en{shadow links to documentation}}}{{fr{liens vers la documentation si elle n'est pas présente}}}\n//{{{\nconfig.shadowTiddlers.PolyGlotPluginDoc_en = "Documentation for this plugin is available [[here|" + version.extensions.PolyGlotPlugin.source +"Doc_en]]";\nconfig.shadowTiddlers.PolyGlotPluginDoc_fr = "La documentation de ce plugin est disponible [[ici|" + version.extensions.PolyGlotPlugin.source +"Doc_fr]]";\n//}}}
|Name|PolyGlotPlugin|\n|Author|YannPerrin|\n|Source|http://yann.perrin.googlepages.com/twkd.html#PolyGlotPlugin ([[del.icio.us|http://del.icio.us/post?url=http://yann.perrin.googlepages.com/twkd.html#PolyGlotPlugin]])|\n|Version|1.1.4|\n|Require|~TW2.0.7+|\n\n!Description\nThis plugin allows you to create a multilingual TiddlyWiki. It will adapt display to the user language preference.\nIt does not, however, translate content by itself.\n.\n!Installation\n*import (or copy/paste in edit mode) the following tiddler in your document : <<br>>PolyGlotPlugin (tag it : <<tag systemConfig>>)\n*adapt the "Default Parameter" section of the code to your needs\n*import (or copy/paste in edit mode) the necessary [[language tiddlers|linguo]] in your document.\n*tag these tiddlers according to the defined "Default Parameters"\n*in order to allow the user to change language, you still need to install the polyglot macro\n**in a tiddler by writing {{{<<polyglot>>}}} in it's body\n**and/or by writing {{{<div macro='polyglot'></div>}}} or {{{<span macro='polyglot'></span>}}} in the PageTemplate\n*if you want offline access to this documentation, import (or copy/paste in edit mode) the following tiddler in your document : <<br>>PolyGlotPluginDoc_en\n*finally, save changes and reload the document.\n\n\n!Usage\n''Once properly installed'' (see above), this plugin adapt the display to the user preferences by :\n*loading the tiddlers tagged with the chosen language and with the tag defined as pluginTranslationTag (by default <<tag linguo>>) as if they were plugins. Which will result in interface translation.\n*tiddler content marked like that :\n{{{\n{{**{content}}}\n}}}\nis shown if ** is the chosen language and hidden if ** is one of the other defined language.\n\n!Revisions History\n2007.31.01-1.1.4\n>bug correction related to changes in Tiddlywiki core code\n2006.08.06-1.1.3\n>added a class that is always hidden when the plugin is installed so that a good presentation is possible when it is not.\n2006.01.05-1.1.2\n>display bug correction\n>improved compatibility with other plugins\n>(suggestions by BidiX)\n2006.20.04-1.1.1\n>optionnal addition of language parameter to permalink and permaview generated urls\n2006.18.04-1.1.0\n>added {{{lang:}}} paramifier support\n>examples :\n> http://yann.perrin.googlepages.com/twkd.html#lang:fr\n> http://yann.perrin.googlepages.com/twkd.html#lang:en\n> http://yann.perrin.googlepages.com/twkd.html#lang:ru (this one is to show how the plugin handle wrong language choice)\n2006.15.04-1.0.3\n>correction of an internet explorer specific bug.\n2006.13.04-1.0.2\n>correction of an internet explorer specific bug preventing the first language to display(spotted by BidiX)\n2006.13.04-1.0.1\n>added toolbar refreshing of open tiddlers (spotted by Udo Borkowski)\n2006.12.04-1.0.0\n>Initial Public Release\n\n!Credits\nThanks to :\n*[[Jeremy Ruston]] for TiddlyWiki\n*[[Bram Chen]] for his [english translation tiddler|en-US]] that i slightly modified to use in TWkd\n*[[Jacques Turbé]] for ~AdaptationFrancaise2 wich was the basis of the [[fr-FR]] tiddler\n*My father, which gave me the idea and desire to write this plugin
|Nom|PolyGlotPlugin|\n|Auteur|YannPerrin|\n|Source|http://yann.perrin.googlepages.com/twkd.html#PolyGlotPlugin ([[del.icio.us|http://del.icio.us/post?url=http://yann.perrin.googlepages.com/twkd.html#PolyGlotPlugin]])|\n|Version|1.1.4|\n|Requiert|~TW2.0.7+|\n\n!Description\nCe plugin permet de créer un tiddlywiki multilingue, et d'adapter l'affichage à la langue choisie par l'utilisateur.\nIl n'effectue pas par lui même de traduction de contenu.\n.\n!Installation\n*importez (ou copiez/collez en mode édition) le tiddler suivant dans votre document : <<br>>PolyGlotPlugin (indexez le : systemConfig)\n*adaptez la section "Paramètres par défaut" du code selon vos besoins\n*importez (ou copiez/collez en mode édition) les [[tiddlers de langages|linguo]] nécessaires dans votre document.\n*indexez ces tiddlers selon les "Paramètres par défaut" que vous avez défini (langue & pluginTranslationTag)\n*afin de permettre le changement de langue, il faut encore installer la macro polyglot\n**dans un tiddler sous la forme {{{<<polyglot>>}}}\n**et/ou dans le PageTemplate sous la forme {{{<div macro='polyglot'></div>}}} ou {{{<span macro='polyglot'></span>}}}\n*si vous souhaitez accéder hors-ligne à cette documentation, importez (ou copiez/collez en mode édition) le tiddler suivant dans votre document : <<br>>PolyGlotPluginDoc_fr\n*enfin, sauvegardez les changements et rechargez le document.\n\n\n!Usage\n''Une fois correctement installé'' (voir ci-dessus), ce plugin utilise deux systèmes afin d'adapter l'affichage à la langue choisie :\n*les tiddlers indexés avec la langue choisie et l'index défini comme pluginTranslationTag (par défaut <<tag linguo>>) sont marqués de l'index <<tag systemConfig>> et leur contenu est chargé comme un plugin\n*le contenu marqué de la manière suivante :\n{{{\n{{**{contenu}}}\n}}}\nest affiché si ** correspond à la langue choisie et masqué si ** correspond à une des autres langues utilisées.\n\n!Historique des Révisions\n2007.31.01-1.1.4\n>correction d'un bug lié au changement du code source de TiddlyWiki\n2006.08.06-1.1.3\n>ajout d'une classe qui est toujours cachée lorsque le plugin est installé pour permettre une présentation correcte quand il est absent\n2006.01.05-1.1.2\n>correction d'un bug d'affichage\n>amélioration de la compatibilité avec d'autres plugins\n>(suggestions de BidiX)\n2006.20.04-1.1.1\n>ajout optionnel du parametre de langue aux urls générées par permaview et permalink\n2006.18.04-1.1.0\n>ajout du support pour la transmission du langage choisi par l'url sous la forme lang:**\n>exemples :\n> http://yann.perrin.googlepages.com/twkd.html#lang:fr\n> http://yann.perrin.googlepages.com/twkd.html#lang:en\n> http://yann.perrin.googlepages.com/twkd.html#lang:ru (ce dernier montre comment le plugin réagit en cas d'erreur)\n2006.15.04-1.0.3\n>correction du problème de fonctionnement sous internet explorer\n2006.13.04-1.0.2\n>correction du non-affichage de la première langue sous internet explorer (signalé par BidiX)\n2006.13.04-1.0.1\n>correction du non-rafraichissement des barres d'outils des éléments ouverts (détecté par Udo Borkowski)\n2006.12.04-1.0.0\n>Première version publique\n\n!Crédits\nMerci à :\n*[[Jeremy Ruston]] pour TiddlyWiki\n*[[Bram Chen]] pour son [tiddler de traduction anglaise|en-US]] que j'ai légèrement adapté à TWkd\n*[[Jacques Turbé]] pour son ~AdaptationFrancaise2 qui a servi de base pour le tiddler [[fr-FR]]\n*Mon père qui m'a donné l'idée et l'envie d'écrire ce plugin
/***\n| Name:|QuickOpenTagPlugin|\n| Description:|Changes tag links to make it easier to open tags as tiddlers|\n| Version:|6.1.1|\n| Date:|01-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\nconfig.quickOpenTag = {\n\n dropdownChar: (document.all ? "\su25bc" : "\su25be"), // the little one doesn't work in IE\n\n createTagButton: function(place,tag,excludeTiddler) {\n // little hack so we can to <<tag PrettyTagName|RealTagName>>\n var splitTag = tag.split("|");\n var pretty = tag;\n if (splitTag.length == 2) {\n tag = splitTag[1];\n pretty = splitTag[0];\n }\n \n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyText(createTiddlyLink(sp,tag,false),pretty);\n \n var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if (excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n },\n\n miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n },\n\n allTagsHandler: function(place,macroName,params) {\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul");\n if(tags.length == 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++) {\n var theListItem = createTiddlyElement(theDateList,"li");\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n var theDropDownBtn = createTiddlyButton(theListItem," " +\n config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/\sn"+\n"/* created by QuickOpenTagPlugin */\sn"+\n".tagglyTagged .quickopentag, .tagged .quickopentag \sn"+\n" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }\sn"+\n".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }\sn"+\n".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}\sn"+\n"/* extra specificity to make it work right */\sn"+\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#displayArea .viewer .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink \sn"+\n" { border:0px solid black; }\sn"+\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n" { margin-left:0px; padding-left:2px; }\sn"+\n"#displayArea .viewer .quickopentag a.tiddlyLink, \sn"+\n"#mainMenu .quickopentag a.tiddlyLink \sn"+\n" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }\sn"+\n"a.miniTag {font-size:150%;} \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n" /* looks better in right justified main menus */\sn"+\n" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }\sn" + \n"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }\sn" +\n"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }\sn" +\n"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }\sn" +\n"/*}}}*/\sn"+\n "",\n\n init: function() {\n // we fully replace these builtins. can't hijack them easily\n window.createTagButton = this.createTagButton;\n config.macros.allTags.handler = this.allTagsHandler;\n config.macros.miniTag = { handler: this.miniTagHandler };\n config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;\n if (store)\n store.addNotification("QuickOpenTagStyles",refreshStyles);\n else\n config.notifyTiddlers.push({name:"QuickOpenTagStyles", notify: refreshStyles});\n }\n\n}\n\nconfig.quickOpenTag.init();\n\n//}}}\n
/***\n|''Name:''|RearrangeTiddlersPlugin|\n|''Source:''|http://www.TiddlyTools.com/#AttachFilePlugin|\n|''Author:''|Joe Raii|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nadapted from: http://www.cs.utexas.edu/~joeraii/dragn/#Draggable\nchanges by ELS:\n* hijack refreshTiddler() instead of overridding createTiddler()\n* find title element by className instead of elementID\n* set cursor style via code instead of stylesheet\n* set tooltip help text\n* set tiddler "position:relative" when starting drag event, restore saved value when drag ends\n* update 2006.08.07: use getElementsByTagName("*") to find title element, even when it is 'buried' deep in tiddler DOM elements (due to custom template usage)\n\n***/\n//{{{\n\nStory.prototype.rearrangeTiddlersHijack_refreshTiddler = Story.prototype.refreshTiddler;\nStory.prototype.refreshTiddler = function(title,template,unused1,unused2,unused3,unused4,unused5)\n{\n this.rearrangeTiddlersHijack_refreshTiddler(title,template,unused1,unused2,unused3,unused4,unused5);\n var theTiddler = document.getElementById(this.idPrefix + title); if (!theTiddler) return;\n var theHandle;\n var children=theTiddler.getElementsByTagName("*");\n for (var i=0; i<children.length; i++) if (hasClass(children[i],"title")) { theHandle=children[i]; break; }\n if (!theHandle) return theTiddler;\n\n Drag.init(theHandle, theTiddler, 0, 0, null, null);\n theHandle.style.cursor="move";\n theHandle.title="drag title to re-arrange tiddlers"\n theTiddler.onDrag = function(x,y,myElem) {\n if (this.style.position!="relative")\n { this.savedstyle=this.style.position; this.style.position="relative"; }\n y = myElem.offsetTop;\n var next = myElem.nextSibling;\n var prev = myElem.previousSibling;\n if (next && y + myElem.offsetHeight > next.offsetTop + next.offsetHeight/2) { \n myElem.parentNode.removeChild(myElem);\n next.parentNode.insertBefore(myElem, next.nextSibling);//elems[pos+1]);\n myElem.style["top"] = -next.offsetHeight/2+"px";\n }\n if (prev && y < prev.offsetTop + prev.offsetHeight/2) { \n myElem.parentNode.removeChild(myElem);\n prev.parentNode.insertBefore(myElem, prev);\n myElem.style["top"] = prev.offsetHeight/2+"px";\n }\n };\n theTiddler.onDragEnd = function(x,y,myElem) {\n myElem.style["top"] = "0px";\n if (this.savedstyle!=undefined)\n this.style.position=this.savedstyle;\n }\n return theTiddler;\n}\n\n/**************************************************\n * dom-drag.js\n * 09.25.2001\n * www.youngpup.net\n **************************************************\n * 10.28.2001 - fixed minor bug where events\n * sometimes fired off the handle, not the root.\n **************************************************/\n\nvar Drag = {\n obj:null,\n\n init:\n function(o, oRoot, minX, maxX, minY, maxY) {\n o.onmousedown = Drag.start;\n o.root = oRoot && oRoot != null ? oRoot : o ;\n if (isNaN(parseInt(o.root.style.left))) o.root.style.left="0px";\n if (isNaN(parseInt(o.root.style.top))) o.root.style.top="0px";\n o.minX = typeof minX != 'undefined' ? minX : null;\n o.minY = typeof minY != 'undefined' ? minY : null;\n o.maxX = typeof maxX != 'undefined' ? maxX : null;\n o.maxY = typeof maxY != 'undefined' ? maxY : null;\n o.root.onDragStart = new Function();\n o.root.onDragEnd = new Function();\n o.root.onDrag = new Function();\n },\n\n start:\n function(e) {\n var o = Drag.obj = this;\n e = Drag.fixE(e);\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n o.root.onDragStart(x, y, Drag.obj.root);\n o.lastMouseX = e.clientX;\n o.lastMouseY = e.clientY;\n if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;\n if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;\n if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;\n if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;\n document.onmousemove = Drag.drag;\n document.onmouseup = Drag.end;\n Drag.obj.root.style["z-index"] = "10";\n return false;\n },\n\n drag:\n function(e) {\n e = Drag.fixE(e);\n var o = Drag.obj;\n var ey = e.clientY;\n var ex = e.clientX;\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n var nx, ny;\n if (o.minX != null) ex = Math.max(ex, o.minMouseX);\n if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);\n if (o.minY != null) ey = Math.max(ey, o.minMouseY);\n if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);\n nx = x + (ex - o.lastMouseX);\n ny = y + (ey - o.lastMouseY);\n Drag.obj.root.style["left"] = nx + "px";\n Drag.obj.root.style["top"] = ny + "px";\n Drag.obj.lastMouseX = ex;\n Drag.obj.lastMouseY = ey;\n Drag.obj.root.onDrag(nx, ny, Drag.obj.root);\n return false;\n },\n\n end:\n function() {\n document.onmousemove = null;\n document.onmouseup = null;\n Drag.obj.root.style["z-index"] = "0";\n Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style["left"]), parseInt(Drag.obj.root.style["top"]), Drag.obj.root);\n Drag.obj = null;\n },\n\n fixE:\n function(e) {\n if (typeof e == 'undefined') e = window.event;\n if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;\n if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;\n return e;\n }\n};\n//}}}\n
/***\n|''Name:''|ReminderPlugin|\n|''Version:''|2.3.8 (Mar 9, 2006)|\n|''Source:''|http://www.geocities.com/allredfaq/reminderMacros.html|\n|''Author:''|Jeremy Sheeley(pop1280 [at] excite [dot] com)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|reminder, showreminders, displayTiddlersWithReminders, newReminder|\n|''TiddlyWiki:''|2.0+|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n\n!Description\nThis plugin provides macros for tagging a date with a reminder. Use the {{{reminder}}} macro to do this. The {{{showReminders}}} and {{{displayTiddlersWithReminder}}} macros automatically search through all available tiddlers looking for upcoming reminders.\n\n!Installation\n* Create a new tiddler in your tiddlywiki titled ReminderPlugin and give it the {{{systemConfig}}} tag. The tag is important because it tells TW that this is executable code.\n* Double click this tiddler, and copy all the text from the tiddler's body.\n* Paste the text into the body of the new tiddler in your TW.\n* Save and reload your TW.\n* You can copy some examples into your TW as well. See [[Simple examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]\n\n!Syntax:\n|>|See [[ReminderSyntax]] and [[showRemindersSyntax]]|\n\n!Revision history\n* v2.3.8 (Mar 9, 2006)\n**Bug fix: A global variable had snuck in, which was killing FF 1.5.0.1\n**Feature: You can now use TIDDLER and TIDDLERNAME in a regular reminder format\n* v2.3.6 (Mar 1, 2006)\n**Bug fix: Reminders for today weren't being matched sometimes.\n**Feature: Solidified integration with DatePlugin and CalendarPlugin\n**Feature: Recurring reminders will now return multiple hits in showReminders and the calendar.\n**Feature: Added TIDDLERNAME to the replacements for showReminders format, for plugins that need the title without brackets.\n* v2.3.5 (Feb 8, 2006)\n**Bug fix: Sped up reminders lots. Added a caching mechanism for reminders that have already been matched.\n* v2.3.4 (Feb 7, 2006)\n**Bug fix: Cleaned up code to hopefully prevent the Firefox 1.5.0.1 crash that was causing lots of plugins \nto crash Firefox. Thanks to http://www.jslint.com\n* v2.3.3 (Feb 2, 2006)\n**Feature: newReminder now has drop down lists instead of text boxes.\n**Bug fix: A trailing space in a title would trigger an infinite loop.\n**Bug fix: using tag:"birthday !reminder" would filter differently than tag:"!reminder birthday"\n* v2.3.2 (Jan 21, 2006)\n**Feature: newReminder macro, which will let you easily add a reminder to a tiddler. Thanks to Eric Shulman (http://www.elsdesign.com) for the code to do this.\n** Bug fix: offsetday was not working sometimes\n** Bug fix: when upgrading to 2.0, I included a bit to exclude tiddlers tagged with excludeSearch. I've reverted back to searching through all tiddlers\n* v2.3.1 (Jan 7, 2006)\n**Feature: 2.0 compatibility\n**Feature AlanH sent some code to make sure that showReminders prints a message if no reminders are found.\n* v2.3.0 (Jan 3, 2006)\n** Bug Fix: Using "Last Sunday (-0)" as a offsetdayofweek wasn't working.\n** Bug Fix: Daylight Savings time broke offset based reminders (for example year:2005 month:8 day:23 recurdays:7 would match Monday instead of Tuesday during DST.\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// ReminderPlugin\n//============================================================================\n//============================================================================\n\nversion.extensions.ReminderPlugin = {major: 2, minor: 3, revision: 8, date: new Date(2006,3,9), source: "http://www.geocities.com/allredfaq/reminderMacros.html"};\n\n//============================================================================\n// Configuration\n// Modify this section to change the defaults for \n// leadtime and display strings\n//============================================================================\n\nconfig.macros.reminders = {};\nconfig.macros["reminder"] = {};\nconfig.macros["newReminder"] = {};\nconfig.macros["showReminders"] = {};\nconfig.macros["displayTiddlersWithReminders"] = {};\n\nconfig.macros.reminders["defaultLeadTime"] = [0,6000];\nconfig.macros.reminders["defaultReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY";\nconfig.macros.reminders["defaultShowReminderMessage"] = "DIFF: TITLE on 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";\nconfig.macros.reminders["emtpyShowRemindersString"] = "There are no upcoming events";\n\n\n//============================================================================\n// Code\n// You should not need to edit anything \n// below this. Make sure to edit this tiddler and copy \n// the code from the text box, to make sure that \n// tiddler rendering doesn't interfere with the copy \n// and paste.\n//============================================================================\n\n// This line is to preserve 1.2 compatibility\n if (!story) var story=window; \n//this object will hold the cache of reminders, so that we don't\n//recompute the same reminder over again.\nvar reminderCache = {};\n\nconfig.macros.showReminders.handler = function showReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the \n //leadtime a few lines down.\n paramHash["leadtime"] = [-10000, 10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = "";\n if (arr.length == 0)\n {\n mess += config.macros.reminders.emtpyShowRemindersString; \n }\n for (var j = 0; j < arr.length; j++)\n {\n if (paramHash["format"] != null)\n {\n arr[j]["params"]["format"] = paramHash["format"];\n }\n else\n {\n arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];\n }\n mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);\n mess += "\sn";\n }\n wikify(mess, elem, null, null);\n};\n\n\nconfig.macros.displayTiddlersWithReminders.handler = function displayTiddlersWithReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the leadtime \n //a few lines down.\n paramHash["leadtime"] = [-10000,10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n for (var j = 0; j < arr.length; j++)\n {\n displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false);\n }\n};\n\nconfig.macros.reminder.handler = function reminder(place,macroName,params)\n{\n var dateHash = getParamsForReminder(params);\n if (dateHash["hidden"] != null)\n {\n return;\n }\n var leadTime = dateHash["leadtime"];\n if (leadTime == null)\n {\n leadTime = config.macros.reminders["defaultLeadTime"]; \n }\n var leadTimeLowerBound = new Date().getMidnight().addDays(leadTime[0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(leadTime[1]);\n var matchedDate = findDateForReminder(dateHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound);\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(place).id.substr(7);\n if (matchedDate != null)\n {\n var diff = matchedDate.getDifferenceInDays(new Date().getMidnight());\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate, title);\n wikify(mess, elem, null, null);\n }\n else\n {\n createTiddlyElement(place,"span",null,null, config.macros.reminders["noReminderFound"].replace("TITLE", dateHash["title"]).replace("LEADTIMEUPPER", leadTime[1]).replace("LEADTIMELOWER", leadTime[0]).replace("TIDDLERNAME", title).replace("TIDDLER", "[[" + title + "]]") );\n }\n};\n\nconfig.macros.newReminder.handler = function newReminder(place,macroName,params)\n{\n var today=new Date().getMidnight();\n var formstring = '<html><form>Year: <select name="year"><option value="">Every year</option>';\n for (var i = 0; i < 5; i++)\n {\n formstring += '<option' + ((i == 0) ? ' selected' : '') + ' value="' + (today.getFullYear() +i) + '">' + (today.getFullYear() + i) + '</option>';\n }\n formstring += '</select>&nbsp;&nbsp;Month:<select name="month"><option value="">Every month</option>';\n for (i = 0; i < 12; i++)\n {\n formstring += '<option' + ((i == today.getMonth()) ? ' selected' : '') + ' value="' + (i+1) + '">' + config.messages.dates.months[i] + '</option>';\n }\n formstring += '</select>&nbsp;&nbsp;Day:<select name="day"><option value="">Every day</option>';\n for (i = 1; i < 32; i++)\n {\n formstring += '<option' + ((i == (today.getDate() )) ? ' selected' : '') + ' value="' + i + '">' + i + '</option>';\n }\n\nformstring += '</select>&nbsp;&nbsp;Reminder Title:<input type="text" size="40" name="title" value="please enter a title" onfocus="this.select();"><input type="button" value="ok" onclick="addReminderToTiddler(this.form)"></form></html>';\n\n var panel = config.macros.slider.createSlider(place,null,"New Reminder","Open a form to add a new reminder to this tiddler");\n wikify(formstring ,panel,null,store.getTiddler(params[1]));\n};\n\n// onclick: process input and insert reminder at 'marker'\nwindow.addReminderToTiddler = function(form) {\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(form).id.substr(7);\n var tiddler=store.getTiddler(title);\n var txt='\sn<<reminder ';\n if (form.year.value != "")\n txt += 'year:'+form.year.value + ' ';\n if (form.month.value != "")\n txt += 'month:'+form.month.value + ' ';\n if (form.day.value != "")\n txt += 'day:'+form.day.value + ' ';\n txt += 'title:"'+form.title.value+'" ';\n txt +='>>';\n tiddler.set(null,tiddler.text + txt);\n window.story.refreshTiddler(title,1,true);\n store.setDirty(true);\n};\n\nfunction hasTag(tiddlerTags, tagFilters)\n{\n //Make sure we respond well to empty tiddlerTaglists or tagFilterlists\n if (tagFilters.length==0 || tiddlerTags.length==0)\n {\n return true;\n }\n\n var bHasTag = false;\n \n /*bNoPos says: "'till now there has been no check using a positive filter"\n Imagine a filterlist consisting of 1 negative filter:\n If the filter isn't matched, we want hasTag to be true.\n Yet bHasTag is still false ('cause only positive filters cause bHasTag to change)\n \n If no positive filters are present bNoPos is true, and no negative filters are matched so we have not returned false\n Thus: hasTag returns true.\n \n If at any time a positive filter is encountered, we want at least one of the tags to match it, so we turn bNoPos to false, which\n means bHasTag must be true for hasTag to return true*/\n var bNoPos=true;\n \nfor (var t3 = 0; t3 < tagFilters.length; t3++)\n {\n for(var t2=0; t2<tiddlerTags.length; t2++)\n {\n if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!') \n {\n if (tiddlerTags[t2] == tagFilters[t3].substring(1))\n {\n //If at any time a negative filter is matched, we return false\n return false;\n }\n }\n else \n {\n if (bNoPos)\n {\n //We encountered the first positive filter\n bNoPos=false;\n }\n if (tiddlerTags[t2] == tagFilters[t3])\n {\n //A positive filter is matched. As long as no negative filter is matched, hasTag will return true\n bHasTag=true;\n }\n }\n }\n }\n return (bNoPos || bHasTag);\n};\n\n//This function searches all tiddlers for the reminder //macro. It is intended that other plugins (like //calendar) will use this function to query for \n//upcoming reminders.\n//The arguments to this function filter out reminders //based on when they will fire.\n//\n//ARGUMENTS:\n//baseDate is the date that is used as "now". \n//leadtime is a two element int array, with leadtime[0] \n// as the lower bound and leadtime[1] as the\n// upper bound. A reasonable default is [0,14]\n//tags is a space-separated list of tags to use to filter \n// tiddlers. If a tag name begins with an !, then \n// only tiddlers which do not have that tag will \n// be considered. For example "examples holidays" \n// will search for reminders in any tiddlers that \n// are tagged with examples or holidays and \n// "!examples !holidays" will search for reminders \n// in any tiddlers that are not tagged with \n// examples or holidays. Pass in null to search \n// all tiddlers.\n//limit. If limit is null, individual reminders can \n// override the leadtime specified earlier. \n// Pass in 1 in order to override that behavior.\n\nwindow.findTiddlersWithReminders = function findTiddlersWithReminders(baseDate, leadtime, tags, limit)\n{\n//function(searchRegExp,sortField,excludeTag)\n// var macroPattern = "<<([^>\s\s]+)(?:\s\s*)([^>]*)>>";\n var macroPattern = "<<(reminder)(.*)>>";\n var macroRegExp = new RegExp(macroPattern,"mg");\n var matches = store.search(macroRegExp,"title","");\n var arr = [];\n var tagsArray = null;\n if (tags != null)\n {\n tagsArray = tags.split(" ");\n }\n for(var t=matches.length-1; t>=0; t--)\n {\n if (tagsArray != null)\n {\n //If they specified tags to filter on, and this tiddler doesn't \n //match, skip it entirely.\n if ( ! hasTag(matches[t].tags, tagsArray))\n {\n continue;\n }\n }\n\n var targetText = matches[t].text;\n do {\n // Get the next formatting match\n var formatMatch = macroRegExp.exec(targetText);\n if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")\n {\n //Find the matching date.\n \n var params = formatMatch[2] != null ? formatMatch[2].readMacroParams() : {};\n var dateHash = getParamsForReminder(params);\n if (limit != null || dateHash["leadtime"] == null)\n {\n if (leadtime == null)\n dateHash["leadtime"] = leadtime;\n else\n {\n dateHash["leadtime"] = [];\n dateHash["leadtime"][0] = leadtime[0];\n dateHash["leadtime"][1] = leadtime[1];\n }\n }\n if (dateHash["leadtime"] == null)\n dateHash["leadtime"] = config.macros.reminders["defaultLeadTime"]; \n var leadTimeLowerBound = baseDate.addDays(dateHash["leadtime"][0]);\n var leadTimeUpperBound = baseDate.addDays(dateHash["leadtime"][1]);\n var matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n while (matchedDate != null)\n {\n var hash = {};\n hash["diff"] = matchedDate.getDifferenceInDays(baseDate);\n hash["matchedDate"] = new Date(matchedDate.getFullYear(), matchedDate.getMonth(), matchedDate.getDate(), 0, 0);\n hash["params"] = cloneParams(dateHash);\n hash["tiddler"] = matches[t].title;\n hash["tags"] = matches[t].tags;\n arr.pushUnique(hash);\n if (dateHash["recurdays"] != null || (dateHash["year"] == null))\n {\n leadTimeLowerBound = leadTimeLowerBound.addDays(matchedDate.getDifferenceInDays(leadTimeLowerBound)+ 1);\n matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n }\n else matchedDate = null;\n }\n }\n }while(formatMatch);\n }\n if(arr.length > 1) //Sort the array by number of days remaining.\n {\n arr.sort(function (a,b) {if(a["diff"] == b["diff"]) {return(0);} else {return (a["diff"] < b["diff"]) ? -1 : +1; } });\n }\n return arr;\n};\n\n//This function takes the reminder macro parameters and\n//generates the string that is used for display.\n//This function is not intended to be called by \n//other plugins.\n window.getReminderMessageForDisplay= function getReminderMessageForDisplay(diff, params, matchedDate, tiddlerTitle)\n{\n var anniversaryString = "";\n var reminderTitle = params["title"];\n if (reminderTitle == null)\n {\n reminderTitle = config.macros.reminders["untitledReminder"];\n }\n if (params["firstyear"] != null)\n {\n anniversaryString = config.macros.reminders["defaultAnniversaryMessage"].replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));\n }\n var mess = "";\n var diffString = "";\n if (diff == 0)\n {\n diffString = config.macros.reminders["todayString"];\n }\n else if (diff == 1)\n {\n diffString = config.macros.reminders["tomorrowString"];\n }\n else\n {\n diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);\n }\n var format = config.macros.reminders["defaultReminderMessage"];\n if (params["format"] != null)\n {\n format = params["format"];\n }\n mess = format;\n//HACK! -- Avoid replacing DD in TIDDLER with the date\n mess = mess.replace(/TIDDLER/g, "TIDELER");\n mess = matchedDate.formatStringDateOnly(mess);\n mess = mess.replace(/TIDELER/g, "TIDDLER");\n if (tiddlerTitle != null)\n {\n mess = mess.replace(/TIDDLERNAME/g, tiddlerTitle);\n mess = mess.replace(/TIDDLER/g, "[[" + tiddlerTitle + "]]");\n }\n \n mess = mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("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.\nwindow.getParamsForReminder = function getParamsForReminder(params)\n{\n var dateHash = {};\n var type = "";\n var num = 0;\n var title = "";\n for(var t=0; t<params.length; t++)\n {\n var split = params[t].split(":");\n type = split[0].toLowerCase();\n var value = split[1];\n for (var i=2; i < split.length; i++)\n {\n value += ":" + split[i];\n }\n if (type == "nolinks" || type == "limit" || type == "hidden")\n {\n num = 1;\n }\n else if (type == "leadtime")\n {\n var leads = value.split("...");\n if (leads.length == 1)\n {\n leads[1]= leads[0];\n leads[0] = 0;\n }\n leads[0] = parseInt(leads[0], 10);\n leads[1] = parseInt(leads[1], 10);\n num = leads;\n }\n else if (type == "offsetdayofweek")\n {\n if (value.substr(0,1) == "-")\n {\n dateHash["negativeOffsetDayOfWeek"] = 1;\n value = value.substr(1);\n }\n num = parseInt(value, 10);\n }\n else if (type != "title" && type != "tag" && type != "format")\n {\n num = parseInt(value, 10);\n }\n else\n {\n title = value;\n t++;\n while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"' && params[t] != undefined)\n {\n title += " " + params[t++];\n }\n //Trim off the leading and trailing quotes\n if (title.substr(0,1) == "\s"" && title.substr(title.length - 1,1)== "\s"")\n {\n title = title.substr(1, title.length - 2);\n t--;\n }\n num = title;\n }\n dateHash[type] = num;\n }\n //date is synonymous with day\n if (dateHash["day"] == null)\n {\n dateHash["day"] = dateHash["date"];\n }\n return dateHash;\n};\n\n//This function finds the date specified in the reminder \n//parameters. It will return null if no match can be\n//found. This function is not intended to be used by\n//other plugins.\nwindow.findDateForReminder= function findDateForReminder( dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound)\n{\n if (baseDate == null)\n {\n baseDate = new Date().getMidnight();\n }\n var hashKey = baseDate.convertToYYYYMMDDHHMM();\n for (var k in dateHash)\n {\n hashKey += "," + k + "|" + dateHash[k];\n }\n hashKey += "," + leadTimeLowerBound.convertToYYYYMMDDHHMM();\n hashKey += "," + leadTimeUpperBound.convertToYYYYMMDDHHMM();\n if (reminderCache[hashKey] == null)\n {\n //If we don't find a match in this run, then we will\n //cache that the reminder can't be matched.\n reminderCache[hashKey] = false;\n }\n else if (reminderCache[hashKey] == false)\n {\n //We've already tried this date and failed\n return null;\n }\n else\n {\n return reminderCache[hashKey];\n }\n \n var bOffsetSpecified = dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null || \n dateHash["recurdays"] != null;\n \n // If we are matching the base date for a dayofweek offset, look for the base date a \n //little further back.\n var tmp1leadTimeLowerBound = leadTimeLowerBound; \n if ( dateHash["offsetdayofweek"] != null)\n {\n tmp1leadTimeLowerBound = leadTimeLowerBound.addDays(-6); \n }\n var matchedDate = baseDate.findMatch(dateHash, tmp1leadTimeLowerBound, leadTimeUpperBound);\n if (matchedDate != null)\n {\n var newMatchedDate = matchedDate;\n if (dateHash["recurdays"] != null)\n {\n while (newMatchedDate.getTime() < leadTimeLowerBound.getTime())\n {\n newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);\n }\n }\n else if (dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null)\n {\n var tmpdateHash = cloneParams(dateHash);\n tmpdateHash["year"] = dateHash["offsetyear"];\n tmpdateHash["month"] = dateHash["offsetmonth"];\n tmpdateHash["day"] = dateHash["offsetday"];\n tmpdateHash["dayofweek"] = dateHash["offsetdayofweek"];\n var tmpleadTimeLowerBound = leadTimeLowerBound;\n var tmpleadTimeUpperBound = leadTimeUpperBound;\n if (tmpdateHash["offsetdayofweek"] != null)\n {\n if (tmpdateHash["negativeOffsetDayOfWeek"] == 1)\n {\n tmpleadTimeLowerBound = matchedDate.addDays(-6);\n tmpleadTimeUpperBound = matchedDate;\n\n }\n else\n {\n tmpleadTimeLowerBound = matchedDate;\n tmpleadTimeUpperBound = matchedDate.addDays(6);\n }\n\n }\n newMatchedDate = matchedDate.findMatch(tmpdateHash, tmpleadTimeLowerBound, tmpleadTimeUpperBound);\n //The offset couldn't be matched. return null.\n if (newMatchedDate == null)\n {\n return null;\n }\n }\n if (newMatchedDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n reminderCache[hashKey] = newMatchedDate;\n return newMatchedDate;\n }\n }\n return null;\n};\n\n//This does much the same job as findDateForReminder, but\n//this one doesn't deal with offsets or recurring \n//reminders.\nDate.prototype.findMatch = function findMatch(dateHash, leadTimeLowerBound, leadTimeUpperBound)\n{\n\n var bSpecifiedYear = (dateHash["year"] != null);\n var bSpecifiedMonth = (dateHash["month"] != null);\n var bSpecifiedDay = (dateHash["day"] != null);\n var bSpecifiedDayOfWeek = (dateHash["dayofweek"] != null);\n if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)\n {\n return new Date(dateHash["year"], dateHash["month"]-1, dateHash["day"], 0, 0);\n }\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)\n {\n\n //Shortcut -- First try this year. If it's too small, try next year.\n var tmpMidnight = this.getMidnight();\n var tmpDate = new Date(this.getFullYear(), dateHash["month"]-1, dateHash["day"], 0,0);\n if (tmpDate.getTime() < leadTimeLowerBound.getTime())\n {\n tmpDate = new Date((this.getFullYear() + 1), dateHash["month"]-1, dateHash["day"], 0,0);\n }\n if ( tmpDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n return tmpDate;\n }\n else\n {\n return null;\n }\n }\n\n var newDate = leadTimeLowerBound; \n while (newDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n var tmp = testDate(newDate, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek);\n if (tmp != null)\n return tmp;\n newDate = newDate.addDays(1);\n }\n};\n\nfunction testDate(testMe, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek)\n{\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedYear)\n {\n bMatchedYear = (dateHash["year"] == testMe.getFullYear());\n }\n if (bSpecifiedMonth)\n {\n bMatchedMonth = ((dateHash["month"] - 1) == testMe.getMonth() );\n }\n if (bSpecifiedDay)\n {\n bMatchedDay = (dateHash["day"] == testMe.getDate());\n }\n if (bSpecifiedDayOfWeek)\n {\n bMatchedDayOfWeek = (dateHash["dayofweek"] == testMe.getDay());\n }\n\n if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)\n {\n return testMe;\n }\n};\n\n//Returns true if the date is in between two given dates\nDate.prototype.isBetween = function isBetween(lowerBound, upperBound)\n{\n return (this.getTime() >= lowerBound.getTime() && this.getTime() <= upperBound.getTime());\n}\n//Return a new date, with the time set to midnight (0000)\nDate.prototype.getMidnight = function getMidnight()\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0);\n};\n// Add the specified number of days to a date.\nDate.prototype.addDays = function addDays(numberOfDays)\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate() + numberOfDays, 0, 0);\n};\n//Return the number of days between two dates.\nDate.prototype.getDifferenceInDays = function getDifferenceInDays(otherDate)\n{\n//I have to do it this way, because this way ignores daylight savings\n var tmpDate = this.addDays(0);\n if (this.getTime() > otherDate.getTime())\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() > otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(-1);\n }\n return i;\n }\n else\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() < otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(1);\n }\n return i * -1;\n }\n return 0;\n};\nfunction cloneParams(what) {\n var tmp = {};\n for (var i in what) {\n tmp[i] = what[i];\n }\n return tmp;\n}\n// Substitute date components into a string\nDate.prototype.formatStringDateOnly = function formatStringDateOnly(template)\n{\n template = template.replace("YYYY",this.getFullYear());\n template = template.replace("YY",String.zeroPad(this.getFullYear()-2000,2));\n template = template.replace("MMM",config.messages.dates.months[this.getMonth()]);\n template = template.replace("0MM",String.zeroPad(this.getMonth()+1,2));\n template = template.replace("MM",this.getMonth()+1);\n template = template.replace("DDD",config.messages.dates.days[this.getDay()]);\n template = template.replace("0DD",String.zeroPad(this.getDate(),2));\n template = template.replace("DD",this.getDate());\n return template;\n};\n\n//}}}
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|6.1.18|\n| Date:|18-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}\n\n
/***\n|!''Name:''|!''Send''|\n|''Description:''|this framework allows you to easily create macros that produce links referring to the current tiddler|\n|''Version:''|0.2.0|\n|''Date:''|22/03/2007|\n|''Source:''|http://yann.perrin.googlepages.com/twkd.html#Send|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n***/\n//{{{\nif (!window.TWkd) window.TWkd = {context:{}};\nif (!TWkd.Send) TWkd.Send = function (name,separator) {\n this.name = name;\n this.separator = separator;\n this.Destinations = [];\n this.addDestination = function(name,url,icon){\n this.Destinations.push({name:name,url:url,icon:icon});\n };\n this.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var here = window.story.findContainingTiddler(place).getAttribute("tiddler");\n var permalink = window.location.hash ? window.location.href.substr(0,window.location.href.lastIndexOf("#"))+"#[["+here+"]]" : window.location.href+"#[["+here+"]]";\n var links = [];\n for (var d=0; d<this.Destinations.length; d++) {\n var uri = this.Destinations[d].url.format([encodeURIComponent(permalink),encodeURIComponent(here)]);\n if (!this.Destinations[d].icon)\n links.push("[["+this.Destinations[d].name+"|"+uri+"]]");\n else\n links.push("[img["+this.Destinations[d].name+"|"+this.Destinations[d].icon+"]["+uri+"]]");\n }\n wikify(links.join(this.separator),place);\n };\n config.macros[name] = this;\n};\n//}}}
<<tiddler SideBarOptions>>
Tweaked ~TiddlyWiki
~TWkd
<div class='toolbar'>\n <!-- regular toolbar -->\n <span macro='toolbar closeTiddler closeOthers +editTiddler undoChanges permalink references jump'></span>\n</div>\n<!-- regular tags macro but uses taggly css -->\n<div class="tagglyTagged" macro="tags"></div>\n<div>\n <span class='title' macro='view title'></span>\n <span macro="miniTag"></span>\n</div>\n<!-- using taggly versions of these two\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div> -->\n<div class='viewer' macro='view text wikified'></div>\n<div class="tagglyTagging" macro="tagglyTagging"></div>\n<div class='tagClear'></div>\n<div class='subtitle'>\n <span macro='view modifier link'></span>,\n <span macro='view modified date [[DD-MMM-YY]]'></span>\n <span macro='showWhen (tiddler.created!=tiddler.modified)'>(<span macro='message views.wikified.createdPrompt'></span>\n <span macro='view created date [[DD-MMM-YY]]'></span>)</span>\n</div>\n<div macro='socialBookmark'></div>
/*{{{*/\n.header {\n color:[[ColorPalette::Background]];\n background:[[ColorPalette::Foreground]];\n height:3.8em;\n}\n.headerForeground {\n padding:0;\n color:[[ColorPalette::PrimaryDark]];\n position:relative;\n top:0.3em;\n left:1em;\n}\n#topMenu {\n position:absolute;\n top:0.2em;\nleft:0;\nwidth:98%;\n text-align:right;\n}\n#topMenu .button {\n color:[[ColorPalette::PrimaryMid]];\n border:0;\n margin-right:0.5em;\n}\n#topMenu .button:hover {\n color:[[ColorPalette::PrimaryPale]];\n}\n#displayArea {\n margin: 1em 1em 0em 16em;\n}\n/* more subtle tiddler subtitle */\n.subtitle {\n padding:0px;\n margin:0px;\n padding-left:0.5em;\n font-size: 90%;\n color: [[ColorPalette::TertiaryMid]];\n}\n.subtitle .tiddlyLink {\n color: [[ColorPalette::TertiaryMid]];\n}\n\n/* a little bit of extra whitespace */\n.viewer {\n padding-bottom:3px;\n}\n/* give tiddlers 3d style border and explicit background */\n.tiddler {\n background: [[ColorPalette::TertiaryPale]];\n border-right: 2px [[ColorPalette::TertiaryMid]] solid;\n border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;\n margin-bottom: 1em;\n padding-bottom: 2em;\n}\n.tiddler .button {\n border-color:[[ColorPalette::TertiaryPale]];\n}\n.tiddler .button:hover {\n border-color:[[ColorPalette::SecondaryMid]];\n}\n/* displays the list of a tiddler's tags horizontally. used in ViewTemplate */\n.tagglyTagged li.listTitle {\n display:none\n}\n.tagglyTagged li {\n display: inline; font-size:90%;\n}\n.tagglyTagged ul {\n margin:0px; padding:0px;\n}\n.popup {\n background: [[ColorPalette::TertiaryLight]];\n border: 1px solid [[ColorPalette::PrimaryMid]];\n}\n.popup li {\nlist-style: none;\n}\n.popup a, .popup a:visited, .popup li a, .popup li a:visited, .popup .button{\n color: [[ColorPalette::PrimaryMid]];\n border: none;\n}\n#topMenu .txtCurrentMode .tabContents{\n position:absolute;\nfloat:left;\n left: 0.2em;\n top: 4.5em;\n font-size: .9em;\n width: 16em;\n background: [[ColorPalette::Background]];\n border: 0;\n text-align:left;\n}\n#topMenu .txtCurrentMode .tabset {\n padding-top:0.3em;\n}\n#topMenu .txtCurrentMode .tabContents .tabset{\n padding-top:1em;\n}\n#topMenu .txtCurrentMode .tabset .tabSelected{\n border:0;\n color: [[ColorPalette::PrimaryLight]];\n background: [[ColorPalette::Foreground]];\n}\n#topMenu .txtCurrentMode .tabset .tabUnselected{\n color: [[ColorPalette::PrimaryMid]];\n background: [[ColorPalette::Foreground]];\n}\n#topMenu .tabContents .tabContents {\n position:relative;\n top:0;\n color: [[ColorPalette::PrimaryDark]];\n background: [[ColorPalette::TertiaryPale]];\n border: 1px solid [[ColorPalette::TertiaryLight]];\n}\n#topMenu .txtCurrentMode .tabContents .button:hover , #topMenu .txtCurrentMode .tabContents a:hover {\n color:[[ColorPalette::Background]];\n background:[[ColorPalette::PrimaryDark]];\n}\n#popup.popup .button {\n display:block;\n}\n#popup.popup .button:hover , #popup.popup a:hover {\n color:[[ColorPalette::Background]];\n background:[[ColorPalette::PrimaryDark]];\n}\n/*}}}*/
<<saveChanges>>\n----\n<<newDocument "label:New Blog" blog.html ForBlogUse>>\n----\n<<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
|''URL:''|http://yann.perrin.googlepages.com/twkd.html|\n|''Description:''|Tweaks and Plugins for TiddlyWiki|\n|''Author:''|[[Yann Perrin|YannPerrin]]|
<<tiddler OutdatedTemplate with:"TWkdLib" with:"E.A.S.E">>
<<newTiddler>><<list all>>
<<tagDisplayed>><<allTags>><<untagDisplayed>>
<<newJournal 'DD MMM YYYY'>><<timeline>>
{{fr{[[Ouvrir l'index '$1'|$1]]}}}{{hide{ / }}}{{en{[[Open tag '$1'|$1]]}}}\n<<openAll $1>><<closeTagged $1>><<keepTagged $1>><<tagging $1>><<tagDisplayed $1>><<untagDisplayed $1>>{{fr{<<newTiddler label:"Nouvel élément '$1'" tag:"$1">>}}}{{en{<<newTiddler label:"New '$1' Tiddler" tag:"$1">>}}}
/***\n| Name:|TagglyTaggingPlugin|\n| Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version:|6.1.5|\n| Date:|05-Oct-2006|\n| Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n!Notes\nSee http://mptw.tiddlyspot.com/#TagglyTagging\n***/\n//{{{\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as '%0':"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"]\n },\n valuePrefix: "taggly."\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n }, \n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n return " ("+tagCount+")";\n }\n return "";\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n for (var i=0;i<list.length;i++) {\n var countString = this.getTaggingCount(list[i].title);\n if (useCommas)\n output.push((i > 0 ? ", " : "") + "[[" + list[i].title + "]]" + countString);\n else\n output.push("*[[" + list[i].title + "]]" + countString + "\sn");\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n\n if (sortOrder == "desc")\n list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++)\n leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) {\n for (var j=0;j<list[i].tags.length;j++) {\n\n if (list[i].tags[j] != title) { // not this tiddler\n\n if (!allTagsHolder[list[i].tags[j]])\n allTagsHolder[list[i].tags[j]] = "";\n\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + "\sn";\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn";\n\n var output = [];\n\n if (sortOrder == "desc")\n allTags.reverse();\n else if (leftOverOutput != "")\n // leftovers first...\n output.push(leftOverOutput);\n\n for (var i=0;i<allTags.length;i++)\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn" + allTagsHolder[allTags[i]]);\n\n if (sortOrder == "desc" && leftOverOutput != "")\n // leftovers last...\n output.push(leftOverOutput);\n\n return this.drawTable(place,\n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used to build site map\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + "\sn"+childOutput;\n },\n\n // this if for the site map mode\n createTagglyListSiteMap: function(place,title) {\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var refreshContainer = createTiddlyElement(place,"div");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n refreshContainer.setAttribute("title",tiddler.title);\n this.refresh(refreshContainer);\n },\n\n refresh: function(place) {\n var title = place.getAttribute("title");\n removeChildren(place);\n if (store.getTaggedTiddlers(title).length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"numCols");\n config.taggly.createTagglyList(place,title);\n }\n }\n }\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/\sn"+\n"/* created by TagglyTaggingPlugin */\sn"+\n".tagglyTagging { padding-top:0.5em; }\sn"+\n".tagglyTagging li.listTitle { display:none; }\sn"+\n".tagglyTagging ul {\sn"+\n" margin-top:0px; padding-top:0.5em; padding-left:2em;\sn"+\n" margin-bottom:0px; padding-bottom:0px;\sn"+\n"}\sn"+\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\sn"+\n".tagglyTagging table { margin:0px; padding:0px; }\sn"+\n".tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\sn"+\n".tagglyTagging .button, .tagglyTagging .hidebutton {\sn"+\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;\sn"+\n" border:0px; padding-left:0.3em;padding-right:0.3em;\sn"+\n"}\sn"+\n".tagglyTagging .button:hover, .hidebutton:hover {\sn"+\n" background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];\sn"+\n"}\sn"+\n".selected .tagglyTagging .button {\sn"+\n" display:inline;\sn"+\n"}\sn"+\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }\sn"+\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }\sn"+\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }\sn"+\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\sn"+\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\sn"+\n".tagglyTagging ul ul li {margin-left:0.5em; }\sn"+\n".editLabel { font-size:90%; padding-top:0.5em; }\sn"+\n".tagglyTagging .commas { padding-left:1.8em; }\sn"+\n"/*}}}*/\sn"+\n "",\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;\n if (store)\n store.addNotification("TagglyTaggingStyles",refreshStyles);\n else\n config.notifyTiddlers.push({name:"TagglyTaggingStyles", notify: refreshStyles});\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n
/***\n|!''Name:''|!''TemplatedTagTools''|\n|''Description:''|this plugin replace the content of the tag popup with the one from TagToolTemplate (a new shadowTiddler).<<br>>It allows for quick and easy modification of this popup content (including some [[batchTagTools]] macros for example)|\n|''Version:''|0.1.0|\n|''Date:''|17/01/2007|\n|''Source:''|http://yann.perrin.googlepages.com/twkd.html#TemplatedTagTools|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n***/\n//{{{\nfunction onClickTag(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var popup = Popup.create(this);\n var tag = this.getAttribute("tag");\n var title = this.getAttribute("tiddler");\n if(popup && tag) {\n wikify('<<tiddler TagToolTemplate with:"'+tag+'">>',popup);\n }\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n//{{{\nconfig.macros.openAll = {};\nconfig.macros.openAll.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var lingo = config.views.wikified.tag;\n var openAll = createTiddlyButton(place,lingo.openAllText.format(params),lingo.openAllTooltip,onClickTagOpenAll);\n openAll.setAttribute("tag",params[0]);\n}\n//}}}\n////definition de TagToolTemplate\n//{{{\nconfig.shadowTiddlers.TagToolTemplate = "[[Open tag '$1'|$1]]\sn<<openAll $1>>\sn<<tagging $1>><<newTiddler label:\s"New $1 Tiddler\s" tag:\s"$1\s">>";\n//}}}
<<tiddler OutdatedTemplate with:"TiddlerSlicer" with:"easySlicer">>
|''URL:''|http://tiddlystyles.com/|
|''URL:''|http://www.tiddlytools.com/|\n|''Description:''|Small Tools for Big Ideas!|\n|''Author:''|EricShulman|\n
|''URL:''|http://avm.free.fr/TiddlyWiki-fr.html|\n|''Description:''|TiddlyWiki en Français|\n|''Author:''|Jacques Turbé|
<<closeAll>>- <<permaview>>| <<search>> <<polyglot>>{{fr{<<tabs txtCurrentMode Blog Blog MainMenu Agenda Agenda Agenda Contenu Contenu Content Systeme Systeme System>>}}}{{en{<<tabs txtCurrentMode Blog Blog MainMenu Agenda Agenda Agenda Content Content Content System System System>>}}}
<<closeAll>>- <<permaview>>| <<search>> <<polyglot>>{{fr{<<tabs txtCurrentMode Blog Blog MainMenu Agenda Agenda Agenda Contenu Contenu Content>>}}}{{en{<<tabs txtCurrentMode Blog Blog MainMenu Agenda Agenda Agenda Content Content Content>>}}}
<div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig','Contacts']) && !tiddler.text.match('{{'+'{')">[[StandardViewTemplate]]</div>\n<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">[[CodeViewTemplate]]</div>\n<div macro='showWhen tiddler.tags.contains("Contacts")'>[[ContactViewTemplate]]</div>
{{fr{\nEn raison de l'évolution de TiddlyWiki, Wikedit n'a plus de raison d'être et ne sera plus développé, toutefois, ceux qui souhaitent y accéder pourront le trouver à l'adresse :\nhttp://yann.perrin.googlepages.com/twkd1.html#Wikedit}}}{{hide{\n----}}}{{en{\nAs TiddlyWiki evolved, the need for Wikedit disappeared. It won't be developped any longer, however, it can still be accessed at :\nhttp://yann.perrin.googlepages.com/twkd1.html#Wikedit}}}
Author of TWkd and Omni
/***\n|!''Name:''|!''batchTagTools''|\n|''Description:''|These macros are designed to work on the displayed tiddlers tagged with the chosen tag<<br>>.You can see them in action in the tag tab from the content section of TWkd|\n|''Version:''|0.1.0|\n|''Date:''|27/01/2007|\n|''Source:''|http://yann.perrin.googlepages.com/twkd.html#batchTagTools|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n|''Requires:''|@@color:red;''Batch''@@|\n***/\n//{{{\nconfig.macros.closeTagged = new TWkd.Batch ("closeTagged", "Close Tagged", "Close Tiddlers tagged with the chosen tag", "Close '%0' Tiddlers", "Close Tiddlers tagged with '%0'", function(tiddler,tag) { if ((!tag)||(tiddler.tags.contains(tag))) story.closeTiddler(tiddler.title,true,false); }, true, "Please enter the tag of your choice");\n//}}}\n//{{{\nconfig.macros.keepTagged = new TWkd.Batch ("keepTagged", "Keep Tagged","Close Tiddlers that are not tagged with the chosen tag", "Keep '%0' Tiddlers", "Close Tiddlers that are not tagged with '%0'", function(tiddler,tag) { if ((!tag)||(!tiddler.tags.contains(tag))) story.closeTiddler(tiddler.title,true,false); }, true, "Please enter the tag of your choice");\n//}}}\n//{{{\nconfig.macros.tagDisplayed = new TWkd.Batch ("tagDisplayed", "New Tag", "Tag displayed Tiddlers with the chosen tag", "Tag as '%0'", "Tag displayed Tiddlers with '%0'", function(tiddler,tag) { if (!tiddler.isTagged(tag)) { tiddler.tags.push(tag); story.refreshTiddler(tiddler.title,false,true); store.setDirty(true); } }, false, "Please enter the tag of your choice");\n//}}}\n//{{{\nconfig.macros.untagDisplayed = new TWkd.Batch ("untagDisplayed", "Remove Tag", "remove the chosen tag from displayed Tiddlers", "Remove '%0' Tag", "Remove the '%0' tag from displayed Tiddlers", function(tiddler,tag) { if (tiddler.isTagged(tag)) { tiddler.tags.splice(tiddler.tags.find(tag),1); story.refreshTiddler(tiddler.title,false,true); store.setDirty(true); } }, false, "Please enter the tag of your choice");\n//}}}\n//{{{\nconfig.macros.deleteTagged = new TWkd.Batch("deleteTagged", "Delete Tagged", "Delete displayed tiddlers tagged with the chosen tag", "Delete '%0' Tiddlers", "Delete diplayed Tiddlers tagged with '%0'", function(tiddler,tag) { if ((!tag)||(tiddler.tags.contains(tag))) {store.removeTiddler(tiddler.title); story.closeTiddler(tiddler.title,true,false); }}, false, "Please enter the tag of your choice");\n//}}}
//{{{\nconfig.macros.closeTagged.label = "Close Tagged";\nconfig.macros.closeTagged.prompt = "Close Tiddlers tagged with the chosen tag";\nconfig.macros.closeTagged.labelIfParam = "Close '%0' Tiddlers";\nconfig.macros.closeTagged.promptIfParam = "Close Tiddlers tagged with '%0'";\nconfig.macros.keepTagged.label = "Keep Tagged";\nconfig.macros.keepTagged.prompt = "Close Tiddlers that are not tagged with the chosen tag";\nconfig.macros.keepTagged.labelIfParam = "Keep '%0' Tiddlers";\nconfig.macros.keepTagged.promptIfParam = "Close Tiddlers that are not tagged with '%0'";\nconfig.macros.tagDisplayed.label = "New Tag";\nconfig.macros.tagDisplayed.prompt = "Tag displayed Tiddlers with the chosen tag";\nconfig.macros.tagDisplayed.labelIfParam = "Tag as '%0'";\nconfig.macros.tagDisplayed.promptIfParam = "Tag displayed Tiddlers with '%0'";\nconfig.macros.untagDisplayed.label = "Remove Tag";\nconfig.macros.untagDisplayed.prompt = "remove the chosen tag from displayed Tiddlers";\nconfig.macros.untagDisplayed.labelIfParam = "Remove '%0' Tag";\nconfig.macros.untagDisplayed.promptIfParam = "Remove the '%0' tag from displayed Tiddlers";\nconfig.macros.deleteTagged.label = "Delete Tagged";\nconfig.macros.deleteTagged.prompt = "Delete displayed tiddlers tagged with the chosen tag";\nconfig.macros.deleteTagged.labelIfParam = "Delete '%0' Tiddlers";\nconfig.macros.deleteTagged.promptIfParam = "Delete diplayed Tiddlers tagged with '%0'";\n//}}}
//{{{\nconfig.macros.closeTagged.label = "Fermer les éléments indexés";\nconfig.macros.closeTagged.prompt = "Ferme les éléments porteurs de l'index choisi";\nconfig.macros.closeTagged.labelIfParam = "Fermer les éléments '%0'";\nconfig.macros.closeTagged.promptIfParam = "Ferme les éléments porteurs de l'index '%0'";\nconfig.macros.keepTagged.label = "Isoler les éléments indexés";\nconfig.macros.keepTagged.prompt = "Isole les éléments porteurs de l'index choisi";\nconfig.macros.keepTagged.labelIfParam = "Isoler les éléments '%0'";\nconfig.macros.keepTagged.promptIfParam = "Isoler les éléments porteurs de l'index '%0'";\nconfig.macros.tagDisplayed.label = "Nouvel Index";\nconfig.macros.tagDisplayed.prompt = "Ajoute aux éléments affiché l'index choisi";\nconfig.macros.tagDisplayed.labelIfParam = "Indexer comme '%0'";\nconfig.macros.tagDisplayed.promptIfParam = "Ajoute aux éléments affiché l'index '%0'";\nconfig.macros.untagDisplayed.label = "Supprimer l'index";\nconfig.macros.untagDisplayed.prompt = "Supprime l'index choisi des éléments affichés";\nconfig.macros.untagDisplayed.labelIfParam = "Supprimer l'index '%0'";\nconfig.macros.untagDisplayed.promptIfParam = "Supprime l'index '%0' des éléments affichés";\nconfig.macros.deleteTagged.label = "Supprimer les éléments indexés";\nconfig.macros.deleteTagged.prompt = "Supprime les éléments porteurs de l'index choisi";\nconfig.macros.deleteTagged.labelIfParam = "Supprimer les éléments '%0'";\nconfig.macros.deleteTagged.promptIfParam = "Supprime les éléments porteurs de l'index '%0'";\n//}}}
/***\n|!''Name:''|!easyFormat|\n|''Description:''|the format command format selection according to your choice|\n|''Version:''|0.1.0|\n|''Date:''|13/01/2007|\n|''Source:''|[[TWkd|http://yann.perrin.googlepages.com/twkd.html#easyFormat]]|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n|''Requires:''|@@color:red;''E.A.S.E''@@|\n***/\n//{{{\nconfig.commands.format = new TWkd.Ease('Format','format selection accordingly to chosen mode');\nconfig.commands.format.addMode({\n name:'Bold',\n tooltip:'turns selection into bold text',\n operation:function(){\n config.commands.format.putInPlace("''"+TWkd.context.selection.content+"''",TWkd.context.selection);\n }\n});\nconfig.commands.format.addMode({\n name:'Italic',\n tooltip:'turns selection into italic text',\n operation:function(){\n config.commands.format.putInPlace("//"+TWkd.context.selection.content+"//",TWkd.context.selection);\n }\n});\nconfig.commands.format.addMode({\n name:'Underlined',\n tooltip:'turns selection into underlined text',\n operation:function(){\n config.commands.format.putInPlace("__"+TWkd.context.selection.content+"__",TWkd.context.selection);\n }\n});\nconfig.commands.format.addMode({\n name:'Strikethrough',\n tooltip:'turns selection into striked text',\n operation:function(){\n config.commands.format.putInPlace("--"+TWkd.context.selection.content+"--",TWkd.context.selection);\n }\n});\nconfig.commands.format.addMode({\n name:'Superscript',\n tooltip:'turns selection into superscript',\n operation:function(){\n config.commands.format.putInPlace("^^"+TWkd.context.selection.content+"^^",TWkd.context.selection);\n }\n});\nconfig.commands.format.addMode({\n name:'Subscript',\n tooltip:'turns selection into subscript',\n operation:function(){\n config.commands.format.putInPlace("~~"+TWkd.context.selection.content+"~~",TWkd.context.selection);\n }\n});\nconfig.commands.format.addMode({\n name:'Highlight',\n tooltip:'highlight selection',\n operation:function(){\n config.commands.format.putInPlace("@@"+TWkd.context.selection.content+"@@",TWkd.context.selection);\n }\n});\n//}}}
/***\n|!''Name:''|!easySlicer|\n|''Description:''|The slice command allows you to create microcontent tiddlers from bigger ones.<<br>>It turns selected text into a new independent tiddler, and replace it in the original tiddler with a reference to the newly created tiddler.|\n|''Version:''|0.1.0|\n|''Date:''|13/01/2007|\n|''Source:''|[[TWkd|http://yann.perrin.googlepages.com/twkd.html#easySlicer]]|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n|''Requires:''|@@color:red;''E.A.S.E''@@|\n***/\n//{{{\nconfig.commands.slice = new TWkd.Ease('8<','divide tiddler into parts');\nconfig.commands.slice.addMode({\n name:'tiddler',\n tooltip:'turns selection into a new tiddler and replace it with a macro diplaying the new tiddler content',\n operation:function(){\n var newtitle=config.commands.slice.askForTitle();\n if(!newtitle) {\n displayMessage(config.messages.Ease.cancel);\n return(false);\n }\n config.commands.slice.newTWkdLibTiddler(newtitle,TWkd.context.selection.content,TWkd.context.selection.source,true);\n config.commands.slice.putInPlace("<<tiddler "+newtitle+">>",TWkd.context.selection);\n }\n});\nconfig.commands.slice.addMode({\n name:'link',\n tooltip:'turns selection into a new tiddler and replace it with a link to the new tiddler',\n operation:function(){\n var newtitle=config.commands.slice.askForTitle();\n if(!newtitle) {\n displayMessage(config.messages.Ease.cancel);\n return(false);\n }\n config.commands.slice.newTWkdLibTiddler(newtitle,TWkd.context.selection.content,TWkd.context.selection.source,true);\n config.commands.slice.putInPlace("[["+newtitle+"]]",TWkd.context.selection);\n }\n});\nconfig.commands.slice.addMode({\n name:'slider',\n tooltip:'turns selection into a new tiddler and replace it with a slider containing the new tiddler',\n sliderTooltip:'content of ',\n operation:function(){\n var newtitle=config.commands.slice.askForTitle();\n if(!newtitle) {\n displayMessage(config.messages.Ease.cancel);\n return(false);\n }\n config.commands.slice.newTWkdLibTiddler(newtitle,TWkd.context.selection.content,TWkd.context.selection.source,true);\n config.commands.slice.putInPlace('<<slider chkSlice [['+newtitle+']] "'+newtitle+'" "'+this.sliderTooltip+newtitle+'">>',TWkd.context.selection);\n }\n});\nif (version.extensions.nestedSliders) {\nconfig.commands.slice.addMode({\n name:'nestedslider',\n tooltip:'turns selection into a slider',\n operation:function(){\n var newtitle=config.commands.slice.askForTitle();\n if(!newtitle) {\n displayMessage(config.messages.Ease.cancel);\n return(false);\n }\n config.commands.slice.putInPlace("+++["+newtitle+"]\sn"+TWkd.context.selection.content+"\sn===",TWkd.context.selection);\n }\n});\n}\nif (version.extensions.PartTiddlerPlugin) {\nconfig.commands.slice.addMode({\n name:'part',\n tooltip:'turns selection into a part',\n operation:function(){\n var newtitle=config.commands.slice.askForTitle();\n if(!newtitle) {\n displayMessage(config.messages.Ease.cancel);\n return(false);\n }\n config.commands.slice.putInPlace("<part "+newtitle+">"+TWkd.context.selection.content+"</part>",TWkd.context.selection);\n }\n});\n}\n//}}}\n
/***\n|!''Name:''|!easyTongue|\n|''Description:''|The tongue command allows you to mark selection as being from the chosen language|\n|''Version:''|0.1.0|\n|''Date:''|13/01/2007|\n|''Source:''|[[TWkd|http://yann.perrin.googlepages.com/twkd.html#easyTongue]]|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n|''Requires:''|@@color:red;''E.A.S.E''@@|\n***/\n//{{{\nconfig.commands.tongue = new TWkd.Ease(':P','mark selection as being in selected language');\nif (version.extensions.PolyGlotPlugin) {\n for (var i=0; i<config.macros.polyglot.languages.length; i++)\n config.commands.tongue.addMode({\n name:config.macros.polyglot.languages[i],\n tooltip:'mark selection as being in '+config.macros.polyglot.languages[i]+' language',\n operation:function(){\n config.commands.tongue.putInPlace("{{"+this.name+"{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);\n }\n });\n config.commands.tongue.addMode({\n name:config.macros.polyglot.hidewhenactive,\n tooltip:'selection should be hidden from view when PolyGlotPlugin is installed',\n operation:function(){\n config.commands.tongue.putInPlace("{{"+this.name+"{"+TWkd.context.selection.content+"}}}",TWkd.context.selection);\n }\n });\n }\nelse {\n config.commands.tongue.addMode({\n name:'Unfulfilled dependency',\n tooltip:'PolyGlotPlugin is needed',\n operation:function(){displayMessage('PolyGlotPlugin is needed to run this command','http://yann.perrin.googlepages.com/twkd.html#PolyGlotPlugin');}\n});\n}\n//}}}\n\n
/***\n''Version 2.1.3 31/01/07''\n\n!English messages taken from the TiddlyWiki core\n***/\n//{{{\nmerge(config.messages,{\n customConfigError: "Problems were encountered loading plugins. See PluginManager for details",\n pluginError: "Error: %0",\n pluginDisabled: "Not executed because disabled via 'systemConfigDisable' tag",\n pluginForced: "Executed because forced via 'systemConfigForce' tag",\n pluginVersionError: "Not executed because this plugin needs a newer version of TiddlyWiki",\n nothingSelected: "Nothing is selected. You must select one or more items first",\n savedSnapshotError: "It appears that this TiddlyWiki has been incorrectly saved. Please see http://www.tiddlywiki.com/#DownloadSoftware for details",\n subtitleUnknown: "(unknown)",\n undefinedTiddlerToolTip: "The tiddler '%0' doesn't yet exist",\n shadowedTiddlerToolTip: "The tiddler '%0' doesn't yet exist, but has a pre-defined shadow value",\n tiddlerLinkTooltip: "%0 - %1, %2",\n externalLinkTooltip: "External link to %0",\n noTags: "There are no tagged tiddlers",\n notFileUrlError: "You need to save this TiddlyWiki to a file before you can save changes",\n cantSaveError: "It's not possible to save changes. This could be because your browser doesn't support saving (instead, use FireFox if you can), or because the pathname to your TiddlyWiki file contains illegal characters",\n invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",\n backupSaved: "Backup saved",\n backupFailed: "Failed to save backup file",\n rssSaved: "RSS feed saved",\n rssFailed: "Failed to save RSS feed file",\n emptySaved: "Empty template saved",\n emptyFailed: "Failed to save empty template file",\n mainSaved: "Main TiddlyWiki file saved",\n mainFailed: "Failed to save main TiddlyWiki file. Your changes have not been saved",\n macroError: "Error in macro <<%0>>",\n macroErrorDetails: "Error while executing macro <<%0>>:\sn%1",\n missingMacro: "No such macro",\n overwriteWarning: "A tiddler named '%0' already exists. Choose OK to overwrite it",\n unsavedChangesWarning: "WARNING! There are unsaved changes in TiddlyWiki\sn\snChoose OK to save\snChoose CANCEL to discard",\n confirmExit: "--------------------------------\sn\snThere are unsaved changes in TiddlyWiki. If you continue you will lose those changes\sn\sn--------------------------------",\n saveInstructions: "SaveChanges",\n unsupportedTWFormat: "Unsupported TiddlyWiki format '%0'",\n tiddlerSaveError: "Error when saving tiddler '%0'",\n tiddlerLoadError: "Error when loading tiddler '%0'",\n wrongSaveFormat: "Cannot save with storage format '%0'. Using standard format for save.",\n invalidFieldName: "Invalid field name %0",\n fieldCannotBeChanged: "Field '%0' cannot be changed"});\n\nmerge(config.messages.messageClose,{\n text: "close",\n tooltip: "close this message area"});\n\nconfig.messages.dates.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"];\nconfig.messages.dates.days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];\nconfig.messages.dates.shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];\nconfig.messages.dates.shortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];\n\nmerge(config.views.wikified.tag,{\n labelNoTags: "no tags",\n labelTags: "tags: ",\n openTag: "Open tag '%0'",\n tooltip: "Show tiddlers tagged with '%0'",\n openAllText: "Open all",\n openAllTooltip: "Open all of these tiddlers",\n popupNone: "No other tiddlers tagged with '%0'"});\n\nmerge(config.views.wikified,{\n defaultText: "The tiddler '%0' doesn't yet exist. Double-click to create it",\n defaultModifier: "(missing)",\n shadowModifier: "(built-in shadow tiddler)",\n createdPrompt: "created"});\n\nmerge(config.views.editor,{\n tagPrompt: "Type tags separated with spaces, [[use double square brackets]] if necessary, or add existing",\n defaultText: "Type the text for '%0'"});\n\nmerge(config.views.editor.tagChooser,{\n text: "tags",\n tooltip: "Choose existing tags to add to this tiddler",\n popupNone: "There are no tags defined",\n tagTooltip: "Add the tag '%0'"});\n\nmerge(config.macros.search,{\n label: "search",\n prompt: "Search this TiddlyWiki",\n accessKey: "F",\n successMsg: "%0 tiddlers found matching %1",\n failureMsg: "No tiddlers found matching %0"});\n\nmerge(config.macros.tagging,{\n label: "tagging: ",\n labelNotTag: "not tagging",\n tooltip: "List of tiddlers tagged with '%0'"});\n\nmerge(config.macros.timeline,{\n dateFormat: "DD MMM YYYY"});\n\nmerge(config.macros.allTags,{\n tooltip: "Show tiddlers tagged with '%0'",\n noTags: "There are no tagged tiddlers"});\n\nconfig.macros.list.all.prompt = "All tiddlers in alphabetical order";\nconfig.macros.list.missing.prompt = "Tiddlers that have links to them but are not defined";\nconfig.macros.list.orphans.prompt = "Tiddlers that are not linked to from any other tiddlers";\nconfig.macros.list.shadowed.prompt = "Tiddlers shadowed with default contents";\n\nmerge(config.macros.closeAll,{\n label: "close all",\n prompt: "Close all displayed tiddlers (except any that are being edited)"});\n\nmerge(config.macros.permaview,{\n label: "permaview",\n prompt: "Link to an URL that retrieves all the currently displayed tiddlers"});\n\nmerge(config.macros.saveChanges,{\n label: "save changes",\n prompt: "Save all tiddlers to create a new TiddlyWiki",\n accessKey: "S"});\n\nmerge(config.macros.newTiddler,{\n label: "new tiddler",\n prompt: "Create a new tiddler",\n title: "New Tiddler",\n accessKey: "N"});\n\nmerge(config.macros.newJournal,{\n label: "new journal",\n prompt: "Create a new tiddler from the current date and time",\n accessKey: "J"});\n\nmerge(config.macros.plugins,{\n skippedText: "(This plugin has not been executed because it was added since startup)",\n noPluginText: "There are no plugins installed",\n confirmDeleteText: "Are you sure you want to delete these tiddlers:\sn\sn%0",\n listViewTemplate : {\n columns: [\n {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},\n {name: 'Title', field: 'title', tiddlerLink: 'title', title: "Title", type: 'TiddlerLink'},\n {name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},\n {name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},\n {name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},\n {name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},\n {name: 'Log', field: 'log', title: "Log", type: 'StringList'}\n ],\n rowClasses: [\n {className: 'error', field: 'error'},\n {className: 'warning', field: 'warning'}\n ],\n actions: [\n {caption: "More actions...", name: ''},\n {caption: "Remove systemConfig tag", name: 'remove'},\n {caption: "Delete these tiddlers forever", name: 'delete'}\n ]}\n });\n\nmerge(config.macros.refreshDisplay,{\n label: "refresh",\n prompt: "Redraw the entire TiddlyWiki display"\n });\n\nmerge(config.macros.importTiddlers,{\n readOnlyWarning: "You cannot import tiddlers into a read-only TiddlyWiki. Try opening the TiddlyWiki file from a file:// URL",\n defaultPath: "http://www.tiddlywiki.com/index.html",\n fetchLabel: "fetch",\n fetchPrompt: "Fetch the tiddlywiki file",\n fetchError: "There were problems fetching the tiddlywiki file",\n confirmOverwriteText: "Are you sure you want to overwrite these tiddlers:\sn\sn%0",\n wizardTitle: "Import tiddlers from another TiddlyWiki file",\n step1: "Step 1: Locate the TiddlyWiki file",\n step1prompt: "Enter the URL or pathname here: ",\n step1promptFile: "...or browse for a file: ",\n step1promptFeeds: "...or select a pre-defined feed: ",\n step1feedPrompt: "Choose...",\n step2: "Step 2: Loading TiddlyWiki file",\n step2Text: "Please wait while the file is loaded from: %0",\n step3: "Step 3: Choose the tiddlers to import",\n step4: "%0 tiddler(s) imported",\n step5: "Done",\n listViewTemplate: {\n columns: [\n {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},\n {name: 'Title', field: 'title', title: "Title", type: 'String'},\n {name: 'Snippet', field: 'text', title: "Snippet", type: 'String'},\n {name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}\n ],\n rowClasses: [\n ],\n actions: [\n {caption: "More actions...", name: ''},\n {caption: "Import these tiddlers", name: 'import'}\n ]}\n });\n\nmerge(config.commands.closeTiddler,{\n text: "close",\n tooltip: "Close this tiddler"});\n\nmerge(config.commands.closeOthers,{\n text: "close others",\n tooltip: "Close all other tiddlers"});\n\nmerge(config.commands.editTiddler,{\n text: "edit",\n tooltip: "Edit this tiddler",\n readOnlyText: "view",\n readOnlyTooltip: "View the source of this tiddler"});\n\nmerge(config.commands.saveTiddler,{\n text: "done",\n tooltip: "Save changes to this tiddler"});\n\nmerge(config.commands.cancelTiddler,{\n text: "cancel",\n tooltip: "Undo changes to this tiddler",\n warning: "Are you sure you want to abandon your changes to '%0'?",\n readOnlyText: "done",\n readOnlyTooltip: "View this tiddler normally"});\n\nmerge(config.commands.deleteTiddler,{\n text: "delete",\n tooltip: "Delete this tiddler",\n warning: "Are you sure you want to delete '%0'?"});\n\nmerge(config.commands.permalink,{\n text: "permalink",\n tooltip: "Permalink for this tiddler"});\n\nmerge(config.commands.references,{\n text: "references",\n tooltip: "Show tiddlers that link to this one",\n popupNone: "No references"});\n\nmerge(config.commands.jump,{\n text: "jump",\n tooltip: "Jump to another open tiddler"});\n\nmerge(config.shadowTiddlers,{\n DefaultTiddlers: "GettingStarted",\n MainMenu: "GettingStarted",\n SiteTitle: "My TiddlyWiki",\n SiteSubtitle: "a reusable non-linear personal web notebook",\n SiteUrl: "http://www.tiddlywiki.com/",\n GettingStarted: "To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:\sn* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)\sn* MainMenu: The menu (usually on the left)\sn* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened\snYou'll also need to enter your username for signing your edits: <<option txtUserName>>",\n SideBarOptions: "<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options �' 'Change TiddlyWiki advanced options'>>",\n OptionsPanel: "These InterfaceOptions for customising TiddlyWiki are saved in your browser\sn\snYour username for signing your edits. Write it as a WikiWord (eg JoeBloggs)\sn\sn<<option txtUserName>>\sn<<option chkSaveBackups>> SaveBackups\sn<<option chkAutoSave>> AutoSave\sn<<option chkRegExpSearch>> RegExpSearch\sn<<option chkCaseSensitiveSearch>> CaseSensitiveSearch\sn<<option chkAnimate>> EnableAnimations\sn\sn----\snAdvancedOptions\snPluginManager\snImportTiddlers",\n AdvancedOptions: "<<option chkGenerateAnRssFeed>> GenerateAnRssFeed\sn<<option chkOpenInNewWindow>> OpenLinksInNewWindow\sn<<option chkSaveEmptyTemplate>> SaveEmptyTemplate\sn<<option chkToggleLinks>> Clicking on links to tiddlers that are already open causes them to close\sn^^(override with Control or other modifier key)^^\sn<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP\sn<<option chkForceMinorUpdate>> Treat edits as MinorChanges by preserving date and time\sn^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^\sn<<option chkConfirmDelete>> ConfirmBeforeDeleting\snMaximum number of lines in a tiddler edit box: <<option txtMaxEditRows>>\snFolder name for backup files: <<option txtBackupFolder>>\sn<<option chkInsertTabs>> Use tab key to insert tab characters instead of jumping to next field",\n SideBarTabs: "<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>",\n TabTimeline: "<<timeline>>",\n TabAll: "<<list all>>",\n TabTags: "<<allTags>>",\n TabMore: "<<tabs txtMoreTab Missing 'Missing tiddlers' TabMoreMissing Orphans 'Orphaned tiddlers' TabMoreOrphans Shadowed 'Shadowed tiddlers' TabMoreShadowed>>",\n TabMoreMissing: "<<list missing>>",\n TabMoreOrphans: "<<list orphans>>",\n TabMoreShadowed: "<<list shadowed>>",\n PluginManager: "<<plugins>>",\n ImportTiddlers: "<<importTiddlers>>"});\n//}}}
/***\n''Version 2.1.0 3/10/06 ''\n!Traduction française des messages intégrés dans le TiddlyWiki de base de JeremyRuston, à jour avec la version 2.1.0\n__NDT:__\n^^Toute traduction peut-être discutée. Celle-ci a été faite en pensant à un utilisateur non spécialiste.\nD'où les choix :\n| //tiddler -> élément<<br>>tag, to tag -> index, indexer<<br>>plugin -> extension<<br>>empty file template -> fichier de base "empty.html"//<<br>>Mais :<<br>>//backup -> backup//<<br>>(traduire ce terme consacré introduirait des confusions) |\n//Traduction// Jacques Turbé : http://avm.free.fr//TiddlyWiki-fr.html ^^\n\nAvec la version 2.1.0 de TiddlyWiki apparaissent deux nouvelles fonctions intégrées :\n''Importations'' et ''Extensions'' : Les boutons d'appel correspondants sont ajoutés au bas de votre OptionPanel par le code suivant : {{{[[Importations|ImportTiddlers]]}}} et {{{[[Extensions|PluginManager]]}}}\n\n!!!Script de fusion des textes //''pour les versions antérieures à 2.0.11''//\n***/\n/*{{{*/\nif(window.merge == undefined)\n{\nmerge = function(dst,src)\n{\n for (p in src)\n dst[p] = src[p];\n return dst;\n}\n}\n/*}}}*/\n/***\n!!!Chaînes traduites\n***/\n/*{{{*/\n\n// Messages\nmerge(config.messages,{\n customConfigError: "Problème rencontré pour charger des extensions. Activer le menu 'Extensions' pour les détails",\n pluginError: "Erreur: %0",\n pluginDisabled: "Extension désactivée en raison de l'index 'systemConfigDisable' tag",\n pluginForced: "Exécution forcée en raison de l'index 'systemConfigForce' tag",\n pluginVersionError: "Cette extension ne peut être exécutée car elle nécessite une version plus récente de TiddlyWiki",\n nothingSelected: "Pas de sélection faite. Il faut sélectionner au moins un item d'abord",\n savedSnapshotError: "Cet exemplaire de TiddlyWiki ne semble pas conforme. Reportez-vous à http://www.tiddlywiki.com/#DownloadSoftware",\n subtitleUnknown: "(inconnu)",\n undefinedTiddlerToolTip: "L'élément '%0' n'est pas encore créé",\n shadowedTiddlerToolTip: "L'élément '%0' n'est pas encore créé, mais a un contenu par défaut.",\n tiddlerLinkTooltip: "%0 - %1, %2",\n externalLinkTooltip: "%0",\n noTags: "Il n'y a pas d'éléments indexés",\n notFileUrlError: "Les données entrées sont mémorisées pendant cette session. Pour les conserver, il faudra faire une sauvegarde avant de quitter",\n cantSaveError: "Sauvegarde impossible : soit votre navigateur ne permet pas de sauvegarder les changements (préférez FireFox si possible), soit l'adresse de votre fichier contient des caractères invalides.",\n invalidFileError: "Le fichier '%0' choisi ne semble pas être un TiddlyWiki valide",\n backupSaved: "Sauvegarde effectuée",\n backupFailed: "Echec de l'enregistrement du backup",\n rssSaved: "Flux RSS sauvegardé",\n rssFailed: "Echec de l'enregistrement du flux RSS",\n emptySaved: "Fichier de base 'empty.html' enregistré",\n emptyFailed: "Echec de l'enregistrement du fichier neuf 'empty'",\n mainSaved: "Mise à jour du fichier TiddlyWiki enregistrée",\n mainFailed: "Echec de l'enregistrement du nouveau fichier TiddlyWiki. Vos modifications ne sont pas enregistrées",\n macroError: "Erreur dans la macro <<%0>>",\n macroErrorDetails: "Erreur d'exécution de la macro <<%0>>:\sn%1",\n missingMacro: "Macro non trouvée",\n overwriteWarning: "Il y a déjà un élément nommé '%0'. Confirmez pour le remplacer",\n unsavedChangesWarning: "ATTENTION! Les dernières modifications de ce TiddlyWiki n'ont pas été enregistrées.\sn\snOK pour les enregistrer\snANNULER pour les abandonner",\n confirmExit: "--------------------------------\sn\snSi vous quittez maintenant vous perdrez les modifications qui n'ont pas été sauvegardées.\sn\sn--------------------------------",\n saveInstructions: "Sauvegarder"});\n\nmerge(config.messages.messageClose,{\n text: "fermer",\n tooltip: "ferme cette zône messages"});\n\nconfig.messages.dates.months = ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre","décembre"];\nconfig.messages.dates.days = ["dimanche", "lundi","mardi", "mercredi", "jeudi", "vendredi", "samedi"];\n\nmerge(config.views.wikified.tag,{\n labelNoTags: "non indexé",\n labelTags: "Index : ",\n openTag: "Ouvrir '%0'",\n tooltip: "Afficher les éléments indexés avec '%0'",\n openAllText: "Ouvrir tous",\n openAllTooltip: "Ouvrir tous les éléments de cet index",\n popupNone: "Pas d'autres éléments indexés avec '%0'"});\n\nmerge(config.views.wikified,{\n defaultText: "'%0' n'a pas encore été créé. Double-cliquez pour entrer un texte.",\n defaultModifier: "(absent)",\n shadowModifier: "(défaut)"});\n\nmerge(config.views.editor,{\n tagPrompt: "Séparez les index avec un espace (doubles crochets si besoin), ou sélectionnez un index existant",\n defaultText: "Entrez le texte de '%0'"});\n\nmerge(config.views.editor.tagChooser,{\n text: "index",\n tooltip: "Sélectionner les index existants à associer à cet élément",\n popupNone: "Pas d'index déjà définis",\n tagTooltip: "Associer à l'index '%0'"});\n\nmerge(config.macros.search,{\n label: "chercher",\n prompt: "Rechercher dans ce TiddlyWiki",\n accessKey: "F",\n successMsg: "%0 éléments correspondent à %1",\n failureMsg: "Aucun élément ne correspond à %0"});\n\nmerge(config.macros.tagging,{\n label: "éléments indexés:",\n labelNotTag: "pas d'index",\n tooltip: "Lister les éléments indexés '%0'"});\n\nmerge(config.macros.timeline,{\n dateFormat: "DD MMM YYYY"});\n\nmerge(config.macros.allTags,{\n tooltip: "Afficher les éléments indexés '%0'",\n noTags: "Pas d'éléments indexés"});\n\nconfig.macros.list.all.prompt = "Tous les éléments par ordre alphabétique";\nconfig.macros.list.missing.prompt = "Eléments désignés par un lien mais non créés";\nconfig.macros.list.orphans.prompt = "Eléments ne faisant l'objet d'aucun lien";\nconfig.macros.list.shadowed.prompt = "Eléments ayant un contenu par défaut";\n\nmerge(config.macros.closeAll,{\n label: "page blanche",\n prompt: "Retirer tous les éléments de l'affichage (sauf ceux en cours d'édition)"});\n\nmerge(config.macros.permaview,{\n label: "permavue",\n prompt: "URL de la page actuellement constituée"});\n\nmerge(config.macros.saveChanges,{\n label: "sauvegarde sur le disque",\n prompt: "Créer le fichier TiddlyWiki avec tous les éléments mis à jour - Raccourci : 'S'"});\n\nmerge(config.macros.newTiddler,{\n label: "nouveau",\n prompt: "Créer un nouvel élément",\n title: "EntréeNouvelle",\n accessKey: "N"});\n\n\nmerge(config.macros.importTiddlers,{\n defaultPath: "http://www.tiddlywiki.com/index.html",\n fetchLabel: "Accéder",\n fetchPrompt: "Accèder au fichier tiddlywiki",\n fetchError: "Problèmes rencontrés pour accéder au fichier tiddlywiki",\n confirmOverwriteText: "Confirmez l'écrasement de ces éléments :\sn\sn%0",\n wizardTitle: "Importation d'éléments depuis un autre fichier TiddlyWiki",\n step1: "Etape 1: Identification du fichier TiddlyWiki",\n step1prompt: "Saisir l'URL ou le chemin d'accès: ",\n step1promptFile: "...parcourez les fichiers: ",\n step1promptFeeds: "...ou sélectionnez une importation prédéfinie: ",\n step1feedPrompt: "Choisir...",\n step2: "Etape 2: Chargement des éléments du fichier TiddlyWiki",\n step2Text: "Patientez pendant le chargement des éléments de: %0",\n step3: "Etape 3: Choix des éléments à importer",\n step4: "%0 élément(s) importés",\n step5: "Terminé",\n listViewTemplate: {\n columns: [\n {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},\n {name: 'Title', field: 'title', title: "Plugin", type: 'String'},\n {name: 'Snippet', field: 'text', title: "Extrait", type: 'String'},\n {name: 'Tags', field: 'tags', title: "Index", type: 'Tags'}\n ],\n rowClasses: [\n ],\n actions: [\n {caption: "Autres actions...", name: ''},\n {caption: "Importer ces éléments", name: 'import'}\n ]}\n });\n\nmerge(config.macros.newJournal,{\n label: "journal",\n prompt: "Créer une nouvelle entrée ayant pour titre la date et l'heure",\n accessKey: "J"});\n\nmerge(config.macros.plugins,{\n skippedText: "(Extension non exécutée car ajoutée depuis le début de cette session)",\n noPluginText: "Il n'y a pas d'extensions installées",\n confirmDeleteText: "Confirmez-vous la suppression de ces éléments:\sn\sn%0",\n listViewTemplate : {\n columns: [\n {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},\n {name: 'Title', field: 'title', tiddlerLink: 'title', title: "Extension", type: 'TiddlerLink'},\n {name: 'Forced', field: 'forced', title: "Forcée", tag: 'systemConfigForce', type: 'TagCheckbox'},\n {name: 'Disabled', field: 'disabled', title: "Désactivée", tag: 'systemConfigDisable', type: 'TagCheckbox'},\n {name: 'Executed', field: 'executed', title: "Chargée", type: 'Boolean', trueText: "Yes", falseText: "No"},\n {name: 'Error', field: 'error', title: "Etat", type: 'Boolean', trueText: "Error", falseText: "OK"},\n {name: 'Log', field: 'log', title: "Log", type: 'StringList'}\n ],\n rowClasses: [\n {className: 'error', field: 'error'},\n {className: 'warning', field: 'warning'}\n ],\n actions: [\n {caption: "Autres actions...", name: ''},\n {caption: "Supprimer l'index systemConfig", name: 'remove'},\n {caption: "Supprimer définitivement ces extensions", name: 'delete'}\n ]}\n });\n\n\nmerge(config.commands.closeTiddler,{\n text: "fermer",\n tooltip: "Retirer cet élément de l'affichage"});\n\nmerge(config.commands.closeOthers,{\n text: "isoler",\n tooltip: "Refermer tous les autres éléments"});\nmerge(config.commands.editTiddler,{\n text: "éditer",\n tooltip: "Editer cet élément",\n readOnlyText: "voir",\n readOnlyTooltip: "Montrer le texte source de cet élément"});\n\nmerge(config.commands.saveTiddler,{\n text: "valider",\n tooltip: "Enregistrer les modifications apportées à cet élément"});\n\nmerge(config.commands.cancelTiddler,{\n text: "annuler",\n tooltip: "Abandonner les modifications apportées à cet élément",\n warning: "Confirmez-vous l'abandon des modifications de '%0'?",\n readOnlyText: "retour",\n readOnlyTooltip: "Revenir à l'affichage normal de cet élément"});\n\nmerge(config.commands.deleteTiddler,{\n text: "supprimer",\n tooltip: "Supprimer cet élément du fichier TiddlyWiki",\n warning: "Confirmez-vous la suppression de '%0'?"});\n\nmerge(config.commands.permalink,{\n text: "permalien",\n tooltip: "Permalien de cet élément"});\n\nmerge(config.commands.references,{\n text: "référents",\n tooltip: "Lister les éléments faisant référence à celui-ci",\n popupNone: "Pas de référents"});\n\nmerge(config.commands.jump,{\n text: "atteindre",\n tooltip: "Positionner l'affichage sur un autre élément déjà ouvert"});\n\nmerge(config.shadowTiddlers,{\n DefaultTiddlers: "PourCommencer",\n MainMenu: "PourCommencer",\n SiteTitle: "Mon TiddlyWiki",\n SiteSubtitle: "organiseur personnel web interactif",\n SiteUrl: "http://www.tiddlywiki.com/",\n PourCommencer: "Pour utiliser ce carnet TiddlyWiki, commencez par modifier les éléments suivants (//tiddlers// dans le jargon TiddlyWiki) :\sn\sn* SiteTitle & SiteSubtitle: Le titre et le sous-titre ci-dessus (après sauvegarde et rafraîchissement ils deviendront votre titre de page, qui s'affichera aussi dans la barre titre du navigateur)\sn* MainMenu: Le menu (généralement à gauche)\sn* DefaultTiddlers: Liste les noms des éléments que vous voulez voir s'afficher à l'ouverture de votre TiddlyWiki. \sn\snEntrez également le nom utilisateur avec lequel seront signées chacune de vos entrées : <<option txtUserName>>",\n SideBarOptions: "<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Modifier les options avancées de ce TiddlyWiki'>>",\n OptionsPanel: "Vos options de configuration de TiddlyWiki sont sauvegardées par votre navigateur (cookies).\sn\snNom d'utilisateur pour signer vos entrées : entrez-le sous la forme d'un nom Wiki (par exemple RaymondQueneau).<<option txtUserName>>\sn<<option chkSaveBackups>>Backup de chaque version\sn<<option chkAutoSave>>Sauvegarde automatique après chaque entrée validée\sn<<option chkRegExpSearch>>Expression régulières dans les recherches\sn<<option chkCaseSensitiveSearch>>Respecter la casse dans les recherches\sn<<option chkAnimate>>Ouverture animée des éléments\sn-----\sn[[Importations|ImportTiddlers]]\sn[[Extensions|PluginManager]]\sn[[Options complémentaires|AdvancedOptions]]",\n AdvancedOptions: "<<option chkGenerateAnRssFeed>> Création flux RSS\sn<<option chkOpenInNewWindow>> Ouverture des liens externes dans une nouvelle fenêtre\sn<<option chkSaveEmptyTemplate>> Sauvegarde du fichier de base 'empty.html' de la dernière version\sn<<option chkToggleLinks>> Recliquer sur un lien ferme l'élément qu'il a ouvert\sn^^(hors fonction en appuyant sur la touche Ctrl)^^\sn<<option chkHttpReadOnly>> Masque les fonctions d'édition lorsque le fichier est accédé depuis le Web\sn<<option chkForceMinorUpdate>> L'entrée d'une modification ne modifie pas la date et l'heure déjà enregistrées pour l'élément\sn^^(hors fonction en cliquant 'valider' avecla touche Maj enfoncée, ou en appuyant Ctrl-Maj-Entrée^^\sn<<option chkConfirmDelete>> Confirmations avant suppressions\snNombre maximum de lignes de la fenêtre d'édition: <<option txtMaxEditRows>>\snRépertoire des backups : <<option txtBackupFolder>>\sn",\n SideBarTabs: "<<tabs txtMainTab Chrono 'Affichage chronologique' TabTimeline Alpha 'Liste alphabétique des éléments' TabAll Index 'Liste des index' TabTags Suite 'Autres listes' TabMore>>",\n TabTimeline: "<<timeline>>",\n TabAll: "<<list all>>",\n TabTags: "<<allTags>>",\n TabMore: "<<tabs txtMoreTab Manquants 'Eléments désignés par un lien mais non créés' TabMoreMissing Orphelins 'Eléments sans liens pour les appeler' TabMoreOrphans Défauts 'Eléments ayant un contenu par défaut' TabMoreShadowed>>",\n TabMoreMissing: "<<list missing>>",\n TabMoreOrphans: "<<list orphans>>",\n TabMoreShadowed: "<<list shadowed>>"});\n\n/*}}}*/\n
<<forEachTiddler where tiddler.tags.contains(context.viewerTiddler.title) write '"[["+tiddler.title+"]]\sn"'>>
/***\n|!''Name:''|!''socialBookmark''|\n|''Description:''|This macro will produce links to most of the social bookmarking sites<<br>>These will allow for quick posting of the current tiddler<<br>>feel free to (un)comment lines that begin with {{{SocialBookmark.addDestination}}} below to adapt it to your needs<<br>>you'll see an example output by looking at the bottom of most TWkd tiddlers (as i included the macro in my ViewTemplate)|\n|''Version:''|0.2.0|\n|''Date:''|22/03/2007|\n|''Source:''|http://yann.perrin.googlepages.com/twkd.html#socialBookmark|\n|''Author:''|[[Yann Perrin|YannPerrin]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.x|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n|''Requires:''|@@color:red;''Send''@@|\n***/\n//{{{\nwindow.SocialBookmark=new window.TWkd.Send("socialBookmark","::");\nSocialBookmark.addDestination("Delicious","http://del.icio.us/post?v=4;url=%0;title=%1","http://yann.perrin.googlepages.com/delicious.png");\nSocialBookmark.addDestination("Digg","http://digg.com/submit?phase=2&amp;url=%0&amp;title=%1","http://yann.perrin.googlepages.com/digg.png");\n//SocialBookmark.addDestination("Blink","http://www.blinklist.com/index.php?Action=Blink/addblink.php&amp;Url=%0&amp;Title=%1","http://yann.perrin.googlepages.com/blinklist.png");\n//SocialBookmark.addDestination("Newsvine","http://www.newsvine.com/_tools/seed&amp;save?u=%0&amp;h=%1","http://yann.perrin.googlepages.com/newsvine.png");\n//SocialBookmark.addDestination("Furl","http://www.furl.net/storeIt.jsp?u=%0&amp;t=%1","http://yann.perrin.googlepages.com/furl.png");\n//SocialBookmark.addDestination("Fark","http://cgi.fark.com/cgi/fark/edit.pl?new_url=%0&amp;new_comment=%1&amp;new_comment=%1&amp;linktype=Misc","http://yann.perrin.googlepages.com/fark.png");\n//SocialBookmark.addDestination("BlogMarks","http://blogmarks.net/my/new.php?mini=1&amp;simple=1&amp;url=%0&amp;title=%1","http://yann.perrin.googlepages.com/blogmarks.png");\nSocialBookmark.addDestination("Yahoo! MyWeb","http://myweb2.search.yahoo.com/myresults/bookmarklet?t=%1&u=%0&ei=UTF-8","http://yann.perrin.googlepages.com/yahoomyweb.png");\n//SocialBookmark.addDestination("BlinkBits","http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;source_url=%0&amp;title=%1;body=%1","http://yann.perrin.googlepages.com/blinkbits.png");\n//SocialBookmark.addDestination("Connotea","http://www.connotea.org/addpopup?continue=confirm&amp;uri=%0&amp;title=%1","http://yann.perrin.googlepages.com/connotea.png");\n//SocialBookmark.addDestination("Del.irio.us","http://de.lirio.us/rubric/post?uri=%0;title=%1;when_done=go_back","http://yann.perrin.googlepages.com/delirious.png");\n//SocialBookmark.addDestination("FeedMeLinks","http://feedmelinks.com/categorize?from=toolbar&amp;op=submit&amp;url=%0&amp;name=%1","http://yann.perrin.googlepages.com/feedmelinks.png");\n//SocialBookmark.addDestination("LinkaGoGo","http://www.linkagogo.com/go/AddNoPopup?url=%0&amp;title=%1","http://yann.perrin.googlepages.com/linkagogo.png");\n//SocialBookmark.addDestination("Ma.gnolia","http://ma.gnolia.com/beta/bookmarklet/add?url=%0&amp;title=%1&amp;description=%1","http://yann.perrin.googlepages.com/magnolia.png");\n//SocialBookmark.addDestination("Netvouz","http://www.netvouz.com/action/submitBookmark?url=%0&amp;title=%1&amp;description=%1","http://yann.perrin.googlepages.com/netvouz.png");\n//SocialBookmark.addDestination("Rawsugar","http://www.rawsugar.com/tagger/?turl=%0&amp;tttl=%1","http://yann.perrin.googlepages.com/rawsugar.png");\nSocialBookmark.addDestination("Reddit","http://reddit.com/submit?url=%0&amp;title=%1","http://yann.perrin.googlepages.com/reddit.png");\n//SocialBookmark.addDestination("Scuttle","http://www.scuttle.org/bookmarks.php/maxpower?action=add&amp;address=%0&amp;title=%1&amp;description=%1","http://yann.perrin.googlepages.com/scuttle.png");\n//SocialBookmark.addDestination("Shadows","http://www.shadows.com/features/tcr.htm?url=%0&amp;title=%1","http://yann.perrin.googlepages.com/shadows.png");\n//SocialBookmark.addDestination("Simpy","http://www.simpy.com/simpy/LinkAdd.do?href=%0&amp;title=%1","http://yann.perrin.googlepages.com/simpy.png");\n//SocialBookmark.addDestination("Smarking","http://smarking.com/editbookmark/?url=%0&amp;description=%1","http://yann.perrin.googlepages.com/smarking.png");\n//SocialBookmark.addDestination("Spurl","http://www.spurl.net/spurl.php?url=%0&amp;title=%1","http://yann.perrin.googlepages.com/spurl.png");\n//SocialBookmark.addDestination("TailRank","http://tailrank.com/share/?text=&amp;link_href=%0&amp;title=%1","http://yann.perrin.googlepages.com/tailrank.png");\n//}}}\n