The development process is a step by step one.\nEach new version bringing a single new feature, or a single improvement.\n\nThese versions are named k0N : k for kernel, 0N for version.\n\nk0N will be the generic name for a kernel version
Real mode PC\n8086 based\nfloppy, standard text\nstandard bios
While starting TCOS I used dosemu as a testbed for unit testing. TCOS was a failure, finally, but at least its mechanics was effective, although a bit complicated.\n\nFor this 512b project this will be much simple :\n# patch freedos autoexec.bat (owned by root) to call c:\src.bat\n# map the X: drive to the test directory\n#* rc.bat exits to freedos if a flag file does not exist\n#* if the flag fil exists then execute all test suites (batch files) which are found on the X: root directory, then call exitemu\n\nThis way dosemu runs autonomously until completion of all the test suites \n\nThe actual test target in the Makefile runs 512 in interactive mode under qemu. It shall be renamed to "run"\n\nThe now test target depends onto secondaray targets, each one building then running a list of testsuites.\n\n
My first try was in the ususal way :\n* C \n* a small amount of asm\n* tests on real hardware\n\nThis was no fun at all, and it ended up somewhere into my mess\n
[[Version 0.0 : keyboard and tty screen]] tested Ok\n* Loading Ok\n* tty mode char output Ok\n* tty mode asciiz output Ok\n* Keyboard character reading Ok\n\n
Added the following docs\n\n* [[Journal]]\n* [[SeeAlso]]\n* [[Roadmap]]
[[k01|Version 0.1 : 0.0 with code relocation]] tested OK\n* Loading Ok\n* No regression / [[k0|Version 0.0 : keyboard and tty screen]]\n* [[Code Relocation]] Ok\n\n[[k02|Version 0.2 : 0.1 with simple command interpreter]] tested Ok\n* No regression / [[k01|Version 0.1 : 0.0 with code relocation]] Ok\n* PicoForth Ok\n\n\n\n
[[Version 0.3 : 0.2 with disk sector loading]] has been derived from the previous version, but has not been tested yet.\n
Up to now no bug tracking was used, since I were only in development stages. Hence there were coding errors but no real bugs.\n\nNow with [[Version 0.3 : 0.2 with disk sector chs loading]] I have identified my first real bug.\n\nI assume that many will follow, so I have introduced 2 more tags :\n* [[bug]] : this tag is to be used for uncorrected bugs\n* [[corrected]] : this tag is to be used for corrected bugs\nThese 2 tags have now been introduced into the [[Sitemap]]
Following the correction of [[bug001 : qemu loads k0x.bin instead of k0x.img]] k03 is tested Ok, with no regression at all.
Added lba to chs translation into k04\n\nThis should allow to access the whole floppy disk.\n\nto complete this I will need to add the 2 byte word displaying primitive (not done so far)
The positive word tty display has been added in order to display current sector.\n\nSector loading is Ok in lba mode.\n\nSome docs added, and a root Makefile (tests are needed) has been created.\n\nNext version will be a code cleaning stage, and threaded execution will be added to replace the calls sequences
My goals are \n* some cleaning \n* introducing the threaded engine (PicoForth)\n* gain some bytes in order to put the load/execute routine \n\nMaybe I should include this load/execute routine now. This should not the far away (load + call [BUFFER_ADDRESS])
I have finally implemented the load and run sector . This will enable me to develop [[PicoForth]] as a separate binary while simplifying an beautifying the kernel a little bit.\n\nTo be executable a sector should conform to an [[Executable Format]].\n\nI have drafted a design of the threaded interpreter, but it still needs work.
All intended functionalities (all, clean, test, package) now work.\n\nBTW, picoforth does not work. I have had a bad time making it fit into 512bytes, and it crashes after the very first keydown event.
cf. [[bug002 - Version printing primitive goes into infinite loop]]
My main machine is now dead. Somewhat burned dry and pshhh-ed inside. RIP.\n\nAll I can save and potentially re-use elsewhere are the CPU and its caloduc, the two 256 MB DDR2/400 RAMs, the 60 GB disk, the LCD screen (needs some wiring), keyboard and touchpad (both need some wiring too), and CD/DVD combo. Ah yes there are a couple of fans too.\n\nAll else is unusable. The all-in-one motherboard will join my motherboard collection (a couple 486, one 286/12, a 386SX (IIRC), an Asus T3P5, IIRC).\n\nNow I have to get a new machine. Until then I cannot work confortably on this project.
Since PicoForth cannot be debugged I have proceeded to rearrange the outer loop and then sector selection code.\n\nNow the EXECUTE word seems to work correctly.\n\nTesting needed.\n\nThis moves me to think about automatic testing. The main question being : "How to make automatic testing for 16 bits assembly code under Linux (32 ou 64 bits).\n\nThsi is exposed in the AsmUnit part of this document
Two basic unit tests have been written in order to settle a unit test framework which I named AsmUnit for the moment.\n\nSome kind of "Poor man nasm unit testign framework".\n\nThe main challenges are:\n* to be able to run 16 bit code under linux\n* to minimize the manual actions during tests\n\nFor this I have installed dosemu and freedos. The autoexec.bat file on its C: drive is a symlink to somewhere in /usr (iirc). The target autoexec.bat file belongs to root, with 655 unix rights, so to minimize its modifications I added a call to c:\src.bat, which does the following :\n\n# map x: to ./tests in the 512b root directory\n# if do_tests.flg does exist then\n## chdir to x:\s\n## execute all .bat files\n## exitemu\n# else \n## unmap x:\n## let dosemu bring to freedos prompt\n\nSo far this does work.\n\nIndeed I had to modify the Makefile, which starts to be huge compared to the previous version. Some refactoring is needed here.
Generic rules have been written so as to increase maintability.\n\nIn the meantime one more testsuite has been written concerning the find word, on which I had a doubt. Now I'm sure it works.\n\nThe main PicoForth has been split into smaller pieces :\n* hardware interface (character reading, character writing, sector reading)\n* PicoForth virtual machine macro definitions (NEXT, ENTER, LEAVE) \n* PicoForth main code\n\nAll are included by the main PicoForth asm source file\n\nDoing so, by writing fake hardware routines I will be able to interactively test Picoforth under Dosemu/Freedos, but the main goal is to be able to make more automatic tests
Make test will compile and run all testsuites.\n\nFor now all testsuites are 100% successful.\n\nTests actually say that prim_print word works correctly. Tht other primitives will be tested in the same way.\n\nThe next batch of tests will be about the inner loop and Picoforth vm.
I have not had much time recently, but a few more tests hve been written.\n\nMissing tests have been listed too, so that I can see some progress (even if there is little) in writing them.
So far I have written and run automated tests for the following :\n* ts_nop : display a message through inner interpreter\n* ts_seq : test main inner interpreter mecanisms : NEXT, JZ, JMP, LIT, SKIP_ZERO, SKIP_NZERO, EXECUTE, \n* ts_prt : test picoforth text output (output is emulated through a byte buffer), current sector output\n* ts_sct : test sector selection words\n\nStill to be done :\n* lba -> chs translation\n
The keyboard simulation routine is now written, along with its first unit test.\nA few more tests are needed before unit testing the entire picoforth engine.\n\n
lba_chs translation Ok.\n\nNext to be done : keyboard input simulation + its test suite, then the outer loop testsuite will be written
''Second try : May the forth be with you:''\n\nI wanted to use forth - precisely Tcom by Tom Zimmer - as main programming language with automatic tests. \n\nThis try lent me to a boot loader and a test kernel.\n\nSince tcom produces standard .com files I wrote a small org 100h to org 000h binary header patch. The make process would prefix the tcom generated .com with this patch, making it an "org 0000h" binary.\n\nThis was fun but I had difficulties with using Bochs in my automatic tests. Debian vanilla Bochs had no port 0x0E debug patch. Then all of this went into vanish during a dark period of my life. \n\nI had achieved the following, though :\n* Load of a fixed 64k sized kernel \n* Proceed a couple of test suites (check segment registers, display some text, etc)\n* The start of a memory magager (4k page mapped)\n* 8086 compatible, real mode
This one should go further than previous attempts, since it is much more simple, with clear and step by step goals :\n\n* Kernel resides into the boot sector\n* Single tasking\n* Tty mode, bios based screen output (done)\n* Bios based keyboard handler (thus only qwerty mapped) (done)\n* Very simple and basic 1 char cli interface\n* Threaded code engine\n* [[SectorFs]] : one sector loading at a time display as asciiz data or run as binary code\n\n
\nThe build process (make) is quite simple for the moment : \n# cd to the directory corresponding to the k0n you want to make\n# launch the ''Make'' command to build the disk image\n# launch ''make test'' command to build and launch the disk image\n\nIn the close future, there will be a top Makefile with which you will be able to\n* call each k0N Makefile\n* generate a tar.gz distribution\n* clean (delete generated files from) each k0N directory
This is not my first attempt at writing an OS.\n\n
My main design constraint is the 512 bytes limit, since this engine must stay within the boot sector.\n\nThere is "pico" in the name because this is an execution only variant. Words are nameless ([[Anomynous word]]s), and there is no real dictionnary.\n\nThe inner interpreter is build to be fully recursive.\n\nThe outer interpreter has now been turned into a threaded code. Its startup needs some more work to be functionnal.\n\nThe main core (level 0) primitives (enter, leave, next) are only a few bytes long, but most of the code space is used by the level 1 primitives (display text, load sector, etc).\n\n
<<option chkGenerateAnRssFeed>> GenerateAnRssFeed\n<<option chkOpenInNewWindow>> OpenLinksInNewWindow\n<<option chkSaveEmptyTemplate>> SaveEmptyTemplate\n<<option chkToggleLinks>> Clicking on links to tiddlers that are already open causes them to close\n^^(override with Control or other modifier key)^^\n<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP\n<<option chkForceMinorUpdate>> Treat edits as MinorChanges by preserving date and time\n^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^\n<<option chkConfirmDelete>> ConfirmBeforeDeleting\nMaximum number of lines in a tiddler edit box: <<option txtMaxEditRows>>\nFolder name for backup files: <<option txtBackupFolder>>\n<<option chkInsertTabs>> Use tab key to insert tab characters instead of jumping to next field
PicoForth being a [[Command Key Interface]] (CKI; cf. CLI) all words are nameless.\n\nThere is not word linking either.\n
\n* text editor\n* rpn calc demo
An assembler word ''must'' end with "jmp next".\n\nExample:\n{{{\nprim_drop:\n pop bx\n jmp next\n}}}
Each k0N version has its own makefile, just enter its directory and launch make.\n\nAll k0N versions can now be processed with just one command.\n\nJust go to the 512b root folder and run\n* make all to build all floppy images\n* make clean to clean all directories\n* make package to create a .tar.gz archive\n\nChaque version majeure du kernel a son propre makefile.\nUn makefile principal lance la compilation de tous les kernels
// //''Name:'' Blog\n// //''Version:'' 0.1.1\n// //''Author:'' [[Anshul Nigham|http://yavin4.anshul.info]] (adapted from an earlier plugin by [[ClintChecketts|http://www.checkettsweb.com/]]) \n// //Tag support given by [[Emmanuel Frécon|http://www.sics.se/~emmanuel/]]\n// //''Type:'' Plugin\n// //''Description:'' Posts the most recently edited tiddlers when the TiddlyWiki is opened, similar to a blog.\n// //''Syntax:'' Change the daysOrPosts and numOfDaysOrPosts variables below\n// // If daysOrPosts variable is "days", tiddlers from the past numOfDaysOrPosts dates will be displayed\n// // If daysOrPosts variable is "posts", the past numOfDaysOrPosts tiddlers will be displayed \n// // The restrictTag variable contains the tag that all entries should contain\n// // for appearing as blog entries. Other entries will not appear, except for\n// // those coming from the the defaultTiddlers. If the variable is an empty\n// // string, then the behaviour is the same version 0.1 (below).\n\n// // ''Tested against:'' Tiddlywiki 2.1.3\n\n// // ''HOWTO:'' Simply copy this entire tiddler and paste it into a new tiddler in your own tiddlywiki.\n// // Tag it with systemConfig, and also with systemTiddlers if you don't want it to appear within the blog views. Name it anything you like\n\nvar daysOrPosts = "days";\nvar numOfDaysOrPosts = "7";\nvar restrictTag = "";\n\nfunction displayTopTiddlers()\n{\n if(window.location.hash) daysOrPosts = "";\n if(daysOrPosts == "posts")\n {\n var tiddlerNames = store.reverseLookup("tags","systemTiddlers",false,"modified");\n if (tiddlerNames.length < numOfDaysOrPosts)\n numOfDaysOrPosts = tiddlerNames.length;\n for(var t = tiddlerNames.length-numOfDaysOrPosts;t<=tiddlerNames.length-1;t++)\n if (restrictTag == "" || tiddlerNames[t].isTagged(restrictTag))\n story.displayTiddler("top",tiddlerNames[t].title,DEFAULT_VIEW_TEMPLATE,false,false);\n }\n if (daysOrPosts == "days"){\n var lastDay = "";\n var tiddlerNames = store.reverseLookup("tags","systemTiddlers",false,"modified");\n var t = tiddlerNames.length -1;\n var tFollower = 0;\n for(t;t>=0;t--) if(numOfDaysOrPosts >= 0){\n var theDay = tiddlerNames[t].modified.convertToYYYYMMDDHHMM().substr(0,8);\n if(theDay != lastDay){\n numOfDaysOrPosts = numOfDaysOrPosts -1;\n lastDay = theDay;\n tFollower = t;\n }\n }\n\n for(tFollower = tFollower+1; tFollower < tiddlerNames.length;tFollower++){\n if (restrictTag == "" || tiddlerNames[tFollower].isTagged(restrictTag))\n displayTiddler("top",tiddlerNames[tFollower].title,DEFAULT_VIEW_TEMPLATE,false,false);\n }\n\n }\n}\n\nwindow.original_restart = window.restart;\nwindow.restart = function()\n{\n window.original_restart();\n displayTopTiddlers();\n}\n
# cd into the directory containing the unpacked archive\n# make test\n# make\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
/***\n| Name:|CloseOnCancelPlugin|\n| Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|\n| Version:|$$version$$|\n| Date:|$$date$$|\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
{{{\n\n[BITS 16]\nORG 0x0000 ; seg:offset = 0x1000:0x0000\n\njmp short boot_code\n\n. . .\n\nboot_code:\n cli ; interrupts disabled\n ; set source\n mov ax, cs\n mov ds, ax ; ds = source segment(0)\n mov si, 0x7C00 ; si = source offset(7C00)\n ; set destination\n mov ax, 0x1000\n mov es, ax ; es = destination segment(1000)\n mov di, 0x0000 ; di = destination offset(0xFD00)\n\n mov cx, 512 ; move 512 bytes\n\n rep movsb ; relocate boot loader from 0000:7C00 to 1000:0000\n\n\n jmp 0x1000:new_location ; jump to new location\n\nnew_location:\n mov ax, cs\n mov ss, ax\n mov ds, ax\n mov es, ax\n\n mov sp, 0xFFFF ; set segs and stack pointer to sane values\n\n sti ; interrupts enabled\n\n}}}
Name: Green\nBackground: #fff\nForeground: #000\nPrimaryPale: #9b9\nPrimaryLight: #385\nPrimaryMid: #031\nPrimaryDark: #020\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
PicoForth has a command key interface, ie the entry words does the following:\n\n# display version\n# display current sector\n# get a key\n# find the corresponding word in a key/address table\n# if not found then loop to #3\n# if found then call the word corresponding to the command key
\n|MonkeyGTDSettings|Change settings|\n|<<selectPalette>>|Change colour scheme|\n|Version|<<tiddler MonkeyGTDVersion>>|\n|[[Upgrade]]|Upgrade to the latest MonkeyGTD|\n|[[Area]]|To add/remove Areas of Responsibilty|\n|[[Realm]]|To add/remove Realms|\n|[[ViewDashboardTemplate]]|This defines the dashboards and lists|\n|[[ViewPanelTemplate]]|This controls the toolbar panels|\n|MainMenu|Defines the menu bar|\n|DefaultTiddlers|Defines what to show at startup|\n|SiteTitle|Site title|\n|SiteSubtitle|Site subtitle|\n|GTDComponent|For advanced use only|\n\n!Notes\n* I have hard coded references to "Professional" and "Personal" in a couple of places so it's better to just use those at least for now.\n* If you add a new context/area etc you won't see it until you click "refresh" on one of your tiddler toolbars\n\n!What's New\n* 24 Oct 06\n** Drop down select for projects and areas as suggested by Ken Girard.\n
//{{{\nconfig.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit\nconfig.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler\nconfig.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist\nconfig.views.editor.defaultText = ""; // don't need message when creating a new tiddler \n//}}}\n
# cd into the directory containing the unpacked archive\n# make run
I have found much information and inspiration into other people's work.\n\nHere are some of them. \n\nMany thanks for their work.
/***\nVersion: $$version$$\nCreates a bunch of shadow tiddlers for the dashboards and panels \n***/\n\n//{{{\nmerge(config.shadowTiddlers,{\n\n'ActionPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Action\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Realm:</td><td><span macro=\s"checkboxList Realm\s"></span></td></tr>",\n "<tr macro=\s"showWhen tiddler.getProject() == ''\s"><td class=\s"label\s">Area:</td><td><span macro=\s"dropdownSelect Area\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Project:</td><td><span macro=\s"dropdownSelect Project\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Context:</td><td><span macro=\s"checkboxList Context\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Status:</td><td><span macro=\s"checkboxList ActionStatus\s"></span></td></tr>",\n ""\n].join("\sn"),\n\n'ActionTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Actions by Status'",\n " tags:!Done",\n " group:ActionStatus",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Actions by Realm'",\n " group:Realm",\n " tags:!Done",\n " \s"></div>",\n "",\n "",\n "",\n "</td></tr></table>",\n ""\n].join("\sn"),\n\n'AreaDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:Projects",\n " tags:Project",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions'",\n " tags:'Next && Action && !Done'",\n " view:action_proj",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Waiting For'",\n " tags:'[(Waiting For)] && Action && !Done'",\n " view:action_proj",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Reference'",\n " tags:'Reference'",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Sub Areas'",\n " tags:Area",\n " \s"></div>",\n "",\n "</td>",\n "</td></tr></table>",\n ""\n].join("\sn"),\n\n'AreaPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Area\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Realm:</td><td><span macro=\s"checkboxList Realm\s"></span></td></tr>",\n "",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"newHere title:'New Project' label:'new project' tag: Project GTD\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new next action' tag: Action GTD Next\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new waiting action' tag: Action GTD 'Waiting For'\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new future action' tag: Action GTD\s"></span>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'AreaTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Areas by Realm'",\n " group:Realm",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Projects by Area'",\n " tags:Project",\n " group:Area",\n " mode:global",\n " \s"></div>",\n "",\n "</td>",\n "</tr></table>",\n ""\n].join("\sn"),\n\n'CollectThoughtsTiddlerDash':[\n "",\n "<div macro=\s"collectThoughts\s"></div>",\n ""\n].join("\sn"),\n\n'ContextDash':[\n "<table width=\s"100%\s">",\n "<tr>",\n "<td valign=\s"top\s" width=\s"50%\s">",\n " <div macro=\s"listByTag title:'Next Actions'",\n " tags:'Action && Next && !Done'",\n " view:action_proj",\n " group:Realm",\n " \s"></div>",\n "</td>",\n "<td valign=\s"top\s" width=\s"50%\s">",\n " <div macro=\s"listByTag title:'Waiting For Actions'",\n " tags:'Action && [(Waiting For)] && !Next && !Done'",\n " view:action_proj",\n " group:Realm",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Future Actions'",\n " tags:'Action && ![(Waiting For)] && !Next && !Done'",\n " view:action_proj",\n " group:Realm",\n " \s"></div>",\n "</td>",\n "</tr>",\n "</table>",\n ""\n].join("\sn"),\n\n'ContextTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Contexts'",\n " \s"></div>",\n "",\n "</td>",\n "</tr></table>",\n ""\n].join("\sn"),\n\n'InboxTiddlerDash':[\n "",\n "<div macro=\s"listByTag\s"",\n " title:'Inbox items'",\n " tags:'Inbox'",\n " ></div>",\n ""\n].join("\sn"),\n\n'MainDashDash':[\n "<table width=\s"100%\s">",\n "<tr>",\n "<td valign=\s"top\s" width=\s"50%\s">",\n "",\n "",\n " <div macro=\s"listByTag title:'Next Actions'",\n " tags:'Action && Next && !Done'",\n " view:action_proj",\n " group:Context",\n " mode:global",\n " \s"></div>",\n "",\n "</td><td valign=\s"top\s">",\n "",\n " <div macro=\s"listByTag title:'Current Ticklers'",\n " tags:'Tickler && !Processed'",\n " view:tickler",\n " sort:tickleDate",\n " where:'tiddler.tickleDate() <= (new Date()).convertToLocalYYYYMMDDHHMM()'",\n " mode:global",\n " \s"></div>",\n "",\n "",\n " <div macro=\s"listByTag title:'Waiting For'",\n " tags:'Action && [(Waiting For)] && !Done'",\n " view:action_proj",\n " group:Context",\n " mode:global",\n " \s"></div>",\n "",\n "",\n "</td>",\n "</tr>",\n "</table>",\n ""\n].join("\sn"),\n\n'MainDashPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag MainDash\s"></span></td></tr>",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"newTiddler label:'new project' tag: Project GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new next action' tag: Action Next GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new waiting action' tag: Action GTD 'Waiting For'\s"></span>",\n " <span macro=\s"newTiddler label:'new future action' tag: Action GTD\s"></span>",\n " <span macro=\s"newTiddler title:'New Tickler' label:'new tickler' tag: Tickler GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new context' tag: Context GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new area' tag: Area GTD\s"></span>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'NextTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions by Context'",\n " tags:!Done",\n " view:action_proj",\n " group:Context",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"34%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions by Realm'",\n " tags:!Done",\n " view:action_proj",\n " group:Realm",\n " \s"></div>",\n "",\n "</td><td width=\s"34%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions by Project'",\n " tags:!Done",\n " view:action",\n " group:Project",\n " \s"></div>",\n "",\n "",\n "</td></tr></table>",\n ""\n].join("\sn"),\n\n'ProcessInboxTiddlerDash':[\n "",\n "",\n "<div macro=\s"processInbox\s"></div>",\n ""\n].join("\sn"),\n\n'ProjectDash':[\n "<table style=\s"width:100%\s"><tr>",\n "",\n "<td valign=\s"top\s" width=\s"33%\s" cellspacing=\s"0\s" border=\s"0\s">",\n "",\n " <div macro=\s"listByTag title:'Next Actions'",\n " tags:'Action && Next && !Done'",\n " view:action",\n " group:Context",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Waiting For'",\n " tags:'Action && [(Waiting For)] && !Done'",\n " view:action",\n " \s"></div>",\n "",\n "</td><td valign=\s"top\s" width=\s"34%\s">",\n "",\n " <div macro=\s"listByTag title:'Ticklers'",\n " tags:'Tickler && !Done'",\n " view:tickler",\n " \s"></div>",\n "",\n "",\n " <div macro=\s"listByTag title:'Sub Projects'",\n " tags:'Project'",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Future Actions'",\n " tags:'Action && ![(Waiting For)] && !Next && !Done'",\n " view:action",\n " \s"></div>",\n "",\n "</td><td valign=\s"top\s" width=\s"33%\s">",\n "",\n " <div macro=\s"listByTag title:'Reference'",\n " tags:'Reference'",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Recently Done'",\n " tags:'Action && Done'",\n " limit:10",\n " view:action_plain",\n " sortBy:-modified",\n " \s"></div>",\n "",\n "</td>",\n "</tr></table>",\n ""\n].join("\sn"),\n\n'ProjectPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Project\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Realm:</td><td><span macro=\s"checkboxList Realm\s"></span></td></tr>",\n "<!-- <tr><td class=\s"label\s">Area:</td><td><span macro=\s"checkboxList Area\s"></span></td></tr> -->",\n "<tr macro=\s"showWhenTagged Professional\s"><td class=\s"label\s">Area:</td><td><span macro=\s"dropdownSelect Area && Professional\s"></span></td></tr>",\n "<tr macro=\s"showWhenTagged Personal\s"><td class=\s"label\s">Area:</td><td><span macro=\s"dropdownSelect Area && Personal\s"></span></td></tr>",\n "<tr macro=\s"hideWhen tiddler.tags.containsAny(['Professional','Personal'])\s"><td class=\s"label\s">Area:</td><td><span macro=\s"dropdownSelect Area\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Status:</td><td><span macro=\s"checkboxList ProjectStatus\s"></span></td>",\n "",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"deleteAllTagged 'remove project' delete\s"></span>",\n "</td></tr>",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"newHere title:'New Action' label:'new next action' tag: Action Next GTD\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new waiting action' tag: Action GTD 'Waiting For'\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new future action' tag: Action GTD\s"></span>",\n " <span macro=\s"newHere label:'new sub-project' tag: Project GTD\s"></span>",\n " <span macro=\s"newHere title:'New Tickler' label:'new tickler' tag: Tickler GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new context' tag: Context GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new area' tag: Area GTD\s"></span>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'ProjectTiddlerDash':[\n "<!-- ******************************* -->",\n "<!-- contributed by Michael Lockhart -->",\n "<!-- ******************************* -->",\n "",\n "<!--",\n "~MJL20070205 - Customized Project Tiddler.",\n "This overrides the ProjectTiddlerDash shadow tiddler from MonkeyGTD 2.1 alpha r77 with a new dashboard focussing on",\n "the GTD weekly review task. I have added these features:",\n "",\n " * An ability to see Completed projects and to remove old tasks via the DeleteDoneTasks macro",\n " * Separate out the Someday/Maybe projects to help with assessing if any can be activated",\n " * GTD Weekly Review instructions",\n " * Inspiration for new ideas during review",\n " * A link to a Review How To tiddler that guides me through the GTD process",\n "",\n "-->",\n "",\n "<div style=\s"margin-top:1em;\s" macro=\s"tiddler ReviewTips\s"></div>",\n "",\n "<table width=\s"100%\s"><tr>",\n "",\n "<td style=\s"vertical-align:top\s" width=\s"50%\s">",\n "",\n "<div macro=\s"listByTag title:'Projects by Area'",\n " tags:'!Complete && !Someday/Maybe'",\n " group:Area",\n " view:showstar",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Someday/Maybe Projects'",\n " mode:global",\n " tags:'Someday/Maybe && !Complete'",\n " view:showstar",\n " group:Area",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Completed Projects'",\n " mode:global",\n " tags:'Complete'",\n " view:showstar",\n " group:Area",\n " \s"></div>",\n "",\n "<div macro=\s"deleteDone daysOld:20 title:'Delete Old Actions' \s"></div>",\n "",\n "</td>",\n "",\n "<td valign=\s"top\s" width=\s"50%\s">",\n "<div macro=\s"listByTag title:'Actions by Project'",\n " mode:global",\n " tags:'Action && Next && !Done && !Someday/Maybe'",\n " view:action",\n " group:Project",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Projects that need a next action'",\n " mode:global",\n " tags:'Action && !Done && (Next || [(Waiting For)])'",\n " group:'Project && !Someday/Maybe && !Complete'",\n " onlyShowEmpty:yes",\n " \s"></div>",\n "",\n "</td>",\n "",\n "</tr></table>",\n "",\n "",\n "",\n "",\n "",\n "<!-- old version -->",\n "<!-- ",\n "",\n "<table width=\s"100%\s"><tr>",\n "<td style=\s"vertical-align:top\s" width=\s"50%\s">",\n "",\n "<div macro=\s"listByTag title:'Projects by Area'",\n " tags:!Complete",\n " group:Area",\n " view:showstar",\n " \s"></div>",\n "",\n "</td>",\n "",\n "<td valign=\s"top\s" width=\s"50%\s">",\n "<div macro=\s"listByTag title:'Actions by Project'",\n " mode:global",\n " tags:'Action && Next && !Done'",\n " view:action",\n " group:Project",\n " \s"></div>",\n "</td>",\n "",\n "</tr></table>",\n "",\n "",\n "-->",\n ""\n].join("\sn"),\n\n'RealmDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions'",\n " tags:'Next && Action && !Done && ![(Waiting For)]'",\n " view:action_proj",\n " group:Context",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Waiting For'",\n " tags:'[(Waiting For)] && Action && !Done'",\n " view:action_proj",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "",\n "<div macro=\s"listByTag title:Projects",\n " tags:'Project && !Complete && ![(Someday/Maybe)]'",\n " group:Area",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Someday/Maybe'",\n " tags:'Project && !Complete && [(Someday/Maybe)]'",\n " group:Area",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "",\n "<div macro=\s"listByTag title:Areas",\n " tags:Area",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "</td></tr></table>",\n ""\n].join("\sn"),\n\n'RealmPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Realm\s"></span></td></tr>",\n "",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"newHere label:'new area' tag: Area GTD\s"></span>",\n " <span macro=\s"newHere label:'new project' tag: Project GTD\s"></span>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'RealmTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Realms'",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Areas by Realm'",\n " tags:Area",\n " group:Realm",\n " mode:global",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "",\n "",\n "</td>",\n "",\n "</tr></table>",\n ""\n].join("\sn"),\n\n'StarredTiddlerDash':[\n "",\n "<table width=\s"100%\s"><tr>",\n "<td style=\s"vertical-align:top\s" width=\s"50%\s">",\n "",\n " <div macro=\s"listByTag title:'Starred Next Actions'",\n " tags:'Action && Next && Starred && !Done'",\n " group:Context",\n " view:action",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Starred Waiting For Actions'",\n " tags:'Action && [(Waiting For)] && Starred && !Done'",\n " group:Context",\n " view:action",\n " \s"></div>",\n "",\n "",\n "</td>",\n "",\n "<td valign=\s"top\s" width=\s"50%\s">",\n " <div macro=\s"listByTag title:'Starred'",\n " tags:'Starred && !Complete && !Done && !Action'",\n " group:GTDComponent",\n " view:showstar",\n " \s"></div>",\n "</td>",\n "",\n "</tr></table>",\n "",\n "",\n ""\n].join("\sn"),\n\n'TicklerPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Tickler\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Realm:</td><td><span macro=\s"checkboxList Realm\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Processed:</td><td><span macro=\s"toggleTag Processed\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Tickler:</td><td>",\n " <table class=\s"ticklerDate\s">",\n " <tr>",\n " <td macro=\s"hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'\s" align=\s"right\s"><span macro=\s"view mgtd.tday\s"></span></td>",\n " <td macro=\s"showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'\s" align=\s"right\s"><span macro=\s"view mgtd.tmonth\s"></span></td>",\n " <td>/</td>",\n " <td macro=\s"hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'\s" align=\s"center\s"><span macro=\s"view mgtd.tmonth\s"></span></td>",\n " <td macro=\s"showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'\s" align=\s"center\s"><span macro=\s"view mgtd.tday\s"></span></td>",\n " <td>/</td>",\n " <td align=\s"left\s" macro=\s"view mgtd.tyear\s"></td>",\n " </tr>",\n " </table>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'TicklerTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Current Ticklers'",\n " tags:'!Processed'",\n " view:tickler",\n " sort:tickleDate",\n " where:'tiddler.tickleDate() <= (new Date()).convertToLocalYYYYMMDDHHMM()'",\n " \s"></div>",\n "",\n "",\n "",\n "</td>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Upcoming Ticklers'",\n " tags:'!Processed'",\n " view:tickler",\n " sort:tickleDate",\n " where:'tiddler.tickleDate() > (new Date()).convertToLocalYYYYMMDDHHMM()'",\n " \s"></div>",\n "",\n "<!--",\n "<div macro=\s"listByTag title:'Ticklers by Project'",\n " group:Project",\n " \s"></div>",\n "-->",\n "",\n "",\n "</td></tr></table>",\n ""\n].join("\sn")\n\n});\n//}}}\n
[[Sitemap]]\n[[Project]]\n
/***\n|Name|DeleteAllTaggedPlugin|\n|Source|http://ido-xp.tiddlyspot.com/#DeleteAllTaggedPlugin|\n|Version|1.0|\n\nAn adaptation of DeleteDoneTasks (Simon Baird) by Ido Magal\nTo use this insert {{{<<deleteAllTagged>>}}} into the desired tiddler.\n\nExample usage:\n{{{<<deleteAllTagged>>}}}\n<<deleteAllTagged>>\n***/\n//{{{\n\nconfig.macros.deleteAllTagged = {\n handler: function ( place,macroName,params,wikifier,paramString,tiddler ) {\n var buttonTitle = params[0] ? params[0] : "Delete Tagged w/ '"+tiddler.title+"'"; // simon's tweak\n var alsoDeleteThisTiddler = params[1] ? params[1] : "";\n createTiddlyButton( place, buttonTitle, "Delete every tiddler tagged with '"+tiddler.title+"'", this.deleteAllTagged( tiddler.title, alsoDeleteThisTiddler == "delete" ));\n },\n\n deleteAllTagged: function(tag,deleteMe) {\n return function() {\n var collected = [];\n store.forEachTiddler( function ( title,tiddler ) {\n if ( tiddler.tags.contains( tag ))\n {\n collected.push( title );\n }\n });\n if ( collected.length == 0 )\n {\n alert( "No tiddlers found tagged with '"+tag+"'." );\n }\n else\n {\n if ( confirm( "These tiddlers are tagged with '"+tag+"'\sn'"\n + collected.join( "', '" ) + "'\sn\sn\sn"\n + "Are you sure you want to delete these?" ))\n {\n for ( var i=0;i<collected.length;i++ )\n {\n store.deleteTiddler( collected[i] );\n story.closeTiddler( collected[i], true );\n displayMessage( "Deleted '"+collected[i]+"'" );\n }\n }\n }\n if (deleteMe)\n {\n if ( confirm( "Also delete this tiddler ('"+tag+"')?" ) )\n {\n store.deleteTiddler( tag );\n story.closeTiddler( tag, true );\n displayMessage( "Deleted '"+tag+"'" );\n }\n }\n }\n }\n};\n\n//}}}\n\n\n/***\nExample usage:\n{{{<<deleteDone>>}}}\n<<deleteDone>>\n{{{<<deleteDone daysOld:20 title:'delete old'>>}}}\n<<deleteDone daysOld:30 title:'delete old'>>\n\nTODO merge these two\n\n***/\n//{{{\n\n\n\n\nconfig.macros.deleteDone = {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var namedParams = (paramString.parseParams('daysOld'))[0];\n var daysOld = namedParams['daysOld'] ? namedParams['daysOld'][0] : 30; // default\n var buttonTitle = namedParams['title'] ? namedParams['title'][0] : "Delete Done Actions";\n createTiddlyButton(place,buttonTitle,"Delete done actions older than "+daysOld+" days old",this.deleteDone(daysOld));\n },\n\n deleteDone: function(daysOld) {\n return function() {\n var collected = [];\n var compareDate = new Date();\n compareDate.setDate(compareDate.getDate() - daysOld);\n store.forEachTiddler(function (title,tiddler) {\n if (tiddler.tags.containsAll(["Action","Done"])\n && tiddler.modified < compareDate) {\n collected.push(title);\n }\n });\n if (collected.length == 0) {\n alert("No done actions found older than "+daysOld+" days");\n }\n else {\n if (confirm("Done actions older than "+daysOld+" days:\sn'"\n + collected.join("', '") + "'\sn\sn\sn"\n + "Are you sure you want to delete these actions?")) {\n for (var i=0;i<collected.length;i++) {\n store.removeTiddler(collected[i]);\n displayMessage("Deleted '"+collected[i]+"'");\n story.closeTiddler( collected[i], true );\n }\n }\n }\n }\n }\n};\n\n//}}}\n\n
\n* fire demo\n* ping demo\n* autodisplay text\n
During development qemu is the main test platform
''First approach algorythm:''\n{{{\npush FFFF\nwhile (AX <> 0):\n BX = AX mov 10\n push BX\n AX = AX div 10 \n\npop AX\nwhile (AX != FFFF ) :\n print '0' + AX\n pop AX\n}}}
No real usage, though
\n<div style="display:none" macro="showWhen tiddler.tags.containsAll(['GTD','Action']) || tiddler.title == 'New Action'">\n <span>Project field (not used yet):</span><span macro="edit mgtd.project"></span>\n</div>\n<div macro="showWhen tiddler.tags.containsAll(['GTD','Tickler']) || tiddler.title == 'New Tickler'">\n\n <table>\n <tr><td class="editLabel" valign="top" rowspan="2">Tickler</td>\n <!-- TODO make a utility method for this sort of thing -->\n <td macro="showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'" class="editLabel">Month</td>\n <td class="editLabel">Day</td>\n <td macro="hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'" class="editLabel">Month</td>\n <td class="editLabel">Year</td></tr>\n <tr>\n <td macro="showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'" ><span class="shorterEdit" macro="edit mgtd.tmonth"></span></td>\n <td><span class="shorterEdit" macro="edit mgtd.tday"></span></td>\n <td macro="hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'" ><span class="shorterEdit" macro="edit mgtd.tmonth"></span></td>\n <td><span class="shorterEdit" macro="edit mgtd.tyear"></span></td>\n </tr>\n </table>\n\n</div>\n\n
<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>\n<div class="title" macro="view title"></div>\n<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>\n<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>\n<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>\n<div macro="showWhenExists EditPanelTemplate">[[EditPanelTemplate]]</div>\n<div class="editor" macro="edit text"></div>\n\n
An executable binary start with the following words :\n|!Offset|!description|!Comments|\n|0|0x9090|executable tag word 1 (two nops)|\n|2|0x09E9|executable tag word 2 (jmp start)|\n|4|8 bytes|Binary name|\n|12|NULL byte|asciiz terminator for binary name|\n|13|code|must exit with a ret intruction|\n\nThis is generated by the following code :\n\n{{{\n[BITS 16] ; 16 bits plain binary output\n[ORG 0x0600] ; code origin, where the bios loads it\n nop \n nop\n jmp start\n db "README ",0\nstart:\n}}}\n\n
This allows some of the PicoForth test automation
For now 512b is a very simple OS.\n\nAfter relocating itself to 1000:0000 it waits for a key and processes it as a command.\n\ncf [[Supported commands]] for details \n\n
Future test platforms will be :\n* Amstrad PC1512\n* ZDS 486DX/33\n* clone style 486 DX4/100
These tiddlers are important so don't delete them.
Each testsuite outputs its results into a .log file. a log file is csv formatted with the following fields :\n* test suite name\n* test name\n* "Ok" or "Ko"\n* a comment\n\nWhen all test suites have been ran then all the individual .log files are grep-ed 'Ko' to list the failing tests.\n\nLater more evolved statistics tools will be developped.
<<today>> - <<version>>\n\nBrought to you by [[JeanBuchet]]'s GtdStatsMacro plugin.\n\n<<GtdStats>>\n\n
/***\n|!Plugin Name|GtdStats|\n|!Description:|Collect statistics about projects completion|\n|!Author|[[Jean Buchet|http://buje.free.fr/index.php]]|\n|!Version|2.1.2|\n|!Date:|2008/10/15|\n|!Usage|<////<GtdStats>////>|\n|!Source:| |\n\n!History\n* 2008/12/19 v2.1.2 - Code simplification\n* 2008/10/16 version 2.1.0\n** Some code cleaning\n* 2008/10/15 version 2.0.0\n** took interesting ideas from TagglyTagCloud macro and TagglyListPlugin\n** converted to a macro\n** output into a tiddler\n** data showed as a table and as text/cvs \n** project names are links to the corresponding project tiddler\n* 2008/10/04 version 1.0.0\n** First version as a command button\n** output to the upper right corner notification popup\n\n!Code\n***/\n\n//{{{\n\nversion.extensions.GtdStats= {major: 2, minor: 1 , revision: 1, date: new Date(2005,10, 15)};\n//Created by Jean Buchet, ideas taken from TagCloud \n\nconfig.macros.GtdStats= {\n noProjects: "No projects found"\n};\n\nfunction repeat_string(repeatString, repeatNum) {\n var newString = "";\n for (var x=1; x<=parseInt(repeatNum, 10); x++) {\n newString = newString + repeatString;\n }\n return (newString) ;\n} \n\nconfig.macros.GtdStats.handler = function(place,macroName,params) {\n\n var GtdStatsWrapper = createTiddlyElement(place,"div",null,"GtdStats",null);\n var projects= [];\n var results = "" ;\n var next=0;\n var future=0;\n var done=0;\n var waitfor=0;\n\n\n store.forEachTiddler( function ( title,tiddler ) {\n if ( tiddler.tags.contains( "Project" )) {\n projects.push( title );\n }\n });\n if ( projects.length == 0 ) {\n wikify("''No project found''", place);\n } else {\n var tot_next=0;\n var tot_future=0;\n var tot_done=0;\n var tot_waitfor=0;\n var tot_pct=0;\n\n var pct = 0\n var grph = "";\n\n // generate table header\n \n results="|!Projects|!Actions|!Mass|!Done!|!Todo|!Future|!% done|!Completion|!W/for|!Adherence|";\n\n for ( var i=0;i<projects.length;i++ ) {\n next=0;\n future=0;\n done=0;\n waitfor=0;\n store.forEachTiddler( function ( title, tiddler ) {\n if (tiddler.tags.contains( "Action")) {\n if ( tiddler.tags.contains(projects[i]) ) {\n if (tiddler.tags.contains("Done") ) { done = done + 1 ; }\n else if (tiddler.tags.contains("Next") ) { next = next + 1 ; }\n else if (tiddler.tags.contains("Waiting For") ) { waitfor = waitfor + 1 ; }\n else { future =future + 1 ; }\n }\n }\n });\n\n if ( (next+future+done) == 0 ) {\n pct = 0 ;\n } else {\n pct = done/(next+future+done) ;\n }\n grph = repeat_string("l", Math.round(pct*50) )+ "-" + repeat_string(".", Math.round((1-pct)*50) ) ;\n\n results=results+"\sn"+"|[["+projects[i] +"]]|"+ (next+future+done) +"|"+ repeat_string("X", (next+future+done)) +"|"+ done +"|"+ next +"|"+ future +"|"+ (Math.round(1000 * pct)/10) +" % " +"|"+ grph +"|"+ waitfor +"|"+ repeat_string("X", waitfor) +"|";\n tot_next+=next;\n tot_future+=future;\n tot_done+=done;\n tot_waitfor+=waitfor;\n }\n\n if ( (tot_next+tot_future+tot_done) == 0 ) {\n tot_pct = 0 ;\n } else {\n tot_pct = tot_done/(tot_next+tot_future+tot_done) ;\n }\n\n grph = repeat_string("l", Math.round(tot_pct*50) )+ "-" + repeat_string(".", Math.round((1-tot_pct)*50) ) ;\n\n results=results+"\sn"+"|!"+projects.length+" project(s)|!"+ (tot_next+tot_future+tot_done) +"|!"+ repeat_string("X", Math.round((tot_next+tot_future+tot_done) / projects.length)) +"|!"+ tot_done +"|!"+ tot_next +"|!"+ tot_future +"|!"+ (Math.round(1000 * tot_pct)/10) +" % " +"|!"+ grph +"|!"+ tot_waitfor +"|!"+ repeat_string("X", Math.round(tot_waitfor / projects.length)) +"|";\n\n wikify(results, place);\n \n }\n\n}\n\n//}}}\n
/***\n| Name:|HideWhenPlugin|\n| Description:|Allows conditional inclusion/exclusion in templates|\n| Version:|$$version$$|\n| Date:|$$date$$|\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="showWhenTagged Task">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\n\nwindow.removeElementWhen = function(test,place) {\n if (test) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n};\n\nmerge(config.macros,{\n\n hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( eval(paramString), place);\n }},\n\n showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !eval(paramString), place);\n }},\n\n hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAny(params), place);\n }},\n\n showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAny(params), place);\n }},\n\n hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);\n }},\n\n showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);\n }}\n\n});\n\n//}}}\n\n
Inbox management tools
//{{{\nconfig.formatters.unshift( {\n name: "inlinesliders",\n match: "\s\s+\s\s+\s\s+\s\s+|\s\s<slider",\n lookaheadRegExp: /(?:\s+\s+\s+\s+|<slider) ([\sw\ss]*)(?:>?)\sn((?:.|\sn)*?)\sn(?:====|<\s/slider>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart )\n {\n var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\su00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");\n var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");\n panel.style.display = "none";\n wikify(lookaheadMatch[2],panel);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n },\n onClickSlider : function(e)\n {\n if(!e) var e = window.event;\n var n = this.nextSibling;\n n.style.display = (n.style.display=="none") ? "block" : "none";\n return false;\n }\n});\n//}}}
//{{{\n\n// By Lewcid\n// http://tw.lewcid.org/sandbox/#InlineTabsPlugin\n\nconfig.formatters.unshift( {\n name: "inlinetabs",\n match: "\s\s<tabs",\n lookaheadRegExp: /(?:<tabs (.*)>\sn)((?:.|\sn)*?)(?:\sn<\s/tabs>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var cookie = lookaheadMatch[1];\n var wrapper = createTiddlyElement(null,"div",null,cookie);\n var tabset = createTiddlyElement(wrapper,"div",null,"tabset");\n tabset.setAttribute("cookie",cookie);\n var validTab = false;\n var firstTab = '';\n var tabregexp = /(?:<tab (.*)>)(?:(?:\sn)?)((?:.|\sn)*?)(?:<\s/tab>)/mg;\n while((m = tabregexp.exec(lookaheadMatch[2])) != null)\n {\n if (firstTab == '') firstTab = m[1];\n var tab = createTiddlyButton(tabset,m[1],m[1],story.onClickInlineTab,"tab tabUnselected");\n tab.setAttribute("tab",m[1]);\n tab.setAttribute("content",m[2]);\n tab.title = m[1];\n if(config.options[cookie] == m[1])\n validTab = true;\n }\n if(!validTab)\n config.options[cookie] = firstTab;\n w.output.appendChild(wrapper);\n story.switchInlineTab(tabset,config.options[cookie]);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n})\n\nStory.prototype.switchInlineTab = function(tabset,tab)\n{\n var cookie = tabset.getAttribute("cookie");\n var theTab = null\n var nodes = tabset.childNodes;\n for(var t=0; t<nodes.length; t++)\n if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)\n {\n theTab = nodes[t];\n theTab.className = "tab tabSelected";\n }\n else\n nodes[t].className = "tab tabUnselected"\n if(theTab)\n {\n if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")\n tabset.parentNode.removeChild(tabset.nextSibling);\n var tabContent = createTiddlyElement(null,"div",null,"tabContents");\n tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);\n wikify(theTab.getAttribute("content"),tabContent);\n if(cookie)\n {\n config.options[cookie] = tab;\n saveOptionCookie(cookie);\n }\n }\n}\n \nStory.prototype.onClickInlineTab = function(e)\n{\n story.switchInlineTab(this.parentNode,this.getAttribute("tab"));\n return false;\n}\n//}}}\n\n
/***\n| Name:|InstantTimestampPlugin|\n| Created by:|SimonBaird|\n| Location:|http://instanttimestamp.tiddlyspot.com/|\n| Version:|1.0.5 (17-Jan-2007)|\n| Requires:|~TW2.x|\n!Description\nIf you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list:\n* {ts} or {t} -> timestamp\n* {ds} or {d} -> datestamp\n* !ts or !t at start of line -> !!timestamp\n* !ds or !d at start of line -> !!datestamp\n(I added the extra ! since that's how I like it. Remove it from translations below if required)\n!Notes\n* Change the timeFormat and dateFormat below to suit your preference.\n* See also AutoCorrectPlugin\n!History\n* 17-Jan-07, version 1.0.5\n** added fields param to saveTiddler method needed in TW 2.1+\n* 06-Apr-06, version 1.0.4\n** removed the AutoCorrect stuff and put it in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.3\n** now have exclusion by tag and tiddler name, probably less important here than in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.2\n** put matches into array to and eval them to allow generic substitutions\n* 05-Apr-06, version 1.0.1\n** added ds for datestamp as suggested by DanielBaird\n** made case insensitive\n** Added translation for !t at start of line\n* 05-Apr-06, version 1.0.0\n** written after suggestion by Achim Wessling \n!Code\n***/\n//{{{\n\nconfig.InstantTimestamp = {\n\n // adjust to suit\n timeFormat: 'DD/0MM/YY 0hh:0mm',\n dateFormat: 'DD/0MM/YY',\n\n translations: [\n [/^!ts?$/img, "'!!'+now.formatString(config.InstantTimestamp.timeFormat)"],\n [/^!ds?$/img, "'!!'+now.formatString(config.InstantTimestamp.dateFormat)"],\n [/\s{ts?\s}/ig, "now.formatString(config.InstantTimestamp.timeFormat)"],\n [/\s{ds?\s}/ig, "now.formatString(config.InstantTimestamp.dateFormat)"]\n ],\n\n excludeTags: [\n "noAutoCorrect",\n "html",\n "CSS",\n "css",\n "systemConfig",\n "zsystemConfig",\n "Plugins",\n "Plugin",\n "plugins",\n "plugin",\n "javascript",\n "code"\n ],\n\n excludeTiddlers: [\n "StyleSheet",\n "StyleSheetLayout",\n "StyleSheetColors",\n "StyleSheetPrint"\n ]\n\n}; \n\nif (!Array.prototype.contains)\n Array.prototype.contains = function(item) {\n return (this.find(item) != null);\n };\n\nif (!Array.prototype.containsAny)\n Array.prototype.containsAny = function(items) {\n for (var i=0;i<items.length;i++)\n if (this.contains(items[i]))\n return true;\n return false;\n };\n\nTiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields) {\n\n tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;\n var conf = config.InstantTimestamp;\n\n if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {\n\n var now = new Date();\n var trans = config.InstantTimestamp.translations;\n for (var i=0;i<trans.length;i++) {\n newBody = newBody.replace(trans[i][0], eval(trans[i][1]));\n }\n }\n\n return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields);\n}\n\n//}}}\n\n
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
Name: Blue\nBackground: #fff\nForeground: #000\nPrimaryPale: #cdf\nPrimaryLight: #57c\nPrimaryMid: #114\nPrimaryDark: #012\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
Name: Green\nBackground: #fff\nForeground: #000\nPrimaryPale: #9b9\nPrimaryLight: #385\nPrimaryMid: #031\nPrimaryDark: #020\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
Name: Red\nBackground: #fff\nForeground: #000\nPrimaryPale: #fdd\nPrimaryLight: #c55\nPrimaryMid: #711\nPrimaryDark: #500\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
Name: Smoke\nBackground: #fff\nForeground: #000\nPrimaryPale: #aaa\nPrimaryLight: #777\nPrimaryMid: #111\nPrimaryDark: #000\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
as told by title
[[Dashboard]]\n [[Project]]\n/%\n <<tag Realm>>\n {{new{''<<newTiddler label:'+' title:'New Action' tag: Action Next GTD>>''}}}\n {{tag{<<tag Action>>}}}\n {{new{''<<newTiddler label:'+' title:'New Project' tag: Project GTD>>''}}}\n {{tag{<<tag Project>>}}}\n {{new{''<<newTiddler label:'+' title:'New Tickler' tag: Tickler GTD>>''}}}\n {{tag{<<tag Tickler>>}}}\n {{new{''<<newTiddler label:'+' title:'New Context' tag: Context GTD>>''}}}\n {{tag{<<tag Context>>}}}\n {{new{''<<newTiddler label:'+' title:'New Area' tag: Area GTD>>''}}}\n {{tag{<<tag Area>>}}}\n%/\n@@padding-left:1em;font-size:70%;\n [[starred|Starred]] \n {{tag{<<tag inbox|InboxTiddlers>>}}}\n {{tag{<<tag updt|UpgradeTools>>}}}\n {{tag{<<tag more|GTDComponent>>}}}\n {{tag{<<tag tools|QuickAccess>>}}}\n\n@@\n @@padding-left:1em;color:[[ColorPalette::PrimaryLight]];<<tiddler MonkeyGTDVersion>>@@\n
<<manageTiddlers tags:tech>>
/***\n!Metadata:\n|''Name:''|ManageTiddlersPlugin|\n|''Description:''|List tiddlers with specific tag and let you manage the multiple selected tiddlers.|\n|''Version:''|1.0.0|\n|''Date:''|Nov 23, 2006|\n|''Source:''|http://www.sourceforge.net/projects/ptw/|\n|''Author:''|BramChen (bram.chen (at) gmail (dot) com)|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.5+; InternetExplorer 6.0|\n!Usage:\n{{{\n<<manageTiddlers\n [tags:TagName]\n [listOnly:yes|no]\n [sortField:TiddlerField]\n [sortReverse: yes|no]\n>>\n}}}\n!Revision History:\n|''Version''|''Date''|''Note''|\n|1.0.0|Nov 23, 2006|Initial release|\n!Code section:\n***/\n//{{{\nversion.extensions.manageTiddlers = {major: 1, minor: 0, revision: 0,\n date: new Date("Nov 23, 2006"),\n name: "manageTiddlers",\n type: "Plugin",\n author: "BramChen",\n source: "http://sourceforge.net/project/showfiles.php?group_id=150646"\n};\nconfig.options.txtManageTiddlersTag = "";\nconfig.macros.manageTiddlers = {\n confirmDeleteText: "Confirm delete:\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: 'Author', field: 'modifier', title: 'Author', type: 'String'},\n// {name: 'Created', field: 'created', title: 'Created', type: 'Date', dateFormat: 'Y/m/d H:i:s'},\n {name: 'Snippet', field: 'text', title: 'Snippet', type: 'Snippet'},\n {name: 'Modified', field: 'modified', title: 'Modified', type: 'Date', dateFormat: 'Y/m/d H:i:s'},\n {name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}\n ],\n rowClasses: [\n ],\n actions: [\n {caption: "name....", name: ''},\n {caption: "View", name: 'view'},\n {caption: "Edit", name: 'edit'},\n {caption: "Delete", name: 'delete'},\n {caption: "QuickEdit", name: 'QuickEdit'}\n ]}\n}\n \nconfig.macros.manageTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler){\n var e = createTiddlyElement(place,"div");\n e.setAttribute("refresh","macro");\n e.setAttribute("macroName","manageTiddlers");\n e.setAttribute("params",paramString);\n this.refresh(e,paramString);\n}\n\nconfig.macros.manageTiddlers.refresh = function(place,params){\n removeChildren(place);\n params = params.parseParams("anon",null,true,false,true);\n var tagged = (typeof params[0] == "undefined")?" ":params[0]["tags"];\n var sortField = params[0]["sortField"];\n var sortReverse = params[0]["sortReverse"];\n var tiddlers = (tagged == " ")?store.getNoTaggedTiddlers():store.getTaggedTiddlers(tagged,sortField);\n if (sortReverse == "yes") {\n tiddlers.sort(function(a,b) {return a[sortField] > b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});\n }\n ListView.create(place,tiddlers,config.macros.manageTiddlers.listViewTemplate,config.macros.manageTiddlers.onSelectCommand);\n if ((params[0]["listOnly"]=="yes"))\n place.getElementsByTagName("select")[0].style.display='none';\n}\n\nconfig.macros.manageTiddlers.onSelectCommand = function(listView,command,rowNames){\n var lists = findRelated(listView,"manageTiddlers","className","parentNode");\n switch(command)\n {\n case "view":\n story.displayTiddlers(null,rowNames);\n break;\n case "edit":\n story.displayTiddlers(null,rowNames,DEFAULT_EDIT_TEMPLATE);\n break;\n case "delete":\n if(rowNames.length > 0 && confirm(config.macros.manageTiddlers.confirmDeleteText.format([rowNames.join(", ")])))\n {\n for(t=0; t<rowNames.length; t++)\n {\n store.removeTiddler(rowNames[t]);\n story.closeTiddler(rowNames[t],true,false);\n }\n }\n break;\n case "quickEdit":\n //Waiting ...\n break;\n }\n}\n\n// Add columnTypes, "Snipper", of ListView \nListView.columnTypes.Snippet = {\n createHeader: function(place,columnTemplate,col)\n {\n createTiddlyText(place,columnTemplate.title);\n },\n createItem: function(place,listObject,field,columnTemplate,col,row)\n {\n var v = listObject[field];\n if(v != undefined)\n createTiddlyText(place,v.substr(0,40));\n }\n};\n// Add a method getNoTaggedTiddlers to "TiddlyWiki"\nTiddlyWiki.prototype.getNoTaggedTiddlers = function()\n{\n var results = [];\n this.forEachTiddler(function (title,tiddler) {\n if(tiddler.tags.length==0)\n results.push(tiddler);\n });\n results.sort();\n return results;\n}\n//}}}
''Segments usage:''\n|!Segment|!lin addr|!usage|!Comments|\n|0000|00000|reserved for the system (int table, bios data area, etc)| Part of it may be used by the kernel|\n|1000|10000|contains the kernel and its data|\n|all others| |free for use| |\n\n''kernel memory map:''\n\nAfter boot, the kernel is situated at hex 1000:0000\nAll its FFFF bytes can be used.\n\nSegment Registers are as follows : CS=DS=SS=ES=1000\nThe stack grows downwards from 1000:FFFF \n\nWithin the n 1000 segment, range 0800 to SP can be used for data.\n\n|!start|!usage|!Comment|\n|0000|Kernel data and code|\n|0200|empty|Can be used as data|\n|0600|Sector load buffer|\n|0800|empty|Can be used as data|\n| SP |stack|kernel stack|\n\n\n
MikeOS is an educational Os development example. Simple but efficient and pragmatic:\n\n* MikeOS project website : http://mikeos.berlios.de.\n* MikeOs at BerliOs : http://developer.berlios.de/projects/mikeos/
/***\n\n\n***/\n//{{{\n\nconfig.mGTD = {\n\n star: "\su2605",\n // star: "*", // use in case the above doesn't work on your system\n \n config: {}, // gets populated by populateLists\n\n tiddlerViews: {\n phoneList:\n "'|[['+this.title+']]"+\n "|'+config.mGTD.undefBlank(store.getTiddlerSlice(this.title,'phone'))+'"+\n "|\s\sn'",\n tickler:\n "'|<<toggleTag Processed [['+this.title+']] ->>|[['+this.title+']]"+\n "|'+"+\n "((store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true')"+\n "?(this.mGet('tmonth')+'/'+this.mGet('tday'))"+\n ":(this.mGet('tday')+'/'+this.mGet('tmonth')))"+\n "+'/'+this.mGet('tyear')+'|\s\sn'",\n // TODO ffs use classes for these\n groupBy:\n "'{{groupBy{[['+this.title+']] }}}\s\sn'",\n showstar:\n "'{{starthing{"+\n "@@font-size:80%;"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] }}}\s\sn'",\n showstar2:\n "'{{starthing{"+\n "@@font-size:80%;margin-left:2em;"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] }}}\s\sn'",\n action:\n "'{{action{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n "<<tTag tag:Next mode:text text:N title:[['+this.title+']]>>"+\n "<<tTag tag:[[Waiting For]] mode:text text:W title:[['+this.title+']]>>"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] "+\n "}}}\s\sn'",\n action2:\n "'{{action2{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n "<<tTag tag:Next mode:text text:N title:[['+this.title+']]>>"+\n "<<tTag tag:[[Waiting For]] mode:text text:W title:[['+this.title+']]>>"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] "+\n "}}}\s\sn'",\n action_proj:\n "'{{action{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n "<<tTag tag:Next mode:text text:N title:[['+this.title+']]>>"+\n "<<tTag tag:[[Waiting For]] mode:text text:W title:[['+this.title+']]>>"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] "+\n "'+this.getProjectTextForList()+'"+\n "}}}\s\sn'",\n action_proj2:\n "'{{action2{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n "<<tTag tag:Next mode:text text:N title:[['+this.title+']]>>"+\n "<<tTag tag:[[Waiting For]] mode:text text:W title:[['+this.title+']]>>"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] "+\n "'+this.getProjectTextForList()+'"+\n "}}}\s\sn'",\n action_plain:\n "'{{action{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n " @@"+\n "[['+this.title+']] "+\n "}}}\s\sn'",\n action_plain2:\n "'{{action2{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n " @@"+\n "[['+this.title+']] "+\n "}}}\s\sn'"\n\n },\n\n getListByTag: function(tag) {\n return store.getTaggedTiddlers(tag).map( function(t) { return t.title; } );\n },\n\n populateLists: function() {\n\n // the meta list\n this.config.GTDComponent = this.getListByTag("GTDComponent");\n\n for (var i=0;i<this.config.GTDComponent.length;i++) {\n this.config[this.config.GTDComponent[i]] = this.getListByTag(this.config.GTDComponent[i]);\n }\n\n },\n\n undefBlank: function(value) {\n return value ? value.toString() : "";\n },\n\n commands: {\n refresh: {\n text: 'refresh',\n tooltip: 'Refresh this tiddler',\n handler: function(e,src,title) {\n clearMessage();\n if (config.mGTD.populateLists)\n config.mGTD.populateLists();\n story.refreshTiddler(title,null,true);\n return false; \n }\n } \n },\n\n macros: {\n\n realmSelector: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var markup = "Show realms: ";\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n markup += '<<tField title:MonkeyGTDSettings tag:[[hide'+\n config.mGTD.config.Realm[i] + \n ']] mode:text text:[['+\n config.mGTD.config.Realm[i] +\n ']] refreshAll:yes>>';\n }\n wikify(markup,place,null,tiddler);\n }\n },\n\n listByTag: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var parsedParams = paramString.parseParams("tags",null,true);\n var tagExpr = getParam(parsedParams,"tags","true");\n var whereExpr = getParam(parsedParams,"where","true");\n var groupBy = getParam(parsedParams,"group");\n var mode = getParam(parsedParams,"mode","local");\n var title = getParam(parsedParams,"title","local");\n var sortBy = getParam(parsedParams,"sort","title");\n var limit = getParam(parsedParams,"limit");\n var className = getParam(parsedParams,"class","");\n var viewType = getParam(parsedParams,"view");\n var ignoreRealm = getParam(parsedParams,"ignoreRealm","no");\n var showEmpty = getParam(parsedParams,"showEmpty","no"); // only relevant when using group\n var onlyShowEmpty = getParam(parsedParams,"onlyShowEmpty","no"); // only relevant using group\n\n if (mode != "global")\n tagExpr = '( '+tagExpr+' ) && ( [[' + tiddler.title + ']] )';\n\n if (ignoreRealm != "yes") {\n\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n if (mHideRealm(config.mGTD.config.Realm[i])) {\n tagExpr = '( '+tagExpr+' ) && ( ![[' + config.mGTD.config.Realm[i] + ']] )';\n }\n }\n }\n\n var markup = "{{mList "+className+"{\sn";\n\n if (title)\n markup += "{{mListTitle{"+title+"}}}\sn";\n \n if (groupBy) {\n markup += store.getByTagExpr(groupBy,sortBy).asList(1,viewType,limit,tagExpr,showEmpty,onlyShowEmpty,sortBy);\n\n var catchLeftoversExpr = "( "+tagExpr+" ) && !parent:" + groupBy;\n var leftovers = store.getByTagExpr(catchLeftoversExpr,sortBy).asList(2,viewType,limit);\n if (leftovers != "") {\n markup += "{{groupBy{''(No "+groupBy+")''}}}\sn";\n markup += leftovers;\n }\n\n }\n else\n markup += store.getByTagExpr(tagExpr,sortBy,whereExpr).asList(1,viewType,limit);\n\n markup += "}}}\sn";\n wikify(markup,place,null,tiddler); \n }\n },\n\n checkboxList: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var itemType = params[0];\n for (var i=0;i<config.mGTD.config[itemType].length;i++)\n wikify("<<toggleTag [["+config.mGTD.config[itemType][i]+"]]>>",place,null,tiddler);\n }\n },\n\n dropdownSelect: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n var values = store.getByTagExpr(paramString);\n\n var selectFrom = [];\n var currentVal = "";\n selectFrom.push({name:"", caption:"(none)"});\n for (var i=0;i<values.length;i++) {\n if (tiddler.tags.contains(values[i].title))\n currentVal = values[i].title; \n selectFrom.push({name:values[i].title, caption:values[i].title});\n }\n\n var onChangeHandler = function() {\n // this will be better when we use fields:\n store.setTiddlerTag(tiddler.title,false,currentVal);\n tiddler.mSet("project",null);\n if (this.value != "") {\n tiddler.mSet("project",this.value);\n store.setTiddlerTag(tiddler.title,true,this.value);\n }\n return true;\n };\n\n var selector = createTiddlyDropDown(place,onChangeHandler,selectFrom,currentVal);\n if (currentVal != "")\n wikify(" [[>>|"+currentVal+"]]",place);\n }\n },\n\n\n newHere: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n },\n\n newHereFields: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n // needs some work here to derive parent type\n wikify("<<newTiddlerWithFields "+paramString+" tag:[["+tiddler.title+"]] mgtd.project:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n },\n\n processInbox: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n var shortHand = {\n 'W': 'Waiting For',\n 'N': 'Next',\n 'F': ''\n };\n\n // TODO move this help elsewhere...\n wikify(\n "Enter projects and actions here. Click 'create these items' to create them\sn"+\n "Example usage:\sn{{{\snPaint House|Home Maintenance\sn"+\n ".Buy ladder and brushes|Errands\sn"+\n ".Choose colours|Home|W\sn"+\n "\sn}}}\sn"+\n "By default actions are next actions. "+\n "Specify W or F to make them future or Waiting For. You can create multiple projects.\snRealm:"\n ,place);\n\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n var r = config.mGTD.config.Realm[i];\n var foo = createTiddlyCheckbox(place,r,!mHideRealm(r),null);\n foo.id = "piRealm"+r.replace(/ /,'');\n }\n\n var pi = createTiddlyElement(place,"textarea",null,"piBox");\n \n wikify("\sn",place);\n\n var a1 = createTiddlyCheckbox(place,"Open created projects",true,null);\n a1.id = 'piShowProjects';\n\n var a2 = createTiddlyCheckbox(place,"Open created actions",false,null);\n a2.id = 'piShowActions';\n\n wikify("\sn\sn",place);\n\n var btn = createTiddlyButton(place,"create these items","create these items",function(e) {\n var lines = pi.value.split("\sn");\n var currentProject = "";\n var displayThese = [];\n\n for (var i=0;i<lines.length;i++) {\n //alert(lines[i]);\n var fields = lines[i].split(/[|;]/);\n\n if (!fields[0] || fields[0].trim() == "") {\n currentProject = "";\n }\n else {\n\n var title = fields.shift();\n //alert(title);\n\n // add the realm\n for (var j=0;j<config.mGTD.config.Realm.length;j++) {\n var theId = "piRealm"+config.mGTD.config.Realm[j].replace(/ /,'');\n if (document.getElementById(theId).checked)\n fields.push(config.mGTD.config.Realm[j]);\n }\n\n if (title[0] != '.') {\n //alert("project "+title);\n currentProject = title;\n\n if (document.getElementById('piShowProjects').checked)\n displayThese.push(title);\n\n fields.push("GTD"); // make it a GTD item\n fields.push("Project"); // make it a project\n if (store.tiddlerExists(title))\n alert("Warning: '"+title+"' already exists, did not create");\n else\n store.saveTiddler(\n title,title,\n "", // content\n config.options.txtUserName,\n new Date(),\n fields, // tags\n null // extra fields\n );\n }\n else {\n\n // default to next actions\n if (!fields.containsAny(['N','F','W']))\n fields.push('N');\n\n fields = fields.map(function(f) {\n if (shortHand[f] && shortHand[f] != '')\n return shortHand[f];\n else\n return f;\n });\n\n //alert("action "+title);\n title = title.trim();\n title = title.replace(/^\s.+/,'');\n\n if (document.getElementById('piShowActions').checked)\n displayThese.push(title);\n\n fields.push("GTD"); // make it a GTD item\n fields.push("Action"); // make it an action \n if (currentProject.trim() != "")\n fields.push(currentProject); // make it in this project\n\n if (store.tiddlerExists(title))\n alert("Warning: '"+title+" already exists, did not create");\n else\n store.saveTiddler(\n title,title,\n "", // content\n config.options.txtUserName,\n new Date(),\n fields, // tags\n null // extra fields\n );\n }\n }\n }\n\n for (var ii=0;ii<displayThese.length;ii++)\n story.displayTiddler("bottom",displayThese[ii]);\n\n alert("Done creating items");\n return false;\n }); // end of createTiddlyButton\n\n }\n },\n\n collectThoughts: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n // TODO move this help elsewhere...\n wikify("Enter thoughts one per line. They will be added to your [[Inbox]]",place);\n wikify("\sn",place);\n\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n var r = config.mGTD.config.Realm[i];\n var foo = createTiddlyCheckbox(place,r,!mHideRealm(r),null);\n foo.id = "ctRealm"+r.replace(/ /,'');\n }\n\n wikify("\sn",place);\n var ct = createTiddlyElement(place,"textarea",null,"ctBox");\n wikify("\sn",place);\n \n var btn = createTiddlyButton(place,"add to inbox","add to inbox",function(e) {\n var lines = ct.value.split("\sn");\n var currentProject = "";\n var displayThese = [];\n\n for (var i=0;i<lines.length;i++) {\n //alert(lines[i]);\n var fields = [lines[i]]; //.split(/[|;]/);\n\n var title = fields.shift();\n //alert(title);\n\n // add the realm\n for (var j=0;j<config.mGTD.config.Realm.length;j++) {\n var theId = "ctRealm"+config.mGTD.config.Realm[j].replace(/ /,'');\n if (document.getElementById(theId).checked)\n fields.push(config.mGTD.config.Realm[j]);\n }\n\n fields.push("GTD"); // make it a GTD item\n fields.push("Inbox"); // make it a project\n if (store.tiddlerExists(title))\n alert("Warning: '"+title+"' already exists, did not create");\n else\n store.saveTiddler(\n title,title,\n "", // content\n config.options.txtUserName,\n new Date(),\n fields, // tags\n null // extra fields\n );\n\n }\n\n alert("Done");\n return false;\n }); // end of createTiddlyButton\n\n }\n }\n\n },\n\n/*\n// I think this is obsolete now. See also NewTiddlerWithFieldsMacro.js which also we don't need for now?? \n onClickNewTiddler: function() {\n var title = this.getAttribute("newTitle");\n var params = this.getAttribute("params").split("|");\n var focus = this.getAttribute("newFocus");\n var template = this.getAttribute("newTemplate");\n story.displayTiddler(null,title,template);\n var text = this.getAttribute("newText");\n if(typeof text == "string")\n story.getTiddlerField(title,"text").value = text.format([title]);\n for(var t=0;t<params.length;t++) {\n if (params[t].indexOf("=") != -1) {\n // it's a field, name=value. this is hacky and not good\n var nameValue = params[t].split("=");\n // alert(nameValue[0]);\n // alert(nameValue[1]);\n // damn this doesn't work because tiddler doesn't exist yet\n // store.setValue(title,nameValue[0],nameValue[1]);\n }\n else {\n // it's a normal tag\n story.setTiddlerTag(title,params[t],+1);\n }\n }\n story.focusTiddler(title,focus);\n return false;\n \n },\n*/\n \n stringMethods: {\n parseTagExpr: function() {\n var spaced = this.\n replace(/\s[\s(/g," [["). // because square brackets in templates no good\n replace(/\s)\s]/g,"]] "). \n replace(/(!|&&|\s|\s||\s(|\s))/g," $1 ");\n var tokens = spaced.readBracketedList(false); // false means not unique. thanks Jeremy!\n var expr = "";\n var logicOps = ['(',')','||','&&','!','true','false'];\n for (var i=0;i<tokens.length;i++) {\n if (logicOps.contains(tokens[i])) {\n expr += tokens[i];\n }\n else if (tokens[i].match(/^parent:/)) {\n var lookForTagInParent = tokens[i].split(":")[1];\n expr += "tiddler.parents().anyHasTag('"+lookForTagInParent+"')";\n } \n else {\n expr += "tiddler.tags.contains('"+tokens[i].\n replace(/'/,"\s\s'") // fix single quote bug. hurrah\n // but how to fix round bracket bug?\n +"')";\n }\n }\n //alert(expr);\n return '('+expr+')';\n }\n },\n\n storeMethods: {\n getByTagExpr: function(tagExpr,sortBy,whereExpr) {\n var parsed = tagExpr.parseTagExpr();\n\n sortBy = sortBy ? sortBy : 'title';\n var desc = false;\n if (sortBy.substr(0,1) == '-') {\n desc = true;\n sortBy.replace(/^-/,'');\n }\n\n if (whereExpr) {\n parsed = "( "+parsed+" ) && ( "+whereExpr+" ) ";\n }\n\n\n var output = [];\n var first = true;\n this.forEachTiddler(function(title,tiddler) {\n //alert(tiddler.getRealm());\n try {\n if (eval(parsed))\n output.push(tiddler);\n }\n catch(e) {\n if (first) {\n alert("error parsing: "+parsed);\n first = false;\n }\n }\n });\n if (sortBy == "tickleDate") {\n output.sort(function(a,b) {\n return a.tickleDate() < b.tickleDate() ? -1 :\n (a.tickleDate() == b.tickleDate() ? 0 : +1);\n });\n }\n else {\n output.sort(function(a,b) {\n return a[sortBy] < b[sortBy] ? -1 :\n (a[sortBy] == b[sortBy] ? 0 : +1);\n });\n }\n\n if (desc)\n return output.reverse();\n else\n return output;\n }\n },\n\n arrayMethods: {\n map: function(func) {\n var result = [];\n for (var i=0;i<this.length;i++)\n result.push(func(this[i]));\n return result;\n },\n\n asList: function(level, viewType, limit, subExpr, showEmpty, onlyShowEmpty, sortBy, sortExpr) {\n var output = "";\n for (var i=0;(i<this.length && (!limit || i<limit));i++)\n if (!subExpr)\n output += this[i].mGTDrender(level,viewType);\n else {\n var newExpr = "( " + subExpr + " ) && ( [[" + this[i].title + "]] )";\n var sublist = store.getByTagExpr(newExpr,sortBy).asList(level+1, viewType, limit);\n if (((sublist == "" && (showEmpty == "yes" || onlyShowEmpty == "yes"))) || ((sublist != "" && onlyShowEmpty != "yes"))) {\n output += this[i].mGTDrender(level,"groupBy");\n output += sublist;\n }\n }\n return output;\n },\n\n anyHasTag: function(tagName) {\n for (var i=0;i<this.length;i++)\n if (this[i].tags.contains(tagName))\n return true;\n return false;\n }\n },\n\n tiddlerMethods: {\n \n getProjectTextForList: function() {\n var proj = this.getProject();\n if (proj == '')\n return '';\n return "@@font-size:80%;"+\n " [/%%/[[P|"+proj+"]]/%%/]"+\n "@@";\n },\n\n getProject: function() {\n //return this.getValueByTag('Project').join("/"); // maybe two projects??\n return this.getValueByGTDComponent('Project').join("/"); // maybe two projects??\n },\n \n getRealm: function() {\n // TODO why is different from getProject?\n // do some sneaky backwards/compat stuff for tags/fields\n \n // check for field\n //var fieldBasedRealm = this.mGet('realm');\n //if (fieldBasedRealm) {\n // var realm = fieldBasedRealm.readBrackettedList(); // could be more than one\n //}\n //else {\n //var realm = this.getValueByTag('Realm'); // returns array\n // this.mSet("realm",String.encodeTiddlyLinkList(realm));\n //}\n if (this.tags.contains("Professional")) return "Professional";\n if (this.tags.contains("Personal")) return "Personal";\n \n //return "asdf";//realm[0];\n },\n\n getValueByTag: function(value) {\n // this gets a lot better when we use fields also\n var values = store.getByTagExpr(value); // probably just getTaggedTiddlers would do here..?\n var result = [];\n for (var i=0;i<values.length;i++) {\n if (this.tags.contains(values[i].title)) {\n result.push(values[i].title);\n }\n }\n return result;\n },\n\n getValueByGTDComponent: function(itemType) {\n // faster than getValueByTag since we don't need to\n // do a "full table scan" of all tiddlers\n var values = config.mGTD.config[itemType];\n var result = [];\n for (var i=0;i<values.length;i++) {\n if (this.tags.contains(values[i])) {\n result.push(values[i]);\n }\n }\n return result;\n },\n\n hasValue: function(itemType,value) {\n var foo = this.getValueByGTDComponent(itemType);\n return foo.contains(value);\n },\n\n mGTDrender: function(level,viewType) {\n var output = "";\n if (viewType) {\n if (config.mGTD.tiddlerViews[viewType+level])\n return eval(config.mGTD.tiddlerViews[viewType+level]);\n else\n return eval(config.mGTD.tiddlerViews[viewType]);\n }\n else {\n for (var i=0; i<level; i++)\n output += "*";\n output += "[[%0]]\sn".format([this.title]);\n }\n return output;\n },\n\n parents: function() {\n var output = [];\n for (var i=0;i<this.tags.length;i++) {\n var t = store.fetchTiddler(this.tags[i]);\n if (t)\n output.push(t);\n }\n return output;\n },\n\n mGet: function(field) {\n return store.getValue(this,"mgtd."+field);\n },\n\n mSet: function(field,value) {\n store.setValue(this,"mgtd."+field,value);\n },\n\n tickleDate: function() {\n var d = this.mGet("tday");\n var m = this.mGet("tmonth");\n var y = this.mGet("tyear");\n var result = "";\n if (d && m && y)\n result = y + String.zeroPad(parseInt(m,10),2) + String.zeroPad(parseInt(d,10),2) + '0000';\n return result;\n }\n },\n\n styles: [\n // ".mListTitle { font-weight:bold; }",\n // ".mList { border:solid 1px pink; }",\n // ".mList ul { margin-top:0px; padding-top:0px; }",\n ""],\n\n coreFunctions: {\n\n // Extending this to put in a defaultValue\n createTiddlyDropDown: function(place,onchange,options,defaultValue) {\n var sel = createTiddlyElement(place,"select");\n sel.onchange = onchange;\n var foo = 0;\n for(var t=0; t<options.length; t++)\n {\n var e = createTiddlyElement(sel,"option",null,null,options[t].caption);\n if (options[t].name == defaultValue) foo = t;\n e.value = options[t].name;\n }\n sel.selectedIndex = foo;\n return sel;\n },\n\n // utility\n mOpt: function(setting) {\n return store.getValue("MonkeyGTDSettings","mgtd."+setting);\n },\n\n mHideRealm: function(realm) {\n return store.getValue("MonkeyGTDSettings","hide"+realm);\n },\n\n mDefaultRealm: function() {\n // for (var i=config.mGTD.config.Realm.length-1;i>=0;i--) {\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n if (!mHideRealm(config.mGTD.config.Realm[i])) {\n // if both are on it returns last one\n // hack. because Work is after Personal??\n return config.mGTD.config.Realm[i];\n }\n }\n return config.mGTD.config.Realm[0]; // just in case\n }\n\n },\n dateMethods: {\n // just a bug fix in TW 2.1.3\n // temporary\n formatString: function(template) {\n var t = template.replace(/0hh12/g,String.zeroPad(this.getHours12(),2));\n t = t.replace(/hh12/g,this.getHours12());\n t = t.replace(/0hh/g,String.zeroPad(this.getHours(),2));\n t = t.replace(/hh/g,this.getHours());\n t = t.replace(/0ss/g,String.zeroPad(this.getSeconds(),2));\n t = t.replace(/ss/g,this.getSeconds());\n t = t.replace(/[ap]m/g,this.getAmPm().toLowerCase());\n t = t.replace(/[AP]M/g,this.getAmPm().toUpperCase());\n t = t.replace(/wYYYY/g,this.getYearForWeekNo());\n t = t.replace(/wYY/g,String.zeroPad(this.getYearForWeekNo()-2000,2));\n t = t.replace(/YYYY/g,this.getFullYear());\n t = t.replace(/YY/g,String.zeroPad(this.getFullYear()-2000,2));\n t = t.replace(/MMM/g,config.messages.dates.months[this.getMonth()]);\n t = t.replace(/mmm/g,config.messages.dates.shortMonths[this.getMonth()]);\n t = t.replace(/0MM/g,String.zeroPad(this.getMonth()+1,2));\n t = t.replace(/MM/g,this.getMonth()+1);\n t = t.replace(/0WW/g,String.zeroPad(this.getWeek(),2));\n t = t.replace(/WW/g,this.getWeek());\n t = t.replace(/DDD/g,config.messages.dates.days[this.getDay()]);\n t = t.replace(/ddd/g,config.messages.dates.shortDays[this.getDay()]);\n t = t.replace(/0DD/g,String.zeroPad(this.getDate(),2));\n t = t.replace(/DDth/g,this.getDate()+this.daySuffix());\n t = t.replace(/DD/g,this.getDate());\n\n t = t.replace(/0mm/g,String.zeroPad(this.getMinutes(),2));\n t = t.replace(/mm/g,this.getMinutes());\n\n return t;\n }\n },\n \n test: function() {\n },\n\n init: function() {\n\n merge(config.macros,this.macros);\n merge(config.commands,this.commands);\n\n merge(TiddlyWiki.prototype,this.storeMethods);\n merge(Tiddler.prototype,this.tiddlerMethods);\n merge(String.prototype,this.stringMethods);\n merge(Array.prototype,this.arrayMethods);\n merge(Date.prototype,this.dateMethods);\n merge(window,this.coreFunctions);\n\n\n //merge(config.shadowTiddlers,{MonkeyGTDStyles:this.styles.join("\sn")});\n //store.addNotification("MonkeyGTDStyles",refreshStyles);\n\n // config.macros.newTiddler.onClickNewTiddler = this.onClickNewTiddler; // over-ride\n\n this.populateLists();\n \n this.test();\n \n }\n};\n\nconfig.mGTD.init();\n\n//}}}\n\n
<<tField tag:mgtd.usemdy label:'Use ~M-D-Y instead of ~D-M-Y'>>\n
\n.mToolbar .ticklerDate tr td {\n padding:0;\n margin:0;\n}\n\n.mToolbar {\n background-color:[[ColorPalette::TertiaryPale]];\n border:solid 1px [[ColorPalette::TertiaryMid]];\n}\n.mToolbar td {\n padding:0.5em;\n}\n.mToolbar .label {\n width:1%;\n text-align:right;\n font-weight:bold;\n background-color:[[ColorPalette::TertiaryPale]];\n color:[[ColorPalette::TertiaryMid]];\n padding-left:0.5em;\n padding-right:0;\n}\n.mListTitle {\n font-weight:bold;\n background-color:[[ColorPalette::TertiaryPale]];\n color:[[ColorPalette::TertiaryMid]];\n display:block;\n padding:0.25em 0.5em;\n border-bottom:1px solid [[ColorPalette::TertiaryMid]];\n\n}\n.mList br { display:none; }\n.mList {\n border:solid 1px [[ColorPalette::TertiaryMid]];\n margin:0 0.5em 0 0;\n padding-bottom:1em;\n}\n.mList ul {\n margin:0.25em 0 0;\n padding:0px;\n padding-left:1.8em;\n}\n.mList ul li { }\n\n.mList .action, .mList .starthing {\n display:block;\n padding-left:0.25em;\n padding-bottom:0.1em;\n /*\n overflow:hidden;\n white-space:no-wrap;*/\n /* border-bottom:1px solid #eee; */\n}\n\n.mList .action span { white-space:no-wrap; }\n.mList .action2 span { white-space:no-wrap; }\n\n.mList .action2 {\n display:block;\n padding-left:1.5em;\n padding-bottom:0.1em;\n /*overflow:hidden;\n white-space:no-wrap;*/\n /*border-bottom:1px solid #eee;*/\n}\n/* the nowrap and hidden doesnt work :( */\n\n.shorterEdit input { width:2.5em; }\n\n#topMenu .new a { padding-right:0; margin-right:0; }\n#topMenu .tag a { padding-left:0; margin-left:0; }\n\n.mList .off {border-style:none;background:#fff;color:#ccc;}\n.mList .on {border-style:none;background:#fff;color:#000;}\n.mList .WaitingForButton.off {border-style:none;background:#fff;color:#ccc;}\n.mList .WaitingForButton.on {border-style:none;background:#fdb;color:#000;}\n.mList .NextButton.off {border-style:none;background:#fff;color:#ccc;}\n.mList .NextButton.on {border-style:none;background:#cfa;color:#000;}\n\n.StarredButton.off {border-style:none;background:transparent;color:#ddd;font-size:200%;padding:0;margin:0;font-family:'Arial Unicode MS' sans-serif;}\n.StarredButton.on {border-style:none;background:transparent;color:#f80;font-size:200%;padding:0;margin:0;font-family:'Arial Unicode MS' sans-serif;}\n\nspan.title {\n color:[[ColorPalette::PrimaryDark]];\n}\n\n#topMenu {\n background:url(file://logo-trans.gif) no-repeat -15px 2px transparent;\n padding:5px;\n padding-left:80px;\n}\n\n\nhtml>body #topMenu {background-image:url(file://logo-trans.png)}\n\n\n#topMenu a { color:white ! important; }\n\n#topMenu a.button {\n border-style:none;\n}\n\n.mList .tiddlyLink { font-weight: normal; }\n\n.mList .groupBy {\n display:block;\n padding-top:0.75em;\n border-bottom:1px solid #ddd;\n margin-right:1em;\n margin-bottom:1px;\n padding-bottom:1px;\n margin-left:1em;\n font-size:120%;\n}\n\n.mList .groupBy a {\n font-weight:bold;\n}\n\n#extraToolbar .button {\n background:#ccc;\n padding:0 0.5em;\n margin:0 0.5em;\n}\n\n.piBox {\n width:95%;\n height:10em;\n}\n\n@media print {\n\n/* Thanks to Andrew C and Scott K*/\n#mainMenu,\n#sidebar,\n#extraToolbar,\n#messageArea,\n.subtitle,\n.tagglyTagged,\n.toolbar,\n.mToolbar,\n.mList .off,\n.mList .WaitingForButton.off,\n.mList .NextButton.off\n{\n display: none ! important;\n}\n\n#displayArea {\n margin: 1em 1em 0em 1em;\n}\n\n.tiddler { page-break-after:always }\n\n}/* end @media print */\n\n\n\n
URL: http://mgtd-alpha.tiddlyspot.com/upgrade.html\n
URL: /proxy/mgtd-alpha.tiddlyspot.com/upgrade.html\n
~MonkeyGTD 2.1 alpha r91\n\n
/***\n| Name:|MptwLayoutPlugin|\n| Description:|A package containing templates and css for the MonkeyPirateTiddlyWiki layout|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#MptwLayoutPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n!Notes\nPresumes you have TagglyTaggingPlugin installed.\n***/\n//{{{\nconfig.shadowTiddlers.GettingStarted += "\sn\snSee also MonkeyPirateTiddlyWiki.";\n\n//}}}\n\n//{{{\nmerge(config.shadowTiddlers,{\n\n'MptwEditTemplate':[\n "<!--{{{-->",\n "<div class=\s"toolbar\s" macro=\s"toolbar +saveTiddler closeOthers -cancelTiddler deleteTiddler\s"></div>",\n "<div class=\s"title\s" macro=\s"view title\s"></div>",\n "<div class=\s"editLabel\s">Title</div><div class=\s"editor\s" macro=\s"edit title\s"></div>",\n "<div class=\s"editLabel\s">Tags</div><div class=\s"editor\s" macro=\s"edit tags\s"></div>",\n "<div class=\s"editorFooter\s"><span macro=\s"message views.editor.tagPrompt\s"></span><span macro=\s"tagChooser\s"></span></div>",\n "<div macro=\s"showWhenExists EditPanelTemplate\s">[[EditPanelTemplate]]</div>",\n "<div class=\s"editor\s" macro=\s"edit text\s"></div>",\n "<!--}}}-->",\n ""\n].join("\sn"),\n\n'MptwPageTemplate':[\n "<!--{{{-->",\n "<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>",\n " <div class='headerShadow'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> ",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n " <div class='headerForeground'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> ",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n "</div>",\n "<!-- horizontal MainMenu -->",\n "<div id='topMenu' refresh='content' tiddler='MainMenu'></div>",\n "<!-- original MainMenu menu -->",\n "<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->",\n "<div id='sidebar'>",\n " <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>",\n " <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>",\n "</div>",\n "<div id='displayArea'>",\n " <div id='messageArea'></div>",\n " <div id='tiddlerDisplay'></div>",\n "</div>",\n "<!--}}}-->",\n ""\n].join("\sn"),\n\n'MptwStyleSheet':[\n "/*{{{*/",\n "/* a contrasting background so I can see where one tiddler ends and the other begins */",\n "body {",\n " background: [[ColorPalette::TertiaryLight]];",\n "}",\n "",\n "/* sexy colours and font for the header */",\n ".headerForeground {",\n " color: [[ColorPalette::PrimaryPale]];",\n "}",\n ".headerShadow, .headerShadow a {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n ".headerForeground, .headerShadow {",\n " padding: 1em 1em 0;",\n " font-family: 'Trebuchet MS' sans-serif;",\n " font-weight:bold;",\n "}",\n ".headerForeground .siteSubtitle {",\n " color: [[ColorPalette::PrimaryLight]];",\n "}",\n ".headerShadow .siteSubtitle {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n "",\n "/* make shadow go and down right instead of up and left */",\n ".headerShadow {",\n " left: 1px;",\n " top: 1px;",\n "}",\n "",\n "/* prefer monospace for editing */",\n ".editor textarea {",\n " font-family: 'Consolas' monospace;",\n "}",\n "",\n "/* sexy tiddler titles */",\n ".title {",\n " font-size: 250%;",\n " color: [[ColorPalette::PrimaryLight]];",\n " font-family: 'Trebuchet MS' sans-serif;",\n "}",\n "",\n "/* more subtle tiddler subtitle */",\n ".subtitle {",\n " padding:0px;",\n " margin:0px;",\n " padding-left:0.5em;",\n " font-size: 90%;",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n ".subtitle .tiddlyLink {",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n "",\n "/* a little bit of extra whitespace */",\n ".viewer {",\n " padding-bottom:3px;",\n "}",\n "",\n "/* don't want any background color for headings */",\n "h1,h2,h3,h4,h5,h6 {",\n " background: [[ColorPalette::Background]];",\n " color: [[ColorPalette::Foreground]];",\n "}",\n "",\n "/* give tiddlers 3d style border and explicit background */",\n ".tiddler {",\n " background: [[ColorPalette::Background]];",\n " border-right: 2px [[ColorPalette::TertiaryMid]] solid;",\n " border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;",\n " margin-bottom: 1em;",\n " padding-bottom: 2em;",\n "}",\n "",\n "/* make options slider look nicer */",\n "#sidebarOptions .sliderPanel {",\n " border:solid 1px [[ColorPalette::PrimaryLight]];",\n "}",\n "",\n "",\n "/* the borders look wrong with the body background */",\n "#sidebar .button {",\n " border-style: none;",\n "}",\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 "",\n "/* this means you can put line breaks in SidebarOptions for readability */",\n "#sidebarOptions br {",\n " display:none;",\n "}",\n "/* undo the above in OptionsPanel */",\n "#sidebarOptions .sliderPanel br {",\n " display:inline;",\n "}",\n "",\n "/* horizontal main menu stuff */",\n "#displayArea {",\n " margin: 1em 15.7em 0em 1em; /* use the freed up space */",\n "}",\n "#topMenu br {",\n " display: none;",\n "}",\n "#topMenu {",\n " background: [[ColorPalette::PrimaryMid]];",\n " color:[[ColorPalette::PrimaryPale]];",\n "}",\n "#topMenu {",\n " padding:2px;",\n "}",\n "#topMenu .button, #topMenu .tiddlyLink, #topMenu a {",\n " margin-left: 0.5em;",\n " margin-right: 0.5em;",\n " padding-left: 3px;",\n " padding-right: 3px;",\n " color: [[ColorPalette::PrimaryPale]];",\n " font-size: 115%;",\n "}",\n "#topMenu .button:hover, #topMenu .tiddlyLink:hover {",\n " background: [[ColorPalette::PrimaryDark]];",\n "}",\n "",\n "/* make it print a little cleaner */",\n "@media print {",\n " #topMenu {",\n " display: none ! important;",\n " }",\n " /* not sure if we need all the importants */",\n " .tiddler {",\n " border-style: none ! important;",\n " margin:0px ! important;",\n " padding:0px ! important;",\n " padding-bottom:2em ! important;",\n " }",\n " .tagglyTagging .button, .tagglyTagging .hidebutton {",\n " display: none ! important;",\n " }",\n " .headerShadow {",\n " visibility: hidden ! important;",\n " }",\n " .tagglyTagged .quickopentag, .tagged .quickopentag {",\n " border-style: none ! important;",\n " }",\n " .quickopentag a.button, .miniTag {",\n " display: none ! important;",\n " }",\n "}",\n "/*}}}*/",\n ""\n].join("\sn"),\n\n'MptwViewTemplate':[\n "<!--{{{-->",\n "",\n "<div class='toolbar'>",\n " <span macro=\s"showWhenTagged systemConfig\s">",\n " <span macro=\s"toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'\s"></span>",\n " </span>",\n " <span style=\s"padding:1em;\s"></span>",\n " <span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler undoChanges permalink references jump newHere newJournalHere'></span>",\n "</div>",\n "",\n "<div class=\s"tagglyTagged\s" macro=\s"tags\s"></div>",\n "",\n "<div class='titleContainer'>",\n " <span class='title' macro='view title'></span>",\n " <span macro=\s"miniTag\s"></span>",\n "</div>",\n "",\n "<div class='subtitle'>",\n " <span macro='view modifier link'></span>,",\n " <span macro='view modified date [[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 "",\n "<div macro=\s"showWhenExists ViewPanelTemplate\s">[[ViewPanelTemplate]]</div>",\n "",\n "<div macro=\s"hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer' macro='view text wikified'></div>",\n "</div>",\n "<div macro=\s"showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer'><pre macro='view text'></pre></div>",\n "</div>",\n "",\n "<div macro=\s"showWhenExists ViewDashboardTemplate\s">[[ViewDashboardTemplate]]</div>",\n "",\n "<div class=\s"tagglyTagging\s" macro=\s"tagglyTagging\s"></div>",\n "",\n "<!--}}}-->",\n ""\n].join("\sn")\n\n});\n//}}}\n
/***\n| Name:|NewHerePlugin|\n| Description:|Creates the new here and new journal toolbar commands|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\nTo use edit your ViewTemplate and add newHere to the toolbar div, eg\n{{{<div class='toolbar' macro='toolbar ... newHere'></div>}}}\nNote: would be good if we could do this instead some day\n{{{<<newTiddler tag:{{tiddler.title}} label:'new here'>>}}}\n***/\n//{{{\nmerge(config.commands,{\n\n newHere: {\n text: 'new here',\n tooltip: 'Create a new tiddler tagged as this tiddler',\n hideReadOnly: true,\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var t=document.getElementById('tiddler'+title);\n story.displayTiddler(t,config.macros.newTiddler.title,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(config.macros.newTiddler.title, title, 0);\n story.focusTiddler(config.macros.newTiddler.title,"title"); // doesn't work??\n return false;\n }\n }\n },\n\n newJournalHere: {\n //text: 'new journal here', // too long\n text: 'new journal',\n hideReadOnly: true,\n dataFormat: 'DD MMM YYYY', // adjust to your preference\n //dataFormat: 'YYYY-0MM-0DD', \n tooltip: 'Create a new journal tiddler tagged as this tiddler',\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var now = new Date();\n var t=document.getElementById('tiddler'+title);\n var newtitle = now.formatString(this.dataFormat)\n story.displayTiddler(t,newtitle,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(newtitle, title, 0);\n story.focusTiddler(newtitle,"title");\n return false;\n }\n }\n }\n\n});\n//}}}\n
/***\n| Name:|NewTiddlerWithFieldsMacro|\n| Created by:|BJ Backitis|\n| Location:|http://tampageekland.tiddlyspot.com#NewTiddlerWithFieldsMacro|\n| Version:|0.1.0 (16 Nov 2006)|\n| Requires:|~TW2.1.x|\n!Description\nThis is a clone of the NewTiddler core macro that allows for adding custom fields and values. Any param "name: value" pair where the name is not a \nrecognized param (title, text, label, prompt, accessKey, template, focus, and tag) will be treated as a custom field name and value. \n!Usage\nUse like the existing {{{<<newTiddler>>}}} macro, but any unknown param "name: value" pairs will be treated as a custom field name and value.\nBe sure to have the custom field defined in your view and/or edit templates so you can see them (if you wish)!\n\nExample:\n{{{<<newTiddlerWithFields label:'New Example' tag: special customTiddler tiddlertype: Example>>}}}\n\ntry it here:\n<<newTiddlerWithFields label:'New Example' tag: special customTiddler tiddlertype: Example>>\n\n* v0.1.0 -- BJ Backitis, 16 Nov 2006 (Original, based on a suggestion from Simon Baird)\n!To Do\n* {{{<<newJournalWithFields>>}}}???\n\n!Code\n***/\n\n\nconfig.macros.newTiddlerWithFields = {\n text: "new Tiddler",\n prompt: "Create a new tiddler with custom fields",\n title: "new Tiddler"\n} \n \nconfig.macros.newTiddlerWithFields.fixedParams = ["title", "tag", "label", "text", "prompt", "accessKey", "focus", "template", "anon"];\n\nconfig.macros.newTiddlerWithFields.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if(!readOnly) {\n params = paramString.parseParams("anon",null,true,false,false);\n var title = params[1] && params[1].name == "anon" ? params[1].value : this.title;\n title = getParam(params,"title",title);\n this.createNewTiddlerWithFieldsButton(place,title,params,this.label,this.prompt,this.accessKey,"title",false);\n }\n}\n\nconfig.macros.newTiddlerWithFields.createNewTiddlerWithFieldsButton = function(place,title,params,label,prompt,accessKey,newFocus,isJournal) {\n var tags = [];\n var custFields = [];\n var custValues = [];\n for(var t=1; t<params.length; t++) {\n if (!this.fixedParams.contains(params[t].name)) {\n custFields.push(params[t].name);\n custValues.push(params[t].value);\n }\n else if((params[t].name == "anon" && t != 1) || (params[t].name == "tag"))\n tags.push(params[t].value);\n }\n label = getParam(params,"label",label);\n prompt = getParam(params,"prompt",prompt);\n accessKey = getParam(params,"accessKey",accessKey);\n newFocus = getParam(params,"focus",newFocus);\n var btn = createTiddlyButton(place,label,prompt,this.onClickNewTiddlerWithFields,null,null,accessKey);\n btn.setAttribute("newTitle",title);\n btn.setAttribute("isJournal",isJournal);\n btn.setAttribute("params",tags.join("|"));\n btn.setAttribute("custFields",custFields.join("|"));\n btn.setAttribute("custValues",custValues.join("|"));\n btn.setAttribute("newFocus",newFocus);\n btn.setAttribute("newTemplate",getParam(params,"template",DEFAULT_EDIT_TEMPLATE));\n var text = getParam(params,"text");\n if(text !== undefined) \n btn.setAttribute("newText",text);\n return btn;\n}\n\n\nconfig.macros.newTiddlerWithFields.onClickNewTiddlerWithFields = function() {\n var title = this.getAttribute("newTitle");\n if(this.getAttribute("isJournal")) {\n var now = new Date();\n title = now.formatString(title.trim());\n }\n var params = this.getAttribute("params").split("|");\n var custFields = this.getAttribute("custFields").split("|");\n var custValues = this.getAttribute("custValues").split("|");\n var focus = this.getAttribute("newFocus");\n var template = this.getAttribute("newTemplate");\n story.displayTiddler(null,title,template);\n var text = this.getAttribute("newText");\n if (typeof text == "string")\n story.getTiddlerField(title,"text").value = text.format([title]);\n for (var t=0;t<params.length;t++)\n story.setTiddlerTag(title,params[t],+1);\n for (var i=0;i<custFields.length;i++) \n story.setTiddlerField(title,custValues[i],+1,custFields[i]);\n story.focusTiddler(title,focus);\n return false;\n}\n\n\n\n
The osDev site is a grat source of informations:\n\n* Main site : http://www.osdev.org/\n* Forum : http://forum.osdev.org/\n* Wiki : http://wiki.osdev.org/\n* Project list : http://wiki.osdev.org/Projects
* dftech material at http://www.dftech.cwc.net/osdev/\n* Bona fide os dev : http://www.osdever.net/
\n<!--{{{-->\n<!--div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>\n <div class='headerShadow'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n <div class='headerForeground'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n</div-->\n<!-- horizontal MainMenu -->\n<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>\n<div id='topMenu' refresh='content' tiddler='MainMenu' style="font-size:120%;"></div>\n</div>\n<!-- realm selector under construction -->\n<div id="extraToolbar" style="color:#555;background:#999;padding:3px;border-bottom:2px solid #777;padding-left:0.5em;font-size:120%;">\n <span id='realmSelector' macro="realmSelector"></span>\n <span style="margin:0 2em;">|</span>\n <span>Create:</span>\n <span macro="newTiddler label:'new action' title:'New Action' tag: Action Next GTD "></span>\n <span macro="newTiddler label:'new project' title:'New Project' tag: Project GTD "></span>\n <span macro="newTiddler label:'new tickler' title:'New Tickler' tag: Tickler GTD "></span>\n</div>\n<!--\n<div id='topBar' style="background:#ddd;padding:3px;border-bottom:1px solid #aaa;padding-left:0.5em;">\n <span macro="saveChanges" style="padding-left:2em;padding-right:2em;"></span>\n <span macro="selectPalette">select colour palette:</span>\n</div>\n-->\n<!-- original MainMenu menu -->\n<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->\n<div id='sidebar'>\n <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n <div style="padding:0.5em;" macro="calendar thismonth"></div>\n <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n <div id='messageArea'></div>\n <div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->\n\n
PicoForth has two stacks. \n\nThe stack segment SS = DS\n\nThe two stacks pointers are handled by register BP (return address) and SP (data address).\n\n
Brought to you by Jack Parke's [[PublishMacro]]\n\nPublish all tagged tiddlers : <<doPublish>>\nPublish tiddlers tagged with <<option txtPublishTags>> : <<doPublish>> \n\nAll output is in 'publish' directory\n\nSee also :\n* [[PublishTemplateHead]] template to style your pages header\n* [[PublishTemplateBody]] template to style your pages footer\n* [[PublishIndexTemplate]] to define an index page. \n* [[PublishTemplateBodySingle]] template for single tiddler publish\n
/***\n|''Name:''|Publish Macro|\n|''Version:''|2.4.1 (2 July 2008)|\n|''Source''|http://jackparke.googlepages.com/jtw.html#PublishMacro ([[del.icio.us|http://del.icio.us/post?url=http://jackparke.googlepages.com/jtw.html%23PublishMacro]])|\n|''Author:''|[[Jack]]|\n|''Type:''|Macro|\n!Description\n<<doPublish>> tiddlers tagged with these tags <<option txtPublishTags>> (comma seperated) as HTML pages to the subfolder 'publish' (you must create this). Use the [[PublishTemplateHead]] and [[PublishTemplateBody]] templates to style your pages and the [[PublishIndexTemplate]] to define an index page. For publishing individual tiddlers the [[PublishTemplateBodySingle]] template is used.\n!Usage\nTo publish all tagged tiddlers:\n{{{<<doPublish>>}}} <<doPublish>>\nTo publish a single tiddler, use the {{{<<publishTiddler>>}}} macro or add the "publishTiddler" command to your ViewTemplate\n!Template placeholders\n|!Placeholder|!Meaning|\n|%0|Your SiteTitle "<<tiddler SiteTitle>>"|\n|%1|The current tiddler title|\n|%2|The rendered tiddler HTML|\n|%3|CSV list of tags|\n|%4|Tiddler modifier|\n|%5|Tiddler modified date|\n|%6|Tiddler creation date|\n|%7|Tiddler wiki text|\n!Revision History\n* Original by [[Jack]] 24 May 2006\n* Updated 2 Jan 2007\n* Refactored 4 Jan 2007\n* Small improvements\n* Publish single tiddlers\n* Template placeholder %7 for tiddler's wiki text\n\n!Code\n***/\n//{{{\nversion.extensions.doPublish = {\n major: 2,\n minor: 4,\n revision: 1,\n date: new Date("July 2, 2008")\n};\nconfig.macros.doPublish = {\n label: "publish",\n prompt: "Publish Tiddlers as HTML files"\n};\nif (config.options.txtPublishTags == undefined) config.options.txtPublishTags = "Publish";\nconfig.shadowTiddlers.PublishTemplateHead = '<title>%0 - %1</title>\sn<link rel="stylesheet" type="text/css" href="style.css"/>\sn<meta name="keywords" content="%3"/>'\nconfig.shadowTiddlers.PublishTemplateBody = '<div class=\s'viewer\s' id=\s'contentWrapper\s'><small><a href=\s"./publish/index.html\s">Home</a> > %1</small><h1>%0</h1>\sn<h2>%1</h2>\sn%2\sn<hr>Tags: %3\sn<hr>%4, %5 (created %6)\sn</div>\sn'\nconfig.shadowTiddlers.PublishTemplateBodySingle = '<h1>%0</h1>\sn<h2>%1</h2>\sn%2\sn<hr>Tags: %3\sn<hr>%4, %5 (created %6)\sn</div>\sn'\nconfig.shadowTiddlers.PublishIndexTemplate = '<div class=\s'viewer\s' id=\s'contentWrapper\s'><small><a href="./publish/index.html">Home</a> > %1</small><h1>%0</h1><h2>%1</h2>\sn<ul>%2\sn</ul>\sn<small>Published: %6</small>\sn</div>\sn';\nconfig.macros.doPublish.handler = function(place)\n {\n if (!readOnly)\n createTiddlyButton(place, this.label, this.prompt, \n function() {\n doPublish();\n return false;\n },\n null, null, this.accessKey);\n\n}\nconfig.macros.publishTiddler = {\n label : 'publish',\n prompt : 'Publish this tiddler as an HTML file.',\n handler : function(place,macroName,params,wikifier,paramString,tiddler)\n {\n var btn = createTiddlyButton(place, this.label, this.prompt, \n function(e) {\n if(!e) var e = window.event;\n publishTiddler(this.getAttribute('tiddler'))\n return false;\n },\n null, null, this.accessKey);\n btn.setAttribute('tiddler', tiddler.title);\n}}\nconfig.commands.publishTiddler = {handler : function(event,src,title) {publishTiddler(title);},text: "publish", tooltip: "Publish this tiddler as HTML"};\nfunction publishTiddler(title) {\n //debugger\n \n var PublishFolder = getWikiPath('publish');\n var place = document.getElementById(story.container)\n var HTMLTemplateHead = store.getTiddlerText("PublishTemplateHead");\n var HTMLTemplateBody = store.getTiddlerText("PublishTemplateBodySingle") || store.getTiddlerText("PublishTemplateBody");\n HTMLTemplateBody = renderTemplate(HTMLTemplateBody)\n HTMLTemplateBody = wiki2Web(HTMLTemplateBody);\n \n var tiddler = store.getTiddler(title);\n var tiddlerText = store.getValue(tiddler, 'text');\n var tiddlerHTML = wikifyStatic(tiddlerText);\n var HTML = '<html>\sn\s<head>\sn' + HTMLTemplateHead + '\sn</head>\sn<body>\sn' + HTMLTemplateBody + '\sn</body>\sn</html>';\n HTML = HTML.format([\n wikifyPlain("SiteTitle").htmlEncode(), \n tiddler.title.htmlEncode(), \n wiki2Web(tiddlerHTML), \n tiddler.tags.join(", "), \n tiddler.modifier, \n tiddler.modified.toLocaleString(), \n tiddler.created.toLocaleString(),\n tiddlerText\n ]);\n saveFile(PublishFolder + tiddler.title.filenameEncode() + ".html", HTML);\n //story.closeTiddler(tiddler.title);\n var indexWin = window.open((PublishFolder + title.filenameEncode() + ".html").replace(/\s\s/g, "/"), null);\n indexWin.focus();\n}\nfunction doPublish() {\n var savedTiddlers = [];\n var tiddlers = store.getTiddlers("title");\n var place = document.getElementById(story.container)\n var HTMLTemplateHead = store.getTiddlerText("PublishTemplateHead");\n var HTMLTemplateBody = store.getTiddlerText("PublishTemplateBody");\n HTMLTemplateBody = renderTemplate(HTMLTemplateBody)\n HTMLTemplateBody = wiki2Web(HTMLTemplateBody);\n\n var PublishTags = config.options.txtPublishTags || "publish";\n PublishTags = PublishTags.split(",")\n var PublishFolder = getWikiPath('publish');\n if (!PublishFolder) return;\n var indexFile = "";\n\n var indexFileTemplate = store.getTiddlerText("PublishIndexTemplate");\n // This does not allow <<myMacro>> but wants <div macro="myMacro">\n indexFileTemplate = renderTemplate(indexFileTemplate)\n // This option allows WIKI-syntax but is limited in it's HTML capabilities\n //indexFileTemplate = wikifyStatic(indexFileTemplate)\n\n for (var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n if (tiddler.tags.containsAny(PublishTags)) {\n var tiddlerText = store.getValue(tiddler, 'text');\n var tiddlerHTML = wikifyStatic(tiddlerText);\n var HTML = '<html>\sn\s<head>\sn' + HTMLTemplateHead + '\sn</head>\sn<body>\sn' + HTMLTemplateBody + '\sn</body>\sn</html>';\n HTML = HTML.format([\n wikifyPlain("SiteTitle").htmlEncode(), \n tiddler.title.htmlEncode(), \n wiki2Web(tiddlerHTML), \n tiddler.tags.join(", "), \n tiddler.modifier, \n tiddler.modified.toLocaleString(), \n tiddler.created.toLocaleString(),\n tiddlerText\n ]);\n //saveFile(PublishFolder + tiddler.created.formatString("YYYY0MM0DD") + ".html", HTML);\n saveFile(PublishFolder + tiddler.title.filenameEncode() + ".html", HTML);\n indexFile += "<li><a href=\s"" + tiddler.title.filenameEncode() + ".html" + "\s" class=\s"tiddlyLink tiddlyLinkExisting\s">" + tiddler.title + "</a></li>\sn";\n story.closeTiddler(tiddler.title);\n\n }\n\n }\n indexFileTemplate = '<html>\sn\s<head>\sn' + HTMLTemplateHead + '\sn</head>\sn<body>\sn' + indexFileTemplate + '\sn</body>\sn</html>';\n indexFileTemplate = indexFileTemplate.format([wikifyPlain("SiteTitle").htmlEncode(), wikifyPlain("SiteSubtitle").htmlEncode(), "%2", "", "", "", (new Date()).toLocaleString()])\n\n indexFile = indexFileTemplate.replace("%2", indexFile)\n indexFile = wiki2Web(indexFile);\n saveFile(PublishFolder + "index.html", indexFile)\n saveFile(PublishFolder + "style.css", store.getTiddlerText("StyleSheet") + store.getTiddlerText("StyleSheetLayout") + store.getTiddlerText("StyleSheetColors"))\n var indexWin = window.open("file://" + PublishFolder.replace(/\s\s/g, "/") + "index.html", null);\n indexWin.focus();\n\n}\n\nfunction renderTemplate(html) {\n var result = document.createElement("div");\n result.innerHTML = html;\n applyHtmlMacros(result, null);\n var temp = result.innerHTML;\n //result.parentNode.removeChild(result);\n return temp;\n\n}\n\n// Convert wikified text to html\nfunction wiki2Web(wikiHTML) {\n //var regexpLinks = new RegExp("<a tiddlylink=.*?</a>", "img");\n var regexpLinks = /<a[^>]+tiddlylink\ss*=\ss*["']?\ss*?([^ "'>]*)\ss*["']?[^>]*>[^<]+<\s/a>/img;\n var result = wikiHTML.match(regexpLinks);\n if (result) {\n for (i = 0; i < result.length; i++) {\n var className = result[i].match(/ class="(.*?)"/i) ? result[i].match(/ class="(.*?)"/i)[1] : "";\n var tiddlerName = result[i].match(/ tiddlylink="(.*?)"/i)[1]; \n var url = tiddlerName.htmlDecode().filenameEncode() + ".html"; \n var tiddlerLabel = result[i].match(/">(.*?)<\s/a>/i)[1]; \n if (!className.match(/tiddlyLinkNonExisting/i)) \n wikiHTML = wikiHTML.myReplace(result[i], "<a class=\s"" + className + "\s" href=\s"" + url + "\s">" + tiddlerLabel + "</a>"); \n else\n wikiHTML = wikiHTML.myReplace(result[i], "<a class=\s"" + className + "\s" title=\s"Page does not exist\s" href=\s"#\s">" + tiddlerName + "</a>");\n\n }\n wikiHTML = wikiHTML.replace(/ href="http:\s/\s//gi, " target=\s"_blank\s" href=\s"http://");\n\n }\n return wikiHTML\n\n}\nfunction getWikiPath(folderName) {\n var originalPath = document.location.toString();\n if (originalPath.substr(0, 5) != 'file:') {\n alert(config.messages.notFileUrlError);\n if (store.tiddlerExists(config.messages.saveInstructions))\n story.displayTiddler(null, config.messages.saveInstructions);\n return;\n\n }\n var localPath = getLocalPath(originalPath);\n var backSlash = localPath.lastIndexOf('\s\s') == -1 ? '/': '\s\s';\n var dirPathPos = localPath.lastIndexOf(backSlash);\n var subPath = localPath.substr(0, dirPathPos) + backSlash + (folderName ? folderName + backSlash: '');\n return subPath;\n\n}\n\n// Replace without regex\nString.prototype.myReplace = function(sea, rep) {\n var t1 = this.indexOf(sea);\n var t2 = parseInt(this.indexOf(sea)) + parseInt(sea.length);\n var t3 = this.length;\n return this.substring(0, t1) + rep + this.substring(t2, t3)\n\n}\n// Convert illegal characters to underscores\nString.prototype.filenameEncode = function()\n {\n return (this.toLowerCase().replace(/[^a-z0-9_-]/g, "_"));\n\n}\n//}}}
<<deleteAllTagged>>\n\n{{{\n<<deleteAllTagged>>\n}}}
/***\n| Name:|QuickOpenTagPlugin|\n| Description:|Changes tag links to make it easier to open tags as tiddlers|\n| Version:|$$version$$|\n| Date:|$$date$$|\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
* BX = top of data stack\n* remaining of the data stack is pointed to by SP\n* SI points to the address being executed\n* All subroutines (CALLed from other code) must preserve CS, DS, SS, SI, BX.\n* SP and BP should remain untouched too.
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|$$version$$|\n| Date:|$$date$$|\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// to use these you must add them to the tool bar in EditTemplate\n\nmerge(config.commands,{\n\n saveCloseTiddler: {\n text: 'done/close',\n tooltip: 'Undo changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.saveTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n },\n\n cancelCloseTiddler: {\n text: 'cancel/close',\n tooltip: 'Save changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.cancelTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n }\n\n});\n\n
Full floppy sector fs\n\n* The fs treats floppy as series of 512 byte sectors\n* A sector is identified by its LBA number\n* Each sector must start with a tag byte which indicates its type : code or text\n* A sector can be loaded to a fixed address. Then it is either\n** run as a binary code (code tagged sector)\n** displayed to screen (text code)\n
\n* sector clearing\n* sector copying\n* dir utility\n* dir extractor utility : fetches each file name from sectors and put the list into an empty sector\n\n\n
/***\nQuick and dirtly palette switcher for 2.1.x\n<<selectPalette>>\nWARNING this will overwrite your ColorPalette tiddler.\n***/\n\n//{{{\n\nmerge(config.macros,{\n\n setPalette: {\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var paletteName = params[0] ? params[0] : tiddler.title;\n createTiddlyButton(place,"apply","Apply this palette",function(e) {\n config.macros.selectPalette.updatePalette(tiddler.title);\n return false;\n });\n }\n },\n\n selectPalette: {\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyDropDown(place,this.onPaletteChange,this.getPalettes());\n },\n\n getPalettes: function() {\n var result = [\n {caption:"-palette-", name:""},\n {caption:"(Default)", name:"(default)"}\n ];\n var tagged = store.getTaggedTiddlers("palette","title");\n for(var t=0; t<tagged.length; t++) {\n var caption = tagged[t].title;\n var sliceTitle = store.getTiddlerSlice(caption,"Name");\n if (sliceTitle)\n caption = sliceTitle;\n result.push({caption:sliceTitle, name:tagged[t].title});\n }\n return result;\n },\n\n onPaletteChange: function(e) {\n config.macros.selectPalette.updatePalette(this.value);\n return true;\n },\n\n updatePalette: function(title) {\n if (title != "") {\n store.deleteTiddler("ColorPalette");\n if (title != "(default)")\n store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),\n config.options.txtUserName,undefined,"");\n this.refreshPalette();\n if(config.options.chkAutoSave)\n saveChanges(true);\n }\n },\n\n refreshPalette: function() {\n config.macros.refreshDisplay.onClick();\n }\n }\n});\n\n//}}}\n\n
<<tabs txtMainTab\n Timeline Timeline TabTimeline\n All 'All tiddlers' TabAll\n Tags 'Tags' TabTags\n Shadowed 'Shadowed tiddlers' TabMoreShadowed\n >>\n/%\n Tags 'All tags' TabTags\n More 'More lists' TabMore\n%/\n
powered by TiddlyWiki\n
512bytes Documentation
|<<siteMap 512bytes>>|<<siteMap Roadmap>>|\n|<<siteMap Journal>> <<siteMap k0N>> |<<siteMap bugs>> <<siteMap tech>> <<siteMap concepts>>|\n\n
/***\n| Name:|SiteMapMacro|\n| Author:|Simon Baird|\n| Location:|http://simonbaird.com/mptw/#SiteMapMacro|\n| Version:|1.0.3, 15-Mar-06|\n\n!!Examples\nSee SiteMap and SliderSiteMap for example usage.\n\n!!Parameters\n* Name of tiddler to start at\n* Max depth (a number) \n* Format (eg, nested, see formats below)\n* Don't show root flag (anything other than null turns it on)\n* Tags - a string containing a bracketed list of tags that we are interested in\n\n!!History\n* 1.0.3 (15-Mar-06)\n** added tag filtering\n* 1.0.2 (15-Mar-06)\n** Added json format and dontshowroot option\n* 1.0.1 (9-Mar-06)\n** Added selectable formats and fixed nested slider format\n* 1.0.0 (8-Mar-06)\n** first release\n\n***/\n//{{{\n\nversion.extensions.SiteMapMacro = {\n major: 1,\n minor: 0,\n revision: 3,\n date: new Date(2006,3,15),\n source: "http://simonbaird.com/mptw/#SiteMapMacro"\n};\n\nconfig.macros.siteMap = {\n\n formats: {\n bullets: {\n formatString: "%0[[%1]]\sn%2",\n indentString: "*"\n },\n\n // put this in your StyleSheet to make it look good.\n // .sliderPanel { margin-left: 2em; }\n\n sliders: {\n formatString: "[[%1]]+++\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n openSliders: {\n formatString: "[[%1]]++++\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n popups: {\n formatString: "[[%1]]+++^\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n // these don't work too well\n openPopups: {\n formatString: "[[%1]]++++^\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n \n // this is a little nuts but it works\n json: {\n formatString: '\sn%0{"%1":[%2\sn%0]}',\n formatStringLeaf: '\sn%0"%1"',\n indentString: " ",\n separatorString: ","\n }\n\n\n },\n\n defaultFormat: "bullets",\n\n treeTraverse: function(title,depth,maxdepth,format,dontshowroot,tags,excludetags) {\n\n var tiddler = store.getTiddler(title);\n var tagging = store.getTaggedTiddlers(title);\n\n if (dontshowroot)\n depth = 0;\n\n var indent = "";\n if (this.formats[format].indentString)\n for (var j=0;j<depth;j++)\n indent += this.formats[format].indentString;\n\n var childOutput = "";\n if (!maxdepth || depth < parseInt(maxdepth)) \n for (var i=0;i<tagging.length;i++)\n if (tagging[i].title != title) {\n if (this.formats[format].separatorString && i != 0)\n childOutput += this.formats[format].separatorString;\n childOutput += this.treeTraverse(tagging[i].title,depth+1,maxdepth,format,null,tags,excludetags);\n }\n\n if (childOutput == "" && (\n (tags && tags != "" && !tiddler.tags.containsAll(tags.readBracketedList())) ||\n (excludetags && excludetags != "" && tiddler.tags.containsAny(excludetags.readBracketedList()))\n )\n ) {\n // so prune it cos it doesn't have the right tags and neither do any of it's children\n return "";\n }\n\n if (dontshowroot)\n return childOutput;\n\n if (this.formats[format].formatStringLeaf && childOutput == "") {\n // required for nestedSliders\n return this.formats[format].formatStringLeaf.format([indent,title,childOutput]);\n }\n\n return this.formats[format].formatString.format([indent,title,childOutput]);\n },\n\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n wikify(this.treeTraverse(\n params[0] && params[0] != '.' ? params[0] : tiddler.title, 1, \n params[1] && params[1] != '.' ? params[1] : null, // maxdepth\n params[2] && params[2] != '.' ? params[2] : this.defaultFormat, // format\n params[3] && params[3] != '.' ? params[3] : null, // dontshowroot\n params[4] && params[4] != '.' ? params[4] : null, // tags\n params[5] && params[5] != '.' ? params[5] : null // excludetags\n ),place);\n }\n\n}\n\n//}}}\n
<<list orphans>>\n\n[edit] Parameters\n\n * all (default)\n * missing\n * orphans\n * shadowed\n * touched\n * filter \n\nRetrieved from "http://tiddlywiki.org/wiki/List_%28macro%29"\n
\n[[MptwStyleSheet]]\n[[MonkeyGTDStyles]]\n\n
* PC Style hardware\n* 8086 compatible cpu\n* floppy disk\n* standard bios supporting int 10h (tty mode), 16h (keyboard), 13h (floppy)
The current commands are :\n\n''Select a sector:''\n* p - current_sector - -\n* n - current_sector + +\n* P - current_sector -= 10 limited to 1.. 200 range\n* N - current_sector += 10 limited to 1.. 200 range\n\n''Handle the current sector:''\n* l - load current_sector and display it as asciiz\n* r - load current_sector and run it as a binary (cf [[Executable Format]]\n\n''Print information:''\n* v - print kernel version\n* s - print current sector\n\n
<<timeline modified 45>>\n
Brought to you by [[Clint Checketts]]' TagglyTagCloud plugin.\n<<gradient vert #dddddd #ffffff #eeeeee>>\n<<tagCloud>>\n>>
/***\n|!Plugin Name|TagglyTagCloud|\n|!Author|[[Clint Checketts|http://www.checkettsweb.com]]|\n|!Version|1.0|\n|!Usage|<////<tagCloud excludeTag>////>|\n***/\n\n//{{{\nversion.extensions.tagCloud = {major: 1, minor: 0 , revision: 1, date: new Date(2005,8,16)};\n//Created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman\n\nconfig.macros.tagCloud = {\n noTags: "No tag cloud created because there are no tags.",\n tooltip: "%1 tiddlers tagged with '%0'"\n};\n\nconfig.macros.tagCloud.handler = function(place,macroName,params) {\n \nvar tagCloudWrapper = createTiddlyElement(place,"div",null,"tagCloud",null);\n\nvar tags = store.getTags();\nfor (var t=0; t<tags.length; t++) {\n for (var p=0;p<params.length; p++) if (tags[t][0] == params[p]) tags[t][0] = "";\n}\n\n if(tags.length == 0) \n createTiddlyElement(tagCloudWrapper,"span",null,null,this.noTags);\n //Findout the maximum number of tags\n var mostTags = 0;\n for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){\n if (tags[t][1] > mostTags) mostTags = tags[t][1];\n }\n //divide the mostTags into 4 segments for the 4 different tagCloud sizes\n var tagSegment = mostTags / 4;\n\n for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){\n var tagCloudElement = createTiddlyElement(tagCloudWrapper,"span",null,null,null);\n tagCloudWrapper.appendChild(document.createTextNode(" "));\n var theTag = createTiddlyLink(tagCloudElement,tags[t][0],true);\n theTag.className += " tagCloudtag tagCloud" + (Math.round(tags[t][1]/tagSegment)+1);\n if (tags[t][1] > 1){\n theTag.title = "There are "+tags[t][1]+" tiddlers tagged as '"+tags[t][0]+"'";\n} else {\n theTag.title = "There is only one tiddler tagged as '"+tags[t][0]+"'";\n}\n\n// theTag.setAttribute("tag",tags[t][0]);\n }\n\n};\n\nsetStylesheet(".tagCloud span{height: 1.8em;margin: 3px;}.tagCloud1{font-size: 1.2em;}.tagCloud2{font-size: 1.4em;}.tagCloud3{font-size: 1.6em;}.tagCloud4{font-size: 1.8em;}.tagCloud5{font-size: 1.8em;font-weight: bold;}","tagCloudsStyles");\n//}}}
/***\n| Name:|TagglyTaggingPlugin|\n| Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version:|$$version$$|\n| Date:|$$date$$|\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
Tests must be runnable without manual intervention, for eg by a cron or at job.\n\nThe following must be done durign an automated session :\n# creation of a sand box. this must become the current directory\n# svn output into the sandbox\n# make all\n# make test\n# send test results by mail
Generally forth or forth-like languages such as\n* min4th\n* zenforth\n* eforth\n
A threaded word starts with a jmp to the inner_enter routine.\n\nIf it can not be called by the outer interpret It should \n* start with a "jmp inner_enter" instruction and\n* end with a "dw inner_leave" \nExample:\n{{{\ninner_print_sector: \n jmp inner_enter\n dw prim_lit , msg_print_sect\n dw prim_print\n dw prim_get_current\n dw prim_out_dec\n dw inner_crlf\n dw outer_interpreter\n}}}\n\nWhen called by the outer interpret it should end with a "dw interpreter" instruction\n\nExample:\n{{{\ninner_print_version:\n dw prim_lit, msg_version\n dw prim_print\n dw outer_interpreter\n}}}
\n/***\n\nAn under construction replacement for toggleTag\n\n<<tTag mode:text text:D tag:Done>>\n<<tTag mode:text text:N tag:Next>>\n***/\n//{{{\n\nmerge(config.macros,{\n\n tTag: {\n\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n var parsedParams = paramString.parseParams("tags",null,true);\n \n if (!tiddler)\n tiddler = store.getTiddler(getParam(parsedParams,"title"));\n \n var tag = getParam(parsedParams,"tag","checked");\n var title = getParam(parsedParams,"title",tiddler.title);\n\n var refreshAll = getParam(parsedParams,"refreshAll",false);\n\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = getParam(parsedParams,"label",defaultLabel);\n\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n\n var mode = getParam(parsedParams,"mode","checkbox");\n\n var theClass = getParam(parsedParams,"class",tag+"Button");\n\n\n var currentValue = theTiddler && \n (macroName == "tTag" ? theTiddler.isTagged(tag) : store.getValue(theTiddler,tag)=="true");\n\n if (mode == "checkbox") {\n // create the checkbox\n\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), currentValue, function(e) {\n if (!store.tiddlerExists(title)) {\n if (config.macros.tTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n //store.suspendNotifications(); \n if (macroName == "tTag")\n store.setTiddlerTag(title,this.checked,tag);\n else // it must be tField\n store.setValue(title,tag,this.checked?"true":null);\n\n if (refreshAll) {\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n }\n\n //store.resumeNotifications();\n return true;\n });\n }\n else if (mode == "text") {\n var text = getParam(parsedParams,"text","X");\n\n var cl = createTiddlyButton(place, text, "Toggle "+text, function(e) {\n if(!e) var e = window.event;\n\n if (!store.tiddlerExists(title)) {\n if (config.macros.tTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n //store.suspendNotifications(); \n var currentState = this.getAttribute("state")=="true";\n var newState = !currentState;\n\n store.setTiddlerTag(title,newState,tag);\n if (macroName == "tTag")\n store.setTiddlerTag(title,newState,tag);\n else // it must be tField\n store.setValue(title,tag,newState?"true":null);\n\n // this is terrible please refactor\n if (currentState) {\n cl.setAttribute("state","false");\n removeClass(cl,"on");\n addClass(cl,"off");\n }\n else {\n cl.setAttribute("state","true");\n removeClass(cl,"off");\n addClass(cl,"on");\n }\n\n //refreshDisplay(); \n if (refreshAll) {\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n }\n //store.resumeNotifications();\n\n e.cancelBubble = true;\n if(e.stopPropagation) e.stopPropagation();\n\n return false;\n });\n\n addClass(cl,theClass.replace(/ /g,''));\n\n if (currentValue) {\n cl.setAttribute("state","true");\n removeClass(cl,"off");\n addClass(cl,"on");\n }\n else {\n cl.setAttribute("state","false");\n removeClass(cl,"on");\n addClass(cl,"off");\n }\n \n }\n else if (mode == "popup") {\n var cl = createTiddlyButton(place, "zzz", "Toggle "+text, function(e) {\n // props to Saq\n if(!e) var e = window.event;\n var popup = Popup.create(this);\n createTiddlyButton(createTiddlyElement(popup,"li"),"foo","bar",function(e) {\n // under contruction\n alert(this.getAttribute("tag"));\n });\n Popup.show(popup,false);\n e.cancelBubble = true;\n if(e.stopPropagation) e.stopPropagation();\n return false ;\n });\n }\n\n }\n }\n\n});\n\nconfig.macros.tField = config.macros.tTag;\n\nsetStylesheet(["",\n".button.off {border-style:none;background:#fff;color:#ccc;}",\n".button.on {border-style:none;background:#ddd;color:#000;}",\n// TODO move this css elsewhere\n"#realmSelector .button.off {margin:0 0.5em;padding:0 1em;border:2px solid #aaa;background:#eee;color:#333;}", // actually reversed, ie off is "on"\n"#realmSelector .button.on {margin:0 0.5em;padding:0 1em;border:2px solid #999;background:#999;color:#ccc;}", // actually reversed, ie off is "on"\n""].join("\sn"),"tTag");\n\n//}}}\n\n\n\n\n
/***\n| Name:|ToggleTagMacro|\n| Description:|Makes a checkbox which toggles a tag in a tiddler|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://tiddlyspot.com/mptw/#ToggleTagMacro|\n| Author:|SimonBaird|\n| License:|[[BSD open source license]]|\n| CoreVersion:|2.1|\n!Usage\n{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}\n* TagName - the tag to be toggled, default value "checked"\n* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler\n* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'\n(If a parameter is '.' then the default will be used)\n\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|\n|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|\n(Note if TiddlerName doesn't exist it will be silently created)\n\n!Known issues\n* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing. Should it stick the tag in the edit box?\n\n***/\n//{{{\n\nmerge(config.macros,{\n\n toggleTag: {\n\n doRefreshAll: true,\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;\n label = (label == '-' ? '' : label);\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {\n if (!store.tiddlerExists(title)) {\n if (config.macros.toggleTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n //store.suspendNotifications(); \n store.setTiddlerTag(title,this.checked,tag);\n //refreshDisplay(); \n //store.resumeNotifications();\n return true;\n });\n }\n }\n});\n\n//}}}\n\n
/***\n|!Plugin Name|UntaggedMacro|\n|!Description:|Lists untagged tiddlers|\n|!Author|[[Jean Buchet|http://buje.free.fr/index.php]]|\n|!Version|2.0.0|\n|!Date:|2008/10/16|\n|!Usage|<////<Untagged>////>|\n|!Source:| |\n\n!History\n* 2008/10/16 version 2.0.0\n** take profit from my GtdStats macro\n** converted to a macro\n** output into a tiddler\n* 2008/10/04 version 1.0.0\n** First version as a command button\n** output to the upper right corner notification popup\n\n!Code\n***/\n\n//{{{\n\nversion.extensions.UntaggedMacro= {major: 2, minor: 0 , revision: 0, date: new Date(2005,10, 16)};\n//Created by Jean Buchet\n\nconfig.macros.UntaggedMacro= {\n noProjects: "No projects found"\n};\n\nconfig.macros.UntaggedMacro.handler = function(place,macroName,params) {\n\n var UntaggedWrapper = createTiddlyElement(place,"div",null,"UntaggedMacro",null);\n var results= [] ;\n var nb = 0 ;\n\n store.forEachTiddler( function ( title,tiddler ) {\n if ( tiddler.tags.length == 0) {\n wikify("[["+title+"]]\sn", place );\n nb++ ;\n }\n });\n wikify("\sn"+nb + " untagged tiddler(s) found", place);\n}\n\n//}}}\n\n
Brought to you by [[JeanBuchet]]' UntaggedMacro plugin.\n\n<<UntaggedMacro>>
<<option chkSaveBackups>> SaveBackups <<saveChanges>>\nTo upgrade select MonkeyGTDUpgrade (or MonkeyGTDUpgradeTs for tiddlyspot online use) then fetch and install all tiddlers. Click Continue if you get long-running script warnings. When it's done save and reload.\n<<importTiddlers>>\n
Use these tools to upgrade this MonkeyGTD
* The kernel is limitted to its boot sector, thus its very limited (512 bytes) size\n* Floppy based.\n* Does the following :\n# Display a message\n# Infinite loop:\n## grab a char from keyboard\n## print the char to screen in tty mode if in the 32-127 range, or else beep \n
Does the following\n# relocate (copy and jmp) to 0x1000:0x0000\n# same as [[Version 0.0 : keyboard and tty screen]]
This version does the following\n# starts as [[Version 0.1 : 0.0 with code relocation]]\n# Simple command interpreter : infinite loop\n## grab a char from keyboard\n## interpret it through a simple threaded code interpret\n\nHandled commands should be\n* n - next sector\n* p - previous sector\n* v - version\n* s - show current sector number\n* l - display "loaded" message\n
Does the following:\n* acts as [[Version 0.2 : 0.1 with simple command interpreter]]\n* now the 'l' (load) command \n## loads the current sector at DS:#XXXX (current_sector remains in 0..9 interval)\n## displays it as asciiz\n
This version does the following - Tested Ok with no regression\n* acts as [[Version 0.3 : 0.2 with disk sector chs loading]]\n* now the entire disk (well, first 200 sectors) is handled throudh lba addressing instead of chs\n* Added positive word display in tty mode in order to display current sector
This version does the following\n* acts as [[Version 0.4 : 0.3 with lba handling instead of chs]]\n* no added functionnal features\n* code cleaning\n* Create a clean threaded inner loop and outer interpreter as a separate binary\n\nWhen fully functionnal this binary will be turned into the new k06 kernel\n\n\n\n
This version does the following\n* acts as [[Version 0.5 : 0.4 with a clean threaded interpreter]]\n* no added functionnal features\n* code cleaning\n* k05 PicoForth turned into the a new kernel\n\n\n\n
\n<div macro="showWhenTagged GTD">\n\n<div macro="showWhen tiddler.tags.contains('MainDash')">[[MainDashDash]]</div>\n<div macro="showWhen tiddler.tags.contains('Project')">[[ProjectDash]]</div>\n<div macro="showWhen tiddler.tags.contains('Context')">[[ContextDash]]</div>\n<div macro="showWhen tiddler.tags.contains('Area')">[[AreaDash]]</div>\n<div macro="showWhen tiddler.tags.contains('Realm')">[[RealmDash]]</div>\n\n<div macro="showWhen tiddler.title == 'Tickler'">[[TicklerTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Context'">[[ContextTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Realm'">[[RealmTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Area'">[[AreaTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Next'">[[NextTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Action'">[[ActionTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Project'">[[ProjectTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Starred'">[[StarredTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Inbox'">[[InboxTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Process Inbox'">[[ProcessInboxTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Collect Thoughts'">[[CollectThoughtsTiddlerDash]]</div>\n\n</div>\n\n
\n\n<table macro="showWhen tiddler.tags.contains('GTD')" class="mToolbar" width="100%" cellspacing="0" border="0">\n\n <tbody macro="hideWhen tiddler.tags.containsAny(config.mGTD.config.GTDComponent) ||\n config.mGTD.config.GTDComponent.contains(tiddler.title) ||\n tiddler.title == 'Starred' ||\n tiddler.title == 'Process Inbox' ||\n tiddler.title == 'Collect Thoughts'\n "\n > <!-- this seems clumsy. rethink? -->\n <tr>\n <td class="label">Type:</td>\n <td><span macro="checkboxList GTDComponent"></span></td>\n </tr>\n </tbody>\n\n <tbody macro="showWhen tiddler.tags.contains('MainDash')">[[MainDashPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Realm')">[[RealmPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Tickler')">[[TicklerPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Project')">[[ProjectPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Action')">[[ActionPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Area')">[[AreaPanel]]</tbody>\n</table>\n\n\n\n
\n<!--{{{-->\n\n<div class='toolbar'>\n <span macro="showWhenTagged systemConfig">\n <span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>\n </span>\n <span style="padding:1em;"></span>\n <span macro='toolbar +closeTiddler closeOthers +editTiddler deleteTiddler permalink references newHere refresh'></span>\n</div>\n\n\n\n<div class="tagglyTagged" macro="tags"></div>\n\n<div class='titleContainer'>\n <span class='title' macro='view title'></span>\n <span macro="miniTag"></span>\n <span macro="toggleTag GTD"></span>\n <span macro="showWhenTagged GTD">\n <span macro="tTag tag:Starred mode:text text:{{config.mGTD.star}}"></span>\n </span>\n</div>\n\n<div class='subtitle'>\n <span macro='view modifier link'></span>,\n <span macro="hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'">\n <span macro='view modified date [[DD/MM/YY]]'></span>\n (<span macro='message views.wikified.createdPrompt'></span>\n <span macro='view created date [[DD/MM/YY]]'></span>)\n </span>\n <span macro="showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'">\n <span macro='view modified date [[MM/DD/YY]]'></span>\n (<span macro='message views.wikified.createdPrompt'></span>\n <span macro='view created date [[MM/DD/YY]]'></span>)\n </span>\n</div>\n\n<div macro="showWhenExists ViewPanelTemplate">[[ViewPanelTemplate]]</div>\n\n<!--\n<div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer' macro='view text wikified'></div>\n</div>\n<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer'><pre macro='view text'></pre></div>\n</div>\n-->\n\n<div macro="hideWhenTagged GTD">\n <div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer' macro='view text wikified'></div>\n </div>\n <div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer'><pre macro='view text'></pre></div>\n </div>\n</div>\n<div macro="showWhenTagged GTD">\n <div style="background:#ffd;padding:0.5em;margin:0.5em 0;border:1px solid #dda;" macro="showWhen tiddler.text.length > 0">\n <div style="font-size:90%;color:#996;">Notes</div>\n <div class='viewer' macro='view text wikified'></div>\n </div>\n</div>\n\n<div macro="showWhenExists ViewDashboardTemplate">[[ViewDashboardTemplate]]</div>\n\n<div macro="hideWhenTagged GTD">\n <div class="tagglyTagging" macro="tagglyTagging"></div>\n</div>\n\n<!--}}}-->\n
Writing a full fledged OS is quite complicated, because you need to write file system handling, memory management, a process scheduler, device drivers and lots of other stuff.\n\nObjectively my previous attempts finally lead to failures, since they did not produce usable products.\n\nI finally decided to go back to basics :\n* no real file system, but direct floppy sector handling\n* no memory management. binaries are loaded at a fixed address\n* no process scheduler, but a simple single tasking system\n* no device driver, but direct bios calls.\n\nThis leads me to a kernel residing into the boot sector, ie. 512 bytes, hence the name
Picoforth debugging and stabilising have been a hassle. This seems to come to an end, but I'd like to avoid such mess for future releases.\n\nHence I have to build an automatic testing framework for my asm code.\n\nThe main trouble will be to unit test 16 bit asm code under a 32 (or 64) bit OS such as linux, but a workaround has been found, in using freedos under dosemu.
mul mem8 - al * mem8 -> AX\nmul reg8 - al * reg8 -> AX\n\nmul mem16 - ax * mem16 -> DX AX\nmul reg16 - ax * reg16 -> DX AX\n\ndiv mem8 - ax / mem8 -> al, reste dans ah\ndiv reg8 - ax / reg8 -> al, reste dans ah\n\ndiv mem16 - dx ax / mem16 -> ax, reste dans dx\ndiv reg16 - dx ax / reg16 -> ax, reste dans dx\n\n
''Components:'' k0, k01, k02\n''Description:'' Target 'test' must run qemu with the floppy image contructed by target 'all'.\nActually all pre-k03 versions use k0x.''bin'' instead of 0x.''img''\n
''Diagnostic:'' SI register is saved too early, ie before fetching its argument. The end of this word restores saved SI value which still points to "dw prim_print", hence the infinite loop.\n\n''Correction:'' : Replace \n{{{\nprim_print:\n push si\n lodsw\n mov si, a\n}}}\nwith \n{{{\nprim_print:\n lodsw\n push si\n mov si, a\n}}}
PicoForth goes into infinite loop.\n\nA few coding errors have been corrected, but still it does not work.\n\nThe bug remains into the EXECUTE inner word\n----\n''Correction:''\nI have modified the FIND word so that word address is put into BX.\nHence EXECUTE word is modified to perform a jmp bx instead of the previous obfuscated code.
After loading, commands such as l-oad or v-ersion work, but the outer interpreter ends up locking the DevTestPlatform.\n\nSome words, such as p-rev ou n-ext or s-how systematically lock the DevTestPlatform.\n\n''Correction:''\n* Main loop of outer interpreter code slightly changed so as to first display version and current sector \n* Sector selection words simplified : current sector display code extracted and called by outer interpreter\n\n''Tests still have to be proceeded''
For now there are few bugs. Most problems arising are coding problems, especially during the [[PicoForth]] engine development.\n\nSo at this time bugs are either active (ie unsolved), either fixed
{{{\nl2hts: ; Calculate head, track and sector settings for int 13h\n ; IN: logical sector in AX, OUT: correct registers for int 13h\n push bx\n push ax\n\n mov bx, ax ; Save logical sector\n\n xor dx, dx ; First the sector\n div word [SectorsPerTrack]\n add dl, 01h ; Physical sectors start at 1\n mov cl, dl ; Sectors belong in CL for int 13h\n mov ax, bx\n\n xor dx, dx ; Now calculate the head\n div word [SectorsPerTrack]\n xor dx, dx\n div word [Sides]\n mov dh, dl ; Head/side\n mov ch, al ; Track\n\n pop ax\n pop bx\n\n mov dl, byte [bootdev] ; Set correct device\n\n ret\n}}}
* ts_nop;ut_nop;Ok;display and exit - Make sure that outer_exit word works as expected (ret)
* tst_seq - Verify outer loop's ability to execute two successive words (raz; increment; exit)\n* tst_seq2 - Verify outer loop's ability to execute three successive words (raz; increment; increment; exit)\n* tst_seq3 - Verify jz word when tos=0\n* tst_seq4 - Verify jz word when tos=1\n
* jmp_len is 3- Assure that "JMP next" instruction is 3 bytes long\n* jmp_len is not 18- Assure that "JMP next" instruction is not 18 bytes long
* ut_find_zero - find must return 0 if passed a key that cannot be found in the table\n* ut_find_c - find must return label_c address if passed 'c' key\n* ut_find_p - find must return label_p address if passed 'p' key\n* ut_find_n - find must return label_n address if passed 'n' key\n