Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
Welcome one, welcome all, whether from the north, the south the east and the west, welcome. The Banburyshire concept has been in use now for over 150 years, in many forms and by many people, but in essence describes crossing boundaries. From the past, present and future, the real and the imagined, the recorded and the live, and the online and offline. So this evening take a glimpse into the world of Banburyshire through music, song, stories, and humour. During the interval, please consider purchasing CDs in support of the folk club, and at a later time, why not visit the banburyshire.net website where you can listen to over 200 podcasts, freely available, or to browse through the big picture photo gallery or check out the links to other interesting websites, or play the Banburyshire quiz. The music introducing this evening was Cave, a Banburyshire band if ever there was one, with And We Couldn't Stop Smiling, taken from their first studio CD, Welcome Welcome. Gregg Cave is not only a charismatic front-man for the band, but is an apprentice farrier, showing his traditions. He has also been a presenter of the Banburyshire Brolly podcasts, along with our own Linda Watkins.
Finally, before handing over to your living guide for the evening, Jules the Apprentice Banburyshire Storyteller, may I ask that whenever you hear the word Wassail (good health in Middle English), please respond in good heart with Drin Hael (drink and be healthy).
First Set :-
Richard - Recorded intro (provided by Jules)
Jules - Wassail
Davey and Sheena - Morris tunes – Banbury Bill etc
Jules - Old George and the Red Triangle
Davey and Sheena - 2 more songs/tunes
Jules - The Blue Grave – a Salt Way Story
The Guy Puddlers - Centurians by the Seaside - a Guy Puddlers skit
Davey and Sheena - Cotswold song
Jules - Fred Vokins and the Ironstones Railway
Second Set :-
Jules - Horace The Hobby Horse
Jules - Morris Horseman
Paul - 3 French songs
Jules - The Old Back Door
Linda - Too Close To The Wind
Jules - When Soulful Huw meets Angharad The Much Loved One
Linda - Welsh Song
Jules - The Shennington Goldmine
Jules, All - Fred Vokins, Engine Driver
Bob's Banana Bread Beer Song
Ale Oh, Ale Oh, Bob is a spaniel and he likes to drink beer
Ale Oh, Ale Oh, Bob is a spaniel and he likes to drink beer
Four X , six X, Donnington Ale
Bob is a spaniel and he likes to drink beer
Four X , six X, Donnington Ale
Bob is a spaniel and he likes to drink beer
Ale Oh, Ale Oh, Bob is a spaniel and he likes to drink beer
Ale Oh, Ale Oh, Bob is a spaniel and he likes to drink beer
Four X , six X, King and Barnes Old
Bob is a spaniel and he likes to drink beer
Four X , six X, King and Barnes Old
Bob is a spaniel and he likes to drink beer
Ale Oh, Ale Oh, Bob is a spaniel and he likes to drink beer
Ale Oh, Ale Oh, Bob is a spaniel and he likes to drink beer
Four X , six X, Banana Bread Beer
Bob is a spaniel and he likes to drink beer
Four X , six X, Banana Bread Beer
Bob is a spaniel and he likes to drink beer
Ale Oh, Ale Oh, Bob is a spaniel and he likes to drink beer
January 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | | | | | 01 | 02 |
| 03 | 04 | 05 | 06 | 07 | 08 | 09 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 | | | | | | |
February 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | 01 | 02 | 03 | 04 | 05 | 06 |
| 07 | 08 | 09 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | | | | | | |
March 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | 01 | 02 | 03 | 04 | 05 | 06 |
| 07 | 08 | 09 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | | | |
April 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | | | | 01 | 02 | 03 |
| 04 | 05 | 06 | 07 | 08 | 09 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | |
May 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | | | | | | 01 |
| 02 | 03 | 04 | 05 | 06 | 07 | 08 |
| 09 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | | | | | |
June 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | | 01 | 02 | 03 | 04 | 05 |
| 06 | 07 | 08 | 09 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | | | |
July 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | | | | 01 | 02 | 03 |
| 04 | 05 | 06 | 07 | 08 | 09 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
August 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| 01 | 02 | 03 | 04 | 05 | 06 | 07 |
| 08 | 09 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | | | | |
September 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | | | 01 | 02 | 03 | 04 |
| 05 | 06 | 07 | 08 | 09 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | | |
October 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | | | | | 01 | 02 |
| 03 | 04 | 05 | 06 | 07 | 08 | 09 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 | | | | | | |
November 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | 01 | 02 | 03 | 04 | 05 | 06 |
| 07 | 08 | 09 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | | | | |
December 2011
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | | | 01 | 02 | 03 | 04 |
| 05 | 06 | 07 | 08 | 09 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 | |
<hr>
Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| | | | 01 | 02 | 03 | 04 |
| 05 | 06 | 07 | 08 | 09 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 | |
| 31 | | | | | | |
| 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
| | | | | | | |
/***
|Name|CalendarPlugin|
|Source|http://www.TiddlyTools.com/#CalendarPlugin|
|Version|1.5.0|
|Author|Eric Shulman|
|Original Author|SteveRumsby|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Description|display monthly and yearly calendars|
NOTE: For //enhanced// date popup display, optionally install [[DatePlugin]] and [[ReminderMacros]]
!!!Usage:
<<<
|{{{<<calendar>>}}}|full-year calendar for the current year|
|{{{<<calendar year>>}}}|full-year calendar for the specified year|
|{{{<<calendar year month>>}}}|one month calendar for the specified month and year|
|{{{<<calendar thismonth>>}}}|one month calendar for the current month|
|{{{<<calendar lastmonth>>}}}|one month calendar for last month|
|{{{<<calendar nextmonth>>}}}|one month calendar for next month|
|{{{<<calendar +n>>}}}<br>{{{<<calendar -n>>}}}|one month calendar for a month +/- 'n' months from now|
<<<
!!!Configuration:
<<<
|''First day of week:''<br>{{{config.options.txtCalFirstDay}}}|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|
|''First day of weekend:''<br>{{{config.options.txtCalStartOfWeekend}}}|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|
<<option chkDisplayWeekNumbers>> Display week numbers //(note: Monday will be used as the start of the week)//
|''Week number display format:''<br>{{{config.options.txtWeekNumberDisplayFormat }}}|<<option txtWeekNumberDisplayFormat >>|
|''Week number link format:''<br>{{{config.options.txtWeekNumberLinkFormat }}}|<<option txtWeekNumberLinkFormat >>|
<<<
!!!Revisions
<<<
2009.04.31 [1.5.0] rewrote onClickCalendarDate() (popup handler) and added config.options.txtCalendarReminderTags. Partial code reduction/cleanup. Assigned true version number (1.5.0)
2008.09.10 added '+n' (and '-n') param to permit display of relative months (e.g., '+6' means 'six months from now', '-3' means 'three months ago'. Based on suggestion from Jean.
2008.06.17 added support for config.macros.calendar.todaybg
2008.02.27 in handler(), DON'T set hard-coded default date format, so that *customized* value (pre-defined in config.macros.calendar.journalDateFmt is used.
2008.02.17 in createCalendarYear(), fix next/previous year calculation (use parseInt() to convert to numeric value). Also, use journalDateFmt for date linking when NOT using [[DatePlugin]].
2008.02.16 in createCalendarDay(), week numbers now created as TiddlyLinks, allowing quick creation/navigation to 'weekly' journals (based on request from Kashgarinn)
2008.01.08 in createCalendarMonthHeader(), 'month year' heading is now created as TiddlyLink, allowing quick creation/navigation to 'month-at-a-time' journals
2007.11.30 added 'return false' to onclick handlers (prevent IE from opening blank pages)
2006.08.23 added handling for weeknumbers (code supplied by Martin Budden (see 'wn**' comment marks). Also, incorporated updated by Jeremy Sheeley to add caching for reminders (see [[ReminderMacros]], if installed)
2005.10.30 in config.macros.calendar.handler(), use 'tbody' element for IE compatibility. Also, fix year calculation for IE's getYear() function (which returns '2005' instead of '105'). Also, in createCalendarDays(), use showDate() function (see [[DatePlugin]], if installed) to render autostyled date with linked popup. Updated calendar stylesheet definition: use .calendar class-specific selectors, add text centering and margin settings
2006.05.29 added journalDateFmt handling
<<<
!!!Code
***/
//{{{
version.extensions.CalendarPlugin= { major: 1, minor: 5, revision: 0, date: new Date(2009,5,31)};
//}}}
//{{{
if(config.options.txtCalFirstDay == undefined)
config.options.txtCalFirstDay = 0;
if(config.options.txtCalStartOfWeekend == undefined)
config.options.txtCalStartOfWeekend = 5;
if(config.options.chkDisplayWeekNumbers == undefined)
config.options.chkDisplayWeekNumbers = false;
if(config.options.chkDisplayWeekNumbers)
config.options.txtCalFirstDay = 0;
if(config.options.txtWeekNumberDisplayFormat == undefined)
config.options.txtWeekNumberDisplayFormat = 'w0WW';
if(config.options.txtWeekNumberLinkFormat == undefined)
config.options.txtWeekNumberLinkFormat = 'YYYY-w0WW';
if(config.options.txtCalendarReminderTags == undefined)
config.options.txtCalendarReminderTags = 'reminder';
config.macros.calendar = {
monthnames:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
daynames:['M','T','W','T','F','S','S'],
todaybg:'#ccccff',
weekendbg:'#c0c0c0',
monthbg:'#e0e0e0',
holidaybg:'#ffc0c0',
journalDateFmt:'DD MMM YYYY',
monthdays:[31,28,31,30,31,30,31,31,30,31,30,31],
holidays:[ ] // for customization see [[CalendarPluginConfig]]
};
//}}}
//{{{
function calendarIsHoliday(date)
{
var longHoliday = date.formatString('0DD/0MM/YYYY');
var shortHoliday = date.formatString('0DD/0MM');
for(var i = 0; i < config.macros.calendar.holidays.length; i++) {
if( config.macros.calendar.holidays[i]==longHoliday
|| config.macros.calendar.holidays[i]==shortHoliday)
return true;
}
return false;
}
//}}}
//{{{
config.macros.calendar.handler = function(place,macroName,params) {
var calendar = createTiddlyElement(place, 'table', null, 'calendar', null);
var tbody = createTiddlyElement(calendar, 'tbody');
var today = new Date();
var year = today.getYear();
if (year<1900) year+=1900;
// get journal format from SideBarOptions (ELS 5/29/06 - suggested by MartinBudden)
var text = store.getTiddlerText('SideBarOptions');
var re = new RegExp('<<(?:newJournal)([^>]*)>>','mg'); var fm = re.exec(text);
if (fm && fm[1]!=null) { var pa=fm[1].readMacroParams(); if (pa[0]) this.journalDateFmt = pa[0]; }
var month=-1;
if (params[0] == 'thismonth') {
var month=today.getMonth();
} else if (params[0] == 'lastmonth') {
var month = today.getMonth()-1; if (month==-1) { month=11; year--; }
} else if (params[0] == 'nextmonth') {
var month = today.getMonth()+1; if (month>11) { month=0; year++; }
} else if (params[0]&&'+-'.indexOf(params[0].substr(0,1))!=-1) {
var month = today.getMonth()+parseInt(params[0]);
if (month>11) { year+=Math.floor(month/12); month%=12; };
if (month<0) { year+=Math.floor(month/12); month=12+month%12; }
} else if (params[0]) {
year = params[0];
if(params[1]) month=parseInt(params[1])-1;
if (month>11) month=11; if (month<0) month=0;
}
if (month!=-1) {
cacheReminders(new Date(year, month, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, month);
} else {
cacheReminders(new Date(year, 0, 1, 0, 0), 366);
createCalendarYear(tbody, year);
}
window.reminderCacheForCalendar = null;
}
//}}}
//{{{
// cache used to store reminders while the calendar is being rendered
// it will be renulled after the calendar is fully rendered.
window.reminderCacheForCalendar = null;
//}}}
//{{{
function cacheReminders(date, leadtime)
{
if (window.findTiddlersWithReminders == null) return;
window.reminderCacheForCalendar = {};
var leadtimeHash = [];
leadtimeHash [0] = 0;
leadtimeHash [1] = leadtime;
var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);
for(var i = 0; i < t.length; i++) {
//just tag it in the cache, so that when we're drawing days, we can bold this one.
window.reminderCacheForCalendar[t[i]['matchedDate']] = 'reminder:' + t[i]['params']['title'];
}
}
//}}}
//{{{
function createCalendarOneMonth(calendar, year, mon)
{
var row = createTiddlyElement(calendar, 'tr');
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon]+' '+year, true, year, mon);
row = createTiddlyElement(calendar, 'tr');
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarMonth(calendar, year, mon)
{
var row = createTiddlyElement(calendar, 'tr');
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon]+' '+ year, false, year, mon);
row = createTiddlyElement(calendar, 'tr');
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarYear(calendar, year)
{
var row;
row = createTiddlyElement(calendar, 'tr');
var back = createTiddlyElement(row, 'td');
var backHandler = function() {
removeChildren(calendar);
createCalendarYear(calendar, parseInt(year)-1);
return false; // consume click
};
createTiddlyButton(back, '<', 'Previous year', backHandler);
back.align = 'center';
var yearHeader = createTiddlyElement(row, 'td', null, 'calendarYear', year);
yearHeader.align = 'center';
yearHeader.setAttribute('colSpan',config.options.chkDisplayWeekNumbers?22:19);//wn**
var fwd = createTiddlyElement(row, 'td');
var fwdHandler = function() {
removeChildren(calendar);
createCalendarYear(calendar, parseInt(year)+1);
return false; // consume click
};
createTiddlyButton(fwd, '>', 'Next year', fwdHandler);
fwd.align = 'center';
createCalendarMonthRow(calendar, year, 0);
createCalendarMonthRow(calendar, year, 3);
createCalendarMonthRow(calendar, year, 6);
createCalendarMonthRow(calendar, year, 9);
}
//}}}
//{{{
function createCalendarMonthRow(cal, year, mon)
{
var row = createTiddlyElement(cal, 'tr');
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);
row = createTiddlyElement(cal, 'tr');
createCalendarDayHeader(row, 3);
createCalendarDayRows(cal, year, mon);
}
//}}}
//{{{
function createCalendarMonthHeader(cal, row, name, nav, year, mon)
{
var month;
if (nav) {
var back = createTiddlyElement(row, 'td');
back.align = 'center';
back.style.background = config.macros.calendar.monthbg;
var backMonHandler = function() {
var newyear = year;
var newmon = mon-1;
if(newmon == -1) { newmon = 11; newyear = newyear-1;}
removeChildren(cal);
cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, newmon);
return false; // consume click
};
createTiddlyButton(back, '<', 'Previous month', backMonHandler);
month = createTiddlyElement(row, 'td', null, 'calendarMonthname')
createTiddlyLink(month,name,true);
month.setAttribute('colSpan', config.options.chkDisplayWeekNumbers?6:5);//wn**
var fwd = createTiddlyElement(row, 'td');
fwd.align = 'center';
fwd.style.background = config.macros.calendar.monthbg;
var fwdMonHandler = function() {
var newyear = year;
var newmon = mon+1;
if(newmon == 12) { newmon = 0; newyear = newyear+1;}
removeChildren(cal);
cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, newmon);
return false; // consume click
};
createTiddlyButton(fwd, '>', 'Next month', fwdMonHandler);
} else {
month = createTiddlyElement(row, 'td', null, 'calendarMonthname', name)
month.setAttribute('colSpan',config.options.chkDisplayWeekNumbers?8:7);//wn**
}
month.align = 'center';
month.style.background = config.macros.calendar.monthbg;
}
//}}}
//{{{
function createCalendarDayHeader(row, num)
{
var cell;
for(var i = 0; i < num; i++) {
if (config.options.chkDisplayWeekNumbers) createTiddlyElement(row, 'td');//wn**
for(var j = 0; j < 7; j++) {
var d = j + (config.options.txtCalFirstDay - 0);
if(d > 6) d = d - 7;
cell = createTiddlyElement(row, 'td', null, null, config.macros.calendar.daynames[d]);
if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))
cell.style.background = config.macros.calendar.weekendbg;
}
}
}
//}}}
//{{{
function createCalendarDays(row, col, first, max, year, mon) {
var i;
if (config.options.chkDisplayWeekNumbers){
if (first<=max) {
var ww = new Date(year,mon,first);
var td=createTiddlyElement(row, 'td');//wn**
var link=createTiddlyLink(td,ww.formatString(config.options.txtWeekNumberLinkFormat),false);
link.appendChild(document.createTextNode(
ww.formatString(config.options.txtWeekNumberDisplayFormat)));
}
else createTiddlyElement(row, 'td');//wn**
}
for(i = 0; i < col; i++)
createTiddlyElement(row, 'td');
var day = first;
for(i = col; i < 7; i++) {
var d = i + (config.options.txtCalFirstDay - 0);
if(d > 6) d = d - 7;
var daycell = createTiddlyElement(row, 'td');
var isaWeekend=((d==(config.options.txtCalStartOfWeekend-0)
|| d==(config.options.txtCalStartOfWeekend-0+1))?true:false);
if(day > 0 && day <= max) {
var celldate = new Date(year, mon, day);
// ELS 10/30/05 - use <<date>> macro's showDate() function to create popup
// ELS 05/29/06 - use journalDateFmt
if (window.showDate) showDate(daycell,celldate,'popup','DD',
config.macros.calendar.journalDateFmt,true, isaWeekend);
else {
if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;
var title = celldate.formatString(config.macros.calendar.journalDateFmt);
if(calendarIsHoliday(celldate))
daycell.style.background = config.macros.calendar.holidaybg;
var now=new Date();
if ((now-celldate>=0) && (now-celldate<86400000)) // is today?
daycell.style.background = config.macros.calendar.todaybg;
if(window.findTiddlersWithReminders == null) {
var link = createTiddlyLink(daycell, title, false);
link.appendChild(document.createTextNode(day));
} else
var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);
}
}
day++;
}
}
//}}}
//{{{
// Create a pop-up containing:
// * a link to a tiddler for this date
// * a 'new tiddler' link to add a reminder for this date
// * links to current reminders for this date
// NOTE: this code is only used if [[ReminderMacros]] is installed AND [[DatePlugin]] is //not// installed.
function onClickCalendarDate(ev) { ev=ev||window.event;
var d=new Date(this.getAttribute('title')); var date=d.formatString(config.macros.calendar.journalDateFmt);
var p=Popup.create(this); if (!p) return;
createTiddlyLink(createTiddlyElement(p,'li'),date,true);
var rem='\\n\\<\\<reminder day:%0 month:%1 year:%2 title: \\>\\>';
rem=rem.format([d.getDate(),d.getMonth()+1,d.getYear()+1900]);
var cmd="<<newTiddler label:[[new reminder...]] prompt:[[add a new reminder to '%0']]"
+" title:[[%0]] text:{{store.getTiddlerText('%0','')+'%1'}} tag:%2>>";
wikify(cmd.format([date,rem,config.options.txtCalendarReminderTags]),p);
createTiddlyElement(p,'hr');
var t=findTiddlersWithReminders(d,[0,31],null,1);
for(var i=0; i<t.length; i++) {
var link=createTiddlyLink(createTiddlyElement(p,'li'), t[i].tiddler, false);
link.appendChild(document.createTextNode(t[i]['params']['title']));
}
Popup.show(); ev.cancelBubble=true; if (ev.stopPropagation) ev.stopPropagation(); return false;
}
//}}}
//{{{
function calendarMaxDays(year, mon)
{
var max = config.macros.calendar.monthdays[mon];
if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) max++;
return max;
}
//}}}
//{{{
function createCalendarDayRows(cal, year, mon)
{
var row = createTiddlyElement(cal, 'tr');
var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first1 < 0) first1 = first1 + 7;
var day1 = -first1 + 1;
var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first2 < 0) first2 = first2 + 7;
var day2 = -first2 + 1;
var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first3 < 0) first3 = first3 + 7;
var day3 = -first3 + 1;
var max1 = calendarMaxDays(year, mon);
var max2 = calendarMaxDays(year, mon+1);
var max3 = calendarMaxDays(year, mon+2);
while(day1 <= max1 || day2 <= max2 || day3 <= max3) {
row = createTiddlyElement(cal, 'tr');
createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;
createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;
}
}
//}}}
//{{{
function createCalendarDayRowsSingle(cal, year, mon)
{
var row = createTiddlyElement(cal, 'tr');
var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first1 < 0) first1 = first1+ 7;
var day1 = -first1 + 1;
var max1 = calendarMaxDays(year, mon);
while(day1 <= max1) {
row = createTiddlyElement(cal, 'tr');
createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
}
}
//}}}
//{{{
setStylesheet('.calendar, .calendar table, .calendar th, .calendar tr, .calendar td { text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }', 'calendarStyles');
//}}}
// // override cookie settings for CalendarPlugin:
//{{{
config.options.txtCalFirstDay=6;
config.options.txtCalStartOfWeekend=5;
//}}}
// // override internal default settings for CalendarPlugin:
//{{{
config.macros.calendar.journalDateFmt="DDD MMM 0DD YYYY";
//}}}
Centurians by the Seaside - a Guy Puddlers sketch
Narrator: We have many short cuts to thank the Romans for, short haircuts, short dresses and Roman roads. Here's an explanation of one of the reasons why the Fosse Way runs from Leicestershire to Lyme Regis on the Dorset coast.
Centurian: Wife, why are you looking so unhappy?
Wife: We have been on this British Isle for two years now, without a break. I miss the sea, the sand and the snuggling up!
Centurian: I'll have a word with the General, I fancy a bit of a snuggle.
Narrator: The next day the Centurian requests to see the General.
General: Centurian, what can I do for you?
Centurian: Well sir, me and the lads haven't had a break since we arrived here, and the good lady wife fancies a trip to the sea
General: Good news for you then, Centurian, for the new Fosse Way has just opened. We can all have a break. You can drop me off at Bath so I
can have a dip in the spa, while you and the lads take your womenfolk to Lyme for the day.
Centurian: Thankyou very much sir, I tell the lads.
Wife: I was hoping to get away for our wedding anniversary, if at all possible, sir. It's been a long time since I've got Roger down on the beach.
Centurian: You haven't called me Roger in ages!
General: When your anniversary then, Centurian?
Centurian: In two weeks time, sir
General: Well then, there's no time to waste, we'd better set off tomorrow!
Climbing Everest in Dorset
The two landlords of the Anchor Inn at Seatown with the annual fund-raiser challenge
Walking from the Anchor to the top of Golden Cap the equivalent of climbing Mt Everest, 47 times!
Practised by walking to work from Charmouth and Bridport
Day 1 - Start delayed by Cornish Colin and Huge Furry Knittingstool
Day 2 - Head butted on leg by Dorset sheep with spiral horns and a dreadlock coat
Day 3 - Hit on same leg by old codger with adverse comments about Everest double glazing
Day 4 - Use Sherpa van to get barrel of Palmers to top of Golden Cap, leave girls to guard it
Day 5 - Local newspaper reports lights in the sky and strange sounds, not 'UFO's but impromtu rave
Success. Over £7000 raised for CLIC Sergeant
The Cursed Warehouse
This is a dark story. Not all Banburyshire tales are light-hearted and frivolous and this tells of a time before the motorways, before the railways and even before the tarmaced main roads, when moving goods about the country relied on pack horses and wagons, leading to many breakages of manufactured goods, such at pottery from Staffordshire. So the news of a canal to pass through the area, smoothing the passage of trade was greatly welcomed. The great engineer James Brindley started the Oxford Canal, but sadly died before it was completed, and so the work was left to his brother in law, Samuel Simcock. The section to Banbury was built in good time and to a good standard, but ran out of money again. It those days, it took an act of Parliament to raise the funds, and it was a further 8 years before the remaining section to Oxford was started, let alone completed. So Banbury became a terminus, with wharfs and a vibrant, money-making bustle to this hitherto quiet farming town.
The canal engineers had the vision and expertise to design the canals, the canal companies had M.P.s on their boards of directors to facilitate funding, and the use of Irish navigators and puddlers is well known. But who were the people who lived on the narrow boats, moving the goods around the network? In those days most people were restricted, by the Poor Laws, to work in the parish of their birth, and so it was down to the Romany gypsies, well acquainted to a travelling lifestyle, to provide the essential workforce to run the boats. It was also said that if you struck a bargain with a Romany then they would keep their side of the deal, even if it meant sacrificing their own lives. But if you crossed them, then watch out, for they had long memories.
And so, with Banbury growing in wealth, a family came to town with their horse-drawn narrow boart, The hard-working father enjoying this new method of travel, his wife versed in the old ways and their two children, a young girl with black hair and a voice like a nightingale, and her younger red-haired brother, devoted to his older sister. She sang in the local pubs bringing harmony amongst the disparate groups of customers, and the sound of her voice was loved by all.
Then, one evening, as they were making their way back up the canal to their parents boat, they were stopped by three young men. And the young men, the drunken young men, asked for her to sing some more. But she replied that they must be getting home, for their parents were expecting them, and that she had sung already that evening. The young men became abusive, and the frightened sister and brother sought refuge in the nearby warehouse, which they knew from their father. However these yobs were the sons of the merchant who owned the warehouse, and quickly found the sister and brother, and set about the boy, who was valiantly trying to defend his sister, but they knocked him to the ground and kicked him until he lay dying. His sister fled to the stairs, to the top of the warehouse, but again was found, with two of the brothers coming from one direction, and one from the other. And she cried out "Do not come nearer or else I shall jump" But the eldest brother said "There is no need to jump" and with that he pushed her out into the void, where she fell, screaming, to her death, landing close by to her devoted brother.
The nightwatchman, a gammy-legged chap named Pugh, had heard the screams but by the time he arrived in the courtyard, the brothers were fleeing out a side door. Pugh knew the sister and brother, for he was a Romany himself, and he was filled with great sadness. He called for the constable to be sent for, but the constable sent a reply saying he would look into things in the morning, as this was probably just a family squabble, and why should he come out so late in the evening. So Pugh, with help from some of the crowd who had gathered at the scene, picked up the bodies of the girl and boy, and carried them up the canal path to their parents boat.
The black haired girl with a voice like a song-bird and her devoted red-haired younger brother
Pugh the Night Watchman
Rosie and Jim
[[IntroductioN]]
[[HoracE]]
/%
!info
|Name|DigitalClock|
|Source|http://www.TiddlyTools.com/#DigitalClock|
|Version|2.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|display current time with automatic update|
Usage
<<<
{{{
<<tiddler DigitalClock with: format tick>>
}}}
*''format'' is any TiddlyWiki date/time formatting string
*''tick'' is the time in seconds between display updates (default=1sec)
<<<
Example
<<<
show hours, minutes and seconds, updated once per second:
{{{<<tiddler DigitalClock with: "hh:0mm:0ss" 1>>}}}
<<tiddler DigitalClock##show with: "hh:0mm:0ss" 1>>
<<<
!end
!show
<html><a href='javascript:;'></a></html><<tiddler {{
window.DigitalClock_tick=function(id){
var e=document.getElementById(id); if (!e) return;
e.title='click to '+(e.paused?'RESUME':'PAUSE')+' clock display';
if (e.paused) return;
e.innerHTML=new Date().formatString(e.fmt);
e.timer=setTimeout('window.DigitalClock_tick('+id+')',e.tick*1000);
}
var e=place.lastChild.firstChild;
e.id=new Date().getTime()+Math.random();
e.onclick=function(){this.paused=!this.paused;window.DigitalClock_tick(this.id);}
e.style.cursor='pointer';
e.fmt=('$1'=='$'+'1')?'hh12:0mm:0ss am':'$1';
e.tick=('$2'=='$'+'2')?'1':'$2';
if (e.timer===undefined) window.DigitalClock_tick(e.id);
'';}}>>
!end
%/<<tiddler {{'DigitalClock##'+(tiddler&&tiddler.title=='DigitalClock'?'info':'show');}}
with: [[$1]] [[$2]]>>
Fred Vokins, Engine Driver
Chorus :-
Fred Vokins, engine driver
With his wife, Maude, by his side
And the comrades all around them
How Fred worked, and worked with pride
Fred he joined the British army
Fought throughout the first world war
But he never spoke of battles
Just the time he worked in Stores
Fred then joined the Ironstones railway
Learned to be a steamer man
Hauling ironstone down from Wroxton
And the empties back again
After twenty five years of service
Not a silver plate for he
But he got the name the loco
Called it Maude, now don't you see
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
Guy Fawkes - a Guy Puddlers sketch
Guy Fawkes was always getting into trouble with the authorities in England, and the king was so fed up with him, he had him sent abroad.
So Guy was transported from England, but due to a navigation error he ended up in China, instead of Australia.
However, this was no bad thing for Guy, as Woo Flung Poo - his old nanny, had taught him Cantonese as a child.
At that time, the Chinese had a habit of crucifying their criminals, and leaving their bodies on show, as a deterrent, but this lead to a spread of disease, which they were at a loss to control.
Guy Fawkes, ever the loud-mouth, persuaded the authorities to burn the bodies, after a period of a couple of days, by placing wood around the stakes, and this caused a great reduction in illness, but a huge increase in smog.
This suggestion not only bought Guy his freedom to return to England by the Silk Route, but also the European concession for the use of Chinese gunpowder. The rest, as they say, is history.
The Honeybourne Hut
Franz and Elspeth Altwasser parents to Richard, who was part of the 4-man design team which built the Sinclair Zx81.
Franz was a navigator in a German bomber, shot down on it's way to Coventry. It was his first, and last raid, and as a prisoner of war he was sent to the Vale of Evesham to work on the land.
Getting off the train at Honeybourne, his attention was immediately caught by the sight of the station managers granddaughter, helping out her gramps, due to the shortage of men. Her name was Elspeth, as he had heard someone call out and Franz knew he would have to bide his time, but he would like to get to know her better.
So he settled into life in the Vale, working in the fields, digging, hoeing and picking crops of sprouts and cabbages. Taking his time to learn English better, and try to be accepted by the locals. In what little spare time he had, he spent on carving pieces of wood, as he had been working for his own father before the war, training as a carpenter, and was a natural at understanding the properties and form of wood.
Franz noticed that the young courting couples all used the railwayman's hut in the station yard to meet up of an evening, where they could get to know each other better. This was in the days before youth clubs and discos, so anywhere out of the weather where young lovers could go was valued. The only problem was that the door couldn't be locked from the inside, and on a number of occasions youngsters had been rudely interrupted in their romance. Franz came up with an idea. He produced wooden carvings for each couple, of birds and flowers and such like, which could be placed in the window above the door to the hut, indicating it being in use, and by whom.
This turned out to be a popular solution, greatly appreciated by the youth of the village. As for his own romantic aspirations, Franz had to wait further, as Elspeth had departed off to teacher training college, but he was a patient young man.
At the end of the war, Franz stayed on at Honeybourne. He had no real ambition to return to Germany, and felt his future was in the Vale, with Elspeth, as she had returned to teach in the local school. But he had wait yet again, as the government brought in legislation to prevent prisoners of war from associating with the locals. By this time, Franz's skills as a carpenter were in great demand, as some of the courting couples had married, and were looking for furniture for their new homes, and in due course, cribs and baby toys. So Franz was able to set up business in the village as a carpenter, an occupation he retained until his retirement.
It was 1955 before Franz and Elspeth were eventually married, and the following year Richard was born. If you visit the village of Honeybourne, you may well be able to see wooden carvings in the windows of a number of cottages, as reminders of the young lovers and the Honeyboune Hut.
Horace The Hobby Horse
Horace the Hobby Horse hardly ever leaves Hampshire
Preferring to prance in his paddock, playing with his pre-teen patrons, Peter and Petunia
Sashaying across the sward, swathed in silky silks and sumptuous satin
Green garters and garish jumpers, garnished with garnets which gleam and glow even in the gloaming
Horace the Hobby Horse hardly ever leaves Hampshire
Then one particular day the part-time postman popped his peaked cap around the poppies
"Special delivery, sign here" says he, "something to get 'cited about"
The card contained the caption "Hobby Horse festival" and an invitation
“Dear Horace, please join us for the 10th Birthday of the Banbury Hobby Horse Festival
RSVP Verna and Steven”
Horace the Hobby Horse left Hampshire
Big city Banbury beckoned, beamed Horace, boulevards of bouquets, bags of bonhomie, and buxom barmaids, blushed Horace.
Heaps of hobby horses, hobnobbing and horsing around happily
With Demons deftly demonstrating daftness, daring and dark ale drinking
Horace the Hobby Horse returned to Hampshire
Nurturing new friendships with the neighbourly New Forest ponies
Discoursing dynamically with the donkeys and the dotty deer
Cheerfully conversing with contented cattle at the convivial watering holes
Horace the Hobby Horse was home
Written by Jules Procter, June 2010
When Soulful Huw meets Angharad The Much Loved One - a Salt Way Story
Huw came from the lands of Snowdonia, the youngest son of a slate mine owner, who was hoping to expand the market for his goods.
Huw's Da had already trained up his two elder sons to take over the business, and he wanted Huw to make his own way in life, so he brought him along on a trading expedition to the lands of the Mercians, which resulted in things turning out better than he could ever have imagined. While Huw was bright, his real skills lay as a musician, a harpist, and a poet, but not up the standards of the best of the Bards, so he was only too happy to go along with his Da, leaving the mountains behind, for what would turn out to be the last time.
The father and son made use of the Salt Way leading from mid-Wales back to Droitwich, running over the Malvern Hills through a cutting known then as now, as the Wych. Reaching the cutting one misty morning, they stopped to catch their breath and compare the lands beside the River Severn laying out in front of them, to the distant mountains of their homeland back to the west. With the mist still rising, they couldn't see the tops of the hills, but heard the sound of small bells coming out down from the clouds. After some moments a figure appeared wearing a grey hooded cloak, sitting upon a white horse. The animal and rider came to a halt some feet away, and all fell silent.
"Good morrow" spoke Huw's Da, "Do you always enjoy a ride in the fog? Without your bells we wouldn't have known you were there."
The figure threw back the hood of the cloak to reveal a beautiful young girl, who laughed "But I could hear you, with your cursing and cussing as you came up the Way."
Huw stepped forward and asked "May I introduce my father and myself? Da is a slate miner looking to trade hereabouts, and I am a musician looking for adventure" . When the girl extended her hand to him, he took it, and a shock passed though them as if hit by lightning. "I am Angharad of the Salt Way" she announced "I think you need to look no further."
From that day on, Angharad, The Much Loved One and Huw the Soulful, were inseparable. And she had music wherever she went.
These Banburyshire Stories are part of my attempt to learn to become a traditional-style storyteller, as an apprentice over a period of six or seven years.
Most are based on true events, or inspired by stories I have been told, or people I have met.
The individual story notes here are not meant to be definitive, but just a guide, for I usually adjust each story depending on the audience, and how I see the story evolving over time.
Jules Procter
The Apprentice Banburyshire Storyteller
Fred Vokins and the Ironstones Railway
Fred Vokins was born in 1889 in Didcot, and moved to Banbury at the age of five, when his father's railway job changed.
At Dashwood Road school he met Maud, the love of his life, but at the age of 16 he decided to join the Army instead of joining his dad.
Although he saw action throughout the first world war, he would only talk about his time in the quartermasters stores, and on leaving the army in 1920, he returned to Banbury in search of his sweetheart. In the meantime, Maud had trained as a nurse, and by the time Fred returned, she had become a ward sister. The couple married, and as Fred had secured a job on the Ironstones railway as a trainee stream engine driver, the newly weds moved into one the the three railway cottages owned by the company, location in Paradise St, now known as Bath Road.
The cottages were known as Ss1, Ss2 and Ss3 , Ss standing for "Steam shed". Ss1 being where the railway manager lived, Fred and Maud moving into Ss2 and Ss3 was home to the engine driver. After a few months, the drive retired and Fred and Maud moved into the slighter larger Ss3.
Maud had been told that she couldn't have any children, so the two of them decided to adopt some of the waifs and strays, a result of the war. There was Phil, the twins Ricky and Micky , Maggie, Simon, welsh Tudor who became something of a folk singer and guitarist, Graham, Jean, Donna and Nick. All living in the two-up two-down. However, Fred was a hard-working, practical man, so he built a shed in the garden, modelled on the French railway couchette, which meant six of the boys could sleep in their own individual beds, something of a luxury at that time.
With so many children to remember, Fred took the easy route and often just referred to them as his "Comrades", and would address with phrases such as "Comrades, come the revolution, we shall be listening to jazz" and "Comrades, cider is the drink of the working man".
But it was just the comrades that Fred and Maud had to think about, as before long they had a child of their own, who Maud insisted on naming Fred. So life was good for Fred and Maud, Fred working driving the steam engine hauling the ironstone, quarried at Wroxton, down to the GWR main line in Banbury. When not driving, he would help out on the upkeep of the line, quite happy to help with shovelling ballast or painting platforms, whatever needed doing. The Ironstones railway had opened in 1917, built using labour from German and Italian prisoners of war, and the stone was freighted up to Corby, where it was crushed, the metal extracted and turned into steel, which became an important part of the war effort in World War Two.
After 25 years of service with a company, it was customary to be given a silver plate, but for Fred in 1945, this was not possible. Instead he was if would like to name the new 0-4-0 locomotive they had just taken delivery of. Fred was pleased as punch, beaming from ear to ear, and of course, named it Maud.
When Fred eventually retired, the company brought together as many of the comrades as they could, rather than have a big do, as they knew that he didn't want a fuss. When asked to name the love of his life, by one of the cheeky comrades, Fred, with one arm leaning against the loco, and the other around his wife's shoulder, simply replied "Maud". And with that he walked off with Maud to their retirement bungalow, overlooking the Ironstones Railway, where he could listen to his jazz, keep an eye on the railway and enjoy his wife's company.
The Ironstones Railway moved over to using diesel engines shortly before it closed in 1967. But you can still walk most of the length of it, recalling Fred Vokins and The Ironstones Railway.
<html>
<div class='vcard'>
<a class='url fn n' href='mailto:jprocter@banburyshire.net><span class='given-name'>Julian</span><span class='family-name'>Procter</span></a>
<div class='email'><span><a href='mailto:jprocter@clockworkdata.co.uk'>jprocter@banburyshire.net</a></span></div>
<div class="web"><span><a href="http://www.banburyshire.net" target="_blank">Banburyshire Web Site</a></span></div>
<div class="img"><span><img src="./jules.jpg"></span></div>
</div></html>
Current Tiddlers
<<tiddler DefaultTiddlers>>
Lists by Category
<<slider chkSliderOptionsPanel StorieS 'Stories »' 'A list of Banburyshire stories'>>
<<slider chkSliderOptionsPanel SnippetS 'Snippets »' 'A list of Banburyshire songs, poems and snippets'>>
<<slider chkSliderOptionsPanel MaintainLists 'Maintain Lists »' 'Maintain list of lists'>>
External Links
[[WebLinks]]
Reference
[[CalendaR]]
[[DefaultTiddlers]]
[[GettingStarted]]
[[MainMenu]]
[[MaintaiN]]
StorieS
SnippetS
DefaultTiddlers
MainMenu
MaintainLists
Old George and the Red Triangle
George had served in the British Army and seen active service in the Boer War. On leaving the army he returned to the farm on which he had been brought up, and as was the tradition, was allowed to keep his red coat. This coat was the envy of his fellow farm-workers, as they had to make do with rag coats themselves to try and keep out the cold and wet, and made Old George stand out as he worked in the fields.
As the Autumn drew to a close, with the ploughing and planting of winter wheat completed, the hedges trimmed and the ditches cleared out, there was little for the farmworkers to do, and with no work, it meant no pay. So for the first three weeks in December before Xmas a group went Morris dancing around the farms and large houses, trying to earn a few pence to help them and their families through the constraints of Winter. But this tradition had become to be seen as begging by the uncaring law-makers, and so the lads blacked up their faces in an attempt to disguise their features.
Carrying on the Morris, in good company, travelling the area, sleeping in barns, and with strong cider and hearty vegetable soups to maintain them, the lads had quite a time.
On the return to Thorndon Farm by George and the other workers, they decided to have one last night out at the Bird In Hand pub, about a mile away, before tightening the belts and putting their meagre savings to one side. They were joined by the farmer and his brothers, and a jolly, lively time was had by most of the group, playing darts and cribbage. George, however, sat to one side, pipe lit, in quiet reflection, as was his way. He had seen too much in life to be light-hearted, but took comfort that others could be carefree.
At the end of the evening, and after a fair number of pints of cider, the men made their way back to the farm, through the falling snow, laughing and joking and generally horsing around. It was not until the next morning at breakfast that Old George's absence was noted, for it not like George to miss a meal. So a search party was assembled and retraced the route to the pub. About fifty yards before Windmill Lane joined the main road, one of the party spotted a red triangle poking up out of the snow. "That's Old George's coat!" he exclaimed, and sure enough it was. The snow was scrapped back to reveal George, still fast asleep and snoring. The combination of coat and a covering of snow had saved George from freezing to death, and this was a turning point for him. From that time on, for the rest of his long life, he talked to all who would listen about his experiences, both his time abroad in the service of his queen, and the traditions and situations at home. For Old George became a story teller.
/***
|Name|SaveAsPlugin|
|Source|http://www.TiddlyTools.com/#SaveAsPlugin|
|Documentation|http://www.TiddlyTools.com/#SaveAsPluginInfo|
|Version|2.7.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Save current document to another path/filename|
!!!!!Documentation
<<<
see [[SaveAsPluginInfo]]
<<<
!!!!!Revisions
<<<
2009.10.13 2.7.0 added 'here' param (saves current tiddler)
2009.08.16 2.6.2 fixed handling for backstage
| Please see [[SaveAsPluginInfo]] for additional revision details |
2006.02.03 1.0.0 Created
<<<
!!!!!Code
***/
//{{{
version.extensions.SaveAsPlugin= {major: 2, minor: 7, revision: 0, date: new Date(2009,10,13)};
config.macros.saveAs = {
label: 'save as...',
labelparam: 'label:',
prompt: 'Save current document to a different path/file',
promptparam: 'prompt:',
filePrompt: 'Please select or enter a target path/filename',
targetparam: 'target:',
defaultFilename: 'new.html',
filenameparam: 'filename:',
currfilekeyword: 'here',
typeparam: 'type:',
type_TW: 'tw', type_PS: 'ps', type_TX: 'tx', type_CS: 'cs', type_NF: 'nf', // file type tokens
type_map: {
tiddlywiki:'tw', tw:'tw', wiki: 'tw',
purestore: 'ps', ps:'ps', store:'ps',
plaintext: 'tx', tx:'tx', text: 'tx',
comma: 'cs', cs:'cs', csv: 'cs',
newsfeed: 'nf', nf:'nf', xml: 'nf', rss:'nf'
},
limitparam: 'limit:',
replaceparam: 'replace',
mergeparam: 'merge',
quietparam: 'quiet',
openparam: 'open',
askParam: 'ask',
hereParam: 'here',
askMsg: "Enter a tag filter (use * for all tiddlers, 'none' for blank document)",
hereMsg: 'Enter a tiddler title',
emptyParam: 'none',
confirmmsg: "Found %0 tiddlers matching\n\n'%1'\n\nPress OK to proceed",
mergeprompt: '%0\nalready contains tiddler definitions.\n'
+'\nPress OK to add new/revised tiddlers to current file contents.'
+'\nPress Cancel to completely replace file contents',
mergestatus: 'Merged %0 new/revised tiddlers and %1 existing tiddlers',
okmsg: '%0 tiddlers written to %1',
failmsg: 'An error occurred while creating %1',
filter: '',
handler: function(place,macroName,params) {
if ((params[0]||'').startsWith(this.labelparam))
var label=params.shift().substr(this.labelparam.length);
if ((params[0]||'').startsWith(this.promptparam))
var prompt=params.shift().substr(this.promptparam.length);
if ((params[0]||'').startsWith(this.targetparam))
var target=params.shift().substr(this.targetparam.length);
if ((params[0]||'').startsWith(this.filenameparam))
var filename=params.shift().substr(this.filenameparam.length);
if ((params[0]||'').startsWith(this.typeparam))
var filetype=this.type_map[params.shift().substr(this.typeparam.length).toLowerCase()];
if ((params[0]||'').startsWith(this.limitparam))
var limit=params.shift().substr(this.limitparam.length);
var q=((params[0]||'')==this.quietparam); if (q) params.shift();
var o=((params[0]||'')==this.replaceparam); if (o) params.shift();
var m=((params[0]||'')==this.mergeparam); if (m) params.shift();
var a=((params[0]||'')==this.openparam); if (a) params.shift();
var btn=createTiddlyButton(place,label||this.label,prompt||this.prompt,
function(){ config.macros.saveAs.go( this.getAttribute('target'),
this.getAttribute('filename'), this.getAttribute('filetype'),
this.getAttribute('filter'), this.getAttribute('limit'),
this.getAttribute('quiet')=='true',
this.getAttribute('overwrite')=='true',
this.getAttribute('merge')=='true',
this.getAttribute('autoopen')=='true',
this);
return false;
});
if (target) btn.setAttribute('target',target);
if (filename) btn.setAttribute('filename',filename);
btn.setAttribute('filetype',filetype||this.type_TW);
btn.setAttribute('filter',params.join(' '));
btn.setAttribute('limit',limit||0);
btn.setAttribute('quiet',q?'true':'false');
btn.setAttribute('overwrite',o?'true':'false');
btn.setAttribute('merge',m?'true':'false');
btn.setAttribute('autoopen',a?'true':'false');
},
go: function(target,filename,filetype,filter,limit,quiet,overwrite,merge,autoopen,here) {
var cm=config.messages; // abbreviation
var cms=config.macros.saveAs; // abbreviation
if (window.location.protocol!='file:') // make sure we are local
{ displayMessage(cm.notFileUrlError); return; }
// get tidders, confirm filtered results
var tids=cms.selectTiddlers(filter,here);
if (tids===false) return; // cancelled by user
if (cms.filter!=cms.emptyParam && cms.filter.length && !quiet)
if (!confirm(cms.confirmmsg.format([tids.length,cms.filter]))) return;
// get target path/filename
if (!filetype) filetype=this.type_TW;
target=target||cms.getTarget(filename,filetype==this.type_TX?'txt':filetype==this.type_CS?'csv':'html');
if (!target) return; // cancelled by user
var link='file:///'+target.replace(/\\/g,'/');
var samefile=link==decodeURIComponent(window.location.href);
var p=getLocalPath(document.location.href);
if (samefile) {
if (config.options.chkSaveBackups)
{ var t=loadOriginal(p);if(t)saveBackup(p,t); }
if (config.options.chkGenerateAnRssFeed && saveRss instanceof Function)
saveRss(p);
}
var notes='';
var total={val:0};
var out=this.assembleFile(target,filetype,tids,limit||0,notes,quiet,overwrite,merge,total);
var ok=saveFile(target,out);
if (ok && autoopen) {
if (!samefile) window.open(link).focus();
else { store.setDirty(false); window.location.reload(); }
}
if (!quiet || !(ok && autoopen))
displayMessage((ok?this.okmsg:this.failmsg).format([total.val,target]),link);
},
selectTiddlers: function(filter,here) {
var cms=config.macros.saveAs; // abbreviation
var tids=[]; cms.filter=filter||'';
if (filter==cms.emptyParam)
return tids;
if (filter==config.macros.saveAs.hereParam) {
var here=story.findContainingTiddler(here);
if (here) var tid=here.getAttribute('tiddler');
else var tid=prompt(config.macros.saveAs.hereMsg,'');
while (tid && !store.tiddlerExists(tid)) {
var err='"'+tid+'" not found.\nPlease try again.\n\n';
var tid=prompt(err+config.macros.saveAs.hereMsg,tid);
}
if (!tid) return false; // cancelled by user
return [store.getTiddler(tid)];
}
if (filter==config.macros.saveAs.askParam) {
filter=prompt(config.macros.saveAs.askMsg,'');
if (!filter) return false; // cancelled by user
cms.filter=filter=='*'?'':filter;
}
if (!filter||!filter.length||filter=='*') tids=store.getTiddlers('title');
else tids=store.filterTiddlers('[tag['+filter+']]');
return tids;
},
getTarget: function(defName,defExt) {
var cms=config.macros.saveAs; // abbreviation
// get new target path/filename
var newPath=getLocalPath(window.location.href);
var slashpos=newPath.lastIndexOf('/'); if (slashpos==-1) slashpos=newPath.lastIndexOf('\\');
if (slashpos!=-1) newPath=newPath.substr(0,slashpos+1); // trim filename
if (!defName||!defName.length) { // use current filename as default
var p=getLocalPath(window.location.href);
var s=p.lastIndexOf('/'); if (s==-1) s=p.lastIndexOf('\\');
if (s!=-1) defName=p.substr(s+1);
}
var defFilename=(defName||cms.defaultFilename).replace(/.html$/,'.'+defExt);
var target=cms.askForFilename(cms.filePrompt,newPath,defFilename,defExt);
if (!target) return; // cancelled by user
// if specified file does not include a path, assemble fully qualified path and filename
var slashpos=target.lastIndexOf('/'); if (slashpos==-1) slashpos=target.lastIndexOf('\\');
if (slashpos==-1) target=target+(defName||cms.defaultFilename).replace(/.html$/,'.'+defExt);
return target;
},
askForFilename: function(msg,path,file,defExt) {
if(window.Components) { // moz
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
picker.init(window, msg, nsIFilePicker.modeSave);
var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
thispath.initWithPath(path);
picker.displayDirectory=thispath;
picker.defaultExtension=defExt||'html';
picker.defaultString=file;
picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
}
catch(e) { alert('error during local file access: '+e.toString()) }
}
else { // IE
try { // XP/Vista only
var s = new ActiveXObject('UserAccounts.CommonDialog');
s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
s.FilterIndex=(defExt=='txt')?2:3; // default to HTML files;
s.InitialDir=path;
s.FileName=file;
if (s.showOpen()) var result=s.FileName;
}
catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
}
return result;
},
plainTextHeader:
'Source:\n\t%0\n'
+'Title:\n\t%1\n'
+'Subtitle:\n\t%2\n'
+'Created:\n\t%3 by %4\n'
+'Application:\n\tTiddlyWiki %5 / %6 %7\n\n',
plainTextTiddler:
'- - - - - - - - - - - - - - -\n'
+'| title: %0\n'
+'| created: %1\n'
+'| modified: %2\n'
+'| edited by: %3\n'
+'| tags: %4\n'
+'- - - - - - - - - - - - - - -\n'
+'%5\n',
plainTextFooter:
'',
newsFeedHeader:
'<'+'?xml version="1.0"?'+'>\n'
+'<rss version="2.0">\n'
+'<channel>\n'
+'<title>%1</title>\n'
+'<link>%0</link>\n'
+'<description>%2</description>\n'
+'<language>en-us</language>\n'
+'<copyright>Copyright '+(new Date().getFullYear())+' %4</copyright>\n'
+'<pubDate>%3</pubDate>\n'
+'<lastBuildDate>%3</lastBuildDate>\n'
+'<docs>http://blogs.law.harvard.edu/tech/rss</docs>\n'
+'<generator>TiddlyWiki %5 / %6 %7</generator>\n',
newsFeedTiddler:
'\n%0\n',
newsFeedFooter:
'</channel></rss>',
pureStoreHeader:
'<html><body>'
+'<style type="text/css">'
+' #storeArea {display:block;margin:1em;}'
+' #storeArea div {padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}'
+' #pureStoreHeading {width:100%;text-align:left;background-color:#eeeeee;padding:1em;}'
+'</style>'
+'<div id="pureStoreHeading">'
+' TiddlyWiki "PureStore" export file<br>'
+' Source'+': <b>%0</b><br>'
+' Title: <b>%1</b><br>'
+' Subtitle: <b>%2</b><br>'
+' Created: <b>%3</b> by <b>%4</b><br>'
+' TiddlyWiki %5 / %6 %7<br>'
+' Notes:<hr><pre>%8</pre>'
+'</div>'
+'<div id="storeArea">',
pureStoreTiddler:
'%0\n%1',
pureStoreFooter:
'</div><!--POST-BODY-START-->\n<!--POST-BODY-END--></body></html>',
assembleFile: function(target,filetype,tids,limit,notes,quiet,overwrite,merge,total) {
var revised='';
var now = new Date().toLocaleString();
var src=convertUnicodeToUTF8(document.location.href);
var title = convertUnicodeToUTF8(wikifyPlain('SiteTitle').htmlEncode());
var subtitle = convertUnicodeToUTF8(wikifyPlain('SiteSubtitle').htmlEncode());
var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());
var twver = version.major+'.'+version.minor+'.'+version.revision;
var v=version.extensions.SaveAsPlugin; var pver = v.major+'.'+v.minor+'.'+v.revision;
var headerargs=[src,title,subtitle,now,user,twver,'SaveAsPlugin',pver,notes];
switch (filetype) {
case this.type_TX: // plain text
var header=this.plainTextHeader.format(headerargs);
var footer=this.plainTextFooter;
break;
case this.type_CS: // comma-separated
var fields={};
for (var i=0; i<tids.length; i++) for (var f in tids[i].fields) fields[f]=f;
var names=['title','created','modified','modifier','tags','text'];
for (var f in fields) names.push(f);
var header=names.join(',')+'\n';
var footer='';
break;
case this.type_NF: // news feed (XML)
headerargs[0]=store.getTiddlerText('SiteUrl','');
var header=this.newsFeedHeader.format(headerargs);
var footer=this.newsFeedFooter;
tids=store.sortTiddlers(tids,'-modified');
break;
case this.type_PS: // PureStore (no code)
var header=this.pureStoreHeader.format(headerargs);
var footer=this.pureStoreFooter;
break;
case this.type_TW: // full TiddlyWiki
default:
var currPath=getLocalPath(window.location.href);
var original=loadFile(currPath);
if (!original) { alert(config.messages.cantSaveError); return; }
var posDiv = locateStoreArea(original);
if (!posDiv) { alert(config.messages.invalidFileError.format([currPath])); return; }
var header = original.substr(0,posDiv[0]+startSaveArea.length)+'\n';
var footer = '\n'+original.substr(posDiv[1]);
break;
}
if (parseInt(limit)!=0) tids=tids.slice(0,limit);
var out=this.getData(target,filetype,tids,quiet,overwrite,merge,fields);
var revised = header+convertUnicodeToUTF8(out.join('\n'))+footer;
// if full TW, insert page title and language attr, and reset MARKUP blocks as needed...
if (filetype==this.type_TW) {
var newSiteTitle=convertUnicodeToUTF8(getPageTitle()).htmlEncode();
revised=revised.replaceChunk('<title'+'>','</title'+'>',' ' + newSiteTitle + ' ');
revised=updateLanguageAttribute(revised);
var titles=[]; for (var i=0; i<tids.length; i++) titles.push(tids[i].title);
revised=updateMarkupBlock(revised,'PRE-HEAD',
titles.contains('MarkupPreHead')? 'MarkupPreHead' :null);
revised=updateMarkupBlock(revised,'POST-HEAD',
titles.contains('MarkupPostHead')?'MarkupPostHead':null);
revised=updateMarkupBlock(revised,'PRE-BODY',
titles.contains('MarkupPreBody')? 'MarkupPreBody' :null);
revised=updateMarkupBlock(revised,'POST-SCRIPT',
titles.contains('MarkupPostBody')?'MarkupPostBody':null);
}
total.val=out.length;
return revised;
},
getData: function(target,filetype,tids,quiet,overwrite,merge,fields) {
// output selected tiddlers and gather list of titles (for use with merge)
var out=[]; var titles=[];
var url=store.getTiddlerText('SiteUrl','');
for (var i=0; i<tids.length; i++) {
out.push(this.formatItem(store,filetype,tids[i],url,fields));
titles.push(tids[i].title);
}
// if TW or PureStore format, ask to merge with existing tiddlers (if any)
if (filetype==this.type_TW || filetype==this.type_PS) {
if (overwrite) return out; // skip merge... forced overwrite
var txt=loadFile(target);
if (txt && txt.length) {
var remoteStore=new TiddlyWiki();
if (version.major+version.minor*.1+version.revision*.01<2.52) txt=convertUTF8ToUnicode(txt);
if (remoteStore.importTiddlyWiki(txt) && (merge||confirm(this.mergeprompt.format([target])))) {
var existing=remoteStore.getTiddlers('title');
for (var i=0; i<existing.length; i++)
if (!titles.contains(existing[i].title))
out.push(this.formatItem(remoteStore,filetype,existing[i],url));
if (!quiet) displayMessage(this.mergestatus.format([tids.length,out.length-tids.length]));
}
}
}
return out;
},
formatItem: function(s,f,t,u,fields) {
if (f==this.type_TW)
var r=s.getSaver().externalizeTiddler(s,t);
if (f==this.type_PS)
var r=this.pureStoreTiddler.format([t.title,s.getSaver().externalizeTiddler(s,t)]);
if (f==this.type_NF)
var r=this.newsFeedTiddler.format([t.saveToRss(u)]);
if (f==this.type_TX)
var r=this.plainTextTiddler.format([t.title, t.created.toLocaleString(), t.modified.toLocaleString(),
t.modifier, String.encodeTiddlyLinkList(t.tags), t.text]);
if (f==this.type_CS) {
function toCSV(t) { return '"'+t.replace(/"/g,'""')+'"'; } // always encode CSV
var out=[ toCSV(t.title), toCSV(t.created.toLocaleString()), toCSV(t.modified.toLocaleString()),
toCSV(t.modifier), toCSV(String.encodeTiddlyLinkList(t.tags)), toCSV(t.text) ];
for (var f in fields) out.push(toCSV(t.fields[f]||''));
var r=out.join(',');
}
return r||'';
}
};
//}}}
//{{{
// automatically add saveAs to backstage
config.tasks.saveAs = {
text: 'saveAs',
tooltip: config.macros.saveAs.prompt,
action: function(){ clearMessage(); config.macros.saveAs.go(); }
}
config.backstageTasks.splice(config.backstageTasks.indexOf('save')+1,0,'saveAs');
//}}}
|Name|SaveAsPluginInfo|
|Source|http://www.TiddlyTools.com/#SaveAsPlugin|
|Documentation|http://www.TiddlyTools.com/#SaveAsPluginInfo|
|Version|2.7.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for SaveAsPlugin|
>//Note: This plugin replaces ''[[NewDocumentPlugin]]'' (except for the HTML+CSS "snapshot" features, which are now provided by [[SnapshotPlugin]].//
!!!!!Usage
<<<
This plugin automatically adds a 'save as' command to the TiddlyWiki 'backstage' menu so you can quickly create an exact copy of the current TiddlyWiki document. The plugin also defines a macro that you can use to place a "save as..." command link into your sidebar/mainmenu/any tiddler (or wherever you like). When the command link is clicked, a system-specific dialog box will be displayed so you can select/enter the desired target path and filename.
{{{
<<saveAs "label:..." "prompt:..." "filename:..." "type:..." "limit:..."
quiet replace merge open filter|ask|here|none>>
}}}
//(all parameters are optional)//
*''label:...''<br>custom link text (instead of "save as...")
*''prompt:...''<br>custom tooltip text
*''filename:...''<br>default filename to be shown when asking for an output path/file
*''type:...''<br>a keyword, indicating one of the following output file formats:
**''~TiddlyWiki''<br>(or ''wiki'' or ''tw'') a TiddlyWiki HTML document
**''~PureStore''<br>(or ''store'' or ''ps'') a TiddlyWiki "PureStore" HTML export file (just tiddlers, no core code)
**''~PlainText''<br>(or ''text'' or ''tx'') a plain text file listing of tiddler //source// content
**''Comma''<br>(or ''csv'' or ''cs'') a Comma-Separated Value (CSV) database/spreadsheet file
**''~NewsFeed''<br>(or ''xml'' or ''rss'' or ''nf'') an RSS ~NewsFeed XML file
*''limit:...''<br>output is limited to the specified number of tiddlers
*''quiet''<br>normally, when using filtering (see below), the number of matching tiddlers is reported and you are asked to confirm before saving those tiddlers to a new file. Use the ''quiet'' keyword to suppress this confirmation step.
*''replace''<br>overwrites existing output file, if any, without confirmation.
*''merge''<br>merges with existing output file, if any, without confirmation.
*''open''<br>opens the newly created document file in a separate browser tab/window.
*''filter''<br>selects a subset of tiddlers to be written into the new document. If omitted, all tiddlers in the document are written to the new file. ''filter'' can either:
**a tag value<br>selects only tiddlers that are tagged with that value. To select tiddlers based on a combination of tags, you can install [[MatchTagsPlugin]] to construct complex 'tag expressions' using full 'boolean' logic with AND, OR, and NOT operators, as well as nested parentheses.
**''ask''<br>prompts you to enter a tag (or tag expression) whenever you click on the 'save as...' command
**''here''<br>selects the current tiddler (if any). If the command is not embedded within a tiddler, you will be prompted to enter a tiddler title.
**''none''<br>omits all tiddlers and creates a new //empty// document
<<<
!!!!!Examples
<<<
save all tiddlers:
>{{{<<saveAs>>}}}<br>try it: <<saveAs>>
save only tiddlers matching a single tag:
>{{{<<saveAs "label:create Import/Export starter" "filename:TW+ImportExport.html" ImportExportPackage>>}}}
>try it: <<saveAs "label:create Import/Export starter" "filename:TW+ImportExport.html" "ImportExportPackage>>
save to a ~PureStore format:
>{{{<<saveAs "label:create Import/Export archive" "filename:ImportExportPackage.html" type:PureStore open ImportExportPackage>>}}}
>try it: <<saveAs "label:create Import/Export archive" "filename:ImportExportPackage.html" type:PureStore open ImportExportPackage>>
save to a ~PlainText format:
>{{{<<saveAs "label:create Import/Export source listing" type:PlainText open ImportExportPackage>>}}}
>try it: <<saveAs "label:create Import/Export source listing" type:PlainText open ImportExportPackage>>
save tiddlers matching a complex combination of tags (requires [[MatchTagsPlugin]]):
>{{{<<saveAs (alpha or settings) and not systemConfig>>}}}
>try it: <<saveAs (alpha or settings) and not systemConfig>>
prompt for tag or tag expression each time:
>{{{<<saveAs "label:custom save as..." ask>>}}}
>try it: <<saveAs "label:custom save as..." ask>>
save this tiddler:
>{{{<<saveAs "label:save this tiddler..." {{"filename:"+tiddler.title}} quiet here>>}}}
>try it: <<saveAs "label:save this tiddler..." {{"filename:"+tiddler.title}} quiet here>>
<<<
!!!!!Revisions
<<<
2009.10.13 2.7.0 added 'here' param (saves current tiddler)
2009.08.16 2.6.2 fixed handling for backstage
2009.08.04 2.6.1 fixed handling when limit is omitted.
2009.08.03 2.6.0 added 'limit:nn' parameter.
2009.08.02 2.5.3 in getData(), if type=RSS, sort by modified (most recent first).
2009.07.03 2.5.2 TW252 fixup: don't call convertUTF8ToUnicode() for local loadFile() I/O
2009.04.30 2.5.1 custom fields in CSV output.
2009.04.19 2.5.0 added CSV format.
2008.09.29 2.4.3 in getData(), convert UTF8 to Unicode before merging (fixes international characters).
2008.09.28 2.4.2 in go(), fixed typo that prevented backstage SaveAs from working.
2008.09.24 2.4.1 if rewriting *current* file and chkSaveBackups and/or chkGenerateAnRssFeed is enabled, then write a backup file or RSS feed, respectively
2008.09.24 2.4.0 when 'open' param is used and file is saved to current location, reload() page instead of opening a new tab/window. Added 'filename' param to specify default filename. Added 'replace' and 'merge' keyword params to control file handling without asking user. Improved use of 'quiet' flag to eliminate more unwanted messages
2008.09.19 2.3.2 fixed backstage SaveAs command (was defaulting to empty document). in formatItem(), removed unnecessary convertUnicodeToUTF8() (was causing double-conversion!)
2008.09.16 2.3.1 fixed IE 'navigate away' error by returning false from button onclick handler
2008.09.11 2.3.0 added support for alternative file formats: ~PlainText (TX), ~PureStore (PS), or ~NewsFeed (XML) in addition to existing ~TiddlyWiki (TW) document format
2008.09.06 2.2.1 corrected handling of autoopen attribute so it only applies when "open" param is specified
2008.08.01 2.2.0 added "open" param to auto-open newly saved document
2008.07.20 2.1.3 added "quiet" param to bypass confirmation when using tag filter
2008.04.22 2.1.2 corrected use of getTarget() to check for "user cancelled"
2008.04.22 2.1.1 documentation fixes
2008.04.22 2.1.0 added support for tag filtering to completely replace [[NewDocumentPlugin]] (now retired)
2008.04.12 2.0.1 automatically add "saveAs" to backstage commands
2008.04.12 2.0.0 initial release based on [[NewDocumentPlugin]]
__Previous revisions from [[NewDocumentPlugin]]__
2008.04.20 1.8.0 added support for 'noCSS' and 'viewer' params for alternative snapshot output
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.04 [*.*.*] update for ~TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.03.30 1.7.0 added support for "print" param as alternative for "snap". When "print" is used, the filename is ignored and ouput is directed to another browser tab/window, where the print dialog is then automatically triggered
2007.03.30 1.6.1 added support for "here" keyword for current tiddler elementID and "prompt:text" param for specifying tooltip text
2007.02.12 1.6.0 in onClickNewDocument(), reset HTML source 'markup'
2006.10.23 1.5.1 in onClickNewDocument(), get saved parameter value for snapID instead of using default "contentWrapper" (oops!)
2006.10.18 1.5.0 new optional param for 'snap'... specify alternative DOM element ID (default is still "contentWrapper")
2006.08.03 1.4.3 in promptForFilename(), for IE (~WinXP only), added handling for ~UserAccounts.~CommonDialog
2006.07.29 1.4.2 in onClickNewDocument(), okmsg display is now linked to newly created file
2006.07.24 1.4.1 in promptForFilename(), check for nsIFilePicker.returnCancel to allow nsIFilePicker.returnOK **OR** nsIFilePicker.returnReplace to be processed
2006.05.23 1.4.0 due to very poor performance, support for tag *expressions* has been removed, in favor of a simpler "containsAny()" scan for tags
2006.04.09 1.3.6 in onClickNewDocument, added call to convertUnicodeToUTF8() to better handle international characters
2006.03.15 1.3.5 added nsIFilePicker() handler for selecting filename in moz-based browsers. IE and other non-moz browsers still use simple prompt() dialog
2006.03.15 1.3.0 added "label:text" param for custom link text. added special "all" filter parameter for "save as..." handling (writes all tiddlers to output file)
2006.03.09 1.2.0 added special "snap" filter parameter to generate and write "snapshot" files containing static HTML+CSS for currently rendered document
2006.02.24 1.1.2 Fix incompatiblity with TW 2.0.5 by removing custom definition of getLocalPath() (which is now part of TW core)
2006.02.03 1.1.1 concatentate 'extra' params so that tag expressions don't have to be quoted. moved all text to 'formatted' string definitions for easier translation.
2006.02.03 1.1.0 added support for tag EXPRESSIONS. plus improved documentation and code cleanup
2006.02.03 1.0.0 Created
<<<
/***
|Name|SaveTiddlerToFilePlugin|
|Source|http://www.TiddlyTools.com/#SaveTiddlerToFilePlugin|
|Documentation|http://www.TiddlyTools.com/#SaveTiddlerToFilePlugin|
|Version|1.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|toolbar command to save tiddler source definition to an external text file|
!!!!!Usage/Example
<<<
Embedded as a macro in tiddler content:
{{{
<<saveTiddlerToFile label:text prompt:text filename:text path:text>>
}}}
or, as a tiddler toolbar command in [[ViewTemplate]]:
{{{
<span class='toolbar' macro='toolbar saveTiddlerToFile'></span>
}}}
where:
* ''label'' //(optional)//<br>specifies the text to display for the command
* ''prompt'' //(optional)//<br>specifies the mouseover 'tooltip' text for the command
* ''filename'' //(optional)//<br>specifies the default filename to create. You can use "*" within the filename as a 'substitution marker' that will be automatically replaced with the current tiddler's title. If ''file'' is omitted, a system-specific 'ask for filename' dialog box will be displayed, using 'tiddlername.tid' as the suggested default filename. //Note: if the tiddler is a plugin (tagged with <<tag systemConfig>>), then the suggested filename will use ".js" instead of ".tid"//
* ''path'' //(optional)//<br>specifies the default folder in which to create the output file. If the path begins with "./" (or ".\" for Windows) it is treated as a relative path, and the path containing the current document will be prepended to create a full path reference. Otherwise, the specified path must be a full path reference. You can use "*" within the path as a 'substitution marker' that will be automatically replaced with the current tiddler's title. If ''path'' is omitted, the path containing the current document will be used by default.
Examples:
>{{{<<saveTiddlerToFile>>}}}<br>Try it: <<saveTiddlerToFile>>
>{{{<<saveTiddlerToFile label:"save 'txt' file to current folder..." filename:*.txt>>}}}<br>Try it: <<saveTiddlerToFile label:"save 'txt' file to current folder..." filename:*.txt>>
>{{{<<saveTiddlerToFile label:"save 'txt' file to archive..." filename:*.txt path:./archive>>}}}<br>Try it: <<saveTiddlerToFile label:"save 'txt' file to archive..." filename:*.txt path:./archive>>
<<<
!!!!!Configuration
<<<
When {{{<span class='toolbar' macro='toolbar saveTiddlerToFile'></span>}}} is used to create a tiddler toolbar command, the default values for all parameters are applied (e.g., you will be prompted to select/enter a filename with a ".tid" or ".js" extension). You can override these defaults by writing the following into a tiddler tagged with <<tag systemConfig>>:
{{{
config.commands.saveTiddlerToFile.filename="...";
config.commands.saveTiddlerToFile.path="...";
}}}
<<<
!!!!!Revisions
<<<
2008.04.22 [1.1.0] converted from inline script to tiddler toolbar command
2007.06.26 [1.0.0] initial release as inline script
<<<
!!!!!Code
***/
//{{{
version.extensions.SaveTiddlerToFilePlugin= {major: 1, minor: 1, revision: 0, date: new Date(2008,4,22)};
config.macros.saveTiddlerToFile = {
label: "save this tiddler to a file",
prompt: "save this tiddler's SOURCE text to a local file",
askmsg: "select an output filename for this tiddler",
okmsg: "Tiddler source written to %0",
failmsg: "An error occurred while creating %0",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
params = paramString.parseParams("anon",null,true,false,false);
var label=getParam(params,"label",this.label);
var prompt=getParam(params,"prompt",this.prompt);
var filename=getParam(params,"filename","");
var path=getParam(params,"path","");
var btn=createTiddlyButton(place,label,prompt,
function(event){config.macros.saveTiddlerToFile.go(this,event)});
btn.setAttribute("filename",filename);
btn.setAttribute("path",path);
},
go: function(src,event) {
var cms=config.macros.saveTiddlerToFile; // abbreviation
var here=story.findContainingTiddler(src); if (!here) return;
var tid=here.getAttribute('tiddler');
var filename=src.getAttribute("filename")||"";
filename=filename.replace(/\*/g,tid);
var path=src.getAttribute("path")||"";
path=path.replace(/\*/g,tid);
if (!path.length||path.substr(0,2)=="./"||path.substr(0,2)==".\\") {
var curr=getLocalPath(document.location.href);
var slashpos=curr.lastIndexOf("/"); if (slashpos==-1) slashpos=curr.lastIndexOf("\\");
if (slashpos!=-1) curr=curr.substr(0,slashpos+1); // remove filename, leave trailing slash
var trailingslash=curr.indexOf("\\")!=-1?"\\":"/"; // fixup for missing trailing slash
if (path.length && path.substr(path.length,1)!=trailingslash) path+=trailingslash;
path=!path.length?curr:curr+path.substr(2); // convert relative path to absolute path
}
var deffn=tid+(store.getTiddler(tid).isTagged("systemConfig")?".js":".tid");
var target=filename.length?path+filename:cms.askForFilename(cms.askmsg,path,deffn); // ask
if (!target||!target.length) return false; // cancelled by user
var msg=saveFile(target,store.getTiddlerText(tid))?cms.okmsg:cms.failmsg;
clearMessage(); displayMessage(msg.format([target]),"file:///"+target.replace(/\\/g,'/'));
},
askForFilename: function(msg,path,file) {
if(window.Components) { // moz
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
picker.init(window, msg, nsIFilePicker.modeSave);
var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
thispath.initWithPath(path);
picker.displayDirectory=thispath;
picker.defaultExtension='tid';
picker.defaultString=file;
picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
}
catch(e) { alert('error during local file access: '+e.toString()) }
}
else { // IE
try { // XP/Vista only
var s = new ActiveXObject('UserAccounts.CommonDialog');
s.Filter='All files|*.*|Text files|*.txt;*.tid;*.js|HTML files|*.htm;*.html|';
s.FilterIndex=2; // default to TEXT files;
s.InitialDir=path;
s.FileName=file;
if (s.showOpen()) var result=s.FileName;
}
catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
}
return result;
}
}
// // toolbar definition
config.commands.saveTiddlerToFile= {
text: "file",
tooltip: config.macros.saveTiddlerToFile.prompt,
filename: "",
path: "",
handler: function(event,src,title) {
var ccs=config.commands.saveTiddlerToFile;
if (ccs.filename.length) src.setAttribute("filename",ccs.filename);
if (ccs.path.length) src.setAttribute("path",ccs.path);
config.macros.saveTiddlerToFile.go(src,event);
return false;
}
};
//}}}
Sgt Carter and The Two Lesleys
Sgt Dick Carter from Reading is about to move into C.I.D in Banbury
On his last weekend in uniform, he is to maintain law and order while the rest of the police attend a grudge football match between Banbury Town and Brackley Town.
Saturday evenings always starts off with two rival gangs facing each other either side of the High St, and the latest gang members are pushed into the middle to start the entertainment.
The gang from London ride scooters and have mostly moved up from the East End
The gang from Birmingham ride bikes and have moved down with Birds
Sgt Cater read the riot act to the assembled gangs and marches the two Ls up to the Cross and gives them an option
Lesley (with parka) trains as a mechanic and becomes manager of a tyre fitting establishment in town
Lesley (with leathers) trains as a bookkeeper and marries the son of a local farmer
a personal web notebook powered by TiddlyWiki
BanburyshireEvening
HoracE
Fred_Vokins
Bobs_BBB_Song
WassaiL
ContactS
IntroductioN
Cursed_Warehouse
Sgt_Carter_2_Lesleys
Postcode_Lottery
Enchanted_Garden
Honeybourne_Hut
The_Blue_Grave
Climbing_Everest
Old_George
Ironstones_Railway
The_Old_Back_Door
Huw_meets_Angharad
Millies_2nd_Helping
Shennington_Goldmine
Size_14_Boots
Centurians_by_Sea
The_White_Lion_Spirit
Guy_Fawkes
The Blue Grave - a Salt Way Story
Back in the 1960's a group of archaeologists from Oxford University travelled up to just beyond Broughton Castle to examine the Roman Road to be found there. In pristine condition, buried a few feet below the surface. The road had been built over the top of the ancient Salt Way which ran from Droitwich Spa past Chipping Campden and Banbury before making it's way down to London, and was one of the many Salt Ways which made up the three trading networks, based around Droitwich, the Cheshire salt mines and the sea salt works along the south coast.
But the boffins were only interested in the Roman part of the road, a warm-up field trip before their main overseas expedition in the Summer.
While they were in the area, the local farmer went over to them, and said "If you've got a moment can to tell me what this means?" pointing to an area of blue-tinged soil some 50 feet away. One of the students wandered over for a closer look, as the farmer explained that his plough had brought up pieces of smooth stone from the same area. It was only a foot down before a broken stone lid was uncovered, and further careful clearing exposed a stone coffin. Inside was the remains of a young woman, later calculated to be in her mid-twenties, who had lived in the latter part of the fifth century, some fifty years after the Romans had departed these shores. She had been buried in the lead-lined stone coffin, which explained the blue dis-colouration of the soil, and signified not plague or plutonium, but great wealth. The only object in the coffin with her was a small blue glass amphora, a five inch high perfume bottle which had originated in what is now the Lebanon.
After careful measurements and photographs were taken, the blue grave was filled in, and the farmer and now his son, make a point of avoiding the spot when ploughing.
So who was the young lady, and why was the coffin buried so shallowly? Recent re-examination of the photos, by use of modern image analysis software have revealed an intriguing possible answer. It was already known that the lead must have come from either Cornwall or Wales, showing the extensive trade routes in place, and the proximity to Salt Way would suggest that she would have some involvement.
But the image analysis shows two pieces of writing, on either side of the coffin. Facing Salt Way, in latin, was inscribed "Here lies the Fine Lady of the Salt Way. Give thanks for all she has done for you." On the other side, this time in Welsh, was written "My beloved Angharad of the Salt Way. I will play you music no more. Huw"
It is presumed that the coffin was never interred, but that it lay above ground as a monument to Angharad, and only with the passing of the influence of the Salt Way, after many centuries, did it then sink underground.
Was Angharad the original Fine Lady who inspired the writing of the nursery rhyme some 1300 years later?
The Old Back Door
It's not often you get someone passionately talking about their old back door, but this is exactly what I found when over at the Cropredy cottage of Steven and Verna, the stalwarts of the Banbury Hobby Horse Festival, amongst many other activities.
Steven, a one time archaeologist and schoolmaster, now enjoying the student life again of riotous behaviour and field trips to exotic locations, was explaining the craftsmanship of the back door to their cottage. It turns out it was the old post office at somewhere about the time that the Culworth Gang were terrorising the area, as holdup merchants, highwaymen and strongarm thieves, so a stout door was a must. By day the gang members worked on the land, and one was even a parish clerk, but in the evening they donned smock coats and tasteful masks, going about their business with billyclubs and pitchforks. However, they never killed anyone, or even seriously injured any of their victims over the twenty years of their reign of terror. But this didn't stop a number of the gang from being hung for their misdemeanours, although two gangmembers appear to have fled to the colonies, where they did very nicely for themselves.
So next time you see an unusual doorway, just think of what stories it could tell.
References :-
http://archiver.rootsweb.ancestry.com/th/read/ENG-BANBURY-AREA/2002-02/1012575732
The Spirit of The White Lion
TiddlyWiki is a website on a stick! In one single HTML file, TiddlyWiki gives you the ability to publish and organize information in a whole manner of different ways. If you can't do what you want to, you can write plugins to change the way TiddlyWiki works. A thriving community of developers have generated huge number of plugins that turn TiddlyWiki into a number of different things, from a CD organizer to an online collaboration tool.
TiddlyWiki is a piece of open source software created by Jeremy Ruston. The copyright is now owned by the not-for-profit organisation [[UnaMesa|http://www.unamesa.com]]. TiddlyWiki has always been free and open source and will remain free and open source. Edit mode.
Wassail
Old Apple tree, old apple tree;
We've come to wassail thee;
To bear and to bow apples enow;
Hats full, caps full, three bushel bags full;
Barn floors full and a little heap under the stairs
At Carhampton, near Minehead, the Apple Orchard Wassailing is held on the Old Twelfth Night (17 January)
So dunk your toast in plum yerkum, and place in the branches of your apple tree
Pour some cider over the roots giving thanks to last years bounty
Keep singing and shouting and clatter your pans
Til evil spirits are scared on their way by the gunmans bang
Wassail
Wassial - good health
Drin(k) Hael - drink and be healthy
<html>
<div class="web"><span><a href="http://www.banburyshire.net" target="_blank">Banburyshire</a></span></div>
<div class="web"><span><a href="http://www.banburyfolkclub.co.uk" target="_blank">Banbury Folk Club</a></span></div>
<div class="web"><span><a href="http://www.banburyfolkfestival.co.uk" target="_blank">Banbury Folk Festival</a></span></div>
<div class="web"><span><a href="http://www.clockworkdata.co.uk" target="_blank">Clockwork Data</a></span></div>
<hr>
<div class="web"><span><a href="http://www.autotrader.co.uk/" target="_blank">Autotrader</a></span></div>
<div class="web"><span><a href="http://news.bbc.co.uk/" target="_blank">BBC News</a></span></div>
<div class="web"><span><a href="http://www.thephonebook.bt.com/publisha.content/en/index.publisha" target="_blank">BT Directory Enquiries</a></span></div>
<div class="web"><span><a href="http://www.google.co.uk/" target="_blank">Google</a></span></div>
<div class="web"><span><a href="http://www.kelkoo.co.uk/" target="_blank">Kelkoo</a></span></div>
</html>