\nThis is an experimental hypertext version of ''an extract from //Pale Fire//'' by Vladimir Nabokov, designed to explore the hypertextuality in that novel, using this remarkable hypertext tool, [[TiddlyWiki|http://www.tiddlywiki.org/]]. This edition is limited to the [[Foreword]], the first Canto of the [[Poem|Pale Fire]], and, of the [[Commentary]] and [[Index]], only entries directly relating to that same first Canto. It seems like fair use, to me, though the rights holders may demur. But someone may find it interesting or useful in the meantime. \n\nIf you wish, you can [[leap straight in|Foreword]] to the novel as published, or follow the links below to find out more about\n*[[Pale Fire, the novel]]\n*[[The hypertext Pale Fire project]]\n*[[How to use the hypertext]]\n*[[Using TiddlyWiki as a hypertext engine for Pale Fire]]\nNothing on the web is ever quite finished. The following journal chronicles where we've got up to:\n<<timeline better:true onlyTag:journal>>\nYou can contact me about this: //richard at relocution dot com//.
<<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\n<<option chkSinglePageMode>> Display one tiddler at a time\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page
config.options.chkHttpReadOnly = false;\n
/***\n|Name|BetterTimelineMacro|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#BetterTimelineMacro|\n|Version|0.5 beta|\n|Requires|~TW2.x|\n!!!Description:\nA replacement for the core timeline macro that offers more features:\n*list tiddlers with only specfic tag\n*exclude tiddlers with a particular tag\n*limit entries to any number of days, for example one week\n*specify a start date for the timeline, only tiddlers after that date will be listed.\n\n!!!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nEdit the ViewTemplate to add the fullscreen command to the toolbar.\n\n!!!Syntax:\n{{{<<timeline better:true>>}}}\n''the param better:true enables the advanced features, without it you will get the old timeline behaviour.''\n\nadditonal params:\n(use only the ones you want)\n{{{<<timeline better:true onlyTag:Tag1 excludeTag:Tag2 sortBy:modified/created firstDay:YYYYMMDD maxDays:7 maxEntries:30>>}}}\n\n''explanation of syntax:''\nonlyTag: only tiddlers with this tag will be listed. Default is to list all tiddlers.\nexcludeTag: tiddlers with this tag will not be listed.\nsortBy: sort tiddlers by date modified or date created. Possible values are modified or created.\nfirstDay: useful for starting timeline from a specific date. Example: 20060701 for 1st of July, 2006\nmaxDays: limits timeline to include only tiddlers from the specified number of days. If you use a value of 7 for example, only tiddlers from the last 7 days will be listed.\nmaxEntries: limit the total number of entries in the timeline.\n\n\n!!!History:\n*28-07-06: ver 0.5 beta, first release\n\n!!!Code\n***/\n//{{{\n// Return the tiddlers as a sorted array\nTiddlyWiki.prototype.getTiddlers = function(field,excludeTag,includeTag)\n{\n var results = [];\n this.forEachTiddler(function(title,tiddler)\n {\n if(excludeTag == undefined || tiddler.tags.find(excludeTag) == null)\n if(includeTag == undefined || tiddler.tags.find(includeTag)!=null)\n results.push(tiddler);\n });\n if(field)\n results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });\n return results;\n}\n\n\n\n//this function by Udo\nfunction getParam(params, name, defaultValue)\n{\n if (!params)\n return defaultValue;\n var p = params[0][name];\n return p ? p[0] : defaultValue;\n}\n\nwindow.old_timeline_handler= config.macros.timeline.handler;\nconfig.macros.timeline.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var args = paramString.parseParams("list",null,true);\n var betterMode = getParam(args, "better", "false");\n if (betterMode == 'true')\n {\n var sortBy = getParam(args,"sortBy","modified");\n var excludeTag = getParam(args,"excludeTag",undefined);\n var includeTag = getParam(args,"onlyTag",undefined);\n var tiddlers = store.getTiddlers(sortBy,excludeTag,includeTag);\n var firstDayParam = getParam(args,"firstDay",undefined);\n var firstDay = (firstDayParam!=undefined)? firstDayParam: "00010101";\n var lastDay = "";\n var field= sortBy;\n var maxDaysParam = getParam(args,"maxDays",undefined);\n var maxDays = (maxDaysParam!=undefined)? maxDaysParam*24*60*60*1000: (new Date()).getTime() ;\n var maxEntries = getParam(args,"maxEntries",undefined);\n var last = (maxEntries!=undefined) ? tiddlers.length-Math.min(tiddlers.length,parseInt(maxEntries)) : 0;\n for(var t=tiddlers.length-1; t>=last; t--)\n {\n var tiddler = tiddlers[t];\n var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);\n if ((theDay>=firstDay)&& (tiddler[field].getTime()> (new Date()).getTime() - maxDays))\n {\n if(theDay != lastDay)\n {\n var theDateList = document.createElement("ul");\n place.appendChild(theDateList);\n createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));\n lastDay = theDay;\n }\n var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink",null);\n theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));\n }\n }\n }\n\n else\n {\n window.old_timeline_handler.apply(this,arguments);\n }\n}\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//}}}
//Click on the //card// button to select a verse.//\n<<tag card>>\n<<timeline better:true onlyTag:card,Canto1 firstDay:19590702>>
\n[[I was the shadow of the waxwing slain|Lines 1-4: I was the shadow of the waxwing slain, etc.]]\n[[By the false azure in the windowpane;|Lines 1-4: I was the shadow of the waxwing slain, etc.]]\n[[I was the smudge of ashen fluff -- and I|Lines 1-4: I was the shadow of the waxwing slain, etc.]]\n[[Lived on, flew on, in the reflected sky.|Lines 1-4: I was the shadow of the waxwing slain, etc.]]\nAnd from the inside, too, I'd duplicate\nMyself, my lamp, an apple on a plate:\nUncurtaining the night, I'd let dark glass\nHang all the furniture above the grass, \nAnd how delighted when a fall of snow\nCovered my glimpse of lawn and reached up so\nAs to make chair and bed exactly stand\nUpon that snow, out in [[that crystal land|Line 12: that crystal land]]!
\nRetake the falling snow: each drifting flake\nShapeless and slow, unsteady and opaque,\nA dull dark white against the day's pale white\nAnd abstract larches in the neutral light.\n[[And then the gradual|Line 17: And then the gradual; Line 29: gray]] and dual blue\nAs night unites the viewer and the view,\nAnd in the morning, diamonds of frost\nExpress amazement: Whose spurred feet have crossed\nFrom left to right the blank page of the road?\nReading from left to right in winter's code:\nA dot, an arrow pointing back; repeat:\nDot, arrow pointing back ... A pheasant's feet!\nTorquated beauty, sublimated grouse,\nFinding your China right behind my house.\nWas he in //[[Sherlock Holmes|Line 27: Sherlock Holmes]]//, the fellow whose\nTracks pointed back when he reversed his shoes?
\nAll colors made me happy: even [[gray|Line 17: And then the gradual; Line 29: gray]].\nMy eyes were such that literally they\nTook photographs. Whenever I'd permit\nOr, with a silent shiver, order it,\nWhatever in my field of vision dwelt --\nAn indoor scene, hickory leaves, the svelt\n[[Stilettos of a frozen stillicide|Lines 34-35: Stilettos of a frozen stillicide]] --\nWas printed on my eyelids' nether side\nWhere it would tarry for an hour or two,\nAnd while this lasted all I had to do\n[[Was close my eyes to reproduce the leaves,|Lines 39-40: Was close my eyes, etc.]]\n[[Or indoor scene, or trophies of the eaves.|Lines 39-40: Was close my eyes, etc.]]\n\n
\nI cannot understand why from the lake\nI could make out our front porch when I'd take\nLake Road to school, whilst now, although no tree\nHas intervened, I look but fail to see\nEven the roof. Maybe some quirk in space\nHas caused a fold or furrow to displace\nThe fragile vista, the frame house between\nGoldsworth and Wordsmith on its square of green.\n\n
\nI had a favorite young shagbark there\nWith ample dark jade leaves and a black, spare,\nVermiculated trunk. The setting sun\nBronzed the black bark, around which, like undone\nGarlands, the shadows of the foliage fell.\nIt is now stout and rough; it has done well.\nWhite butterflies turn lavender as they\nPass through its shade where gently seems to sway\nThe phantom of my little daughter's swing.\n\n
\nThe house itself is much the same. One wing\nWe've had revamped. There's a solarium. There's\nA picture window flanked with fancy chairs.\nTV's huge paperclip now shines instead\nOf the stiff vane so often visited\nBy the naive, the gauzy mockingbird\nRetelling all the programs she had heard;\nSwitching from //chippo-chippo// to a clear\n//To-wee, to-wee//; then rasping out: come here,\nCome here, come herrr'; flirting her tail aloft,\nOr gracefully indulging in a soft\nUpward hop-flop, and instantly (//to-wee!//)\nReturning to her perch the new TV.\n\n
\nI was an infant when my parents died.\nThey both were ornithologists. I've tried\nSo often to evoke them that today\nI have a thousand parents. Sadly they\nDissolve in their own virtues and recede,\nBut certain words, chance words I hear or read,\nSuch as "bad heart" always to him refer,\nAnd "cancer of the pancreas" to her.\nA preterist: one who collects cold nests.\nHere was my bedroom, now reserved for guests.\nHere, tucked away by the Canadian maid,\nI listened to the buzz downstairs and prayed\nFor everybody to be always well,\nUncles and aunts, the maid, her niece Ade'le\nWho'd seen the Pope, people in books, and God.\n\n
\nI was brought up by dear bizarre Aunt Maud,\nA poet and a painter with a taste\nFor realistic objects interlaced\nWith grotesque growths and images of doom.\nShe lived to hear the next babe cry. Her room\nWe've kept intact. Its trivia create\nA still life in her style: the paperweight\nOf convex glass enclosing a lagoon,\nThe verse book open at the Index (Moon,\nMoonrise, Moor, Moral), the forlorn guitar,\nThe human skull; and from the local Star\nA curio: //Red Sox Beat Yanks 5-4//\n//On Chapman's Homer//, thumbtacked to the door.\n\n
\nMy God died young. Theolatry I found\nDegrading, and its premises, unsound.\nNo free man needs a God; but was I free?\nHow fully I felt nature glued to me\nAnd how my childish palate loved the taste\nHalf-fish, half-honey, of that golden pastel\nMy picture book was at an early age\nThe painted parchment papering our cage:\nMauve rings around the moon; blood-orange sun;\nTwinned Iris; and that rare phenomenon\nThe iridule-when, beautiful and strange,\nIn a bright sky above a mountain range\nOne opal cloudlet in an oval form\nReflects the rainbow of a thunderstorm\nWhich in a distant valley has been staged --\nFor we are most artistically caged.\n\n
\nAnd there's the wall of sound: the nightly wall\nRaised by a trillion crickets in the fall.\nImpenetrable! Halfway up the hill\nI'd pause in thrall of their delirious trill.\nThat's Dr. Sutton's light. That's the Great Bear.\nA thousand years ago five minutes were\nEqual to forty ounces of fine sand.\nOutstare the stars. Infinite foretime and\nInfinite aftertime: above your head\nThey close like giant wings, and you are dead.\n\n
\nThe regular vulgarian, I daresay,\nIs happier: he sees the Milky Way\nOnly when making water. Then as now\nI walked at my own risk: whipped by the bough,\nTripped by the stump. Asthmatic, lame and fat,\nI never bounced a ball or swung a bat.\n\n
\nI was the shadow of the waxwing slain\nBy feigned remoteness in the windowpane.\nI had a brain, five senses (one unique),\nBut otherwise I was a cloutish freak.\nIn sleeping dreams I played with other chaps\nBut really envied nothing-save perhaps\nThe miracle of a lemniscate left\nUpon wet sand by nonchalantly deft\nBicycle tires.\n\n
\nBackground: #fff\nForeground: #000\nPrimaryPale: #afb\nPrimaryLight: #096\nPrimaryMid: #042\nPrimaryDark: #000\nSecondaryPale: #bbb\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #042\nTertiaryPale: #aaa\nTertiaryLight: #aaaaff\nTertiaryMid: #000\nTertiaryDark: #8B7355
\n//(Still under construction.)//\n* [[Lines 1-4: I was the shadow of the waxwing slain, etc.]]\n* [[Line 12: that crystal land]]\n* [[Line 17: And then the gradual; Line 29: gray]]\n* [[Line 27: Sherlock Holmes]]\n* [[Lines 34-35: Stilettos of a frozen stillicide]]\n* [[Lines 39-40: Was close my eyes, etc.]]\n\n<html><!-- <<timeline better:true onlyTag:commentary>> --></html>
[[Foreword]]\n[[Pale Fire: A poem in four cantos]]\n[[Commentary]]\n[[Index]]
[[Foreword]]
\n//Pale Fire//, a poem in heroic couplets, of nine hundred ninety-nine lines, divided into four cantos, was composed by John Francis Shade (born July 5, 1898, died July 21, 1959) during the last twenty days of his life, at his residence in New Wye, Appalachia, U.S.A. The manuscript, mostly a Fair Copy, from which the present text has been faithfully printed, consists of eighty medium-sized index cards, on each of which Shade reserved the pink upper line for headings (canto number, date) and used the fourteen light-blue lines for writing out with a fine nib in a minute, tidy, remarkably clear hand, the text of his poem, skipping a line to indicate double space, and always using a fresh card to begin a new canto.\n\nThe short (166 lines) Canto One, with all those amusing birds and parhelia, occupies thirteen cards. Canto Two, your favorite, and that shocking tour de force, Canto Three, are identical in length (334 lines) and cover twenty-seven cards each. Canto Four reverts to One in length and occupies again thirteen cards, of which the last four used on the day of his death give a Corrected Draft instead of a Fair Copy.\n\nA methodical man, John Shade usually copied out his daily quota of completed lines at midnight but even if he recopied them again later, as I suspect he sometimes did, he marked his card or cards not with the date of his final adjustment, but with that of his Corrected Draft or first Fair Copy. I mean, he preserved the date of actual creation rather than that of second or third thoughts. There is a very loud amusement park right in front of my present lodgings.\n\nWe possess in result a complete calendar of his work. Canto One was begun in the small hours of July 2 and completed on July 4. He started the next canto on his birthday and finished it on July 11. Another week was devoted to
\ntwo ping-pong tables in my basement. I asked, was it a crime? No, he said, but why two? "Is that a crime?" I countered, and they all laughed.\n\nDespite a wobbly heart (see line 735), a slight limp, and a certain curious contortion in his method of progress, Shade had an inordinate liking for long walks, but the snow bothered him, and he preferred, in winter, to have his wife call for him after classes with the car. A few days later, as I was about to leave Parthenocissus Hall -- or Main Hall (or now Shade Hall, alas), I saw him waiting outside for Mrs. Shade to fetch him. I stood beside him for a minute, on the steps of the pillared porch, while pulling my gloves on, finger by finger, and looking away, as if waiting to review a regiment: "That was a thorough job," commented the poet. He consulted his wrist watch. A snowflake settled upon it. "Crystal to crystal," said Shade. I offered to take him home in my powerful Kramler. "Wives, Mr. Shade, are forgetful." He cocked his shaggy head to look at the library clock. Across the bleak expanse of snow-covered turf two radiant lads in colorful winter clothes passed, laughing and sliding. Shade glanced at his watch again and, with a shrug, accepted my offer.\n\nI wanted to know if he did not mind being taken the longer way, with a stop at Community Center where I wanted to buy some chocolate-coated cookies and a little caviar. He said it was fine with him. From the inside of the supermarket, through a plate-glass window, I saw the old chap pop into a liquor store. When I returned with my purchases, he was tack in the car, reading a tabloid newspaper which I had thought no poet would deign to touch. A comfortable burp told me he had a flask of brandy concealed about his warmly coated peraon. As we turned into the drive \n
\nway of his house, we saw Sybil pulling up in front of it. I got out with courteous vivacity. She said: "Since my husband does not believe in introducing people, let us do it ourselves: you are Dr. Kinbote, aren't you? And I am Sybil Shade." Then she addressed her husband saying lie might have waited in his office another minute: she had honked and called, and walked all the way up, et cetera. I turned to go, not wishing to listen to a marital scene, but she called me back: "Have a drink with us," she said, "or rather with me, because John is forbidden to touch alcohol." 1 explained I could not stay long as I was about to have a kind of little seminar at home followed by some table tennis, with two charming identical twins and another boy, another boy.\n\nHenceforth I began seeing more and more of my celebrated neighbor. The view from one of my windows kept providing me with first-rate entertainment, especially when I was on the wait for some tardy guest. From the second story of my house the Shades' living-room window remained clearly visible so long as the branches of the deciduous trees between its were still bare, and almost every evening I could see the poet's slippered foot gently rocking. One inferred from it that he was sitting with a book in a low chair but one never managed to glimpse more than that foot and its shadow moving up and down to the secret rhythm of mental absorption, in the concentrated lamplight. Always at the same time the brown morocco slipper would drop from the wool-socked foot which continued to oscillate, with, however, a slight slackening of pace. One knew that bedtime was closing in with all its terrors; that in a few minutes the toe would prod and worry the slipper, and then disappear with it from my golden field of vision traversed by the black bendlet of a branch. And sometimes Sybil Shade would trip by\n
\nwith the velocity and swinging arms of one flouncing out in a fit of temper, and would return a little later, at a much slower gait, having, as it were, pardoned her husband for his friendship with an eccentric neighbor; but the riddle of her behavior was entirely solved one night when by dialing their number and watching their window at the same time I magically induced her to go through the hasty and quite innocent motions that had puzzled me.\n\nAlas, my peace of mind was soon to be shattered. The thick venom of envy began squirting at me as soon as academic suburbia realized that John Shade valued my society above that of all other people. Your snicker, my dear Mrs. C., did not escape our notice as I was helping the tired old poet to find his galoshes after that dreary get-together party at your house. One day I happened to enter the English Literature office in quest of a magazine with the picture of the Royal Palace in Onhava, which I wanted my friend to see, when I overheard a young [[instuctor]] in a green velvet jacket, whom I shall mercifully call Gerald Emerald, carelessly saying in answer to something the secretary had asked: "I guess Mr. Shade has already left with the Great Beaver." Of course, I am quite tall, and my brown beard is of a rather rich tint and texture; the silly cognomen evidently applied to me, but was not worth noticing, and after calmly taking the magazine from a pamphlet-cluttered table, I contented myself on my way out with pulling Gerald Emerald's bow-tie loose with a deft jerk of my fingers as I passed by him. There was also the morning when Dr. Nattochdag, head of the department to which I was attached, begged me in a formal voice to be seated, then closed the door, and having repined. with a downcast frown, his swivel chair, urged me "to\n
\nbe more careful." In what sense, careful? A boy had complained to his adviser. Complained of what, good Lord? That I had criticized a literature course he attended ("a ridiculous survey of ridiculous works, conducted by a ridiculous mediocrity"). Laughing in sheer relief, I embraced my good Netochka, telling him I would never be naughty again. I take this opportunity to salute him. He always behaved with such exquisite courtesy toward me that I sometimes wondered if he did not suspect what Shade suspected, and what only three people (two trustees and the president of the college) definitely knew.\n\nOh, there were many such incidents. In a skit performed by a group of drama students I was pictured as a pompous woman hater with a German accent, constantly quoting Housman and nibbling raw carrots; and a week before Shade's death, a certain ferocious lady at whose club I had refused to speak on the subject of "The Hally Vally" (as she put it, confusing Odin's Hall with the title of a Finnish epic), said to me in the middle of a grocery store, "You are a remarkably disagreeable person. 1 fail to see how John and Sybil can stand you," and, exasperated by my polite smile, she added: "What's more, you are insane."\n\nBut let me not pursue the tabulation of nonsense. Whatever was thought, whatever was said, I had my full reward in John's friendship. This friendship was the more precious for its tenderness being- intentionally concealed, especially when we were not alone, by that gruffness which stems from what can be termed the dignity of the heart. His whole being constituted a mask. John Shade's physical appearance was so little in keeping with the harmonies hiving in the man, that one felt inclined to dismiss it as a coarse disguise\n
\nor passing fashion; for if the fashions of the Romantic Age subtilized a poet's manliness by baring his attractive neck, pruning his profile and reflecting a mountain lake in his oval gaze, present-day bards, owing perhaps to better opportunities of aging, look like gorillas or vultures. My sublime neighbor's face had something about it that might have appealed to the eye, had it been only leonine or only Iroquoian; but unfortunately, by combining the two it merely reminded one of a fleshy Hogarthian tippler of indeterminate sex. His misshapen body, that gray mop of abundant hair, the yellow nails of his pudgy fingers, the bags under his lusterless eyes, were only intelligible if regarded as the waste products eliminated from his intrinsic self by the same forces of perfection which purified and chiseled his verse. He was his own cancellation.\n\nI have one favorite photograph of him. In this color snapshot taken by a onetime friend of mine, on a brilliant spring day, Shade is seen leaning on a sturdy cane that had belonged to his aunt Maud (see line 86). I am wearing a white windbreaker acquired in a local sports shop and a pair of lilac slacks hailing from Cannes. My left hand is half raised-not to pat Shade on the shoulder as seems to be the intention, but to remove my sunglasses which, however, it never reached in that life, the life of the picture; and tile library book under my right arm is a treatise on certain Zemblan calisthenics in which I proposed to interest that young roomer of mine who snapped the picture. A week later he was to betray my trust by taking sordid advantage of my absence on a trip to Washington whence I returned to find he had been entertaining a fiery-haired whore from Exton who had left her combings and reek in all three bath-\n
\nrooms. Naturally, we separated at once, and through a chink in tile window curtains I saw had bad Bob standing rather pathetically, with his crewcut, and shabby valise, and the skis I had given him, all forlorn on the roadside, waiting for a fellow student to drive him away forever. I can forgive everything save treason.\n\nWe never discussed, John Shade and I, any of my personal misfortunes. Our close friendship was on that higher, exclusively intellectual level where one can rest from emotional troubles, not share them. My admiration for him was lor tile a sort of alpine cure. I experienccd it grand sense of wonder whenever I looked at him, especially in the presence of other people, inferior people. This wonder was enhanced by my awareness of their not feeling what I felt, of their not seeing what I saw, of their taking Shade for granted, instead of drenching every nerve, so to speak, in the romance of his presence. Here he is, I would say to myself, that is his head, containing a brain of a different brand than that of the synthetic jellies preserved in tile skulls around him. He is looking from the terrace (of Prof. C.'s house on that March evening) at the distant lake. I am looking at him. I am witnessing a unique physiological phenomenon: John Shade perceiving and transforming the world, taking it in and taking it apart, re-combining its elements in the very process of storing them up so as to produce at some unspecified date an organic miracle, a fusion of image and music, a line of verse. And I experienced the same thrill as when in my early boyhood I once watched across the tea table in my uncle's castle a conjurer who had just given a fantastic performance and was now quietly consuming a vanilla ice. I stared at his powdered cheeks, at the magical flower in his buttonhole\n
\nwhere it had passed through a succession of different colors and had now become fixed as a white carnation, and especially at his marvelous fluid-looking fingers which could if he chose make his spoon dissolve into a sunbeam by twiddling it, or turn his plate into a dove by tossing it up in the air.\n\nShade's poem is, indeed, that sudden flourish of magic: my gray-haired friend, my beloved old conjurer, put a pack of index cards into his hat -- and shook out a poem.\n\nTo this poem we now must turn. My Foreword has been, I trust, not too skimpy. Other notes, arranged in a running commentary, will certainly satisfy the most voracious reader. Although those notes, in conformity with custom, come after the poem, the reader is advised to consult them first and then study the poem with their help, rereading them of course as he goes through its text, and perhaps, after having done with the poem, consulting them a third time so as to complete the picture. I find it wise in such cases as this to eliminate the bother of back-and-forth leafings by either cutting out and clipping together the pages with the text of the thing, or, even more simply, purchasing two copies of the same work which can then be placed in adjacent positions on a comfortable table-not like the shaky little affair on which my typewriter is precariously enthroned now, in this wretched motor lodge, with that carrousel inside and outside my head, miles away from New Wye. Let me state that without my notes Shade's text simply has no human reality at all since the human reality of such a poem as his (being too skittish and reticent for an autobiographical work), with the omission of many Pithy lines carelessly rejected by him, has to depend entirely on the reality of its author and his\n
\nsurroundings, attachments and so forth, a reality that only my notes can provide. To this statement my dear poet would probably not have subscribed, but, for better or worse, it is the commentator who has the last word.\n\n<html><span style="font-variant: small-caps;">Charles Kinbote</span></html>\n//Oct. 19, 1959, Cedarn, Utana//\n\n
\nCanto Three. Canto Four was begun on July 19 and as already noted, the last third of its text (lines 949-999 is supplied by a Corrected Draft. This is extremely rough in appearance, teeming with devastating erasures and cataclysmic insertions, and does not follow the lines of the card as rigidly as the Fair Copy does. Actually, it turns out to be beautifully accurate when you once make the plunge and compel yourself to open your eyes in the limpid depths under its confused surface. It contains not one gappy line, not one doubtful reading. This fact would be sufficient to show that the imputations made (on July 24, 1959) in a newspaper interview with one of our professed Shadeans -- who affirmed without having seen the manuscript of the poem that it "consists of disjointed drafts none of which yields a definite text" -- is a malicious invention on the part of those who would wish not so much to deplore the state in which a great poet's work was interrupted by death as to asperse the competence, and perhaps honesty, of its present editor and commentator.\n\nAnother pronouncement publicly made by Prof. Hurley and his clique refers to a structural matter. I quote from the same interview: "None can say how long John Shade planned his poem to be, but it is not improbable that what he left represents only a small fraction of the composition he saw in a glass, darkly." Nonsense again! Aside from the veritable clarion of internal evidence ringing throughout Canto Four, there exists Sybil Shade's affirmation (in a document dated July 25, 1959) that her husband "never intended to go beyond four parts." For him the third canto was the penultimate one, and thus I myself have heard him speak of it, in the course of a sunset ramble, when, as if thinking aloud, he reviewed the day's work and gesticulated in pardonable self-approbation while his discreet companion kept trying in \n
\nvain to adapt the swing of a long-limbed gait to the disheveled old poet's jerky shuffle. Nay, I shall even assert (as our shadows still walk without us) that there remained to be written only one line of the poem (namely verse 1000) which would have been identical to line 1 and would have completed the symmetry of the structure, with its two identical central parts, solid and ample, forming together with the shorter Hanks twin wings of five hundred verses each, and damn that music. Knowing Shade's combinational turn of mind and subtle sense of harmonic balance, I cannot imagine that he intended to deform the faces of his crystal by meddling with its predictable growth. And if all this were not enough -- and it is, it is enough -- I have had the dramatic occasion of hearing my poor friend's own voice proclaim on the evening of July 21 the end, or almost the end, of his labors. (See my note to line 991.)\nThis batch of eighty cards was held by a rubber band which I now religiously put back after examining for the last time their precious contents. Another, much thinner, set of a dozen cards, clipped together and enclosed in the same manila envelope as the main batch, bears some additional couplets running their brief and sometimes smudgy course among a chaos of first drafts. As a rule, Shade destroyed drafts the moment he ceased to need them: well do I recall seeing him from my porch, on a brilliant morning, burning a whole stack of them in the pale fire of the incinerator before which he stood with bent head like an official mourner among the wind-borne black butterflies of that backyard auto-da-fé But he saved those twelve cards because of the unused felicities shining among the dross of used draftings. Perhaps, he vaguely expected to replace certain passages in the Fair Copy with some of the lovely rejections \n
\nin his files, or, more probably, a sneaking fondness for this or that vignette, suppressed out of architectonic considerations, or because it had annoyed Mrs. S., urged him to put off, its disposal till the time when the marble finality of an immaculate typescript would have confirmed it or made the most delightful variant seem cumbersome and impure. And perhaps, let me add in all modesty, he intended to ask my advice after reading his poem to me as I know he planned to do.\nIn my notes to the poem the reader will find these canceled readings. Their places are indicated, or at least suggested, by the draftings of established lines in their immediate neighborhood. In a sense, many of them are more valuable artistically and historically than some of the best passages in the final text- I must now explain how Pale Fire came to be edited by me.\n\nImmediately after my dear friend's death I prevailed on his distraught widow to forelay and defeat the commercial passions and academic intrigues that were bound to come swirling around her husband's manuscript (transferred by me to a safe spot even before his body had reached the grave) by signing an agreement to the effect that he had turned over the manuscript to me; that I would have it published without delay, with my commentary, by a firm of my choice; that all profits, except the publisher's percentage, would accrue to her; and that on publication day the manuscript would be handed over to the Library of Congress for permanent preservation. I defy any serious critic to find this contract unfair. Nevertheless, it has been called (by Shade's former lawyer) "a fantastic farrago of evil," while another person (his former literary agent) has wondered with a sneer if Mrs. Shade's tremulous signature might not have been
\npenned "in some peculiar kind of red ink." Such hearts, such brains, would be unable to comprehend that one's attachment to a masterpiece may be utterly overwhelming, especially when it is the underside of the weave that entrances the beholder and only begetter, whose own past intercoils there with the fate of the innocent author.\n\nAs mentioned, I think, in my last note to the poem, the depth charge of Shade's death blasted such secrets and caused so many dead fish to float up, that I was forced to leave New Wye soon after my last interview with the jailed killer. The writing of the commentary had to be postponed until I could find a new incognito in quieter surroundings, but practical matters concerning the poem had to be settled at once. I took a plane to New York, had the manuscript photographed, came to terms with one of Shade's publishers, and was on the point of clinching the deal when, quite casually, in the midst of a vast sunset (we sat in a cell of walnut and glass fifty stories above the progression of scarabs), my interlocutor observed: "You'll be happy to know, Dr. Kinbote, that Professor So-and-so [one of the members of the Shade committee] has consented to act as our adviser in editing the stuff."\n\nNow "happy" is something extremely subjective. One of our sillier Zemblan proverbs says: the lost glove is happy. Promptly I refastened the catch of my briefcase and betook myself to another publisher.\n\nImagine a soft, clumsy giant; imagine a historical personage whose knowledge of money is limited to the abstract billions of a national debt; imagine an exiled prince who is unaware of the Golconda in his cuff links! This is to say -- oh, hyperbolically -- that I am the most impractical fellow in the world. Between such a person and an old fox in the
\nbook publishing business, relations are at first touchingly carefree and chummy, with expansive banterings and all sorts of amiable tokens. I have no reason to suppose that anything will ever happen to prevent this initial relationship with good old Frank, my present publisher, from remaining a permanent fixture.\n\nFrank has acknowledged the safe return of the galleys I had been sent here and has asked me to mention in my Preface -- and this I willingly do -- that I alone am responsible for any mistakes in my commentary. [[Insert before a professional.]] A professional proofreader has carefully rechecked the printed text of the poem against the phototype of the manuscript, and has found a few trivial misprints I had missed; that has been all in the way of outside assistance. Needless to say how much I had been looking forward to Sybil Shade's providing me with abundant biographical data; unfortunately she left New Wye even before I did, and is dwelling now with relatives in Quebec. We might have had, of course, a most fruitful correspondence, but the Shadeans were not to be shaken off. They headed for Canada in droves to pounce on the poor lady as soon as I had lost contact with her and her changeful moods. Instead of answering a month-old letter from my cave in Cedarn, listing some of my most desperate queries, such as the real name of "Jim Coates" etc., she suddenly shot me a wire, requesting me to accept Prof. H. (!) and Prof. C. (!!) as co-editors of her husband's poem. How deeply this surprised and pained me! Naturally, it precluded collaboration with my friend's misguided widow.\n\nAnd he was a very dear friend indeed! The calendar says I had known him only for a few months but there exist friendships which develop their own inner duration, their\n
\neons of transparent time, independent of rotating, malicious music. Never shall I forget how elated I was upon own learning, as mentioned in a note my reader shall find, that suburban house (rented for my use from Judge Goldsworth who had gone on his Sabbatical to England) into which I moved on February 5, 1959, stood next to that of the celebrated American poet whose verses I had tried to put into Zemblan two decades earlier! Apart from this glamorous neighborhood, the Goldsworthian chateau, as I was soon to discover, had little to recommend it. The heating system was a farce, depending as it did on registers in the floor wherefrom the tepid exhalations of a throbbing and groaning basement furnace were transmitted to the rooms with the faintness of a moribund's last breath. By occluding the apertures upstairs I attempted to give more energy to the register in the living room but its climate proved to be incurably vitiated by there being nothing between it and the arctic regions save a sleezy front door without a vestige of vestibule -- either because the house had been built in midsummer by a naive settler who could not imagine the kind of winter New Wye had in store for him, or because oldtime gentility required that a chance caller at the open door could satisfy himself from the threshold that nothing unseemly was going on in the parlor.\n\nFebruary and March in Zembla (the two last of the four "white-nosed months," as we call them) used to be pretty rough too, but even a peasant's room there presented a solid of uniform warmth-not a reticulation of deadly drafts. It is true that, as usually happens to newcomers, I was told I had chosen the worst winter in years -- and this at the latitude of Palermo. On one of my first mornings there, as I was preparing to leave for college in the Powerful red car I had
\njust acquired, I noticed that Mr. and Mrs. Shade, neither of whom I had yet met socially (I was to learn later that they assumed I wished to be left alone), were having trouble with their old Packard in the slippery driveway where it emitted whines of agony but could not extricate one tortured rear wheel out of a concave inferno of ice. John Shade busied himself clumsily with a bucket from which, with the gestures of a sower, he distributed handfuls of brown sand over the blue glaze. He wore snowboots, his vicuna collar was up, his abundant gray hair looked berimed in the sun. I knew he had been ill a few months before, and thinking to offer my neighbors a ride to the campus in my powerful machine, I hurried out toward them. A lane curving around the slight eminence on which my rented castle stood separated it from my neighbors' driveway, and I was about to cross that lane when I lost my footing and sat down on the surprisingly hard snow. 111y fall acted as a chemical reagent on the Shades' sedan, which forthwith budged and almost ran over me as it swung into the lane with John at the wheel strenuously grimacing and Sybil fiercely talking to him. I am not sure either saw me.\n\nA few days later, however, namely on Monday, February 16, I was introduced to the old poet at lunch time in the faculty club. "At last presented credentials," as noted, a little ironically, in my agenda. I was invited to join him and four or five other eminent professors at his usual table, under an enlarged photograph of Wordsmith College as it was, stunned and shabby, on a remarkably gloomy summer day in 1903. His laconic suggestion that I "try the pork" amused me. I am a strict vegetarian, and I like to cook my own meals. Consuming something that had been handled by a\n
\nfellow creature was, I explained to the rubicund convives, repulsive to me as eating any creature, and that would include -- lowering my voice -- the pulpous pony-tailed girl stuclude-lowering dent who served us and licked her pencil. Moreover, I had already finished the fruit brought with me in my briefcase so I would content myself, I said, with a bottle of good college ale. My free and simple demeanor set everybody at ease. The usual questions were fired at me about eggnogs and milkshakes being or not being acceptable to one of my persuasion. Shade said that with him it was the other way around: he must make a definite effort to partake of a vegetable. Beginning a salad, was to him like stepping into sea water on a chilly day, and he had always to brace himself in order to attack the fortress of an apple. I was not yet used to the rather fatiguing jesting and teasing that goes on among American intellectuals of the inbreeding academic type and so abstained from telling John Shade in front of all those grinning old males how much I admired his work lest a serious discussion of literature degenerate into mere facetiation. Instead I asked him about one of my newly acquired students who also attended his course, a moody, delicate, rather wonderful boy; but with a resolute shake of his hoary forelock the old poet answered that he had ceased long ago to memorize faces and names of students and that the only person in his poetry class whom he could visualize was an extramural lady on crutches. "Come, come," said Professor Hurley, "do you mean, John, you really don't have a mental or visceral picture of that stunning blonde in the black leotard who haunts Lit. 202?" Shade, all his wrinkles beaming, benignly tapped Hurley on the wrist to make him stop. Another tormentor inquired if it was true that I had installed\n
\nThis hypertext edition has tried to remain faithful to the original, printed edition, wherever possible, using the features of electronic hypertext to suggest enhancements to the analogue experience. Naturally, mouse-clicks replace the action of turning the page. \n\nOn the left you will find a menu listing the four sections of the novel, much as the Contents page of the original. As you view each gobbet of the text, in the [[Foreword]], in the [[poem|Pale Fire]] itself, or in the [[Commentary]], you will find //Next// and //Previous// buttons that page you through that section in the order that you would expect to read the original. \n\nOwing to its great length, I wanted to break the [[Foreword]] into smaller chunks: until a better idea comes along, I have rendered these arbitrary pages to match the pagination of the original edition exactly. I know that many people object to navigating texts arbitrarily broken into web-page sized chunks -- I generally do myself -- but I feel that the [[Foreword]] is a special case within the context of //Pale Fire//. I will continue to consider the merits or otherwise of this approach. Better still, perhaps, if I could leave the reader the choice of pagination, but that's a bit beyond my capabilities at the moment.\n\nIn the section of verses of [[Canto One of the poem|Canto One]], embedded hyperlinks link to [[Commentary]] entries. Navigation from the [[Commentary]] back to the poem can be achieved either by using the //Back// button on the web browser, or by clicking on //References// (top right), which will show a drop down list of pages that link to the page you are on.\n\n//Pale Fire// has a fairly well-defined chronology, which is reflected in the date stamp of each page, as is its "authorship" (Shade or Kinbote).
\n//(Still under construction.)//\n\n//A., Baron//,Oswen Affenpin, last Baron of Aff, a puny traitor, //286//.\n//Acht, Iris//, celebrated actress, d. 1888, a passionate and powerful woman, favorite of Thurgus the Third (//q.v.//), 130//. ...\n//Alfin, King//, surnamed The Vague, 1873-1918, ...
/***\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
\nPerhaps an allusion to Zembla, my dear country. After this, in the disjointed, half-obliterated draft which I am not at all sure I have deciphered properly:\n>Ah, I must not forget to say something\n>That my friend told me of a certain king.\nAlas, he would have said a great deal more if a domestic andti-Karlist had not communicated every line he communicated to her! Many a time...
\nBy an extraordinary coincidence (inherent perhaps in the contrapuntal nature of Shade's art) our poet seems to name here (gradual, gray) a man, whom he was to see for one fatal moment three weeks later, but of whose existence at this time (July 2) he could not have known. Jakob Gradus called himself variously Jack Degree or Jacques de Grey, or James de Gray...
\nA hawk-nosed, lanky, rather likable private detective, the main character in various stories by Conan Doyle. I have no means to ascertain at the present time which of these is referred to here but suspect that our poet simply made up this Case of the Reversed Footprints.
\nThe image in these opening lines evidently refers to a bird knocking itself out, in full flight, against the outer surface of a glass pane in which a mirrored sky, with its slightly darker tint and slightly slower cloud, presents the illusion of continued space. We can visualize John Shade in his early boyhood...
\nHow persistently our poet evokes images of winter in the beginning of a poem which he started composing on a balmy summer night! ...
\nThese lines are represented in the drafts by a variant reading:\n\n ^^39^^ ............. and home would haste my thieves\n ^^40^^ The sun with stolen ice, the moon with leaves\n\nOne cannot help recalling a passage in //Timon of Athens// (Act IV, Scene 3) where the misanthrope talks to the three marauders. ...
!Pale Fire \n[[Foreword]]\n//[[Pale Fire: A poem in four cantos|Pale Fire]]//\n[[Commentary]]\n[[Index]]\n! \n[[About the hypertext]]\n<html><small>One page at a time</small></html> <<option chkSinglePageMode>>\n
/***\n\n|Name|NavigationMacro|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#NavigationMacro|\n|Version|0.3 |\n|Requires|~TW2.08+|\n!Description:\n*Creates Next and Prev buttons on tiddlers, to cycle through tiddlers in order.\n**you can create next and previous buttons to navigate through your journals, or the tiddlers of a tutorial.\n*You can exclude certain tiddlers, or navigate through tiddlers with a specific tag only.\n*The tiddlers can be sorted by modified or created.\n*Custom ordering will be available after the release of TW 2.1\n*Needs to be added to the ViewTemplate\n*Buttons are updated dynamically and are hidden if there is no next or previous tiddler.\n\n!Usage\n{{{<<navigation>>}}}\nor for more options:\n{{{<<navigation sort exclude tag labelPrevious labelNext >>}}}\nwhere sort is ''created'' (default) or ''modified''\nexlcude is the tag to exclude.\ntag is the tag to navigate through.\nlabelPrevious is the label for the previous button.\nlabelNext is the label for the next button. \n\nI recommend adding it to the ViewTemplate in the viewer div:\n{{{<div class='viewer'>\n<span macro='view text wikified'></span>\n<span macro='navigation "" "" plugin'></span></div>}}}\n\n\n\n!Example:\nThe next and previous buttons at the bottom of this tiddler will cycle through all of my extensions for TW.\n!History\n* 25-06-06 : version 0.3, first release\n\n!Code\n***/\n//{{{\nwindow.refreshNavLink = function (e) {\n var title = e.getAttribute("here");\n var sort = e.getAttribute("sort");\n var exclude = e.getAttribute("exclude");\n if (e.getAttribute("tag")!=undefined) var tag = e.getAttribute("tag");\n var navtype = e.getAttribute("navtype");\n if (tag) {var tiddlers = store.getTaggedTiddlers(tag,sort);}\n else {var tiddlers = store.getTiddlers(sort,exclude);}\n for (var g=0; g<tiddlers.length; g++)\n {if (title==tiddlers[g].title)\n {if(navtype=="next" && !tiddlers[g+1]) \n e.className += " navNonExisting"\n else if (navtype=="prev" && !tiddlers[g-1])\n e.className += " navNonExisting"\n else e.className = "button";}\n }\n}\n\n\nconfig.refreshers.navLink = function(e,changeList){ \n refreshNavLink(e);\n} \n\n\n\nconfig.macros.navigation={};\nconfig.macros.navigation.handler = function(place,macroName,params,wikifier,paramString,tiddler){\n\n var sort = (params[0] && params[0]!=".")? params[0]: "created";\n var exclude =(params[1] && params[1]!=".")? params[1]: undefined;\n if (params[2])\n {var tag= params[2];\n if(tiddler.tags.contains(tag)==false)\n return false;\n }\n var labelPrev = params[3] ? params[3] : "Previous";\n var labelNext = params[4] ? params[4] : "Next";\n\n var next = function(e){\n if (!e) var e=window.event;\n var theTarget = resolveTarget(e);\n var navtype = theTarget.getAttribute("navtype");\n if (tag) {var tiddlers = store.getTaggedTiddlers(tag,sort);}\n else {var tiddlers = store.getTiddlers(sort,exclude);}\n for (var g=0; g<tiddlers.length; g++)\n {if (tiddler.title==tiddlers[g].title)\n {if (navtype == "next")\n story.displayTiddler(theTarget,tiddlers[g+1].title)\n else if (navtype == "prev")\n story.displayTiddler(theTarget,tiddlers[g-1].title)}\n }\n }\n\n var createNavBtn = function(text,theId,mode){\n var nextBtn = createTiddlyButton(place,text,text,next,null,theId);\n nextBtn.setAttribute("refresh","navLink");\n nextBtn.setAttribute("here",tiddler.title);\n nextBtn.setAttribute("sort",sort);\n nextBtn.setAttribute("exclude",exclude);\n nextBtn.setAttribute("navtype",mode);\n if (tag) nextBtn.setAttribute("tag",tag);\n refreshNavLink(nextBtn);\n }\n createNavBtn(labelNext+" ►","NavNext","next");\n createNavBtn("◄ "+labelPrev,"NavPrevious","prev");\n\n}\n\nsetStylesheet(\n"#NavNext {float:right;}\sn"+\n"#NavPrevious {float:left;}\sn"+\n".navNonExisting {display:none;}\sn"+\n "",\n"NavMacroStyles");\n//}}}
tiddlyspot password:\n<<option pasUploadPassword>>\n\nThese InterfaceOptions for customising TiddlyWiki are saved in your browser\n\nYour username for signing your edits.\n<<option txtUserName>>\n<<option chkSaveBackups>> SaveBackups\n<<option chkAutoSave>> AutoSave\n<<option chkRegExpSearch>> RegExpSearch\n<<option chkCaseSensitiveSearch>> CaseSensitiveSearch\n<<option chkAnimate>> EnableAnimations\n<<option chkSinglePageMode>> Display one tiddler at a time\n----\nAdvancedOptions\n
\n//''A poem in four cantos''//\n* <<tag Canto1>> [[Canto One|Canto One, Verse 01]]\n* <<tag Canto2>> [[Canto Two]]\n* <<tag Canto3>> [[Canto Three]]\n* <<tag Canto4>> [[Canto Four]]
\n//Pale Fire// has sometimes been called the first hypertext novel. Whether or not that's true, it is certainly a brilliant and uniquely clever example of the non-linear art of the post-modern novel. \n\nTo find out more about //Pale Fire// you could always get a copy of the book from the inevitable Amazon.com (or get a nice original through Bookfinder.com). A search on Google will find loads of links, and the Wikipedia article is a good, if brief intro (it is predictably, if unjustifiably, dwarfed by the entry for //Lolita//). But I want you to stay here a bit longer, so I'm not linking to any of them directly!\n
/***\n|''Name:''|SinglePageModePlugin|\n|''Source:''|http://www.TiddlyTools.com/#SinglePageModePlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nNormally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.\n\n!!!!!Usage\n<<<\nSinglePageMode allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time. When SinglePageMode is enabled, the title of the current tiddler is automatically displayed in the browser window's titlebar and the browser's location URL is updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.\n\nEven when SinglePageMode is disabled (i.e., displaying multiple tiddlers is permitted), you can reduce the potential for confusion by enable TopOfPageMode, which forces tiddlers to always open at the top of the page instead of being displayed following the tiddler containing the link that was clicked.\n<<<\n!!!!!Configuration\n<<<\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions tiddler so you can enable/disable the plugin behavior. For convenience, these checkboxes are also included here:\n\n<<option chkSinglePageMode>> Display one tiddler at a time\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SinglePageModePlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SinglePageMode handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the ''shadow'' AdvancedOptions tiddler so you can enable/disable this behavior. However, if you have customized your AdvancedOptions, you will need to ''manually add these checkboxes to your customized tiddler.''\n<<<\n!!!!!Revision History\n<<<\n''2006.07.04 [2.2.1]'' in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.\n''2006.06.01 [2.2.0]'' added chkTopOfPageMode (TPM) handling\n''2006.02.04 [2.1.1]'' moved global variable declarations to config.* to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n''2005.12.27 [2.1.0]'' hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list). Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers\n''2005.12.27 [2.0.0]'' Update for TW2.0\n''2005.11.24 [1.1.2]'' When the back and forward buttons are used, the page now changes to match the URL. Based on code added by Clint Checketts\n''2005.10.14 [1.1.1]'' permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them\n''2005.10.14 [1.1.0]'' added automatic setting of window title and location bar ('auto-permalink'). feature suggestion by David Dickens.\n''2005.10.09 [1.0.1]'' combined documentation and code in a single tiddler\n''2005.08.15 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nSupport for BACK/FORWARD buttons adapted from code developed by Clint Checketts\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SinglePageMode= {major: 2, minor: 2, revision: 1, date: new Date(2006,7,3)};\n\nif (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSinglePageMode>> Display one tiddler at a time";\n\nif (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkTopOfPageMode>> Always open tiddlers at the top of the page";\n\nconfig.SPMTimer = 0;\nconfig.lastURL = window.location.hash;\nfunction checkLastURL()\n{\n if (!config.options.chkSinglePageMode)\n { window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }\n if (config.lastURL == window.location.hash)\n return;\n var tiddlerName = convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1)));\n tiddlerName=tiddlerName.replace(/\s[\s[/,"").replace(/\s]\s]/,""); // strip any [[ ]] bracketing\n if (tiddlerName.length) story.displayTiddler(null,tiddlerName,1,null,null);\n}\n\nif (Story.prototype.SPM_coreDisplayTiddler==undefined) Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n if (config.options.chkSinglePageMode) {\n window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));\n config.lastURL = window.location.hash;\n document.title = wikifyPlain("SiteTitle") + " - " + title;\n story.closeAllTiddlers();\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n if (config.options.chkTopOfPageMode) { story.closeTiddler(title); window.scrollTo(0,0); srcElement=null; }\n this.SPM_coreDisplayTiddler(srcElement,title,template,animate,slowly)\n}\n\nif (Story.prototype.SPM_coreDisplayTiddlers==undefined) Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;\nStory.prototype.displayTiddlers = function(srcElement,titles,template,unused1,unused2,animate,slowly)\n{\n // suspend single-page mode when displaying multiple tiddlers\n var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;\n var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;\n this.SPM_coreDisplayTiddlers(srcElement,titles,template,unused1,unused2,animate,slowly);\n config.options.chkSinglePageMode=saveSPM; config.options.chkTopOfPageMode=saveTPM;\n}\n//}}}
An experimental hypertext edition
PALE FIRE by Vladimir Nabokov
.externalLink {\n text-decoration: none;\n}
/*{{{*/\n* html .tiddler {\n height: 1%;\n}\n\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n margin: 0;\n padding: 0;\n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\ndt {font-weight: bold;}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n\n.txtOptionInput {\n width: 11em;\n}\n\n#contentWrapper .chkOptionInput {\n border: 0;\n}\n\n.externalLink {\n text-decoration: underline;\n}\n\n.indent {margin-left:3em;}\n.outdent {margin-left:3em; text-indent:-3em;}\ncode.escaped {white-space:nowrap;}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n#sidebarTabs .tiddlyLinkExisting {\n font-weight: bold;\n font-style: normal;\n}\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 4.5em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 4.5em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n}\n\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n.wizard {\n padding: 0.1em 0em 0em 2em;\n}\n\n.wizard h1 {\n font-size: 2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.4em 0em 0.2em 0em;\n}\n\n.wizard h2 {\n font-size: 1.2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.2em 0em 0.2em 0em;\n}\n\n.wizardStep {\n padding: 1em 1em 1em 1em;\n}\n\n.wizard .button {\n margin: 0.5em 0em 0em 0em;\n font-size: 1.2em;\n}\n\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.listBreak {\n font-size: 1px;\n line-height: 1px;\n}\n\n.listBreak div {\n margin: 2px 0;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.6em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 0.9em;\n}\n\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer table.listView {\n font-size: 0.85em;\n margin: 0.8em 1.0em;\n}\n\n.viewer table.listView th, .viewer table.listView td, .viewer table.listView tr {\n padding: 0px 3px 0px 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.2em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/
\nThis project was conceived and largely completed one stormy January day in London -- as grey clouds hustled horizonwards and a booming Aiolian blitzkrieg blasted my garden fence into splintery shards. That waxwing wouldn't have stood a chance.\n\nI first read //Pale Fire// while studying modernist and post-modern fiction at Warwick University, under the tutelage of the delightfully insightful Cris Nash. This was the same course that also gave me the wonderful opportunity to spend a whole term studying //Ulysses//, and introduced me to other essential novels like Beckett's //Molloy// (rereading the painfully detailed descriptions of stone-sucking ritual and farting frequency calculations still leaves me breathless with delight) and Flann O'Brien's //The Third Policemen// ("'Is it about a bicycle?'")\n\nI was merely an amateur parodist myself: my occasional efforts included "The Mormonne's Tale" (a Chaucer parody for my Mormon friend Hazel), "Werther In Italy" (a description, after, Goethe, of the tribulations of choosing ice cream), and "The Poetry of Spunk Drunk Brenda", a faux-naive critique of the obscene verses my friends Beth and Jude used to write in birthday and Christmas cards to me. Reading //Pale Fire// I instantly recognised the sustained brilliance of a master of the genre. \n\nThe text scanned (photographed, actually) and OCR-ed is the first UK edition (Weidenfeld & Nicholson, November 1962). The book is arranged naturally into bit-size chunks: Kinbote's gobbets of commentary and Shade's structure of cantos and stanzas seem eminently suited to the screen of a web-browser in the sort of format you are looking at. \n\nNo doubt this edition has received even less scholarship and painstaking attention detail than Kinbote's own copy. From the original, I have preserved in the [[Foreword|Foreword (6)]] the joke against shoddy proof-reading, and a mis-spelling ("instuctor" for "instructor": you can find it using the //Search// field). I may have omitted other subtle sparks of //nabokovskiy yumor//, and no doubt introduced errors of my own.\n\n
\nToday I completed:\n* Scanning, OCR and primary proof-reading of the [[Foreword]]\n* Scanning, OCR and primary proof-reading of the [[First Canto|Canto One]]\n* Entry of placeholders for some [[Commentary]] items\n\nOutstanding tasks:\n* Scanning, OCR and primary proof-reading of [[Commentary]] and [[Index]] for [[Canto One]]\n* Secondary proof-reading of all OCR items\n* Work on [[project description|The hypertext Pale Fire project]], and [[project commentary|bb]]\n\n
\nI have finished adding consistent navigation to [[Foreword]], [[Poem|Pale Fire]] and [[Commentary]] sections, and also to [[my spiel|About the hypertext]]. Now every page has a //next// and //previous// arrow, allowing the standard "tour" to be followed, much as in a real book. (N.b. at the moment, not sure which date is used to maintain the right order - //beware of this// and test)\n\nTried in addtion to do some clever things with the ~PresentationPlugin that I used elsewhere. This has a very clear and clean presentation-type interface, with some neat navigation tools, and all the default ~TiddlyWiki clutter removed. But that proved to be a bit beyond me right now. Perhaps it will be easier, once the text is finished, to import the content from here into a new Presentation style ~TiddlyWiki at [[TiddlySpot|http://www.tiddlyspot.com]].\n\n\n\n\n\n
No more additions to the original text, but a lot of general tidying up.
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 18/1/2007 18:22:54 | | [[palefire(3).html|file:///Users/richard/Desktop/palefire(3).html]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/1/2007 19:10:12 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/1/2007 19:11:29 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#InterfaceOptions]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/1/2007 19:11:59 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#%5B%5BAbout%20the%20hypertext%5D%5D]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/1/2007 19:16:49 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#Foreword]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/1/2007 19:20:8 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#Foreword]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/1/2007 19:44:11 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#%5B%5BForeword%20(15)%5D%5D]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/1/2007 20:34:30 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#%5B%5BUpdate%20(18%20January%202007)%5D%5D]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 18/1/2007 20:34:53 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#%5B%5BAbout%20the%20hypertext%5D%5D]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok | Ok |\n| 18/1/2007 20:38:42 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#AdvancedOptions]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 18/1/2007 20:42:13 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#%5B%5B18%20January%202007%5D%5D]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 19/1/2007 12:26:44 | YourName | [[/|http://palefire.tiddlyspot.com/]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 19/1/2007 12:28:12 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/1/2007 12:35:31 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 19/1/2007 13:24:13 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#Commentary]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/1/2007 13:30:27 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#Foreword]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 19/1/2007 13:37:48 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#Foreword]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 19/1/2007 14:44:56 | Jerry Bakewell | [[PaleFire.html|file://localhost/Users/richard/Desktop/TiddlyWikis/PaleFire.html#%5B%5BAbout%20the%20hypertext%5D%5D]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 27/7/2007 16:23:24 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#MainMenu]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 27/7/2007 16:32:19 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/#DefaultTiddlers]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 27/7/2007 16:43:28 | John Shade | [[/|http://palefire.tiddlyspot.com/#%5B%5BHow%20to%20use%20the%20hypertext%5D%5D]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 30/7/2007 21:50:59 | Jerry Bakewell | [[/|http://palefire.tiddlyspot.com/]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 30/7/2007 21:58:59 | Charles Kinbote | [[/|http://palefire.tiddlyspot.com/#Index]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 31/7/2007 0:8:46 | Charles Kinbote | [[/|http://palefire.tiddlyspot.com/#%5B%5BAbout%20the%20hypertext%5D%5D]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 31/7/2007 0:14:37 | Richard Davis | [[/|http://palefire.tiddlyspot.com/#Foreword]] | [[store.cgi|http://palefire.tiddlyspot.com/store.cgi]] | . | index.html | . |
/***\n|''Name:''|UploadPlugin|\n|''Description:''|Save to web a TiddlyWiki|\n|''Version:''|3.4.4|\n|''Date:''|Sep 30, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|\n|''Documentation:''|http://tiddlywiki.bidix.info/#UploadDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|\n|''Require:''|[[UploadService|http://tiddlywiki.bidix.info/#UploadService]]|\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 4, revision: 4, \n date: new Date(2006,8,30),\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n documentation: 'http://tiddlywiki.bidix.info/#UploadDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 1}, \n date: new Date(2006,8,19)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 3, date: new Date(2006,8,30),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) \n {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.className = "txtOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "pasOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n backupFileStored: "Previous file backuped in %0",\n crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n passwordEmpty: "Unable to upload, your password is empty",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.toDirUrl(storeUrl, uploadDir, username)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.toRootUrl = function (storeUrl, username)\n{\n return root = (this.dirname(storeUrl)?this.dirname(storeUrl):this.dirname(document.location.toString()));\n}\nconfig.macros.upload.toDirUrl = function (storeUrl, uploadDir, username)\n{\n var root = this.toRootUrl(storeUrl, username);\n if (uploadDir && uploadDir != '.')\n root = root + '/' + uploadDir;\n return root;\n}\nconfig.macros.upload.toFileUrl = function (storeUrl, toFilename, uploadDir, username)\n{\n return this.toDirUrl(storeUrl, uploadDir, username) + '/' + toFilename;\n}\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (!password || password === '') {\n alert(config.macros.upload.messages.passwordEmpty);\n return;\n }\n if (storeUrl === '') {\n storeUrl = config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n // Check that file is not locked\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {\n alert(config.macros.upload.messages.fileLocked);\n return;\n }\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n var toDir = config.macros.upload.toDirUrl(storeUrl, toFilename, uploadDir, username);\n displayMessage(config.macros.upload.messages.aboutToUpload.format([toDir]), toDir);\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, rssPath, uploadDir, username);\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [toFileUrl]), toFileUrl);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n if (responseText.indexOf("destfile:") > 0) {\n var destfile = responseText.substring(responseText.indexOf("destfile:")+9, \n responseText.indexOf("\sn", responseText.indexOf("destfile:")));\n toFileUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + destfile;\n }\n else {\n toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [toFileUrl]), toFileUrl);\n if (backupDir && responseText.indexOf("backupfile:") > 0) {\n var backupFile = responseText.substring(responseText.indexOf("backupfile:")+11, \n responseText.indexOf("\sn", responseText.indexOf("backupfile:")));\n toBackupUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + backupFile;\n displayMessage(config.macros.upload.messages.backupFileStored.format(\n [toBackupUrl]), toBackupUrl);\n }\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n // erase local lock\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n BidiX.GroupAuthoring.lock.eraseLock();\n // change mtime with new mtime after upload\n var mtime = responseText.substr(responseText.indexOf("mtime:")+6);\n BidiX.GroupAuthoring.lock.mtime = mtime;\n }\n \n \n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) {}\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir;\n // add lock attributes to sheader\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n var l = BidiX.GroupAuthoring.lock.myLock;\n sheader += ";lockuser=" + l.user\n + ";mtime=" + l.mtime\n + ";locktime=" + l.locktime;\n }\n sheader += ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n //strailer = "--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n try {\n request.open("POST", storeUrl, true); \n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent + "\snStatus: "+request.status.statusText);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n try {\n request.open("GET", document.location.toString(), true);\n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n \n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]) + "\snStatus: "+request.status.statusText);\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nsetStylesheet(\n ".pasOptionInput {width: 11em;}\sn"+\n ".txtOptionInput.txtUploadStoreUrl {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadFilename {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadDir {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadBackupDir {width: 25em;}\sn"+\n "",\n "UploadOptionsStyles");\nconfig.shadowTiddlers.UploadDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadDoc ]]\sn"; \nconfig.options.chkAutoSave = false; saveOptionCookie('chkAutoSave');\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n};\n\n//}}}\n////===\n
\nI agonised over whether, in the titles, to refer each gobbet of the poem as //verse//, //stanza// or //card//. Kinbote's reference to the missing "1000th verse" may suggest that he equates a verse with a line, or it may suggest that he envisaged the missing line to stand apart: a single-line verse. Nevertheless, in the end I preferred "verse" to "stanza", which is a term not used in the book, and to "card" which seemed to place too much emphasis on the process of composition that Nabokov attributes to his fictional poet. \n\nThat said, I have imitated, as far as possible, Shade's practice of heading each card with the date, simply because this feature is already part of the way ~TiddlyWiki works by default. (We can infer the dates on //most// of the cards from [[Kinbote's commentary|Commentary]]).\n\nThe act of scanning a book (actually, photographing it) and running it through optical character recognition software has been an instructive one. It's a time-comsuming process to do even a passable job, though it's less of a hardship when it's a text one enjoys. There are still many paper-based texts in the world, in need of scanning if they are to have a chance of surviving long in an online, digitised world -- and it's going to take time and effort to do them justice.
<!--{{{-->\n<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view created date [[DD MMM YYYY]]'></span>. </div>\n<div class='viewer'> <span macro='view text wikified'></span><p/><span macro='navigation "" "" card'></span><span macro='navigation "" "" foreword'></span><span macro='navigation "" "" commentary'><span macro='navigation "" "" hypertext-editor'></span></div>\n</div>\n<div class='tagClear'></div>\n\n\n<!--}}}-->
This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.\n\n@@font-weight:bold;font-size:1.3em;color:#444; //What now?// @@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://palefire.tiddlyspot.com/controlpanel]] (your control panel username is //palefire//).\n<<tiddler tiddlyspotControls>>\n@@font-weight:bold;font-size:1.3em;color:#444; //Working online// @@ You can edit this ~TiddlyWiki right now, and save your changes using the "save to web" button in the column on the right.\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// @@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click "upload" and your ~TiddlyWiki will be saved back to tiddlyspot.com.\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Help!// @@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// @@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions.
| tiddlyspot password:|<<option pasUploadPassword>>|\n| site management:|<<upload http://palefire.tiddlyspot.com/store.cgi index.html . . palefire>>//(requires tiddlyspot password)//<<br>>[[control panel|http://palefire.tiddlyspot.com/controlpanel]], [[download (go offline)|http://palefire.tiddlyspot.com/download]]|\n| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|