Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
|''Type:''|file|
|''URL:''|http://tiddlyvault.tiddlyspot.com/|
|''Workspace:''|(default)|
This tiddler was automatically created to record the details of this server
|''Type:''|file|
|''URL:''|http://tiddlywiki.abego-software.de|
|''Workspace:''|(default)|
This tiddler was automatically created to record the details of this server
{{{
#export TZ='Canada/Eastern'
export PAGER=less
export VISUAL=vim
export LESS=-iX
export LESSKEY=$HOME/lesskey/lesskey
export JAD_OPTIONS='-b+ -ff+ -space+ -nonlb+'
export MYDOCS=$( cygpath -u "c:/mydocs" )
}}}
{{{
export MAIL=~/Mail/Inbox
export EDITOR=vim
export PAGER=less
export LESS="-i -j10"
export LESSKEY=~/.lesskeystuff/lesskey
export CVSROOT=:pserver:xx087@saruman.ncf.ca:/usr/local/src/ncf/cvsroot
export TERM=dtterm
# 20070823 glennj
# hmmm, does this have to be dependent on where I'm ssh-ing from?
# work win pc, need ^H. Was ^? required for mac osx?
stty erase ^H
#stty erase ^?
. ~/.bashrc
cd
# use agent forwarding, so don't need to start an agent here
#_#if pgrep -U $LOGNAME ssh-agent; then
#_# echo "you appear to have an ssh agent running"
#_#else
#_# echo "remember to start the ssh agent: 'agent start'"
#_#fi
}}}
this .bashrc references [[.bash.env]]
{{{
# see also ~/.profile
umask 0 ;# allow glennj and gwj to read/write anything
if [ -z "$COLORTERM" ]; then
# cmd window
PS1="\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\! \$ "
else
# rxvt
PS1="\[\e]0;\w\a\]\n\u@\h \[\e[1;34m\]\w\[\e[0m\]\n\! \$ "
fi
HISTFILESIZE=50
HISTTIMEFORMAT=" %Y-%m-%d %T: "
. "$HOME"/.bash.env
set -o noclobber
# for finger-compatibility with auds916 and auds950,
# use vi-style command line editing, not emacs-style
set -o vi
# use ls colors, except executable files should be black not green
# see C:\Program Files\cygwin\etc\DIR_COLORS
eval `dircolors -b | sed -e 's/ex=..;../ex=01;31/'`
alias ls='ls -F --color=auto'
#alias ll='ls -lG'
alias ll='ls -l'
alias la='ll -a'
# note, piping through less loses colors
#ll() { ls -lGh ${1+"$@"} | less -E; }
#la() { ll -a ${1+"$@"}; }
lh() { ls -lt ${1+"$@"} | cat - | /usr/bin/head -20; }
#alias man='PAGER=more man'
man() { /usr/bin/man "$@" | less -R; }
alias cp='cp -ip'
alias rm='rm -i'
alias mv='mv -i'
alias h=history
#alias vi=vim
winify() {
# convert any cygwin paths to windows paths
local -a args
local -i index=0
for arg ; do
args[$index]=$( cygpath -w -- "$arg" )
index=$(($index + 1))
done
printf "%s\n" "${args[@]}"
}
vi() {
local oldIFS="$IFS"
IFS=$'\n'
local -a args=($( winify "$@" )) ;# convert any cygwin paths to windows paths
set -- "${args[@]}"
printf "gvim %s\n" ${1+"$*"}
{
gvim ${1+"$@"} &&
[[ -n "$1" ]] && mkwritable ${1+"$@"};
} &
IFS="$oldIFS"
}
#alias view='vi -R'
alias view='vi -M'
alias where='type -a'
alias nocat='cat > /dev/null'
psg() {
local fields="user,pid,ppid,stime,time,vsz,args"
local pattern=`printf "%s\n" "$*" | sed -e 's@/@\\\/@g'`
local script='NR==1 {print; next} /awk NR==1/ {next} /'"$pattern"'/'
#ps -e -o $fields | awk "$script" - | sort -n -k 2 | less -E
#ps -al | awk "$script" - | sort -n -k 2 | less -E
ps -af --windows | awk "$script" - | less
}
echopath () {
OPTIND=1
local name=path
local path="$PATH"
while getopts ":hm" option; do
case "$option" in
h) printf "%s\n" "echopath [-hm]" ; return ;;
m) name=manpath; path="$MANPATH" ;;
?) printf "illegal option: '%s'\n" "$OPTARG" >&2 ; return ;;
esac
done
local oldIFS="$IFS"
IFS=:
printf "%s\n" "${name}:"
for p in $path; do printf "%s\n" "$p"; done
IFS="$oldIFS"
}
alias cdsrc='pushd ~/src'
alias cdh='pushd h:/'
#alias cdpf='pushd "$PROGRAMFILES"'
cdpf () { pushd "$PROGRAMFILES/$1"; }
#alias cddocs="pushd '`cygpath -u "$USERPROFILE"`/My Documents'"
cddocs() { pushd "$MYDOCS/$1"; }
#alias cddesktop='cddocs ../Desktop'
alias cddesktop="pushd '$(cygpath -u "$USERPROFILE")/Desktop'"
alias cdmx="pushd /cygdrive/c/Inetpub/wwwroot/EAccMan/bin"
alias cdapache="cdpf 'Apache Software Foundation/Apache2.2/'"
alias cdmysql="cdpf 'MySQL/MySQL Server 5.0/bin'"
alias cdloa="pushd /cygdrive/l/Loa/Data"
# activestate perl needs a windows path for script name
do_script () {
local interpreter="$1"
local script="$2"
local file=`cygpath -w "$script"`
shift 2
"$interpreter" "$file" ${1+"$@"}
}
alias tclsh=/cygdrive/c/Tcl/bin/tclsh ;# activestate tcl 8.5
do_tcl_script () {
do_script /cygdrive/c/Tcl/bin/tclsh ${1+"$@"}
}
#alias ldapsearch='do_script perl ~/bin/searchldap.pl'
alias ldapsearch='do_script python ~/bin/searchldap.py'
alias lds=ldapsearch
check_uli() {
printf "ldapsearch params: %s\n" "$*"
ldapsearch --ldap --auth --all "$@" | gawk '
BEGIN { IGNORECASE=1 ; founduli=0 }
/dn:/ {print}
/aui:/ {print}
/uli/ {print; founduli=1}
END {if (!founduli) {print "\nno ULI found"}}
'
}
alias perlsh='do_script perl ~/bin/perlsh.pl'
alias tcl='do_script /cygdrive/c/Tcl/bin/tclsh ~/bin/tclsh.tcl'
alias beautify_tcl='~/tcl/frink/frink.exe -egINnz -w 150'
frink() {
"$HOME/tcl/frink/frink.exe" -HJ ${1+"$@"}
[ $? -eq 0 ] && printf "%s\n" OK
}
#alias procheck='"$PROGRAMFILES"/TclPro1.4/win32-ix86/bin/procheck.exe'
procheck() {
local oldIFS="$IFS"
IFS=$'\n'
local -a args=($( winify "$@" )) ;# convert any cygwin paths to windows paths
local pc=$( cygpath -u "$PROGRAMFILES/TclPro1.2/win32-ix86/bin/procheck.exe" )
echo "$pc ${args[@]}"
"$pc" "${args[@]}"
IFS="$oldIFS"
}
#alias ssh='plink -ssh'
#alias sftp=psftp
alias mql='do_script perl ~/bin/mql.pl'
alias tkcon='do_script wish85 /cygdrive/c/Tcl/lib/teapot/application/tcl/teapot/tkcon-2.5.tm &'
#alias tclhelp='`cygpath -u $COMSPEC` /c start "" "$PROGRAMFILES/Tcl/doc/ActiveTclHelp8.4.chm"'
##tclhelp() {
## OPTIND=1
## local tcldir='Tcl' tclver='8.5' usage='usage: tclhelp [-h] [-v 8.5]'
## while getopts ':hv:' option; do
## case "$option" in
## h) printf "%s\n" "$usage" ; return ;;
## v) tclver="$OPTARG"
## case "$tclver" in
## 8.4) : ;;
## 8.5) tcldir='Tcl8.5' ;;
## *) printf >&2 "%s\n" "$usage"; return ;;
## esac ;;
## ?) printf "illegal option: '%s'\n" "$OPTARG" >&2 ; return ;;
## esac
## done
## start $(cygpath -w "$PROGRAMFILES/$tcldir/doc/ActiveTclHelp${tclver}.chm")
##}
alias tclhelp='start /cygdrive/c/Tcl/doc/ActiveTclHelp8.5.chm'
#alias tclkit="$HOME/tcl/starkit/tclkit-win32.8_4_13.exe"
alias tclkit="/cygdrive/c/Tcl/lib/teapot/application/win32-ix86/teapot/base-tcl-thread-8.5.2.1.284926.tm"
alias wishkit="/cygdrive/c/Tcl/lib/teapot/application/win32-ix86/teapot/base-tk-thread-8.5.2.1.284926.tm"
alias hexdump='do_script tclsh85 ~/bin/hexdump.tcl'
alias printfile="'$PROGRAMFILES/PrintFile/PRFILE32.exe' /q"
alias 916="'$PROGRAMFILES/PuTTY/putty.exe' -load 'auds916 glennj' &"
alias 950="'$PROGRAMFILES/PuTTY/putty.exe' -load 'auds950 matrix' &"
alias rawl="'$PROGRAMFILES/PuTTY/putty.exe' -load rawlence &"
alias ncf="'$PROGRAMFILES/PuTTY/putty.exe' -load 'xx087@ncf' &"
#findgrep () { find . -type f | xargs -i grep -H ${1+"$@"} {}; }
findgrep () {
OPTIND=1
local findargs=""
local grepargs=""
while getopts ":hF:" option; do
case "$option" in
h) printf "%s\n%s\n%s\n" \
"usage: findgrep [-h] [-F 'find arg'] grep_args..." \
"apply grep to all files found in this directory and all subdirectories" \
"-F 'find arg' => optional argument for find. e.g. '-name \*.txt'"
return ;;
F) findargs="$findargs $OPTARG" ;;
?) grepargs="$grepargs -$OPTARG" ;;
esac
done
shift $(( $OPTIND - 1 ))
echo "find . -type f $findargs -print0 | xargs -0 grep -H $grepargs $@"
find . -type f $findargs -print0 | xargs -0 grep -H $grepargs ${1+"$@"}
}
#explore () {
# local cmd="$(cygpath -u ${WINDIR}/explorer.exe) /e,"$(cygpath -w "$(pwd)")
# printf "%s\n" $cmd
# $cmd
#}
explore() {
cygstart -x "${1:-.}"
}
myip() {
# ipconfig has funny line endings "\r\r\n"
ipconfig | awk '/IP Address/ {sub(/\r$/, ""); print $NF}'
}
clock() {
printf "puts [clock %s]\n" "$*" | tclsh
}
# I put the activestate perl bin dir ahead of /usr/bin to use activestate's
# perl. However activestate perl/bin has a HEAD program which thus supercedes
# /usr/bin/head. Blech.
alias head=/usr/bin/head
# lazy hostname lookup
nslookup() {
for domain in "" .usa.alcatel.com .usa.alcatel-lucent.com .ca.alcatel.com .ca.alcatel-lucent.com .alcatel.com .alcatel-lucent.com .aur.alcatel.com .aur.alcatel-lucent.com; do
local name="${1}$domain"
printf "trying %s ...\n" "$name"
/cygdrive/c/WINDOWS/system32/nslookup "$name" | awk '
NR < 3 { next; }
/Non-authoritative answer:/ { next; }
{ print; }
/Address: / { exit 1; }
' -
[ $? -eq 1 ] && break
printf "%s\n" '----------------------------------------------'
done
}
javascript() {
printf "%s\n" "To exit: quit()"
# continue in a subshell...
(
cd ~/src/rhino1_6R4 &&
env CLASSPATH=./js.jar java org.mozilla.javascript.tools.shell.Main
)
}
beanshell() {
OPTIND=1
local jre=$(cygpath -u "$PROGRAMFILES/Java/jre1.6.0_05")
while getopts ":hj:" option; do
case "$option" in
h) printf "%s\n%s\n%s\n" \
"start a Java shell (http://www.beanshell.org)" \
"usage: beanshell [-h] [-j JAVA_HOME]" \
"-j JAVA_HOME => specify a JAVA_HOME ($jre)"
return ;;
j) jre="$OPTARG" ;;
?) printf >&2 "unknown option: %s\n" "$OPTARG" ; return ;;
esac
done
if [[ ! -d "$jre" ]]; then
printf >&2 "No such directory: %s\n" "$jre"
return
fi
printf "using JAVA_HOME='%s' ...\n" "$jre"
(
JAVA_HOME="$jre"
CLASSPATH=$(cygpath -w "$JAVA_HOME")';'$(cygpath -w "$HOME/bin/bsh-2.0b4.jar")
export JAVA_HOME CLASSPATH
"$JAVA_HOME/bin/java" bsh.Interpreter
)
}
edmslookup() {
OPTIND=1
local debug=0
local db=""
while getopts ":hdp" option; do
case "$option" in
h) printf "%s\n%s\n%s\n" "edmslookup [-hdp] userid ..." "-d => debugging on" "-p => use PREU1 database"; return ;;
d) debug=1 ;;
p) db='&db=preprod' ;;
?) printf "illegal option: '%s'\n" "$OPTARG" >&2 ; return ;;
esac
done
shift $(( $OPTIND - 1 ))
local url='http://edmsweb.usa.alcatel.com/cgi-bin/edmsweb/accounts/lookup_user.exp'
local uri
for userid; do
uri="$url?csl=$userid&debug=${debug}$db"
[ $debug -eq 1 ] && printf "%s\n" "$uri"
links -dump "$uri" | awk '/----/ {exit} {print}' -
done
}
allreadable() {
local cygwin="$CYGWIN"
set -x
unset CYGWIN
# ignore ~/.ssh
find ~ \( -wholename ~/.ssh -prune \) -type f -print0 | xargs -0 chmod ugo+rw
find ~ \( -wholename ~/.ssh -prune \) -type d -print0 | xargs -0 chmod ugo+rwx
local docsdir=$(cygpath -u "$USERPROFILE")
find "$docsdir" -type f -print0 | xargs -0 chmod ugo+rw
find "$docsdir" -type d -print0 | xargs -0 chmod ugo+rwx
/bin/cp -f "$docsdir/Application Data/Mozilla/Firefox/Profiles/ds7xnob5.default/bookmarks.html" "$HOME"
CYGWIN="$cygwin"
set +x
}
edmspasswd() {
pushd ~/bin >/dev/null
do_script tclsh85 ./makepasswd.tcl -alnum
popd >/dev/null
}
rxvt() { /bin/rxvt ${1+"$@"} & }
alias windiff=windiff.bat
alias diff='diff -b'
#alias tin='env NNTPSERVER=news.alcatel.com tin -r'
tin() {
set -x
(
#local old_cygwin="$CYGWIN"
unset CYGWIN
chmod u+rw ~/.newsrc
cd ~/News
#export CYGWIN="$old_cygwin"
env NNTPSERVER=news.alcatel.com tin -r
)
set +x
}
backup() {
local new="$1.$(date '+%Y%m%d')"
while [ -f "$new" ]; do new="$new~"; done
printf "copying '%s' to '%s'\n" "$1" "$new"
cp -ip "$1" "$new"
}
#start() {
# cmd /c "start $@"
#}
alias start=cygstart
alias bc='bc -l'
loadata() {
# rename yesterday's loadata.xls file
cdloa
local loadir=$( pwd )
tcl -e '
set date [clock format [file mtime loadata.xls] -format %Y%m%d]
file rename loadata.xls loadata.$date.xls
'
ls -l
popd
start "$HOME/bin/LoACheck.exe"
start iexplore 'https://caotts200.ca.alcatel.com/LOA/Pages/AppLogin.aspx?ReturnUrl=%2fLOA%2fPages%2fUsers%2fEdmsDownload.aspx'
start excel
cddesktop
printf "todo: mv [lL]o[aA]* %s; ll %s\n" "$loadir" "$loadir"
}
mkwritable() { ( unset CYGWIN; chmod u+rw "$@"; ); }
alias edit='start "${PROGRAMFILES}/Notepad++/notepad++"'
alias elinks="$HOME"/elinks/elinks.exe
weather() {
local url='http://text.www.weatheroffice.gc.ca/forecast/city_e.html?on-118&unit=m'
elinks -dump "$url" | perl -ne '
next if /^\s*$/;
next if /^[^[:alpha:]]+Ontario[^[:alpha:]]+$/;
print if /^\s*Ottawa/ ... /^Historical/
' | grep -v '^Historical'
}
octranspo() {
local url start awk
local time=$( date +%H:%M )
echo "current time: $time"
# 101
set -- 101
url='http://octranspo.com/mapscheds/currenttables/times/times101wke0.htm'
start='Hertzberg/March'
awk='/^ / {next} $1 > time {print $1}'
printf "\nnext %s starting from %s:\n\n" "$1" "$start"
elinks -dump "$url" | gawk -v time="$time" "$awk"
# 182
set -- 182
url="http://octranspo.com/mapscheds/currenttables/times/times182wke1.htm"
start='303 Terry Fox'
awk='$1 > time {print $1}'
printf "\nnext %s starting from %s:\n\n" "$1" "$start"
elinks -dump "$url" | gawk -v time="$time" "$awk"
}
get_http_proxy() {
local url='http://proxy.ca.alcatel.com/proxy.pac'
#links -source "$url" | perl -lne '/return "PROXY (.*?)"/ and print $1'
links -source "$url" | gawk 'match($0, /return "PROXY (.*?)"/, a) {print a[1]}'
}
################################################################################
# launch matrixplot system if running in X server xterm
if [ -n "$RUN" ]; then
alias matrixplot="$HOME/bin/matrixplot.pl"
goto() {
local hostname="$1".usa.alcatel.com
echo "adding $hostname..."
xhost "+$hostame"
local ip=$(myip)
printf "remotely, execute: export DISPLAY=%s:0\n" $ip
plink -ssh -l matrix "$hostname"
}
printf "%s\n" "do you want to run: matrixplot"
printf "%s\n" "to login to auds950/auds916 with X: goto auds950"
fi
################################################################################
}}}
{{{
#
# default path is /usr/bin:.
#
# note: bash pattern matching example: use: [[ $var == unquoted_pattern ]]
# read -p "Continue [n/y]? " answer
# if [[ $answer == [yY]* ]]; then ...
#stty erase ^?
export PATH=/opt/ssh/bin:/usr/local/bin:/usr/bin:/usr/ccs/bin:/usr/xpg4/bin:/usr
/sbin:/usr/proc/bin:/usr/local/sbin:/usr/openwin/bin
export MANPATH=/usr/share/man:/usr/local/man
[ ${BASH_VERSION%%.*} -eq 1 ] && MY_BASHVER=1 || MY_BASHVER=${BASH_VERSINFO[0]}
if [ $MY_BASHVER -gt 1 ]; then
PS1='\n\u@\h \w\n(\@) \! \$ '
else
PS1='\n\u@\h \w\n\! \$ '
fi
HISTFILESIZE=1
set -o noclobber
# use vi line editing
set -o vi
eval `gdircolors -b | sed -e 's/ex=..;../ex=01;31/'`
alias ls='gls -F --color=auto'
lspaged () {
# http://www.student.northpark.edu/pemente/sed/sedfaq4.html
# here, adding 2 spaces to potentially be replaced by commas
# so GB-sized files will not have a comma before the GB digits
local widen='s/^\(.\{33\}\)\(.*\)/\1 \2/'
local comma='s/^\(.\{33\} *\) \([0-9][0-9]*\)\([0-9]\{3\}\)/\1\2,\3/'
(
unset LESSKEY
ls ${1+"$@"} | sed -e "$widen" -e :a -e "${comma};ta" | less -E
)
}
alias ll='lspaged -l'
alias la='lspaged -la'
# needed for "expanded" pathname expansion in 'lh' function
shopt -s extglob
lh () {
local lines="-20"
case "$1" in
-+([0-9]))
lines="$1"
shift
;;
esac
ls -lt ${1+"$@"} | cat - | head "$lines"
}
who () {
/usr/bin/who ${1+"$@"} | sort
}
alias h=history
alias mv='mv -i'
alias rm='rm -i'
alias cp='cp -pi'
alias where='type -a'
alias vi=vim
alias view='vim -R'
alias df='df -k'
alias du='du -k'
alias nocat='cat >/dev/null'
alias more='less -e'
alias top='top -u' ;# buggy top
alias finger='finger -m'
alias mygpg='gpg -e -r glennj -r adalle'
dirtree () { find . -print | sort | sed -e 's,[^/]*/\([^/]*\)$,`--\1,' -e 's,[^/]*/,| ,g'; }
export MY_MUTTRC=~/.mutt/muttrc
#alias mutt='mutt -F $MY_MUTTRC'
mutt() {
OPTIND=1
local type="imap"
while getopts ":hil" option; do
case $option in
h) echo "mutt [-hil]"
echo " -i = IMAP folders"
echo " -l = local folders (default)"
return ;;
i) type="imap" ;;
l) type="local" ;;
?) echo >&2 "illegal option \"$OPTARG\"" ; return ;;
esac
done
export THIS_MUTTRC="${MY_MUTTRC}-$type"
/usr/local/bin/mutt -F "${MY_MUTTRC}-$type"
unset THIS_MUTTRC
}
alias mutthelp='links http://www.mutt.org/doc/manual/'
#alias slrn='NNTPSERVER=freenet-news ~xx278/slrn/bin/slrn.favrc'
alias slrn='$HOME/bin/slrn'
alias news=slrn
#alias t2slrn='slrn -h pubnews.tarantella.com -f ~/.newsrc.tarantella'
alias perldoc='perldoc -U'
if [ $MY_BASHVER -gt 1 ]; then
psg () {
# man bash(1): Parameter Expansion: ${parameter//pattern/string}
# to protect awk's slashes, we want to escape any /'s in the cmdline
local args="${*//\//\\/}"
local script='NR==1 {print; next} /awk NR==1/ {next} /'"$args"'/'
#local fields="user,pid,ppid,stime,time,vsz,osz,args"
# osz is pages, vsz is kbytes
local fields="user,pid,ppid,stime,time,vsz,pmem,args"
ps -e -o $fields | awk "$script" - | sort -n -k 2 | less -E
}
else
psg () {
#local fields="user,pid,ppid,stime,time,vsz,osz,args"
local fields="user,pid,ppid,stime,time,vsz,args"
local pattern=`echo "$*" | sed -e 's@/@\\\/@g'`
local script='NR==1 {print; next} /awk NR==1/ {next} /'"$pattern"'/'
ps -e -o $fields | awk "$script" - | sort -n -k 2 | less -E
}
fi
ptg () {
local prog=$1
echo "$prog"
for pid in `psg $prog | awk 'NR==1 {next} {print $2}'`; do
echo -e "\npid=$pid\nprocesses:"
psg "\\<$pid\\>"
echo -e "\ntree:"
ptree $pid
done
}
echopath () {
OPTIND=1
local name=PATH
local path=$PATH
while getopts ":hm" option; do
case $option in
h) echo "echopath [-hm]" ; return ;;
m) name=MANPATH; path=$MANPATH ;;
?) echo >&2 "illegal option \"$OPTARG\"" ; return ;;
esac
done
local oldIFS="$IFS"
IFS=:
echo ${name}:
for p in $path; do echo $p; done
IFS="$oldIFS"
}
if [ $MY_BASHVER -gt 1 ]; then
man () {
# assume any 1 or 2 character first parameter is a man section
[[ $# -gt 1 && ("$1" == ? || "$1" == [1-9]?) ]] && set -- -s "$@"
/usr/bin/man "$@"
}
else
man () {
# assume any 1 or 2 character first parameter is a man section
case "$1" in ?|[1-9]?) set -- -s "$@";; esac
/usr/bin/man "$@"
}
fi
disp () {
local display=${1:-"sysadmin-dt.ncf.ca"}
export DISPLAY=${display}:0
env | grep DISPLAY
echo "did you 'xhost +`hostname`'?"
}
myzip2 () {
perl -e '
$t1 = time();
$cmd = "nice bzip2 -9v @ARGV";
print "$cmd\n";
`$cmd`;
print "elapsedtime: ", (time() - $t1), " seconds\n";
' "$@"
#perl -e '$t1=time(); `bzip2 -9v --repetitive-best '"$@"'`;
# print "elapsed time: ", (time() - $t1), " seconds\n"; '
#local script='
# $t1=time();
# `bzip2 -9v --repetitive-best '"$@"'`;
# print "elapsed time: ", (time() - $t1), " seconds\n";
#'
#perl -e "$script";
}
alias mysqlncf='mysql -u ncfroot -p -h saruman ncf'
## checkPendingVisa () {
## sql="SELECT accountID,accountType,entryDate,benefactor,donationNative,formOfPayment
## FROM ncfDonations inner join ncfNewRegistrants on accountID=memberID
## WHERE registrationStatus='AwaitingID' and idMethod='creditCard';"
## echo -e "$sql\n"
## echo "$sql" | mysqlncf
## }
alias mycvsstat='cvs status 2>&1 | grep "Status: [^U]"'
myscreen () {
OPTIND=1
local one=0
local two=0
local new=0
local write=0
local screenid=''
local help="myscreen [-h] [-c|-1|-2|-s {1|2} pid]"
while getopts ":hc12s:" option; do
case $option in
h) echo $help ; return ;;
c) new=1 ; shift ;;
s) write=1 ; id=$OPTARG ; shift 2 ;;
1) one=1 ; screenid=$(<~/.screen.id1) ; shift ;;
2) two=1 ; screenid=$(<~/.screen.id2) ; shift ;;
?) echo >&2 "illegal option \"$OPTARG\"" ; return ;;
esac
done
if [ $(( $one + $two + $new + $write )) -ne 1 ]; then
echo "you must specify exactly one of -c or -1 or -2 or -s"
echo $help
return 1
fi
if [ $write -eq 1 ]; then
local pid=$1
if [ "$id" = '1' -o "$id" = '2' ]; then
set -- `ptree $pid | head -1`
if [ "$2" = 'screen' ]; then
echo $pid >| ~/.screen.id$id
else
echo >&2 "pid $pid is not a screen process"
fi
else
echo >&2 "can only set id 1 or 2"
fi
else
local command
if [ $new -eq 1 ]; then
#command="screen -c $HOME/.screenrc.saruman"
command="screen -c $HOME/.screenrc"
else
if [ -z "$screenid" ]; then
echo "don't know the screen id! check ~/.screen.idX files"
screen -ls
ls -la ~/.screen.id*
return 1
fi
command="screen -dr $screenid"
fi
echo $command
$command
fi
}
findgrep () {
OPTIND=1
local findargs=""
local grepargs=""
while getopts ":hF:" option; do
case "$option" in
h) printf "%s\n%s\n%s\n" \
"usage: findgrep [-h] [-F 'find arg'] grep_args..." \
"apply grep to all files found in this directory and all subdirectories" \
"-F 'find arg' => optional argument for find. e.g. '-name \*.txt'"
return ;;
F) findargs="$findargs $OPTARG" ;;
?) grepargs="$grepargs -$OPTARG" ;;
esac
done
shift $(( $OPTIND - 1 ))
echo "find . -type f $findargs -print0 | xargs -0 grep -H $grepargs $@"
find . -type f $findargs -print0 | xargs -0 grep -H $grepargs ${1+"$@"}
}
################################################################################
for m in 1 4 7 9 10; do alias f${m}="rlogin freenet${m}"; done
for m in saruman isildur frodo gandalf smeagol theodyn; do
#alias ${m}="rlogin ${m}"
alias ${m}="sshenv && ssh -A ${m}"
if [ $MY_BASHVER -gt 1 ]; then alias ${m:0:3}=$m; fi
done
#alias gw='rlogin -l glennj gw.ncf.ca'
#gw () {
# echo -n "glennj's "
# rlogin -l glennj gw.ncf.ca
#}
alias gw='ssh -Al glennj gw.ncf.ca'
alias mitel='ssh -Al glennj gw-mitel.ncf.ca'
alias ott='ssh -Al glennj gw.ott.ncf.ca'
alias batcave='ssh -Al glennj $(< $HOME/.ip.batcave)'
alias macx='ssh -Al glennj glennj.dyndsl.com'
alias superman='ssh -Al glennj superman.ncf.ca'
alias denethor='sshenv && ssh -Al glennj denethor.ncf.ca'
alias den=denethor
# Mode ms
#alias tc1='telnet 134.117.137.18'
#alias tc2='telnet 134.117.137.9'
#alias tc3='telnet 134.117.137.10'
#alias tu1='telnet 134.117.137.14 3721'
#alias tu2='telnet 134.117.137.13 3721'
#alias tu3='telnet 134.117.137.17 3721'
################################################################################
# host specific stuff
#
case `hostname` in
isildur)
export MY_MUTTRC_HOST="${MY_MUTTRC}-saruman"
alias cdweb='pushd /files20/apache2'
alias cdtom='pushd /files20/tomcat'
alias rscadm='/usr/platform/SUNW,Sun-Fire-280R/rsc/rscadm'
#alias screen='env TERM=dtterm screen'
# tarantella
PATH=$PATH:/files/tarantella/bin:/opt/lanman/bin:/opt/lanman/sbin
MANPATH=$MANPATH:/opt/lanman/man
alias t2=tarantella
#
tomcatLogins () {
local who=$1
# check 7 days worth
set -- `ls -1tr /files20/tomcat/logs/ncf.log* | tail -7`
local start=${1#*ncf.log.}
echo "checking since $start"
for file; do grep -Ei "(pw.*$who)|($who.*loggedIn)" $file; done
}
;;
saruman)
export MY_MUTTRC_HOST="${MY_MUTTRC}-saruman"
alias cdweb='pushd /usr/local/apache'
alias cdlogs='pushd /files40/logs'
alias cdrad='pushd /files40/logs/radius'
alias cdimta='pushd /files40/logs/sunone/ms/msg-ncf-mail/imta'
alias rscadm='/usr/platform/SUNW,Sun-Fire-280R/rsc/rscadm'
## myfetchmail () {
## # 20040729 - add -t option to avoid "wedged" connections
## #fetchmail -d 300 -t 30 -L $HOME/logs/fetchmail.log
## }
# pc netlink
PATH=$PATH:/opt/lanman/bin:/opt/lanman/sbin
MANPATH=$MANPATH:/opt/lanman/man
# samba
PATH=$PATH:/usr/local/samba/bin
MANPATH=$MANPATH:/usr/local/samba/man
# iplanet
alias mailsrv='su mailsrv'
PATH=$PATH:/raid/sunone/ms/msg-ncf-mail:/raid/sunone/ms/bin/msg/admin/bin:/raid/sunone/ms/bin/msg/store/bin
MANPATH=$MANPATH:/raid/sunone/ms/bin/msg/man:/raid/src/pure-ftpd-1.0.14/man
export LD_LIBRARY_PATH=/raid/sunone/ms/bin/msg/lib
ms () {
local root=/raid/sunone/ms/msg-ncf-mail/store/partition/primary
local mboxutil=mboxutil.exp
if [ `/usr/xpg4/bin/id -u` -eq 899 ]; then mboxutil=mboxutil; fi
if [ $# -lt 2 ]; then
echo "ms <cd|userid|recreate> <userid>"; return
fi
case "$1" in
c|cd) pushd $root/\=user/`hashdir $2`\=$2 ;;
u|us|use|user)
shift; for user; do
echo ""; echo "$user mailbox status"
$mboxutil -l -p user/$user/\* ; $mboxutil -u $user
done ;;
recreate)
local answer boxes="INBOX Drafts Sent Trash"
shift; for user; do
echo ""; echo "$user mailbox recreation"
$mboxutil -l -p user/$user/\*
echo do this:
echo " $mboxutil -d user/$user/INBOX"
echo " for b in $boxes; do $mboxutil -c user/$user/\$b; done"
echo "or:"
local date=`date +%Y%m%d%H%M%S`
echo " $mboxutil -r user/$user/INBOX user/$user/inbox.$date.$$"
echo " $mboxutil -d user/$user/inbox.$date.$$"
done ;;
*) echo "unknown subcommand, '$1'" >&2 ;;
esac
}
#mysql
MANPATH=$MANPATH:/usr/local/mysql/man
# man pages for X apps (e.g. xterm)
MANPATH=$MANPATH:/usr/openwin/man
# for determining what package a file belongs to.
pkgfile () {
#local patt="$1"
#local maplist=/var/tmp/package.maps
#pushd /raid/install/Solaris_8/Product >/dev/null
#if [ ! -f $maplist ]; then
# echo "generating list of package map files..."
# find . -name pkgmap -print > $maplist
#fi
#echo "searching for package(s) containing ${patt}..."
#while read map; do
# if grep "$patt" /raid/install/Solaris_8/Product/$map; then
# echo "===== $map"
# fi
#done < $maplist
#popd >/dev/null
for file; do pkgchk -l -p $file; done
}
#
alias ldapsearch='ldapsearch -h gandalf -b "ou=people,o=ncf.ca,o=freenet"'
#
spamratio () {
perl -e '
my (%u,%c,%s) =((),(),());
open FID, "/var/adm/spamd";
while (<FID>) {
if (/clean message .*? for (.....)/ ) {
$u{$1}=1; $c{$1}++;
}
elsif (/identified spam .*? for (.....)/) {
$u{$1}=1; $s{$1}++;
}
}
close FID;
print "user [clean,spam]\n";
foreach $user qw('"$*"') {
print "$user [", $c{$user}, ",", $s{$user}, "]\n";
}
'
}
#
# screen
#alias screen='env TERM=dtterm screen'
#alias myscreen='screen -c ~/.screenrc.saruman'
dsldecrypt () {
for f in dsl.customers dsl_auth.txt
do
echo $f
gpg -qd ${f}.gpg > $f
touch -r ${f}.gpg $f
done
ls -l dsl*
}
dslencrypt () {
for f in dsl.customers dsl_auth.txt
do
if [ -f $f ]; then
echo $f
if [ $f -nt ${f}.gpg ]; then
echo "encrypting..."
gpg -e -r glennj -r adalle $f
else
echo "$f was not changed"
fi
else
echo "no such file: $f"
fi
done
ls -l dsl*
}
dslvaluepairs () {
echo "SELECT * FROM ncfValuePairs WHERE accountid='$1' AND keyword LIKE 'DSL%';" | mysqlncf
}
;;
gandalf.ncf.ca)
alias ldapbrowser=/files/sunone/data/startconsole
;;
frodo)
alias cdweb='pushd /files20/apache2/servers/isildur'
PATH=$PATH:/usr/dt/bin
alias ns='netscape -install -no-about-splash &'
export ICAROOT=/files/citrixICAClient/
alias citrix="$ICAROOT/wfcmgr &"
# java
export JAVA_HOME=/usr/java
export ANT_HOME=/usr/local/jakarta-ant-1.5.1
alias javac='javac -verbose'
# my private tomcat
export CATALINA_HOME=$HOME/tomcat
export NCF_HOME=~/src
tomcat () {
case "$1" in
start) $CATALINA_HOME/bin/startup.sh ;;
stop) $CATALINA_HOME/bin/shutdown.sh ;;
restart) tomcat stop; tomcat start ;;
*) echo "error: tomcat [start|stop|restart]" ;;
esac
}
;;
freenet1)
MANPATH=$MANPATH:/NCF_dsk/freenet1/u1/majordomo/man:/opt/ssh/man
alias cdweb='pushd /NCF_dsk/freenet1/v1/apache-httpd'
alias cdmodperl='pushd /usr/local/lib/perl5-NCF/NCF/FreePort'
alias sendm='psg sendmail | awk '\''/COMMAND/ {continue} {total++;size+=$6;res+=$7} END {printf("%d processes, size %d KB (%d KB resident)\n",total,size,res)}'\'' -'
unset LESSKEY
;;
freenet4)
MANPATH=$MANPATH:/opt/ssh/man
alias cdweb='pushd /files11/ns-home'
#alias unarchive='date; psg '\''(renew|make)'\''; echo "==="; ~xx968/bin/ncf-unarchive.pl'
unarchive () {
local test_cmd="date; psg '(renew|make)'"
echo $test_cmd
eval $test_cmd && echo "====" && ~xx968/bin/ncf-unarchive.pl
}
ncfpasswd () {
if [ $# -ne 1 ]; then echo "usage: ncfpasswd <userid>"; return; fi
perl -e '
use Sys::Hostname;
die "must be root\n" unless ($< == 0);
$yphost = "freenet4";
die "run on $yphost\n" unless (hostname() eq "$yphost");
$user = "'$1'";
($uid,$gid,$gcos,$dir,$sh) = (getpwnam $user)[2,3,6,7,8]
or die "no such user: $user\n";
print "$user -- $gcos\n";
print "enter the new passwd: ";
chomp($pass = <>);
@c = ("a".."z","A".."Z",0..9,".","/");
$cryp = crypt $pass, $c[int(rand(64))].$c[int(rand(64))];
$file = "/usr/local/lib/npasswd/passwd.update";
open UPDATE, ">> $file" or die "cannot append to $file: $!\n";
print UPDATE "$user:$cryp:$uid:$gid:$gcos:$dir:$sh\n";
close UPDATE;
system "ls","-l",$file;
system "cat",$file;
'
}
unset LESSKEY
;;
freenet9)
MANPATH=$MANPATH:~xx278/slrn/man:/opt/ssh/man
#alias cdweb='pushd /files11/ns-home'
#alias cdtmp='pushd /NCF_dsk/freenet9/h1/xx087'
alias cdtest='pushd /freenet/rootdir/menus/admin/test/xx087'
export MY_MUTTRC_HOST="${MY_MUTTRC}-freenet9"
unalias mutt
#alias mutt='~/.mutt/gen_folder_hooks.sh; mutt-old -F $MY_MUTTRC'
alias mutt='mutt-old -F $MY_MUTTRC'
#alias myscreen='screen -c ~/.screenrc.freenet9'
;;
freenet10)
MANPATH=$MANPATH:~xx278/slrn/man:/opt/ssh/man
alias cdmenu='pushd /freenet/rootdir/menus/admin/test/xx087'
export LINES
#alias LOGIN='[ `/usr/xpg4/bin/id -u` != 0 ] && /freenet/rootdir/bin/BBmenu || echo "not as root!"'
LOGIN () {
if [ `/usr/xpg4/bin/id -u` == 0 ]; then
echo "not as root!"
return
fi
cd
perl -pi -e 's/^(LINES=).*/$1$ENV{LINES}/' .menurc
/freenet/rootdir/bin/BBmenu
}
;;
smeagol)
export MY_MUTTRC_HOST="${MY_MUTTRC}-saruman"
alias cdrad='pushd /usr/local/var/log/radius'
PATH=$HOME/bin/PATH_START:$PATH:/freenet/rootdir/bin:/freenet/rootdir/rootbin
MANPATH=$MANPATH:~xx278/slrn/man:/files30/freenet/local/man
LOGIN () {
if [ `/usr/xpg4/bin/id -u` == 0 ]; then
echo "not as root!"
return
fi
if [ -z "$LINES" ]; then
reset
fi
cd
perl -pi -e 's/^(LINES=).*/$1$ENV{LINES}/' .menurc
/freenet/rootdir/bin/BBmenu
}
#perl -pi -e 's/^(LINES)=\d+/$1=$ENV{LINES}/' $HOME/.menurc
#alias LOGIN='[ `/usr/xpg4/bin/id -u` != 0 ] && /freenet/rootdir/bin/BBmenu || echo "not as root!"'
alias cdmenu='pushd /freenet/rootdir/menus/admin/test/xx087'
#alias mutt=$HOME/bin/mutt.exp
sshenv() {
if [ -n "$SSH_AUTH_SOCK" -a ! -S "$SSH_AUTH_SOCK" ]; then
unset SSH_AUTH_SOCK
fi
if [ -z "$SSH_AUTH_SOCK" ]; then
for dir in /tmp/ssh-*; do
if [ -O "$dir" ]; then
# owned by me
for file in "$dir"/*; do
if [ -S "$file" ]; then
echo "exporting: SSH_AUTH_SOCK=\"$file\""
export SSH_AUTH_SOCK="$file"
break 2
fi
done
fi
done
fi
if [ -z "$SSH_AUTH_SOCK" ]; then
echo "could not find an ssh agent-forwarding socket"
fi
}
fetchcomix() {
pushd $HOME/public_html/comix >/dev/null
./fetch.tcl "$@" -fetch -index && popd >/dev/null
}
;;
esac
# then, add myself to paths
PATH=$PATH:~/bin
MANPATH=$MANPATH:~/man
}}}
{{{
#cd ~
. ~/.bashrc
# ensure Activestate Perl is higher in PATH:
PATH='/cygdrive/c/Program Files/Perl/bin':"$PATH"
#export TZ="Canada/Eastern"
# set the LS_COLORS variable
eval `dircolors --sh|sed -e 's/ln=[^:]*/ln=04;00/' -e 's/ex=[^:]*/ex=01;31/'`
# 20061026 old CVSROOT (set in windows environment variables)
#export CVSROOT=:ext:glennj@edmsweb.usa.alcatel.com:/export/home/glennj/cvs_repository
# new CVSROOT (set in windows)
#export CVSROOT=:pserver:ebscvs.ca.alcatel.com:/home/cvs/cvsedms
# http://exptools.web.lucent.com/intro.html
export TOOLS=/opt/exp
PATH="${PATH}:${TOOLS}/bin"
MANPATH="${MANPATH}:${TOOLS}/man"
# if I invoke rxvt, I don't source any of my bash startup scripts. Apparently
# when rxvt runs, it can't find the SHELL variable and launches sh not bash,
# and hence the dot files aren't sourced. To combat this:
export SHELL
# now launch rxvt if I'm in a cmd window
#[ -z "$COLORTERM" ] && exec rxvt
export CYGWIN=nontsec ;# don't use NT security to set file permissions
}}}
[[see what google says|http://www.google.ca/search?hl=en&q=10%2C000%20steps]]
Track my daily steps at http://stjohnskanata.ca/test/walking.php
Downloaded and customized TiddlyWiki file. I can easily see how this can become a big timewaster in itself, with all the [[themes|http://tiddlythemes.com/#Home]] and [[plugins|http://tiddlyvault.tiddlyspot.com/]] available.
Installed the ~SelectThemePlugin to get the D3GtdTheme and the TiddlyPediaTheme from http://tiddlythemes.com. The CSS for the ~TiddlyPediaTheme appears slightly broken so I'll stick with ~D3Gtd for now.
I'll have to update the [[Ruby]] backup-by-email script I started yesterday.
Decided to stick with the D3GtdTheme and uninstall the ~SelectThemePlugin.
!ChurchBabies Camping Trip 2008
We went to Rideau River P.P. once again. Sonia and Ron (David, Jonathan, Thomas), David and Wendy (Artemise, Abraham), Scott and Trina (Nora), Jeff and Fiona (Gemma), Kelly and Kevin (Jemma), Jacq and I (Joshua).
In preparation, I made: bean and plum salad, hamburgers (uncooked), breaded chicken breasts, fajita filling, whole wheat bread, cornbread, dinner rolls, sauted mushrooms and onions for couscous.
Arrived last Monday around 5pm. Only Sonia and Ron arrived after us. Quickly set up two new tents and air mattress/frame. Alison's adapter did not work for us (pump worked for about 1 second then shut down -- I suspect it did not have sufficient amperage) but Scott had a Crappy Tire portable power thingy that worked great.
Dinner was potluck. Everybody contributed a bit and we had a satisfying repast. We contributed chicken breasts and bean/plum salad.
With the mosquitos, the excitement of friends and the unfamiliar sleeping environment, Joshua (and some other kids) slept poorly. Therefore, most adults did too.
David drove Jeff and I into work Tuesday morning. I cleansed with a quick chilly dip into the river. Had a less than productive day. The campers spent most of the day on the beach.
Scott and Trina, and Kelly and Kevin departed as planned Tuesday afternoon. David and Wendy left after dinner because Abraham had a few vomiting episodes.
Again, potluck dinner. The bean salad made its encore performance.
Had a nice evening at the campfire with marshmallows.
Joshua had another bad night's sleep with his itchy itchy bug-bitten feet.
Wednesday morning, Jeff and Fiona decided to bail with the crummy weather forecast. We all did too. Sonia seemed quite disappointed. Jacq invited everyone to our house for dinner tonight.
Jacq did most of the car packing (fortunately! a well packed car). I picked up my laptop from work and got to NCF just in time for my 1:30 DDM call.
Last night's dinner was a big success. Attendees: Francises, Wirtanens, Kelly, Andre and Kathleen.
found interesting website: [[Minimalist Fitness: How to Get In Lean Shape With Little or No Equipment]]
signed up with http://www.traineo.com
started FoodLog
met Alison for [[dinner|FoodLog]] at [[Pho Van Van|http://www.bfmartin.ca/phoottawa/]], then went back to her house to watch Olympic opening ceremony.
Had Ruben and Rita over for vegetarian dinner. However, there was a meaty bomb during desert: the mousse contains gelatin! They took the news well, however Rita promply stopped eating hers.
Bought some flowers in the afternoon. The flower lady was unhappy with a shipment of glads from S.Ont., so she sold be 2 dozen for $5!
Joshua was cranky all day, and quite beastly with Priya (this dinosaur does NOT share his toys!). After they left, we all went out for a walk under the tunnels, and Joshua walked (ran!) all the way along Tindall, and Parkdale to Kenilworth. He slept very well all night.
start a [[regimen of calisthenics|ExerciseLog 2008w32]] to build strength in addition to the [[10,000Steps]] daily
Added the ContentsSlider tiddler to the sidebar area of the PageTemplate (as found on http://www.tiddlywiki.com/)
Changed theme from [[D3Gtd|http://tiddlythemes.com/#D3Gtd]] to [[Zeldman|http://tiddlythemes.com/#Zeldman]]
yesterday's [[10,000Steps]] to enter: 9511
Past weekend's (Labour Day long weekend) activities:
!!Saturday:
* went to Gatineau with Josh, but did not meet up with Colleen & Phil. We walked for a while, but after several
!!Sunday
* worked with Dad to rebuild the front steps while Jacq & Josh went to [[storyland|http://www.storyland.ca/]] with Brian, MJ et al.
* Stairs complete but railings need to be done and attachment system for railings. To do:
** buy more hooks for ramp
** buy hinges for back gate
** bevel ramp boards
** calculate banister heights.
!!Monday -- Nesting day
* cleaning
* laundry
* assemble back gate
* Chase & Quiggley
Busy weekend, fell off exercise wagon -- ExerciseLog
Haven't written a journal entry in a while. Good thing I'm not a blogger.
meeting of the parish website committee:
* http://stjohnskanata.ca/wiki
* http://stjohnskanata.ca/joomla
StJohns council meeting
* Phyllis Paryas proposes an indoor labyrinth. Examples at St Luke's, Somerset St, and a United(?) church in Bell's Corners
Worst named product ever: [[Baskin Robbins Health Bar Shake|http://www.baskinrobbins.com/Nutrition/product.aspx?Category=Beverages&id=BV228]] -- so bad it has its own [[wikipedia page|http://en.wikipedia.org/wiki/Heath_Bar_Shake]]
2009 St Johns Vestry
Jacq's first day working at Milkface
* Quotes from the [[Wiki|http://en.wikipedia.org/wiki/Wiki#History]] page on Wikipedia:
<<<
A wiki is a collection of web pages designed to enable anyone who accesses it to contribute or modify content, using a simplified markup language.[1][2] Wikis are often used to create collaborative websites and to power community websites. The collaborative encyclopedia Wikipedia is one of the best-known wikis.[2] Wikis are used in business to provide intranets and Knowledge Management systems. Ward Cunningham, developer of the first wiki software, WikiWikiWeb, originally described it as "the simplest online database that could possibly work".[3]
<<<
<<<
"Wiki" (/wiːkiː/) is originally a Hawaiian word for "fast".
<<<
<<<
"Most people, when they first learn about the wiki concept, assume that a Web site that can be edited by anybody would soon be rendered useless by destructive input. It sounds like offering free spray cans next to a grey concrete wall. The only likely outcome would be ugly graffiti and simple tagging, and many artistic efforts would not be long lived. Still, it seems to work very well."
<<<
<<<
Wikis are generally designed with the philosophy of making it easy to correct mistakes, rather than making it difficult to make them.
<<<
<<<
Many wiki communities are private, particularly within enterprises. They are often used as internal documentation for in-house systems and applications. The "open to everyone", all-encompassing nature of Wikipedia is a significant factor in its growth, while there are other wikis which are highly specialized.
<<<
* the original wiki, ~WikiWikiWeb (http://c2.com/cgi/wiki), is focused on Design Patterns in software development
* linking
* WikiFormatting
** WikiWords
* wikipedia
<html><form name="thisForm" method="post">
<table width="600" align="center">
<tbody><tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0">
<tbody><tr>
<td align="center"><a href="http://all.alcatel-lucent.com/"><img alt="Alcatel-Lucent" src="../images/logow.jpg" align="absmiddle" border="0"></a><span style="font-weight: bold; font-size: 17pt; color: rgb(94, 75, 141); font-family: Tahoma,Sans-Serif;">Asset Tracking System</span></td>
</tr>
</tbody></table>
</td></tr>
<tr><td class="TopTitle" align="center">
Asset Details
</td></tr>
<tr><td><img src="../images/blackLine.gif" width="100%" border="0" height="2"></td></tr>
<tr><td align="center">
</td></tr><tr><td><table width="100%" border="1"><tbody><tr><td class="thTitleCenter" colspan="4">Sofware Installed</td></tr><tr><td class="lblTicket" nowrap="nowrap"><font size="-1"><b>Software</b></font></td></tr><tr><td><font size="-2"></font></td></tr><tr><td><font size="-2"></font></td></tr><tr><td><font size="-2"></font></td></tr><tr><td><font size="-2"></font></td></tr><tr><td><font size="-2"></font></td></tr><tr><td><font size="-2">ActiveState ActiveTcl 8.4.13.0</font></td></tr><tr><td><font size="-2">ActiveState ActiveTcl 8.4.17.0</font></td></tr><tr><td><font size="-2">ActiveState ActiveTcl 8.5.1.0</font></td></tr><tr><td><font size="-2">ActiveState Komodo Professional 3.5.3</font></td></tr><tr><td><font size="-2">Adobe Flash Player Plugin</font></td></tr><tr><td><font size="-2">Adobe Reader 8.1.1</font></td></tr><tr><td><font size="-2">Apache HTTP Server 2.2.8</font></td></tr><tr><td><font size="-2">Aspect Explore 4.3.0.6</font></td></tr><tr><td><font size="-2">Broadcom Gigabit Integrated Controller</font></td></tr><tr><td><font size="-2">Broadcom Gigabit Integrated Controller</font></td></tr><tr><td><font size="-2">C-Major Audio</font></td></tr><tr><td><font size="-2">Canon iP4200</font></td></tr><tr><td><font size="-2">Clarify ClearConfigurator 11.5SR1.19</font></td></tr><tr><td><font size="-2">Clarify ClearConfigurator Rule Wizard 11.5SR1.19 (Remove Only)</font></td></tr><tr><td><font size="-2">ClarifyCRM eFrontOffice11.5SR1.19 Client for Microsoft SQL Server</font></td></tr><tr><td><font size="-2">Cognos EP Series 7</font></td></tr><tr><td><font size="-2">Cognos Windows Common Logon Server</font></td></tr><tr><td><font size="-2">Command Prompt Here (cygwin)</font></td></tr><tr><td><font size="-2">Conexant D110 MDC V.9x Modem</font></td></tr><tr><td><font size="-2">Connected Backup</font></td></tr><tr><td><font size="-2">Creative Removable Disk Manager</font></td></tr><tr><td><font size="-2">Creative Software AutoUpdate</font></td></tr><tr><td><font size="-2">Creative System Information</font></td></tr><tr><td><font size="-2">Creative ZEN V Series (R2)</font></td></tr><tr><td><font size="-2">CVSNT</font></td></tr><tr><td><font size="-2">Cygwin Bash Prompt Here</font></td></tr><tr><td><font size="-2">Easy-WebPrint</font></td></tr><tr><td><font size="-2">EthicsPoint Icon (Lucent)</font></td></tr><tr><td><font size="-2">Hotfix for Windows XP (KB928388)</font></td></tr><tr><td><font size="-2">hp OpenView service desk 4.5 client</font></td></tr><tr><td><font size="-2">IE5 Registration</font></td></tr><tr><td><font size="-2">Integrity Agent</font></td></tr><tr><td><font size="-2">Intel(R) Graphics Media Accelerator Driver for Mobile</font></td></tr><tr><td><font size="-2">Intel(R) PROSet/Wireless Software</font></td></tr><tr><td><font size="-2">iPassConnect</font></td></tr><tr><td><font size="-2">Ipswitch WS_FTP Pro</font></td></tr><tr><td><font size="-2">J2SE Runtime Environment 5.0 Update 10</font></td></tr><tr><td><font size="-2">J2SE Runtime Environment 5.0 Update 11</font></td></tr><tr><td><font size="-2">J2SE Runtime Environment 5.0 Update 5</font></td></tr><tr><td><font size="-2">J2SE Runtime Environment 5.0 Update 6</font></td></tr><tr><td><font size="-2">J2SE Runtime Environment 5.0 Update 9</font></td></tr><tr><td><font size="-2">Java 2 Runtime Environment Standard Edition v1.3.1_02</font></td></tr><tr><td><font size="-2">Java 2 Runtime Environment, SE v1.4.2_11</font></td></tr><tr><td><font size="-2">Java 2 SDK, SE v1.4.2_11</font></td></tr><tr><td><font size="-2">Java(TM) 6 Update 2</font></td></tr><tr><td><font size="-2">Livelink Explorer Standard 4.4.0</font></td></tr><tr><td><font size="-2">Macromedia Flash Player 8</font></td></tr><tr><td><font size="-2">Macromedia Shockwave Player</font></td></tr><tr><td><font size="-2">Matrix 9.0</font></td></tr><tr><td><font size="-2">Matrix Admin 9.0</font></td></tr><tr><td><font size="-2">McAfee VirusScan Enterprise</font></td></tr><tr><td><font size="-2">mCore</font></td></tr><tr><td><font size="-2">mDriver</font></td></tr><tr><td><font size="-2">mDrWiFi</font></td></tr><tr><td><font size="-2">mHlpDell</font></td></tr><tr><td><font size="-2">Microsoft .NET Framework 1.1</font></td></tr><tr><td><font size="-2">Microsoft .NET Framework 2.0</font></td></tr><tr><td><font size="-2">Microsoft .NET Framework 2.0</font></td></tr><tr><td><font size="-2">Microsoft .NET Framework SDK (English) 1.1</font></td></tr><tr><td><font size="-2">Microsoft Access 2000 SR-1</font></td></tr><tr><td><font size="-2">Microsoft Data Access Components KB870669</font></td></tr><tr><td><font size="-2">Microsoft FrontPage Client - English</font></td></tr><tr><td><font size="-2">Microsoft MSDN 2005 Express Edition - ENU</font></td></tr><tr><td><font size="-2">Microsoft MSDN 2005 Express Edition - ENU</font></td></tr><tr><td><font size="-2">Microsoft Office Communicator 2005</font></td></tr><tr><td><font size="-2">Microsoft Office Live Meeting 2005</font></td></tr><tr><td><font size="-2">Microsoft Office Outlook 2003</font></td></tr><tr><td><font size="-2">Microsoft Office PowerPoint Viewer 2007 (English)</font></td></tr><tr><td><font size="-2">Microsoft Office Visio Professional 2003</font></td></tr><tr><td><font size="-2">Microsoft Office XP Professional</font></td></tr><tr><td><font size="-2">Microsoft Oracle .NET Data Provider</font></td></tr><tr><td><font size="-2">Microsoft Outlook Personal Folders Backup</font></td></tr><tr><td><font size="-2">Microsoft Project 2000 SR-1</font></td></tr><tr><td><font size="-2">Microsoft Visual C++ 2005 Express Edition - ENU</font></td></tr><tr><td><font size="-2">Microsoft Visual C++ 2005 Express Edition - ENU</font></td></tr><tr><td><font size="-2">Microsoft Visual J# .NET Redistributable Package 1.1</font></td></tr><tr><td><font size="-2">Microsoft Visual SourceSafe NetSetup</font></td></tr><tr><td><font size="-2">Microsoft Visual Studio .NET Enterprise Architect 2003 - English</font></td></tr><tr><td><font size="-2">mIWA</font></td></tr><tr><td><font size="-2">mIWCA</font></td></tr><tr><td><font size="-2">mLogView</font></td></tr><tr><td><font size="-2">mMHouse</font></td></tr><tr><td><font size="-2">Mozilla Firefox (2.0.0.13)</font></td></tr><tr><td><font size="-2">Mozilla Thunderbird (2.0.0.12)</font></td></tr><tr><td><font size="-2">mPfMgr</font></td></tr><tr><td><font size="-2">mPfWiz</font></td></tr><tr><td><font size="-2">mProSafe</font></td></tr><tr><td><font size="-2">MSDN Library - January 2006 DVD</font></td></tr><tr><td><font size="-2">mSSO</font></td></tr><tr><td><font size="-2">MSXML 4.0 SP2 (KB927978)</font></td></tr><tr><td><font size="-2">MSXML 4.0 SP2 (KB936181)</font></td></tr><tr><td><font size="-2">MSXML 6.0 Parser (KB933579)</font></td></tr><tr><td><font size="-2">mToolkit</font></td></tr><tr><td><font size="-2">mWlsSafe</font></td></tr><tr><td><font size="-2">MxAccKit</font></td></tr><tr><td><font size="-2">mXML</font></td></tr><tr><td><font size="-2">MySQL Server 5.0</font></td></tr><tr><td><font size="-2">mZConfig</font></td></tr><tr><td><font size="-2">Netscape</font></td></tr><tr><td><font size="-2">OpenLDAP</font></td></tr><tr><td><font size="-2">PDF reDirect (remove only)</font></td></tr><tr><td><font size="-2">PDFCreator</font></td></tr><tr><td><font size="-2">PHP 5.2.5</font></td></tr><tr><td><font size="-2">PL/SQL Developer</font></td></tr><tr><td><font size="-2">PowerDVD 5.1</font></td></tr><tr><td><font size="-2">PrintFile</font></td></tr><tr><td><font size="-2">QuickTime</font></td></tr><tr><td><font size="-2">RealPlayer</font></td></tr><tr><td><font size="-2">Remedy User 4.5</font></td></tr><tr><td><font size="-2">SAP Front End</font></td></tr><tr><td><font size="-2">Security Update for Microsoft .NET Framework 2.0 (KB928365)</font></td></tr><tr><td><font size="-2">Security Update for Windows Media Player (KB911564)</font></td></tr><tr><td><font size="-2">Security Update for Windows Media Player 10 (KB936782)</font></td></tr><tr><td><font size="-2">Security Update for Windows Media Player 9 (KB911565)</font></td></tr><tr><td><font size="-2">Security Update for Windows Media Player 9 (KB917734)</font></td></tr><tr><td><font size="-2">Security Update for Windows Media Player 9 (KB936782)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB890046)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB893756)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB896358)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB896422)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB896423)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB896424)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB896688)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB899588)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB899591)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB900725)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB901017)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB901214)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB902400)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB904706)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB905414)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB905749)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB905915)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB908519)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB908531)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB911280)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB911562)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB911567)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB911927)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB912919)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB913446)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB914388)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB914389)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB916281)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB917159)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB917344)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB917422)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB917537)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB917953)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB918118)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB918439)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB918899)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB919007)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB920213)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB920214)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB920670)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB920683)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB920685)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB921398)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB921503)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB921883)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB922616)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB922760)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB923191)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB923414)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB923689)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB923694)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB923980)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB924191)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB924270)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB924496)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB924667)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB925454)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB925486)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB925902)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB926255)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB926436)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB927779)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB927802)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB928090)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB928255)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB928843)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB929123)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB929969)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB930178)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB931261)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB931768)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB931784)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB932168)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB933566)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB935839)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB935840)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB937143)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB937894)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB938127)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB938829)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB939653)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB941202)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB941568)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB941569)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB941644)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB942615)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB942830)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB942831)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB943055)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB943460)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB943485)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB944533)</font></td></tr><tr><td><font size="-2">Security Update for Windows XP (KB946026)</font></td></tr><tr><td><font size="-2">Setup1</font></td></tr><tr><td><font size="-2">Sonic DLA</font></td></tr><tr><td><font size="-2">Sonic RecordNow! Plus</font></td></tr><tr><td><font size="-2">Sumatra PDF reader</font></td></tr><tr><td><font size="-2">TclPro 1.2</font></td></tr><tr><td><font size="-2">Texas Instruments PCIxx21/x515 drivers.</font></td></tr><tr><td><font size="-2">TI_Inst</font></td></tr><tr><td><font size="-2">Time Zone Data Update Tool for Microsoft Office Outlook</font></td></tr><tr><td><font size="-2">Tweak UI</font></td></tr><tr><td><font size="-2">Update for Windows XP (KB896727)</font></td></tr><tr><td><font size="-2">Update for Windows XP (KB931836)</font></td></tr><tr><td><font size="-2">Update for Windows XP (KB933360)</font></td></tr><tr><td><font size="-2">Update for Windows XP (KB942840)</font></td></tr><tr><td><font size="-2">VideoLAN VLC media player 0.8.6c</font></td></tr><tr><td><font size="-2">Vim 6.4 (self-installing)</font></td></tr><tr><td><font size="-2">Vim 7.0 (self-installing)</font></td></tr><tr><td><font size="-2">Visual Studio .NET Enterprise Architect 2003 - English</font></td></tr><tr><td><font size="-2">Visual Studio.NET Baseline - English</font></td></tr><tr><td><font size="-2">VPN Client</font></td></tr><tr><td><font size="-2">WebFldrs XP</font></td></tr><tr><td><font size="-2">Winamp</font></td></tr><tr><td><font size="-2">WinCvs 2.0</font></td></tr><tr><td><font size="-2">Windows Installer 3.1 (KB893803)</font></td></tr><tr><td><font size="-2">Windows Media Format Runtime</font></td></tr><tr><td><font size="-2">Windows Media Player 10</font></td></tr><tr><td><font size="-2">Windows Media Player 9 Series</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB873333</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB885250</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB885887</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB887472</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB888113</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB890175</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB890859</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB891781</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB893066</font></td></tr><tr><td><font size="-2">Windows XP Hotfix - KB893086</font></td></tr><tr><td><font size="-2">Windows XP Service Pack 2</font></td></tr><tr><td><font size="-2">WinMerge 2.4.6.0</font></td></tr><tr><td><font size="-2">WinZip</font></td></tr><tr><td><font size="-2">ZENcast Organizer</font></td></tr></tbody></table></td></tr><tr><td><img src="../images/blackLine.gif" width="100%" border="0" height="2"></td></tr>
<tr><td align="center">
<input value="Print" onclick="javascript:window.print();" id="button4" name="button4" type="button">
<input value="Close" onclick="javascript:window.close();" id="button2" name="button2" type="button">
</td></tr>
<tr><td align="center">
<p align="right"><br>
</p>
<p><font size="2" color="lightgrey" face="Times New Roman">All rights reserved Copyright ©2002
ALCATEL Canada</font>
</p>
</td></tr>
</tbody></table>
</form>
</html>
Source: [[Alcatel-Lucent - Asset Tracking System|http://caotts026/rfs1/ats/assetSoftware.asp?17689]]
AMISH CHICKEN CASSEROLE
review: pretty good, but not exciting
8 oz broad egg noodles
1/2 cup butter
8 oz fresh mushrooms, slice
1/3 cup flour
2 cups chicken broth
1 cup milk
salt and pepper, to taste
1/3 cup freshly grated Parmesan cheese
2 cups cooked chicken, cut in cubes
generous pinch of rubbed sage
Cook noodles as directed on package. Melt butter and cook mushrooms in a large skillet until lightly browned. Stir in flour and blend in with a fork or slotted spoon. Stir in milk and broth and seasonings; whisk sauce constantly until thickened.
Combine sauce, noodles and chicken. Adjust seasonings to taste. Place in a 2 quart casserole dish. Sprinkle top with Parmesan cheese and bake at 350°F for 30 minutes.
Source: [[Cooks.com - Recipe - Amish Chicken Casserole|http://www.cooks.com/rec/view/0,178,130191-250192,00.html]]
<html><div id="rf_nameinfo"><h2>Asparagus, Mushroom and Gruyère Strudel</h2>
<p class="from">From <a href="http://www.goodhousekeeping.com" target="_blank">Good Housekeeping</a><br>triple-tested at the Good Housekeeping Research Institute</p>
</div><!--end rf_nameinfo-->
<p class="info">Perfect for an elegant brunch or supper -- and easy with packaged phyllo for the pastry wrapping. Assemble the strudels early and refrigerate covered with plastic wrap. Then, just pop them in the oven 25 minutes before serving! They're nice with a salad of mixed baby greens.</p>
<table class="conversion_tab" border="0" cellpadding="0" cellspacing="0">
<tbody><tr>
<td class="hdr">INGREDIENTS</td>
<td><a style="cursor: pointer;" onclick="window.open('conversion-chart.html' ,'conversion','width=780 , height=340 , top=300 , left=500, toolbar=0 , menubar=no , status=no , scrollbars=no , resizable=0');return false;" href="conversion-chart.html" target="_blank">conv. chart</a></td>
<td><input id="radio_us" class="radio_units" name="radio_name" onclick="convertUntis('us');" checked="checked" type="radio"></td>
<td>U.S.</td>
<td><input id="radio_metric" class="radio_units" name="radio_name" onclick="convertUntis('metric');" type="radio"></td>
<td>Metric</td>
</tr>
</tbody></table>
<table class="ingredients_list" border="0" cellpadding="0" cellspacing="5">
<tbody><tr>
<td class="unit" valign="top"> 3/4 pound(s)</td>
<td class="ingredient" valign="top"> asparagus</td>
</tr>
<tr>
<td class="unit" valign="top">1 teaspoon(s)</td>
<td class="ingredient" valign="top"> salt</td>
</tr>
<tr>
<td class="unit" valign="top">7 tablespoon(s)</td>
<td class="ingredient" valign="top"> margarine or butter</td>
</tr>
<tr>
<td class="unit" valign="top">1 pound(s)</td>
<td class="ingredient" valign="top"> mushrooms, thinly sliced</td>
</tr>
<tr>
<td class="unit" valign="top">2 teaspoon(s)</td>
<td class="ingredient" valign="top"> lemon juice</td>
</tr>
<tr>
<td class="unit" valign="top"> 1/3 cup(s)</td>
<td class="ingredient" valign="top"> walnuts, toasted and finely chopped</td>
</tr>
<tr>
<td class="unit" valign="top">2 tablespoon(s)</td>
<td class="ingredient" valign="top"> dried bread crumbs</td>
</tr>
<tr>
<td class="unit" valign="top">12 slice(s)</td>
<td class="ingredient" valign="top">((about 1/2 16-ounce package)) sheets fresh or frozen (thawed) phyllo</td>
</tr>
<tr>
<td class="unit" valign="top">1 cup(s)</td>
<td class="ingredient" valign="top"> Gruyère or Swiss cheese, shredded </td>
</tr>
</tbody></table>
<script language="javascript" type="text/javascript">shopListDisplay();</script>
<h3>DIRECTIONS</h3>
<ol>
<li>Cut asparagus into 6-inch-long spears (reserve ends for use in soup another day). In nonstick 12-inch skillet, heat 1/2 inch water to boiling over high heat. Add asparagus and 1/2 teaspoon salt; heat to boiling. Reduce heat to medium-low and cook, uncovered, until asparagus is tender, 4 to 8 minutes; drain and wipe skillet dry.</li><li>In same skillet, melt 1 tablespoon margarine or butter over medium-high heat. Add mushrooms and 1/2 teaspoon salt; cook until mushrooms are browned and liquid evaporates. Add lemon juice; cook 30 seconds. Remove mushrooms to plate to cool slightly.</li><li>Preheat oven to 375 degrees F. Lightly grease large cookie sheet. Melt remaining 6 tablespoons margarine or butter. In small bowl, mix chopped walnuts and bread crumbs.</li><li>On work surface, place 1 phyllo sheet (about 17" by 12") with a short side facing you; brush lightly with some melted margarine or butter. Sprinkle with one-sixth of walnut mixture. Top with another phyllo sheet; lightly brush with some margarine or butter, being careful not to tear phyllo. Arrange one-sixth of cheese in a strip on phyllo 2 inches from edge facing you and leaving a 1 1/2-inch border on both sides. Arrange one-sixth of asparagus spears on cheese; top with one-sixth of mushrooms. Roll phyllo jelly-roll fashion to enclose filling, then fold left and right sides in toward center and continue rolling phyllo jelly-roll fashion to end. Place packet, seam-side down, on cookie sheet. Brush packet lightly with some margarine or butter. Repeat to make 5 more packets.</li><li>Bake packets about 25 minutes until slightly puffed and golden brown. Serve immediately.</li></ol></html>
Source: [[Asparagus, Mushroom and Gruyere Strudel - Good Housekeeping|http://www.goodhousekeeping.com/recipefinder/asparagus-mushroom-gruyere-strudel-778]]
!Bhudda Ranks Above the Herd
Monday November 13 saw his latest trip to the doctor's. At age 7 months, his dimensions are:
* weight: 25 pounds
** he's too big for the regular baby scale, so this measurement is a bit rough -- me on the scale holding him minus just me on the scale
* length: 28 1/2 inches
* head circumference: 47 cm
I'm not competitive, but [[where does he rank?|http://pediatrics.about.com/cs/usefultools/l/bl_perc_calc.htm?gender=1&months_ten=0&months=7&cwt=25&chf=2&chi=4&chi_percent=.5&hc=18.5&submitButtonName=Calculate+Percentiles]]
* At 7 months:
** your child is 25 pounds, and that is at ''greater than the 97th percentile for weight''.
** your child is 28.5 inches, and that is at the ''85th percentile for height''.
** your child has a head circumference of 18.5 inches, and that is at the ''96th percentile for head circumference''.
* At 9 months:
** your child is 28 pounds, and that is at ''greater than the 97th percentile for weight''.
** your child is 30.5 inches, and that is at the ''95th percentile for height''.
** your child has a head circumference of 19.25 inches, and that is at ''greater than the 97th percentile for head circumference''.
* At 18 months:
** your child is 30 pounds, and that is at the ''90th percentile for weight''.
** your child is 34 inches, and that is at the ''88th percentile for height''.
** your child has a head circumference of 20.75 inches, and that is at ''greater than the 97th percentile for head circumference''.
* At 29 months:
** your child is 36 pounds, and that is at greater than the ''96th percentile for weight''.
** your child is 37 inches, and that is at the ''75th percentile for height''.
* At 3 years:
** your child is 39 pounds, and that is at the ''95th percentile for weight''.
** your child is 38 inches, and that is at the ''62th percentile for height''.
* At 3 years and 5 months:
** your child is 42 pounds, and that is at the ''96th percentile for weight''.
** your child is 40.5 inches, and that is at the ''86th percentile for height''.
Bhudda the sumo baby!
!Zenib
According to http://pediatrics.about.com/cs/usefultools/l/bl_percentiles.htm
* At 0 months:
** your child is 8.25 pounds, and that is at the ''77th percentile for weight''.
** your child is 22 inches, and that is at greater than the ''97th percentile for height''.
** your child has a head circumference of 13.4 inches, and that is at the ''33th percentile for head circumference''.
* At 6 weeks (the site only allows whole months of age, so here's the 1month and 2month range)
** your child is 12.125 pounds (5500g), and that is between the ''66th and 94th percentile for weight''.
** your child is 24 inches (61cm), and that is between the ''87th and 97+th percentile for height''.
** your child has a head circumference of 15 inches (38cm), and that is between the ''16th and 53th percentile for head circumference''.
* At 2 months:
** your child is 13.58 pounds, and that is at the ''92th percentile for weight''.
** your child is 24.25 inches, and that is at than the ''92th percentile for height''.
** your child has a head circumference of 15.25 inches, and that is at the ''32th percentile for head circumference''.
* At 4 months:
** your child is 17 pounds, and that is at the ''94th percentile for weight''.
** your child is 26.5 inches, and that is at the ''97th percentile for height''.
** your child has a head circumference of 16.25 inches, and that is at the ''47th percentile for head circumference''.
* At 6 months:
** your child is 19.4 pounds (8800g), and that is at the ''93th percentile for weight''.
** your child is 28 inches, and that is at the ''97th percentile for height''.
** your child has a head circumference of 17.5 inches, and that is at the ''90th percentile for head circumference''.
* At 12 months:
** your child is 21.5 pounds, and that is at the ''54th percentile for weight''.
** your child is 30.5 inches, and that is at the ''85th percentile for height''.
** your child has a head circumference of 18 inches, and that is at the ''65th percentile for head circumference''.
!Banana Almond Bread
2/3 cup warm water (110°F)
2 tbsp butter or margarine, softened
3 tbsp sugar
1 1/4 tsp salt
1 egg slightly beaten
1/2 cup mashed ripe bananas (approximately 1 large)
1/2 cup sliced almonds
grated zest of 1 lemon
3 1/2 cups bread flour
3 tsp instant active dry yeast
This recipe for breadmakers makes a delicious and moist banana bread
1. Place all ingredients in bread pan of bread maker. Select dough setting and press start.
2. When dough cycle has finished, remove dough from pan and turn out onto a lightly oiled surface (a nonstick cooking spray works well for this). Form dough into an oval, cover with a cotton towel and let rest for 10 minutes.
3. After resting, turn dough bottom side up and press to flatten. Shape dough into a loaf and place in a loaf pan that's been coated with cooking spray. Cover and place in a warm spot to rise for approximately 30 minutes or until doubled.
4. Preheat oven to 350°F. Bake for 35 to 40 minutes or until loaf sounds hollow when tapped. When ready, an instant thermometer should read between 200°F and 210°F when inserted in centre of loaf. Remove from oven and cool on a bread rack for about 10 minutes before removing from pan.
Makes 1 1/2-pound loaf.
From http://www.whatscookingamerica.net
!Joshua Marc Arnold Jackman
[[Birth announcement|http://web.ncf.ca/glennj/baby]]:
<<<
Jacqueline and Glenn welcome into this world a robust young man,
[[Joshua Marc Arnold Jackman|http://web.ncf.ca/glennj/baby/photos/]]
on Thursday April 13, 2006 at 10:17pm
(to reprise our wedding theme -- a history of detours -- Joshua was two weeks overdue)
His weight was 4kg (8 lb 12 oz), and he measured 58cm (23") long.
Our cups runneth over (especially Jacq's).
Thanks to all who supported us in our birth choices,
Joshua, Jacqueline and Glenn
<<<
BabyDimensions
Source: [[Bhudda Baby - NCF|http://php.ncf.ca/wiki/index.php/Bhudda_Baby]]
<html><div class="M2A"><div class="C8"><span class="subtitle5"><strong>Yield: </strong></span> <span class="subtitle2">6</span></div></div><div class="C8"><div class="title5">Ingredients: </div><h2>Cajun Seasoning</h2><div class="main"><ul class="Recipe_Ingredient_Lines"><li>1/4 cup paprika</li><li>2 tsp garlic powder</li><li>1 tbsp onion powder</li><li>1 tbsp dried oregano</li><li>1 tbsp chilli powder</li><li>1 tbsp dried thyme</li><li>1 tsp salt</li><li>1 tsp sugar</li><li>1/2 tsp cayenne, or to taste</li><li>1/2 tsp ground pepper</li></ul></div><h2>Fish</h2><div class="main"><ul class="Recipe_Ingredient_Lines"><li>6 x tilapia fillets</li><li>1/4 cup butter, melted</li></ul></div>
<div class="title5">Directions: </div><h2>Cajun Seasoning</h2><div class="main"><ol><li>In a bowl, combine all the seasoning ingredients. Set aside.</li></ol></div><h2>Fish</h2><div class="main"><ol><li>Preheat the gas grill, setting the burners to high. Place a cast iron skillet on the grate.</li><li>Pat the fish dry with paper towels. Coat each fillet with melted butter, then dredge it in the seasoning.</li><li>Place 2 fish fillets in the hot skillet. Cook for 1 minute, then turn to blacken the other side.</li><li>Serve with Black Beans and Rice and with Warm Okra and Tomato Salad.</li></ol></div></div></html>
Source: [[Blackened Fish 2 - Food Network Canada|http://www.foodtv.ca/recipes/recipedetails.aspx?dishid=8392]]
<html><p class="cutline">Karma Metzgar, C.F.C.S. Former
Northwest Regional Nutrition Specialist, Nodaway County
Extension Center, University of Missouri Extension</p>
<p> </p>
<p>Every fresh sweet corn season I hear people telling
others how to freeze their corn by just putting in the
freezer-and it tastes fresh. Well…here’s the rest of the
story!</p>
<p><br>
Unless you are freezing onions or green peppers,
blanching is a must before freezing vegetables.</p>
<p><br>
<b>What is blanching and why is it a must?</b></p>
<p><br>
Blanching is the scalding of vegetables in boiling water
or steam. Blanching slows or stops the action of
enzymes. Up until harvest time, enzymes cause vegetables
to grow and mature. If vegetables are not blanched, or
blanching is not long enough, the enzymes continue to be
active during frozen storage causing off-colors,
off-flavors and toughening.</p>
<p><br>
If you spend the time growing the vegetables, pulling
weeds, picking and preparing for the freezer, the
blanching time may be regarded as a pain-but it’s
necessary if you want fresh garden flavor later.</p>
<p><br>
Blanching time is crucial and varies with the vegetable
and size of the pieces to be frozen. Under blanching
speeds up the activity of enzymes and is worse than no
blanching. Over blanching causes loss of flavor, color,
vitamins and minerals.</p>
<p><br>
The most convenient way to blanch vegetables is in a
large kettle of boiling water. Allow one gallon of water
per pound of vegetables. Bring the water to boil and
lower vegetables into the water, allowing the water to
continue boiling. Cover and start counting the blanching
time. I like to use the side burner on my outdoor gas
grill for this task. It keeps the heat and steam outside
and my kitchen cool.</p>
<p><br>
As soon as blanching is complete, cool the vegetables
quickly and thoroughly to stop the cooking process. To
cool, drain the vegetables in a strainer, then plunge
the vegetables into a container of ice water. Cool
vegetables for the same amount of time as they are
blanched.</p>
<p><br>
Drain thoroughly and freeze.</p>
<p><br>
<b>How long do I blanch my vegetables?</b></p>
<p><br>
The University Extension Guide Freezing Vegetables, GH
1503 gives more specific directions, along with
approximate yields of frozen vegetables from the fresh
quantity, a timetable for cooking frozen vegetables, and
blanching instructions for vegetables from asparagus to
zucchini (Summer Squash). Copies are available at your
local extension center or you can view on-line at:
<a href="http://muextension.missouri.edu/xplor/hesguide/foodnut/gh1503.htm">
http://muextension.missouri.edu/xplor/hesguide/foodnut/gh1503.htm</a></p>
<p> </p>
<p>Here are a few blanching times for vegetables you may
need over the next few weeks. The times listed are for
blanching in boiling water. I keep a similar list
slipped inside my cupboard for a handy reference.</p>
<p> </p>
<ul>
<li>Green Beans, 3 minutes</li>
<li>Broccoli, chopped or stalks, 3 minutes</li>
<li>Beets, small, 25-30 minutes; medium, 45-50
minutes</li>
<li>Brussels Sprouts, small, 3 minutes; medium, 4
minutes; large, 5 minutes</li>
<li>Carrots, tiny, whole, 5 minutes; diced or
strips, 2 minutes</li>
<li>Cauliflower, 3 minutes</li>
<li>Corn on the cob to freeze on the ear, small
ears, 7 minutes; medium ears 9 minutes; large ears
11 minutes</li>
<li>Corn on the cob to cut for whole kernel corn, 4
minutes-cool and cut from ear.</li>
<li>Corn on the cob to cut for cream style corn, 4
minutes-cool and cut from ear, scraping the cobs.</li>
<li>Greens like spinach, 2 minutes</li>
<li>Shelled Peas, 1½ minutes</li>
<li>Snow or Sugar Snap Peas, 2-3 minutes</li>
<li>Summer Squash like zucchini, slices or chunks, 3
minutes; grated, 1-2 minutes.</li></ul></html>
Source: [[Blanch Vegetables Before Freezing|http://missourifamilies.org/features/foodsafetyarticles/fdsftyfeature12.htm]]
Yield: 4-6 servings
Ingredients:
Blueberry Buttermilk Pancakes
* 2 cups flour (500 mL) -- //1 cup//
* 1/4 cup sugar (60 mL) -- //2 tbsp//
* 2 1/4 tsp baking powder (12 mL) -- //1 1/8 tsp//
* 1/2 tsp baking soda (2 mL) -- //1/4 tsp//
* 1/2 tsp salt (2 mL) -- //1/4 tsp//
* 2 x eggs -- //1 egg//
* 2 cups buttermilk (500 mL) -- //1 cup//
* 1/4 cup melted unsalted butter, plus some for frying (60 mL) -- //2 tbsp//
* 1 cup blueberries, fresh or frozen (250 mL) -- //1/2 cup//
Directions:
Blueberry Buttermilk Pancakes
1. In a large bowl sift together the flour, sugar, baking powder, baking soda and salt.
2. Beat the eggs with the buttermilk and melted butter.
3. Combine the dry and the wet ingredients into a lumpy batter, being careful not to overmix.
4. Heat some butter in a skillet.
5. Spoon 1/3 cup (75 mL) of batter into the skillet and sprinkle the top with some of the blueberries.
6. Cook for 2 to 3 minutes on each side.
7. Serve with a dollop of whipped cream and maple syrup.
Source: [[Blueberry Buttermilk Pancakes - Food Network Canada|http://www.foodtv.ca/recipes/recipedetails.aspx?dishid=4762]]
* [[last backup|LastBackup]] of this wiki [[online|http://web.ncf.ca/xx087/MyTiddlyWiki]]
* [[iGoogle Home|http://www.google.ca/ig]]
* [[NCF start page|http://start.ncf.ca]]
* [[comix|http://web.ncf.ca/xx087/comix]]
* [[This American Life|http://www.thisamericanlife.org]]
* http://glennj.backpackit.com/
* http://www.mygazines.com/
!!BREADED BAKED CHICKEN
(via http://www.cooks.com/rec/doc/0,1739,144189-234200,00.html)
* 2 c. French bread crumbs
* 1/2 c. grated Parmesan cheese
* 1 to 2 tsp. garlic salt
* 1/2 to 1 tsp. pepper
* 3 whole chicken breasts, halved and skinned
* 1/2 c. butter, melted
Combine bread crumbs, cheese, garlic and pepper.
Dip chicken in butter then dredge in bread crumb mix.
Place in a lightly greased 13×9x2 inch baking pan.
Sprinkle with remaining crumbs.
Bake at 350 degrees for 45 minutes or until done.
Yield: 6 servings.
Source: [[Backpack: Recipes|http://glennj.backpackit.com/pages/1519412]]
Buttermilk Pancakes by Elizabeth Baird and Emily Richards
Servings: 14
Ingredients:
1-1/2 cups (375 mL) all-purpose flour
3 tbsp (50 mL) granulated sugar
1 tsp (5 mL) each baking powder and baking soda
1/4 tsp (1 mL) salt
1-3/4 cups (425 mL) buttermilk
1 egg
2 tbsp (25 mL) butter, melted
2 tsp (10 mL) vanilla
1 tbsp (15 mL) canola oil
Preparation:
In large bowl, whisk together flour, sugar, baking powder, baking soda and salt. In another bowl, whisk together buttermilk, egg, butter and vanilla; pour over dry ingredients and whisk until combined but still slightly lumpy.
Lightly brush large nonstick skillet or griddle with some of the oil; heat over medium-high heat. Using scant 1/4 cup (50 mL) per pancake, pour in batter; spread slightly to form pancakes. Cook until bubbles appear on top, about 3 minutes. Flip and cook until bottom is golden brown, about 1 minute. Transfer to rimmed baking sheet; cover and keep warm in 250°F (120°C) oven.
Source: [[Canadian Living: Buttermilk Pancakes|http://www.canadianliving.com/food/buttermilk_pancakes.php]]
/***
|Name|CalendarPlugin|
|Source|http://www.TiddlyTools.com/#CalendarPlugin|
|Version|2008.06.17|
|Author|Eric Shulman|
|Original Author|SteveRumsby|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|display monthly and yearly calendars|
NOTE: For enhanced date display (including popups), you must also install [[DatePlugin]]
!!!!!Usage:
<<<
|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|
|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|
|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|
|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|
|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|
|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|
<<<
!!!!!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
<<<
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 section:
***/
//{{{
version.extensions.calendar = { major: 0, minor: 7, revision: 0, date: new Date(2008, 6, 17)};
if(config.options.txtCalFirstDay == undefined)
config.options.txtCalFirstDay = 0;
if(config.options.txtCalStartOfWeekend == undefined)
config.options.txtCalStartOfWeekend = 5;
if(config.options.chkDisplayWeekNumbers == undefined)//wn**
config.options.chkDisplayWeekNumbers = false;
if(config.options.chkDisplayWeekNumbers)
config.options.txtCalFirstDay = 0;
if(config.options.txtWeekNumberDisplayFormat == undefined)//wn**
config.options.txtWeekNumberDisplayFormat = "w0WW";
if(config.options.txtWeekNumberLinkFormat == undefined)//wn**
config.options.txtWeekNumberLinkFormat = "YYYY-w0WW";
config.macros.calendar = {};
config.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.macros.calendar.daynames = ["M", "T", "W", "T", "F", "S", "S"];
config.macros.calendar.todaybg = "#ccccff";
config.macros.calendar.weekendbg = "#c0c0c0";
config.macros.calendar.monthbg = "#e0e0e0";
config.macros.calendar.holidaybg = "#ffc0c0";
config.macros.calendar.journalDateFmt = "DD MMM YYYY";
config.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
config.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead
//}}}
//{{{
function calendarIsHoliday(date) // Is the given date a holiday?
{
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", null, null, null);
var today = new Date();
var year = today.getYear();
if (year<1900) year+=1900;
// get format for journal link by reading from SideBarOptions (ELS 5/29/06 - based on suggestion by Martin Budden)
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]; }
if (params[0] == "thismonth") {
cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, today.getMonth());
}
else if (params[0] == "lastmonth") {
var month = today.getMonth()-1; if (month==-1) { month=11; year--; }
cacheReminders(new Date(year, month, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, month);
}
else if (params[0] == "nextmonth") {
var month = today.getMonth()+1; if (month>11) { month=0; year++; }
cacheReminders(new Date(year, month, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, month);
} else {
if (params[0]) year = params[0];
if(params[1]) {
cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, params[1]-1);
} else {
cacheReminders(new Date(year, 0, 1, 0, 0), 366);
createCalendarYear(tbody, year);
}
}
window.reminderCacheForCalendar = null;
}
//}}}
//{{{
//This global variable is used to store reminders that have been cached
//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", null, null, null);
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);
row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarMonth(calendar, year, mon)
{
var row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);
row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarYear(calendar, year)
{
var row;
row = createTiddlyElement(calendar, "tr", null, null, null);
var back = createTiddlyElement(row, "td", null, null, null);
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", null, null, null);
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", null, null, null);
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", null, null, null);
createCalendarDayHeader(row, 3);
createCalendarDayRows(cal, year, mon);
}
//}}}
//{{{
function createCalendarMonthHeader(cal, row, name, nav, year, mon)
{
var month;
if (nav) {
var back = createTiddlyElement(row, "td", null, null, null);
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", null, null, null);
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", null, null, null);//wn**
}
for(i = 0; i < col; i++)
createTiddlyElement(row, "td", null, null, null);
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", null, null, null);
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 2005.10.30: use <<date>> macro's showDate() function to create popup
// ELS 5/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++;
}
}
//}}}
//{{{
// We've clicked on a day in a calendar - create a suitable pop-up of options.
// The pop-up should contain:
// * a link to create a new entry for that date
// * a link to create a new reminder for that date
// * an <hr>
// * the list of reminders for that date
// NOTE: The following code is only used when [[DatePlugin]] is not present
function onClickCalendarDate(e)
{
var button = this;
var date = button.getAttribute("title");
var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));
date = dat.formatString(config.macros.calendar.journalDateFmt);
var popup = createTiddlerPopup(this);
popup.appendChild(document.createTextNode(date));
var newReminder = function() {
var t = store.getTiddlers(date);
displayTiddler(null, date, 2, null, null, false, false);
if(t) {
document.getElementById("editorBody" + date).value += "\n<<reminder day:" + dat.getDate() +
" month:" + (dat.getMonth()+1) + " year:" + (dat.getYear()+1900) + " title: >>";
} else {
document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +
" month:" + (dat.getMonth()+1) +" year:" + (dat.getYear()+1900) + " title: >>";
}
return false; // consume click
};
var link = createTiddlyButton(popup, "New reminder", null, newReminder);
popup.appendChild(document.createElement("hr"));
var t = findTiddlersWithReminders(dat, [0,14], null, 1);
for(var i = 0; i < t.length; i++) {
link = createTiddlyLink(popup, t[i].tiddler, false);
link.appendChild(document.createTextNode(t[i].tiddler));
}
return false; // consume click
}
//}}}
//{{{
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", null, null, null);
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", null, null, null);
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", null, null, null);
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", null, null, null);
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 cookie settings for CalendarPlugin:
//{{{
config.options.chkDisplayWeekNumbers=true;
//}}}
// // override internal default settings for CalendarPlugin:
//{{{
config.macros.calendar.journalDateFmt="DDD MMM 0DD YYYY";
//}}}
<<calendar thismonth>>
[[Calendar]]
!!Music
The Harder They Come soundtrack
Jimmy Cliff
Mugison - Mugimama, Is This Monkey Music?
[[Polaris music nominees|http://en.wikipedia.org/wiki/Polaris_Music_Prize]]
!!TV
Dexter
30 rock season 3
!!Movies
Hedwig and the angry inch
There Will Be Blood
Ang Lee: The Wedding Banquet
Away From Her
The Savages
Once
the Lives of Others
Lars and the Real Girl
The King of Kong
Hot Fuzz
Childstar
Downfall
Open Range
One Flew Over the Cuckoo's Nest
The Lion in Winter
Melvin and Howard
Meet Joe Black
!!![[Michael Caine Movies|http://www.cbc.ca/arts/film/story/2009/05/13/f-michael-caine-is-anybody-there.html]]
The Ipcress File (1965)
Alfie (1966)
Get Carter (1971)
Sleuth (1972)
The Man Who Would Be King (1975)
Educating Rita (1983)
Hannah and Her Sisters (1986)
The Cider House Rules (1999)
The Quiet American (2002)
Is Anybody There? (2009)
!!Comics
Neil Gaiman's `Sandman', Kurt Busiek's `Marvels'. Or, to make it a top ten, let's add Peter Kuper's `The System', Garth Ennis's `Preacher', and anything by Robert Crumb.
!!Internet
[[This American Life: The Giant Pool of Money|http://www.thisamericanlife.org/Radio_Episode.aspx?episode=355]]
http://squarespace.com
----
[[check it out on backpack|http://glennj.backpackit.com/homepage]]
[[mail to backpack|mailto:bakava51@glennj.backpackit.com]]
* 2 tbsp melted butter
* 2 tbsp flour
* 1 cup milk
* 1 cup grated cheddar cheese (or more)
Melt butter.
Add flour and mix well.
Add milk. Stir over medium heat until it boils and thickens.
Add cheese and stir until melted and thick.
Source: [[Cheese Sauce|http://www.bitstop.ca/recipes/cheese_sauce.htm]]
ed, needs more zip: salt & pepper, pepper flakes, etc
[[private|http://glennj.backpackit.com/pages/1405046]] / [[public|http://glennj.backpackit.com/pub/1405046]]
<html>It’s getting to be unbearably hot in many areas of the country, and frozen treats are a healthy way to cool off.<span> </span>With ice cream bars running $5 a small box locally, I went on a search to find inexpensive, alternative recipes to feed our family.<span> </span>What I found were six surprisingly easy ways to stock my freezer on the cheap!</html>
Source: [[Chill Out with These 6 Simple DIY Freezer Treats : Wise Bread|http://www.wisebread.com/chill-out-with-these-6-simple-diy-freezer-treats]]
<html><div class="recipeb">Ingredients:</div>
<div class="usethis">
2 ripe Haas avocados<br> 1/4 C diced debco or vidailla onion<br> 1 ripe tomato seeded and chopped<br> 1 T minced jalapeno slices<br> 1 T salt<br> 1/2 T ground coriander<br> <br> <br>
</div>
<p>
</p><div class="recipeb">Directions:</div>
<div class="usethis">
In a bowl, mash with the back of a wooden spoon the onion, jalapeno, salt and coriander into a paste<br> <br> Halve avocados and remove pits. With a small, sharp knife, dice the avocado meat while still in skin and spoon into bowl.<br> <br> Coat diced avocado meat with paste and fold in chopped tomato.<br>
</div>
<div></div>
<div class="indent"><i>Adjustments may be made by increasing or decreasing amounts of onion, jalapeno, salt or coriander.</i></div></html>
Source: [[Chunky Guacamole Recipe. Category: Dips|http://recipes.epicurean.com/recipedetail2.jsp?recipe_no=14121]]
The StJohnsAnglican parent's group. Yahoo group is pretty unused though http://ca.groups.yahoo.com/group/churchbabies/
!Site Map
@@margin-left:.5em;margin-bottom:0.5em;<<slider chkContents SideBarTabs "contents »" "show lists of tiddlers contained in this document">>@@
3-4lb pork roast
salt & pepper to taste
1 cup ground or finely chopped cranberries
1/4 cup honey
1 tsp grated orange peel
1/8 tsp ground cloved
1/8 tsp ground nutmeg
# sprinkle roast with salt and pepper. place in crockpot
# combine remaining ingredients. pour over roast
# cover. cook on low for 8-10 hours
serves 6 to 8
<html><h2>Cranberry Sauce Recipe</h2>
<div id="callout-printoptions">
<h2>Print Options</h2>
<ul>
<li><a href="http://simplyrecipes.com/recipes/cranberry_sauce-print/">Print (no photos)</a></li>
<li><a href="http://simplyrecipes.com/recipes/cranberry_sauce-print-photo/">Print (with photos)</a></li>
</ul>
</div>
<div id="recipe-ingredients">
<h3>Ingredients</h3>
<ul>
<li>1 cup (200 g) sugar</li>
<li>1 cup (250 mL) water</li>
<li>4 cups (1 12-oz package) fresh or frozen cranberries</li>
<li><em>Optional</em> Pecans, orange zest, raisins, currants, blueberries, cinnamon, nutmeg, allspice.</li></ul>
</div>
<div id="recipe-method">
<h3>Method</h3>
<p><b>1</b> Wash and pick over cranberries. In a saucepan bring to a boil water and sugar, stirring to dissolve sugar. Add cranberries, return to a boil. Reduce heat, simmer for 10 minutes or until cranberries burst. </p>
<p><b>2</b> At this point you can add all number of optional ingredients. We typically mix in a half a cup of roughly chopped pecans with or without a few strips of orange zest. You can add a cup of raisins or currants. You can add up to a pint of fresh or frozen blueberries for added sweetness. Spices such as cinnamon, nutmeg or allspice can be added too.</p>
<p><b>3</b> Remove from heat. Cool completely at room temperature and then chill in refrigerator. Cranberry sauce will thicken as it cools.</p>
<p>Cranberry sauce base makes 2 1/4 cups.</p></div></html>
Source: [[Cranberry Sauce Recipe : Simply Recipes|http://simplyrecipes.com/recipes/cranberry_sauce/]]
<html><div><strong><span style="font-family: arial;">The Ingredients.</span></strong></div> <div><span style="font-family: arial;">--1 qt chicken broth (or vegetable)</span></div><div><span style="font-family: arial;">--2 cups milk (I used 2% cow's)</span></div><div><span style="font-family: arial;">--2 10 oz bags of frozen broccoli florets</span></div><div><span style="font-family: arial;">--1/2 diced white onion</span></div><div><span style="font-family: arial;">--1/2 t black pepper</span></div><div><span style="font-family: arial;">--1/2 t kosher salt</span></div><div><span style="font-family: arial;">--1/2 t ground nutmeg</span></div><div><span style="font-family: arial;">--1 cup each of three different cheeses, I used jarlsberg, gruyere, and cheddar.</span></div><div><span style="font-family: arial;"></span></div><br><br><div><strong><span style="font-family: arial;">The Directions.</span></strong></div><br><div><span style="font-family: arial;">Mince the onion into really small pieces. I used my pampered chef chopper thingy. The onions are going to soften in the milk and the broth, and need to be quite small so you don't crunch on onion pieces when the soup is complete.</span></div><br><div><span style="font-family: arial;">Add the onion to your crockpot, and top with the milk, broth, and spices. Stir in the two frozen bags of broccoli.</span></div><div><span style="font-family: arial;"></span></div><br><div><span style="font-family: arial;">Cook on low for 7-9 hours, or on high for 4-6. The broth is done when the onion is cooked nicely.</span></div><div><span style="font-family: arial;"></span></div><br><div><span style="font-family: arial;">20 minutes or so before serving, shred all the cheese you are going to use, and stir it in. The cheese will be stringy and will stick to the broccoli florets---that's okay!</span></div><div><span style="font-family: arial;"></span></div><br><div><span style="font-family: arial;">Serve with your favorite rolls or drop bisquits.</span></div></html>
Source: [[A Year of CrockPotting: CrockPot Broccoli and Three Cheese Soup Recipe|http://crockpot365.blogspot.com/2008/06/crockpot-broccoli-and-three-cheese-soup.html]]
Source: [[Nikibone.com - Crockpot Recipes|http://www.nikibone.com/recipe/crockpot.html]]
<html><b>Chili 2</b><br>
<br>
1 19 ounce can kidney beans, drained<br>
1 15 ounce can tomato sauce<br>
1 28 ounce can whole or crushed tomatoes<br>
2 medium green peppers, chopped<br>
1 large onion, chopped<br>
4 small cloves garlic, chopped<br>
2 pounds ground beef<br>
1/2 teaspoon celery seed<br>
2 tablespoons chili powder<br>
1 teaspoon cumin<br>
1/8 teaspoon basil<br>
1/2 teaspoon cayenne pepper<br>
1 small bay leaf<br>
1 teaspoon salt<br>
1 teaspoon pepper<br>
<br>
In a small skillet, saute onion, garlic and peppers. In a big skillet, brown beef. Drain fat. Add all ingredients to crockpot. Cook on high 4 to 6 hours or medium 6 to 8 hours.
</html>
Source: [[Nikibone.com - Crockpot Recipes - Chili 2|http://www.nikibone.com/recipe/crockpot/chili2.html]]
<html><div id="articlemasthead"><p>It takes more than one go at cutting up a chicken to become an expert. However, once you've got the hang of it, you can cut up a chicken in very little time and with hardly any effort at all!</p>
<p></p><p>Perhaps the most important reason to learn how to cut up a whole chicken is that it will save you money. Buying a whole chicken is cheaper than buying pieces, and the leftover parts are ideal for forming the backbone of soup stocks. The same method can be used for cutting up other fowl like duck or squab.</p>
</div>
<div id="articlecontent">
<div class="item"><img src="http://images.allrecipes.com/images/5346.jpg" alt="" width="100" border="0" height="75"><p><span>1. </span>Place the chicken breastbone-side up on a clean, flat cutting surface.</p>
<ul></ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5348.jpg" alt="" width="100" border="0" height="75"><p><span>2. </span>Use a standard, sharp kitchen knife to slice off the wing joints. The wings can be set aside and reserved for stock. One breast and leg is removed at a time. Follow steps 3 through 9 to remove the breasts and legs.</p>
<ul></ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5350.jpg" alt="" width="100" border="0" height="75"><p><span>3. </span>Make a shallow incision running along one side of the breastplate.</p>
<ul></ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5352.jpg" alt="" width="100" border="0" height="75"><p><span>4. </span>Deepen the incision by slicing into the chicken toward the rib cage. Pull the meat away from the rib cage as you slice down. As you progress further into the bird, slide the knife off of the rib cage repeatedly to ensure that you are removing any meat attached to the rib cage.</p>
<ul></ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5354.jpg" alt="" width="100" border="0" height="75"><p><span>5. </span>Your knife will come to a point, just underneath the wishbone, where the wing joint meets the rib cage. The wing joint cartilage is soft enough to slice through easily. Slice completely through the joint, stopping only when your knife reaches the cutting surface. At this point, the breast is almost completely off the bird.</p>
<ul></ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5800.jpg" alt="" width="100" border="0" height="75"><p><span>6. </span>Slice through the skin that runs from the tail end of the bird to the point where the leg meets the breast.</p>
<ul></ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5802.jpg" alt="" width="100" border="0" height="75"><p><span>7. </span>The breast should come off of the bird with little effort. Pull the breast outwards, away from the bird, being careful not to rip or tear the flesh. You might need to slice through some still-attached skin to remove the breast.</p>
<ul></ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5804.jpg" alt="" width="100" border="0" height="75"><p><span>8. </span>Cut through the leg joint until you reach the point where the leg bone meets the body. This joint can be difficult to cut through, so stop cutting when you reach bone. Don't try to cut through the leg bone.</p>
<ul></ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5806.jpg" alt="" width="100" border="0" height="75"><p><span>9. </span>Grasp the leg and pull it behind the bird, pressing your fingers into the back of the joint until the joint pops loose. You will feel the bone pop out of the socket. Remove the leg by cutting in and around the joint. Keep cutting until you have freed the leg from the body. Now, turn the bird around and remove the other breast and leg the same way, following steps 3 through 9.</p>
<ul></ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5808.jpg" alt="" width="100" border="0" height="75"><p><span>10. </span>The carcass, along with the wings, can be used for making soup stock. (See our <em>Making Chicken Stock</em> article for tips.)</p>
<ul>
<li><a href="http://allrecipes.com/HowTo/Making-Chicken-Stock/Detail.aspx">Making Chicken Stock</a></li>
</ul>
</div>
<div class="item"><img src="http://images.allrecipes.com/images/5810.jpg" alt="" width="100" border="0" height="75"><p><span>11. </span>You can debone the final cuts of meat further, or cook them whole, depending upon your recipe requirements. (See our Deboning a Chicken Breast and Deboning a Chicken Thigh articles.)</p>
<ul>
<li><a href="http://allrecipes.com/HowTo/Deboning-a-Chicken-Breast/Detail.aspx">Deboning a Chicken Breast</a></li>
<li><a href="http://allrecipes.com/HowTo/Deboning-a-Chicken-Thigh/Detail.aspx">Deboning a Chicken Thigh</a></li></ul></div></div></html>
Source: [[Cutting Up a Whole Chicken - Allrecipes|http://allrecipes.com/HowTo/Cutting-Up-a-Whole-Chicken/Detail.aspx]]
<div class='header' macro='gradient vert #000 #464646'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu' force='true'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='ContentsSlider'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<div class='header' macro='gradient vert #000 #464646'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu' force='true'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
/***
!Layout Rules /%==============================================%/
***/
/*{{{*/
body {
/* this is required for proper layout on IE, for some reason... */
_position: static;
}
.tagClear {
/* this, too, is a necessary IE hack... */
_margin-top: 10em;
_clear: both;
}
.headerForeground, .headerShadow {
padding-top: 1em;
}
.tiddler {
margin: 0 0 0.9em 0;
padding-bottom: 1em;
}
#mainMenu {
width: 16em;
font-size: 1em;
text-align: left;
padding-top: 0.5em;
}
#mainMenu * {
font-size: 1em;
font-weight: normal;
padding: 0; margin: 0; border: 0;
}
#mainMenu ul {
list-style: none;
margin-bottom: 10px;
}
#mainMenu li {
text-indent: 1em;
}
#mainMenu a.button, #mainMenu a.tiddlyLink, #mainMenu a.externalLink {
display: block; margin: 0;
}
#displayArea {
margin-left: 19em; margin-top: 0;
}
.toolbar .button {
margin-left: 4px;
}
/*}}}*/
/***
!Generic Rules /%==============================================%/
***/
/*{{{*/
body {
background: #464646;
color: #000;
}
h1,h2,h3,h4,h5 {
color: #000;
background: #eee;
}
/*}}}*/
/***
!Header /%==================================================%/
***/
/*{{{*/
.header {
background: #000;
}
.headerForeground {
color: #cf6;
}
.headerForeground a {
font-weight: normal;
color: #cf6;
}
/* ??? what is up when you specify a site title colour in IE ??? */
/* .siteTitle { color: red; } */
/*}}}*/
/***
!General tabs /%=================================================%/
***/
/*{{{*/
.tabSelected {
color: #fff;
background: #960;
border: none;
}
.tabUnselected {
color: #fff;
background: #660;
}
.tabContents {
color: #004;
background: #960;
border: none;
}
.tabContents .button, .tabContents a {
border: none;
color: #fff;
}
.tabContents a:hover, .tabset a:hover {
background: #000;
}
/* make nested tab areas look different */
.tabContents .tabSelected, .tabContents .tabContents {
background: #700;
color: #fff;
}
.tabContents .tabContents {
color: #eeb;
}
/*}}}*/
/***
!Main Menu /%=================================================%/
***/
/*{{{*/
#mainMenu {
background: #700;
color: #fff;
border-right: 3px solid #500;
}
#mainMenu * {
color: #fff;
}
#mainMenu a.button, #mainMenu a.tiddlyLink, #mainMenu a.externalLink {
border: none;
border-bottom: 1px solid #500;
border-top: 1px solid #900;
}
#mainMenu a:hover,
#mainMenu a.button:hover {
background-color: #b00;
color: #fff;
}
/*}}}*/
/***
!Sidebar options /%=================================================%/
~TiddlyLinks and buttons are treated identically in the sidebar and slider panel
***/
/*{{{*/
#sidebar {
color: #000;
background: #eeb;
border-right: 3px solid #bb8;
border-bottom: 3px solid #520;
}
#sidebarOptions .sliderPanel {
background: #fff;
}
#sidebarOptions .sliderPanel a {
border: none;
color: #700;
}
#sidebarOptions .sliderPanel a:hover {
color: #fff;
background: #700;
}
#sidebarOptions .sliderPanel a:active {
color: #700;
background: #fff;
}
#sidebarOptions a {
color: #700;
border: none;
}
#sidebarOptions a:hover, #sidebarOptions a:active {
color: #fff;
background: #700;
}
/*}}}*/
/***
!Message Area /%=================================================%/
***/
/*{{{*/
#messageArea {
border-right: 3px solid #da1;
border-bottom: 3px solid #a80;
background: #ffe72f;
color: #014;
}
/*}}}*/
/***
!Popup /%=================================================%/
***/
/*{{{*/
.popup {
background: #cf6;
border: none;
}
.popup hr {
color: #000;
}
.popup li.disabled {
color: #666;
background: #cf6;
}
.popup li a, .popup li a:visited {
color: #000;
border: 1px outset #cf6;
background: #cf6;
}
.popup li a:hover {
color: #000;
border: 1px outset #cf6;
background: #ef9;
}
/*}}}*/
/***
!Tiddler Display /%=================================================%/
***/
/*{{{*/
.tiddler {
background: #fff;
border-right: 3px solid #aaa;
border-bottom: 3px solid #555;
}
.title {
color: #900;
}
.toolbar {
color: #000;
}
.toolbar .button {
background: #eeb /*#cf6*/;
border: 1px outset #eeb /*#cf6*/;
}
.toolbar .button:hover {
background: #700 /*#ef9*/;
color: #fff;
}
#mainMenu .calendar { border: 1px solid white; }
#mainMenu .calendar, #mainMenu .calendar tr, #mainMenu .calendar td, #mainMenu .calendar a {
}
/*}}}*/
/***
!Additional print overrides for fancy style /%==============================================%/
***/
/*{{{*/
@media print {
.tiddler {
/* get rid of our fancy tiddler outline */
border: none;
}
}
/*}}}*/
Here are some examples that show the usage of tiddler data, as provided by the DataTiddlerPlugin.
<<forEachTiddler
where
'tiddler.tags.contains("DataTiddlerExample")'
>>
/***
|''Name:''|DataTiddlerPlugin|
|''Version:''|1.0.6 (2006-08-26)|
|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Enhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).
Such tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers.
''//Example: "Table with all December Expenses"//''
{{{
<<forEachTiddler
where
'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
write
'"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
}}}
//(This assumes that expenses are stored in tiddlers tagged with "expense".)//
<<forEachTiddler
where
'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
write
'"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
For other examples see DataTiddlerExamples.
''Access and Modify Tiddler Data''
You can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields.
These values can be accessed and modified through the following Tiddler methods:
|!Method|!Example|!Description|
|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|
Alternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.
|!Method|!Description|
|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|
//(For details on the various functions see the detailed comments in the source code.)//
''Data Representation in a Tiddler''
The data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]].
//''Data Section Example:''//
{{{
<data>{"isVIP":true,"user":"John Brown","age":34}</data>
}}}
The data section is not displayed when viewing the tiddler (see also "The showData Macro").
Beside the data section a tiddler may have all kind of other content.
Typically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.
''Saving Changes''
The "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.
''Notifications''
No notifications are sent when a tiddler's data value is changed through the "setData" methods.
''Escape Data Section''
In case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.
''The showData Macro''
By default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:
''Syntax:''
|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|
|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|
|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
!Revision history
* v1.0.6 (2006-08-26)
** Removed misleading comment
* v1.0.5 (2006-02-27) (Internal Release Only)
** Internal
*** Make "JSLint" conform
* v1.0.4 (2006-02-05)
** Bugfix: showData fails in TiddlyWiki 2.0
* v1.0.3 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.2 (2005-12-22)
** Enhancements:
*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.
*** Improved (JSON) error messages.
** Bugs fixed:
*** References are not updated when using the DataTiddler.
*** Changes to compound objects are not always saved.
*** "~</data>" is not rendered correctly (expected "</data>")
* v1.0.1 (2005-12-13)
** Features:
*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed
** Bugs fixed:
*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)
* v1.0.0 (2005-12-12)
** initial version
!Code
***/
//{{{
//============================================================================
//============================================================================
// DataTiddlerPlugin
//============================================================================
//============================================================================
// Ensure that the DataTiddler Plugin is only installed once.
//
if (!version.extensions.DataTiddlerPlugin) {
version.extensions.DataTiddlerPlugin = {
major: 1, minor: 0, revision: 6,
date: new Date(2006, 7, 26),
type: 'plugin',
source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"
};
// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window;
if (!TiddlyWiki.prototype.getTiddler) {
TiddlyWiki.prototype.getTiddler = function(title) {
var t = this.tiddlers[title];
return (t !== undefined && t instanceof Tiddler) ? t : null;
};
}
//============================================================================
// DataTiddler Class
//============================================================================
// ---------------------------------------------------------------------------
// Configurations and constants
// ---------------------------------------------------------------------------
function DataTiddler() {
}
DataTiddler = {
// Function to stringify a JavaScript value, producing the text for the data section content.
// (Must match the implementation of DataTiddler.parse.)
//
stringify : null,
// Function to parse the text for the data section content, producing a JavaScript value.
// (Must match the implementation of DataTiddler.stringify.)
//
parse : null
};
// Ensure access for IE
window.DataTiddler = DataTiddler;
// ---------------------------------------------------------------------------
// Data Accessor and Mutator
// ---------------------------------------------------------------------------
// Returns the value of the given data field of the tiddler.
// When no such field is defined or its value is undefined
// the defaultValue is returned.
//
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.getData = function(tiddler, field, defaultValue) {
var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
if (!(t instanceof Tiddler)) {
throw "Tiddler expected. Got "+tiddler;
}
return DataTiddler.getTiddlerDataValue(t, field, defaultValue);
};
// Sets the value of the given data field of the tiddler to
// the value. When the value is equal to the defaultValue
// no value is set (and the field is removed)
//
// Changing data of a tiddler will not trigger notifications.
//
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.setData = function(tiddler, field, value, defaultValue) {
var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
if (!(t instanceof Tiddler)) {
throw "Tiddler expected. Got "+tiddler+ "("+t+")";
}
DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);
};
// Returns the data object of the tiddler, with a property for every field.
//
// The properties of the returned data object may only be read and
// not be modified. To modify the data use DataTiddler.setData(...)
// or the corresponding Tiddler method.
//
// If no data section is defined a new (empty) object is returned.
//
// @param tiddler either a tiddler name or a Tiddler
//
DataTiddler.getDataObject = function(tiddler) {
var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
if (!(t instanceof Tiddler)) {
throw "Tiddler expected. Got "+tiddler;
}
return DataTiddler.getTiddlerDataObject(t);
};
// Returns the text of the content of the data section of the tiddler.
//
// When no data section is defined for the tiddler null is returned
//
// @param tiddler either a tiddler name or a Tiddler
// @return [may be null]
//
DataTiddler.getDataText = function(tiddler) {
var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
if (!(t instanceof Tiddler)) {
throw "Tiddler expected. Got "+tiddler;
}
return DataTiddler.readDataSectionText(t);
};
// ---------------------------------------------------------------------------
// Internal helper methods (must not be used by code from outside this plugin)
// ---------------------------------------------------------------------------
// Internal.
//
// The original JSONError is not very user friendly,
// especially it does not define a toString() method
// Therefore we extend it here.
//
DataTiddler.extendJSONError = function(ex) {
if (ex.name == 'JSONError') {
ex.toString = function() {
return ex.name + ": "+ex.message+" ("+ex.text+")";
};
}
return ex;
};
// Internal.
//
// @param t a Tiddler
//
DataTiddler.getTiddlerDataObject = function(t) {
if (t.dataObject === undefined) {
var data = DataTiddler.readData(t);
t.dataObject = (data) ? data : {};
}
return t.dataObject;
};
// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {
var value = DataTiddler.getTiddlerDataObject(tiddler)[field];
return (value === undefined) ? defaultValue : value;
};
// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {
var data = DataTiddler.getTiddlerDataObject(tiddler);
var oldValue = data[field];
if (value == defaultValue) {
if (oldValue !== undefined) {
delete data[field];
DataTiddler.save(tiddler);
}
return;
}
data[field] = value;
DataTiddler.save(tiddler);
};
// Internal.
//
// Reads the data section from the tiddler's content and returns its text
// (as a String).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readDataSectionText = function(tiddler) {
var matches = DataTiddler.getDataTiddlerMatches(tiddler);
if (matches === null || !matches[2]) {
return null;
}
return matches[2];
};
// Internal.
//
// Reads the data section from the tiddler's content and returns it
// (as an internalized object).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readData = function(tiddler) {
var text = DataTiddler.readDataSectionText(tiddler);
try {
return text ? DataTiddler.parse(text) : null;
} catch(ex) {
throw DataTiddler.extendJSONError(ex);
}
};
// Internal.
//
// Returns the serialized text of the data of the given tiddler, as it
// should be stored in the data section.
//
// @param tiddler a Tiddler
//
DataTiddler.getDataTextOfTiddler = function(tiddler) {
var data = DataTiddler.getTiddlerDataObject(tiddler);
return DataTiddler.stringify(data);
};
// Internal.
//
DataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {
var index = s.indexOf(subString, startIndex);
while ((index > 0) && (s[index-1] == '~')) {
index = s.indexOf(subString, index+1);
}
return index;
};
// Internal.
//
DataTiddler.getDataSectionInfo = function(text) {
// Special care must be taken to handle "<data>" and "</data>" texts inside
// a data section.
// Also take care not to use an escaped <data> (i.e. "~<data>") as the start
// of a data section. (Same for </data>)
// NOTE: we are explicitly searching for a data section that contains a JSON
// string, i.e. framed with braces. This way we are little bit more robust in
// case the tiddler contains unescaped texts "<data>" or "</data>". This must
// be changed when using a different stringifier.
var startTagText = "<data>{";
var endTagText = "}</data>";
var startPos = 0;
// Find the first not escaped "<data>".
var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);
if (startDataTagIndex < 0) {
return null;
}
// Find the *last* not escaped "</data>".
var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);
if (endDataTagIndex < 0) {
return null;
}
var nextEndDataTagIndex;
while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {
endDataTagIndex = nextEndDataTagIndex;
}
return {
prefixEnd: startDataTagIndex,
dataStart: startDataTagIndex+(startTagText.length)-1,
dataEnd: endDataTagIndex,
suffixStart: endDataTagIndex+(endTagText.length)
};
};
// Internal.
//
// Returns the "matches" of a content of a DataTiddler on the
// "data" regular expression. Return null when no data is defined
// in the tiddler content.
//
// Group 1: text before data section (prefix)
// Group 2: content of data section
// Group 3: text behind data section (suffix)
//
// @param tiddler a Tiddler
// @return [may be null] null when the tiddler contains no data section, otherwise see above.
//
DataTiddler.getDataTiddlerMatches = function(tiddler) {
var text = tiddler.text;
var info = DataTiddler.getDataSectionInfo(text);
if (!info) {
return null;
}
var prefix = text.substr(0,info.prefixEnd);
var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);
var suffix = text.substr(info.suffixStart);
return [text, prefix, data, suffix];
};
// Internal.
//
// Saves the data in a <data> block of the given tiddler (as a minor change).
//
// The "chkAutoSave" and "chkForceMinorUpdate" options are respected.
// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.
//
// Notifications are not send.
//
// This method should only be called when the data really has changed.
//
// @param tiddler
// the tiddler to be saved.
//
DataTiddler.save = function(tiddler) {
var matches = DataTiddler.getDataTiddlerMatches(tiddler);
var prefix;
var suffix;
if (matches === null) {
prefix = tiddler.text;
suffix = "";
} else {
prefix = matches[1];
suffix = matches[3];
}
var dataText = DataTiddler.getDataTextOfTiddler(tiddler);
var newText =
(dataText !== null)
? prefix + "<data>" + dataText + "</data>" + suffix
: prefix + suffix;
if (newText != tiddler.text) {
// make the change in the tiddlers text
// ... see DataTiddler.MyTiddlerChangedFunction
tiddler.isDataTiddlerChange = true;
// ... do the action change
tiddler.set(
tiddler.title,
newText,
config.options.txtUserName,
config.options.chkForceMinorUpdate? undefined : new Date(),
tiddler.tags);
// ... see DataTiddler.MyTiddlerChangedFunction
delete tiddler.isDataTiddlerChange;
// Mark the store as dirty.
store.dirty = true;
// AutoSave if option is selected
if(config.options.chkAutoSave) {
saveChanges();
}
}
};
// Internal.
//
DataTiddler.MyTiddlerChangedFunction = function() {
// Remove the data object from the tiddler when the tiddler is changed
// by code other than DataTiddler code.
//
// This is necessary since the data object is just a "cached version"
// of the data defined in the data section of the tiddler and the
// "external" change may have changed the content of the data section.
// Thus we are not sure if the data object reflects the data section
// contents.
//
// By deleting the data object we ensure that the data object is
// reconstructed the next time it is needed, with the data defined by
// the data section in the tiddler's text.
// To indicate that a change is a "DataTiddler change" a temporary
// property "isDataTiddlerChange" is added to the tiddler.
if (this.dataObject && !this.isDataTiddlerChange) {
delete this.dataObject;
}
// call the original code.
DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);
};
//============================================================================
// Formatters
//============================================================================
// This formatter ensures that "~<data>" is rendered as "<data>". This is used to
// escape the "<data>" of a data section, just in case someone really wants to use
// "<data>" as a text in a tiddler and not start a data section.
//
// Same for </data>.
//
config.formatters.push( {
name: "data-escape",
match: "~<\\/?data>",
handler: function(w) {
w.outputText(w.output,w.matchStart + 1,w.nextMatch);
}
} );
// This formatter ensures that <data>...</data> sections are not rendered.
//
config.formatters.push( {
name: "data",
match: "<data>",
handler: function(w) {
var info = DataTiddler.getDataSectionInfo(w.source);
if (info && info.prefixEnd == w.matchStart) {
w.nextMatch = info.suffixStart;
} else {
w.outputText(w.output,w.matchStart,w.nextMatch);
}
}
} );
//============================================================================
// Tiddler Class Extension
//============================================================================
// "Hijack" the changed method ---------------------------------------------------
DataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;
Tiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;
// Define accessor methods -------------------------------------------------------
// Returns the value of the given data field of the tiddler. When no such field
// is defined or its value is undefined the defaultValue is returned.
//
// When field is undefined (or null) the data object is returned. (See
// DataTiddler.getDataObject.)
//
// @param field [may be null, undefined]
// @param defaultValue [may be null, undefined]
// @return [may be null, undefined]
//
Tiddler.prototype.data = function(field, defaultValue) {
return (field)
? DataTiddler.getTiddlerDataValue(this, field, defaultValue)
: DataTiddler.getTiddlerDataObject(this);
};
// Sets the value of the given data field of the tiddler to the value. When the
// value is equal to the defaultValue no value is set (and the field is removed).
//
// @param value [may be null, undefined]
// @param defaultValue [may be null, undefined]
//
Tiddler.prototype.setData = function(field, value, defaultValue) {
DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);
};
//============================================================================
// showData Macro
//============================================================================
config.macros.showData = {
// Standard Properties
label: "showData",
prompt: "Display the values stored in the data section of the tiddler"
};
config.macros.showData.handler = function(place,macroName,params) {
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// Parse the optional "JSON"
var showInJSONFormat = false;
if ((i < params.length) && params[i] == "JSON") {
i++;
showInJSONFormat = true;
}
var tiddlerName = story.findContainingTiddler(place).id.substr(7);
if (i < params.length) {
tiddlerName = params[i];
i++;
}
// --- Processing ------------------------------------------
try {
if (showInJSONFormat) {
this.renderDataInJSONFormat(place, tiddlerName);
} else {
this.renderDataAsTable(place, tiddlerName);
}
} catch (e) {
this.createErrorElement(place, e);
}
};
config.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {
var text = DataTiddler.getDataText(tiddlerName);
if (text) {
createTiddlyElement(place,"pre",null,null,text);
}
};
config.macros.showData.renderDataAsTable = function(place,tiddlerName) {
var text = "|!Name|!Value|\n";
var data = DataTiddler.getDataObject(tiddlerName);
if (data) {
for (var i in data) {
var value = data[i];
text += "|"+i+"|"+DataTiddler.stringify(value)+"|\n";
}
}
wikify(text, place);
};
// Internal.
//
// Creates an element that holds an error message
//
config.macros.showData.createErrorElement = function(place, exception) {
var message = (exception.description) ? exception.description : exception.toString();
return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);
};
// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
".showDataError{color: #ffffff;background-color: #880000;}",
"showData");
} // of "install only once"
// Used Globals (for JSLint) ==============
// ... TiddlyWiki Core
/*global createTiddlyElement, saveChanges, store, story, wikify */
// ... DataTiddler
/*global DataTiddler */
// ... JSON
/*global JSON */
/***
!JSON Code, used to serialize the data
***/
/*
Copyright (c) 2005 JSON.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The Software shall be used for Good, not Evil.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
/*
The global object JSON contains two methods.
JSON.stringify(value) takes a JavaScript value and produces a JSON text.
The value must not be cyclical.
JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
throw a 'JSONError' exception if there is an error.
*/
var JSON = {
copyright: '(c)2005 JSON.org',
license: 'http://www.crockford.com/JSON/license.html',
/*
Stringify a JavaScript value, producing a JSON text.
*/
stringify: function (v) {
var a = [];
/*
Emit a string.
*/
function e(s) {
a[a.length] = s;
}
/*
Convert a value.
*/
function g(x) {
var c, i, l, v;
switch (typeof x) {
case 'object':
if (x) {
if (x instanceof Array) {
e('[');
l = a.length;
for (i = 0; i < x.length; i += 1) {
v = x[i];
if (typeof v != 'undefined' &&
typeof v != 'function') {
if (l < a.length) {
e(',');
}
g(v);
}
}
e(']');
return;
} else if (typeof x.toString != 'undefined') {
e('{');
l = a.length;
for (i in x) {
v = x[i];
if (x.hasOwnProperty(i) &&
typeof v != 'undefined' &&
typeof v != 'function') {
if (l < a.length) {
e(',');
}
g(i);
e(':');
g(v);
}
}
return e('}');
}
}
e('null');
return;
case 'number':
e(isFinite(x) ? +x : 'null');
return;
case 'string':
l = x.length;
e('"');
for (i = 0; i < l; i += 1) {
c = x.charAt(i);
if (c >= ' ') {
if (c == '\\' || c == '"') {
e('\\');
}
e(c);
} else {
switch (c) {
case '\b':
e('\\b');
break;
case '\f':
e('\\f');
break;
case '\n':
e('\\n');
break;
case '\r':
e('\\r');
break;
case '\t':
e('\\t');
break;
default:
c = c.charCodeAt();
e('\\u00' + Math.floor(c / 16).toString(16) +
(c % 16).toString(16));
}
}
}
e('"');
return;
case 'boolean':
e(String(x));
return;
default:
e('null');
return;
}
}
g(v);
return a.join('');
},
/*
Parse a JSON text, producing a JavaScript value.
*/
parse: function (text) {
var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null)\s*/,
token,
operator;
function error(m, t) {
throw {
name: 'JSONError',
message: m,
text: t || operator || token
};
}
function next(b) {
if (b && b != operator) {
error("Expected '" + b + "'");
}
if (text) {
var t = p.exec(text);
if (t) {
if (t[2]) {
token = null;
operator = t[2];
} else {
operator = null;
try {
token = eval(t[1]);
} catch (e) {
error("Bad token", t[1]);
}
}
text = text.substring(t[0].length);
} else {
error("Unrecognized token", text);
}
} else {
token = operator = undefined;
}
}
function val() {
var k, o;
switch (operator) {
case '{':
next('{');
o = {};
if (operator != '}') {
for (;;) {
if (operator || typeof token != 'string') {
error("Missing key");
}
k = token;
next();
next(':');
o[k] = val();
if (operator != ',') {
break;
}
next(',');
}
}
next('}');
return o;
case '[':
next('[');
o = [];
if (operator != ']') {
for (;;) {
o.push(val());
if (operator != ',') {
break;
}
next(',');
}
}
next(']');
return o;
default:
if (operator !== null) {
error("Missing value");
}
k = token;
next();
return k;
}
}
next();
return val();
}
};
/***
!Setup the data serialization
***/
DataTiddler.format = "JSON";
DataTiddler.stringify = JSON.stringify;
DataTiddler.parse = JSON.parse;
//}}}
/***
|Name|DatePlugin|
|Source|http://www.TiddlyTools.com/#DatePlugin|
|Documentation|http://www.TiddlyTools.com/#DatePluginInfo|
|Version|2.7.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|formatted dates plus popup menu with 'journal' link, changes and (optional) reminders|
There are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.
!!!!!Documentation
>see [[DatePluginInfo]]
!!!!!Configuration
<<<
<<option chkDatePopupHideCreated>> omit 'created' section from date popups
<<option chkDatePopupHideChanged>> omit 'changed' section from date popups
<<option chkDatePopupHideTagged>> omit 'tagged' section from date popups
<<option chkDatePopupHideReminders>> omit 'reminders' section from date popups
<<option chkShowJulianDate>> display Julian day number (1-365) below current date
see [[DatePluginConfig]] for additional configuration settings, for use in calendar displays, including:
*date formats
*color-coded backgrounds
*annual fixed-date holidays
*weekends
<<<
!!!!!Revisions
<<<
2008.03.08 [2.7.0] in addModifiedsToPopup(), if a tiddler was created on the specified date, don't list it in the 'changed' section of the popup. Based on a request from Kashgarinn.
|please see [[DatePluginInfo]] for additional revision details|
2005.10.30 [0.9.0] pre-release
<<<
!!!!!Code
***/
//{{{
version.extensions.date = {major: 2, minor: 7, revision: 0, date: new Date(2008,3,8)};
config.macros.date = {
format: "YYYY.0MM.0DD", // default date display format
linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format
linkedbg: "#babb1e", // "babble"
todaybg: "#ffab1e", // "fable"
weekendbg: "#c0c0c0", // "cocoa"
holidaybg: "#ffaace", // "face"
createdbg: "#bbeeff", // "beef"
modifiedsbg: "#bbeeff", // "beef"
remindersbg: "#c0ffee", // "coffee"
holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)
weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]
};
config.macros.date.handler = function(place,macroName,params)
{
// do we want to see a link, a popup, or just a formatted date?
var mode="display";
if (params[0]=="display") { mode=params[0]; params.shift(); }
if (params[0]=="popup") { mode=params[0]; params.shift(); }
if (params[0]=="link") { mode=params[0]; params.shift(); }
// get the date
var now = new Date();
var date = now;
if (!params[0] || params[0]=="today")
{ params.shift(); }
else if (params[0]=="filedate")
{ date=new Date(document.lastModified); params.shift(); }
else if (params[0]=="tiddler")
{ date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }
else if (params[0].substr(0,8)=="tiddler:")
{ var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }
else {
var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));
var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));
var d = eval(params.shift().replace(/D/ig,now.getDate()+0));
date = new Date(y,m-1,d);
}
// date format with optional custom override
var format=this.format; if (params[0]) format=params.shift();
var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();
showDate(place,date,mode,format,linkformat);
}
window.showDate=showDate;
function showDate(place,date,mode,format,linkformat,autostyle,weekend)
{
if (!mode) mode="display";
if (!format) format=config.macros.date.format;
if (!linkformat) linkformat=config.macros.date.linkformat;
if (!autostyle) autostyle=false;
// format the date output
var title = date.formatString(format);
var linkto = date.formatString(linkformat);
// just show the formatted output
if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }
// link to a 'dated tiddler'
var link = createTiddlyLink(place, linkto, false);
link.appendChild(document.createTextNode(title));
link.title = linkto;
link.date = date;
link.format = format;
link.linkformat = linkformat;
// if using a popup menu, replace click handler for dated tiddler link
// with handler for popup and make link text non-italic (i.e., an 'existing link' look)
if (mode=="popup") {
link.onclick = onClickDatePopup;
link.style.fontStyle="normal";
}
// format the popup link to show what kind of info it contains (for use with calendar generators)
if (autostyle) setDateStyle(place,link,weekend);
}
//}}}
//{{{
// NOTE: This function provides default logic for setting the date style when displayed in a calendar
// To customize the date style logic, please see[[DatePluginConfig]]
function setDateStyle(place,link,weekend) {
// alias variable names for code readability
var date=link.date;
var fmt=link.linkformat;
var linkto=date.formatString(fmt);
var cmd=config.macros.date;
if ((weekend!==undefined?weekend:isWeekend(date))&&(cmd.weekendbg!=""))
{ place.style.background = cmd.weekendbg; }
if (hasModifieds(date)||hasCreateds(date)||hasTagged(date,fmt))
{ link.style.fontStyle="normal"; link.style.fontWeight="bold"; }
if (hasReminders(date))
{ link.style.textDecoration="underline"; }
if (isToday(date))
{ link.style.border="1px solid black"; }
if (isHoliday(date)&&(cmd.holidaybg!=""))
{ place.style.background = cmd.holidaybg; }
if (hasCreateds(date)&&(cmd.createdbg!=""))
{ place.style.background = cmd.createdbg; }
if (hasModifieds(date)&&(cmd.modifiedsbg!=""))
{ place.style.background = cmd.modifiedsbg; }
if ((hasTagged(date,fmt)||store.tiddlerExists(linkto))&&(cmd.linkedbg!=""))
{ place.style.background = cmd.linkedbg; }
if (hasReminders(date)&&(cmd.remindersbg!=""))
{ place.style.background = cmd.remindersbg; }
if (isToday(date)&&(cmd.todaybg!=""))
{ place.style.background = cmd.todaybg; }
if (config.options.chkShowJulianDate) { // optional display of Julian date numbers
var m=[0,31,59,90,120,151,181,212,243,273,304,334];
var d=date.getDate()+m[date.getMonth()];
var y=date.getFullYear();
if (date.getMonth()>1 && (y%4==0 && y%100!=0) || y%400==0)
d++; // after February in a leap year
wikify("@@font-size:80%;<br>"+d+"@@",place);
}
}
//}}}
//{{{
function isToday(date) // returns true if date is today
{ var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }
function isWeekend(date) // returns true if date is a weekend
{ return (config.macros.date.weekend[date.getDay()]); }
function isHoliday(date) // returns true if date is a holiday
{
var longHoliday = date.formatString("0MM/0DD/YYYY");
var shortHoliday = date.formatString("0MM/0DD");
for(var i = 0; i < config.macros.date.holidays.length; i++) {
var holiday=config.macros.date.holidays[i];
if (holiday==longHoliday||holiday==shortHoliday) return true;
}
return false;
}
//}}}
//{{{
// Event handler for clicking on a day popup
function onClickDatePopup(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
var popup = Popup.create(this);
if(popup) {
// always show dated tiddler link (or just date, if readOnly) at the top...
if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))
createTiddlyLink(popup,this.date.formatString(this.linkformat),true);
else
createTiddlyText(popup,this.date.formatString(this.linkformat));
if (!config.options.chkDatePopupHideCreated)
addCreatedsToPopup(popup,this.date,this.format);
if (!config.options.chkDatePopupHideChanged)
addModifiedsToPopup(popup,this.date,this.format);
if (!config.options.chkDatePopupHideTagged)
addTaggedToPopup(popup,this.date,this.linkformat);
if (!config.options.chkDatePopupHideReminders)
addRemindersToPopup(popup,this.date,this.linkformat);
}
Popup.show(popup,false);
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return(false);
}
//}}}
//{{{
function indexCreateds() // build list of tiddlers, hash indexed by creation date
{
var createds= { };
var tiddlers = store.getTiddlers("title","excludeLists");
for (var t = 0; t < tiddlers.length; t++) {
var date = tiddlers[t].created.formatString("YYYY0MM0DD")
if (!createds[date])
createds[date]=new Array();
createds[date].push(tiddlers[t].title);
}
return createds;
}
function hasCreateds(date) // returns true if date has created tiddlers
{
if (!config.macros.date.createds) config.macros.date.createds=indexCreateds();
return (config.macros.date.createds[date.formatString("YYYY0MM0DD")]!=undefined);
}
function addCreatedsToPopup(popup,when,format)
{
var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));
if (force || !config.macros.date.createds) config.macros.date.createds=indexCreateds();
var indent=String.fromCharCode(160)+String.fromCharCode(160);
var createds = config.macros.date.createds[when.formatString("YYYY0MM0DD")];
if (createds) {
createds.sort();
var e=createTiddlyElement(popup,"div",null,null,"created ("+createds.length+")");
for(var t=0; t<createds.length; t++) {
var link=createTiddlyLink(popup,createds[t],false);
link.appendChild(document.createTextNode(indent+createds[t]));
createTiddlyElement(popup,"br",null,null,null);
}
}
}
//}}}
//{{{
function indexModifieds() // build list of tiddlers, hash indexed by modification date
{
var modifieds= { };
var tiddlers = store.getTiddlers("title","excludeLists");
for (var t = 0; t < tiddlers.length; t++) {
var date = tiddlers[t].modified.formatString("YYYY0MM0DD")
if (!modifieds[date])
modifieds[date]=new Array();
modifieds[date].push(tiddlers[t].title);
}
return modifieds;
}
function hasModifieds(date) // returns true if date has modified tiddlers
{
if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();
return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);
}
function addModifiedsToPopup(popup,when,format)
{
var date=when.formatString("YYYY0MM0DD");
var force=(store.isDirty() && date==new Date().formatString("YYYY0MM0DD"));
if (force || !config.macros.date.modifieds) config.macros.date.modifieds=indexModifieds();
var indent=String.fromCharCode(160)+String.fromCharCode(160);
var mods = config.macros.date.modifieds[date];
if (mods) {
// if a tiddler was created on this date, don't list it in the 'changed' section
if (config.macros.date.createds && config.macros.date.createds[date]) {
var temp=[];
for(var t=0; t<mods.length; t++)
if (!config.macros.date.createds[date].contains(mods[t]))
temp.push(mods[t]);
mods=temp;
}
mods.sort();
var e=createTiddlyElement(popup,"div",null,null,"changed ("+mods.length+")");
for(var t=0; t<mods.length; t++) {
var link=createTiddlyLink(popup,mods[t],false);
link.appendChild(document.createTextNode(indent+mods[t]));
createTiddlyElement(popup,"br",null,null,null);
}
}
}
//}}}
//{{{
function hasTagged(date,format) // returns true if date is tagging other tiddlers
{
return store.getTaggedTiddlers(date.formatString(format)).length>0;
}
function addTaggedToPopup(popup,when,format)
{
var indent=String.fromCharCode(160)+String.fromCharCode(160);
var tagged=store.getTaggedTiddlers(when.formatString(format));
if (tagged.length) var e=createTiddlyElement(popup,"div",null,null,"tagged ("+tagged.length+")");
for(var t=0; t<tagged.length; t++) {
var link=createTiddlyLink(popup,tagged[t].title,false);
link.appendChild(document.createTextNode(indent+tagged[t].title));
createTiddlyElement(popup,"br",null,null,null);
}
}
//}}}
//{{{
function indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date
{
var reminders = { };
if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed
// DEBUG var starttime=new Date();
var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);
for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;
// DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\n";
// DEBUG out+="startdate: "+date.toLocaleDateString()+"\n"+"leadtime: "+leadtime+" days\n\n";
// DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\n"; }
// DEBUG alert(out);
}
return reminders;
}
function hasReminders(date) // returns true if date has reminders
{
if (window.reminderCacheForCalendar)
return window.reminderCacheForCalendar[date]; // use calendar cache
if (!config.macros.date.reminders)
config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache
return (config.macros.date.reminders[date]);
}
function addRemindersToPopup(popup,when,format)
{
if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed
var indent = String.fromCharCode(160)+String.fromCharCode(160);
var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);
createTiddlyElement(popup,"div",null,null,"reminders ("+(reminders.length||"none")+")");
for(var t=0; t<reminders.length; t++) {
link = createTiddlyLink(popup,reminders[t].tiddler,false);
var diff=reminders[t].diff;
diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");
var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;
link.appendChild(document.createTextNode(indent+diff+" - "+txt));
createTiddlyElement(popup,"br",null,null,null);
}
if (readOnly) return; // omit "new reminder..." link
var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");
var title = when.formatString(format);
link.title="add a reminder to '"+title+"'";
link.onclick = function() {
// show tiddler editor
story.displayTiddler(null, title, 2, null, null, false, false);
// find body 'textarea'
var c =document.getElementById("tiddler" + title).getElementsByTagName("*");
for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;
// append reminder macro to tiddler content
if (i<c.length) {
if (store.tiddlerExists(title)) c[i].value+="\n"; else c[i].value="";
c[i].value += "<<reminder";
c[i].value += " day:"+when.getDate();
c[i].value += " month:"+(when.getMonth()+1);
c[i].value += " year:"+when.getFullYear();
c[i].value += ' title:"Enter a title" >>';
}
};
}
//}}}
/***
|Name|DatePluginConfig|
|Source|http://www.TiddlyTools.com/#DatePluginConfig|
|Documentation|http://www.TiddlyTools.com/#DatePluginInfo|
|Version|2.6.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|formats, background colors and other optional settings for DatePlugin|
***/
// // Default popup content display options (can be overridden by cookies)
//{{{
if (config.options.chkDatePopupHideCreated===undefined)
config.options.chkDatePopupHideCreated=false;
if (config.options.chkDatePopupHideChanged===undefined)
config.options.chkDatePopupHideChanged=false;
if (config.options.chkDatePopupHideTagged===undefined)
config.options.chkDatePopupHideTagged=false;
if (config.options.chkDatePopupHideReminders===undefined)
config.options.chkDatePopupHideReminders=false;
//}}}
// // show Julian date number below regular date
//{{{
if (config.options.chkShowJulianDate===undefined)
config.options.chkShowJulianDate=false;
//}}}
// // fixed-date annual holidays
//{{{
config.macros.date.holidays=[
"01/01", // NewYearsDay,
"07/04", // US Independence Day
"07/24" // Eric's Birthday (hooray!)
];
//}}}
// // weekend map (1=weekend, 0=weekday)
//{{{
config.macros.date.weekend=[ 1,0,0,0,0,0,1 ]; // day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6
//}}}
// // date display/link formats
//{{{
config.macros.date.format="YYYY-0MM-0DD"; // default date display format
config.macros.date.linkformat="YYYY-0MM-0DD"; // 'dated tiddler' link format
//}}}
// // When displaying a calendar (see [[CalendarPlugin]]), you can customize the colors/styles that are applied to the calendar dates by modifying the values and/or functions below:
//{{{
// default calendar colors
config.macros.date.weekendbg="#c0c0c0";
config.macros.date.holidaybg="#ffaace";
config.macros.date.createdbg="#bbeeff";
config.macros.date.modifiedsbg="#bbeeff";
config.macros.date.linkedbg="#babb1e";
config.macros.date.remindersbg="#c0ffee";
// apply calendar styles
function setDateStyle(place,link,weekend) {
// alias variable names for code readability
var date=link.date;
var fmt=link.linkformat;
var linkto=date.formatString(fmt);
var cmd=config.macros.date;
if ((weekend!==undefined?weekend:isWeekend(date))&&(cmd.weekendbg!=""))
{ place.style.background = cmd.weekendbg; }
if (hasModifieds(date)||hasCreateds(date)||hasTagged(date,fmt))
{ link.style.fontStyle="normal"; link.style.fontWeight="bold"; }
if (hasReminders(date))
{ link.style.textDecoration="underline"; }
if (isToday(date))
{ link.style.border="1px solid black"; }
if (isHoliday(date)&&(cmd.holidaybg!=""))
{ place.style.background = cmd.holidaybg; }
if (hasCreateds(date)&&(cmd.createdbg!=""))
{ place.style.background = cmd.createdbg; }
if (hasModifieds(date)&&(cmd.modifiedsbg!=""))
{ place.style.background = cmd.modifiedsbg; }
if ((hasTagged(date,fmt)||store.tiddlerExists(linkto))&&(cmd.linkedbg!=""))
{ place.style.background = cmd.linkedbg; }
if (hasReminders(date)&&(cmd.remindersbg!=""))
{ place.style.background = cmd.remindersbg; }
if (isToday(date)&&(cmd.todaybg!=""))
{ place.style.background = cmd.todaybg; }
if (config.options.chkShowJulianDate) {
var m=[0,31,59,90,120,151,181,212,243,273,304,334];
var d=date.getDate()+m[date.getMonth()];
var y=date.getFullYear();
if (date.getMonth()>1 && (y%4==0 && y%100!=0) || y%400==0) d++; // after February in a leap year
wikify("@@font-size:80%;<br>"+d+"@@",place);
}
}
//}}}
|Name|DatePluginInfo|
|Source|http://www.TiddlyTools.com/#DatePlugin|
|Documentation|http://www.TiddlyTools.com/#DatePluginInfo|
|Version|2.7.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|documentation for DatePlugin|
There are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.
!!!!!Usage
<<<
This plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to tiddlers that were created/changed on that date, or are tagged with that date, as well as links to any pending reminders for the coming 31 days (if the RemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc.
This plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.
However, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:
* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.
* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values.
* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"
>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^
>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^
>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^
>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^
* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format
In addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:
''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}''
Note that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:
* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.
* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.
<<<
!!!!!Examples
<<<
The current date: <<date>>
The current time: <<date today "0hh:0mm:0ss">>
Today's blog: <<date link today "DDD, MMM DDth, YYYY">>
Recent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>
The first day of next month will be a <<date Y M+1 1 "DDD">>
This tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>
The SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>
This document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>
<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>
<<<
!!!!!Revisions
<<<
2008.03.08 [2.7.0] in addModifiedsToPopup(), if a tiddler was created on the specified date, don't list it in the 'changed' section of the popup. Based on a request from Kashgarinn
2008.01.31 [2.6.0] refactored date style logic into separate setDateStyle() function so it can be overridden by a custom definition. See [[DatePluginConfig]].
2008.01.11 [2.5.0] added options to selectively suppress created/changes/tagged/reminders popup content
2008.01.08 [*.*.*] plugin size reduction: documentation moved to DatePluginInfo
2007.11.21 [2.4.0] added hasTagged() and addTaggedToPopup() to list any tiddlers that has been tagged using the title of the dated journal tiddler asa tag value (i.e., the tiddlers that will be listed in the standard "tagging" display when viewing the journal tiddler itself). Based on a request from Coby.
2007.06.20 [2.3.1] in onClickDatePopup(), use Popup.show() instead of deprecated ScrollToTiddlerPopup(). Fixes fatal error that prevents popups from being properly displayed
2007.05.31 [2.3.0] list "created" tiddlers in date popup. Also, force re-cache of created/modified indices when displaying current date and store.isDirty(), so that popup is kept in sync with tiddler changes.
2006.05.09 [2.2.1] added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.
2006.05.05 [2.2.0] added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.
2006.03.08 [2.1.2] add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.
2006.03.06 [2.1.0] hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").
2006.02.14 [2.0.5] when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.
2006.02.05 [2.0.4] added var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables
2006.01.18 [2.0.3] In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.
2006.01.11 [2.0.2] correct 'weekend' override detection logic in showDate()
2006.01.10 [2.0.1] allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)
added flag param to showDate() API to override internal weekend[] array
2005.12.27 [2.0.0] Update for TW2.0
Added parameter handling for 'linkformat'
2005.12.21 [1.2.2] FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.
2005.11.07 [1.2.1] added support for "tiddler" dynamic date parameter
2005.11.06 [1.2.0] added support for "tiddler:title" dynamic date parameter
2005.11.03 [1.1.2] when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.
2005.11.03 [1.1.1] Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).
2005.11.01 [1.1.0] corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...
2005.10.31 [1.0.1] documentation and code cleanup
2005.10.31 [1.0.0] initial public release
2005.10.30 [0.9.0] pre-release
<<<
GlennJackman [[Bookmarks]]
<html><h1>Egg Substitutes: Handy Recipe List</h1>
<div class="wp-caption aligncenter" style="width: 353px;"><img alt="Measuring Cups & Eggs" src="http://tipnut.com/projectpics/measuring-eggs.jpg" title="Measuring Cups & Eggs" height="225" width="343"><p class="wp-caption-text">Measuring Cups & Eggs</p></div>
<p>If you run out of eggs while baking, an egg substitute is a quick fix since chances are you have something in the pantry that you can use. You may also find need for an egg substitute if you’re baking a cake for someone with allergies or if someone is vegan. Using an egg substitute may affect the taste or texture of the final product.</p>
<p>I do have a running list of <a href="http://tipnut.com/handy-substitute-recipes-for-baking/">Handy Substitute Recipes For Baking</a> but decided to make a separate post just for egg substitutes & replacers since I have so many.</p>
<h2>Egg Substitute Recipes (Each replaces one egg)</h2>
<p><em>*It’s recommended not to replace more than 2 eggs per recipe.</em></p>
<ul>
<li>1 tsp baking powder + 1 1/2 TBS water + 1 1/2 TBS oil</li>
<li>1 tsp baking powder + 1 TBS water + 1 TBS vinegar</li>
<li>2 TBS water or milk + 2 TBS flour + 1/2 TBS shortening + 1/2 tsp baking powder</li>
<li>1 TBS vinegar + 1 tsp baking soda</li>
<li>2 TBS lemon juice + 1 tsp baking soda</li>
<li>1 TBS cornstarch + 3 TBS water for each missing egg</li>
<li>2 TBS arrowroot flour</li>
<li>2 TBS potato starch</li>
<li>1 TBS tapioca starch + 1/4 cup warm water (mix well & allow to gel a bit before using)</li>
<li>1 tsp yeast dissolved in 1/4 cup warm water</li>
<li>1/2 banana, mashed (medium size) + 1/4 tsp baking powder</li>
<li>2 TBS applesauce</li>
<li>3 TBS mayonnaise</li>
</ul>
<p><strong>Flax Seed Egg Replacer</strong><br>
<em>*Replacer for 1 egg</em></p>
<p>1 TBS flax seed (ground)<br>
3 TBS water</p>
<ul>
<li>Method #1: Simmer together on top of stove for about 5 minutes until the consistency reaches a thick, egg-white like consistency.</li>
<li>Method #2: Blend ingredients together in a blender or food processor until the mixture is thick and creamy. Refrigerate.</li>
</ul>
<p><strong>Homemade Egg Substitute</strong><br>
*1/4 cup = 1 large egg</p>
<p>6 egg whites<br>
1/4 cup dry milk powder (non-fat)<br>
1 TBS vegetable oil</p>
<ul>
<li>Mix all ingredients together and blend until smooth, refrigerate. Can be frozen.</li>
</ul>
<p><strong>Replacer For Egg Substitute</strong>:</p>
<ul>
<li>Some low fat or low cholesterol recipes call for a commercial egg substitute. If you don’t have any on hand or wish to cook with fresh eggs instead, 1 fresh egg = 1/4 cup of egg substitute.</li>
</ul>
<p><strong>More Handy Kitchen Charts</strong>:</p>
<ul>
<li><a href="http://tipnut.com/handy-substitute-recipes-for-baking/">Handy Substitute Recipes For Baking</a></li>
<li><a href="http://tipnut.com/kitchen-measurement-hacks/">34 Handy Kitchen Measurement Hacks & Tidbits</a></li>
<li><a href="http://tipnut.com/recipe-ingredient-substitutions-equivalents-chart/">Recipe Ingredient Substitutions & Equivalents Chart</a></li></ul></html>
Source: [[Egg Substitutes: Handy Recipe List : TipNut.com|http://tipnut.com/egg-substitutes/]]
* do some daily [[calisthenics|Minimalist Fitness: How to Get In Lean Shape With Little or No Equipment]] to gain strength,
* launch the OneHundredPushups program
* continue [[10,000Steps]] to maintain exercise.
[[ExerciseLog 2008w32]]
[[ExerciseLog 2008w33]]
[[ExerciseLog 2008w34]]
[[ExerciseLog 2008w35]]
[[ExerciseLog 2008w36]]
[[ExerciseLog 2008w38]]
[[ExerciseLog 2008w39]]
ExerciseLogTemplate
[[10,000Steps]]
|!Thursday Aug 14/08|pushups 22, squats 50|
|!Friday Aug 15/08||
|!Saturday Aug 16/08|OneHundredPushups, squats 30 with Joshua piggyback|
[[10,000Steps]]
|!Sunday Aug 17/08|mow the grass|
|!Monday Aug 18/08|OneHundredPushups|
|!Tuesday Aug 19/08|(plank, squats 25) x 2|
|!Wednesday Aug 20/08|OneHundredPushups, squats 25 x 2|
|!Thursday Aug 21/08||
|!Friday Aug 22/08|OneHundredPushups|
|!Saturday Aug 23/08||
[[10,000Steps]]
|!Sunday Aug 24/08||
|!Monday Aug 25/08|OneHundredPushups, 1 plank, 25 squats|
|!Tuesday Aug 26/08||
|!Wednesday Aug 27/08|OneHundredPushups|
|!Thursday Aug 28/08||
|!Friday Aug 29/08|OneHundredPushups, 16 squats before interruption|
|!Saturday Aug 30/08|gatineau hike carrying sleepy boy|
[[10,000Steps]]
|!Sunday Aug 31/08||
|!Monday Sep 1/08||
|!Tuesday Sep 2/08||
|!Wednesday Sep 3/08||
|!Thursday Sep 4/08||
|!Friday Sep 5/08||
|!Saturday Sep 6/08||
[[10,000Steps]]
|!Sunday Sep 7/08||
|!Monday Sep 8/08||
|!Tuesday Sep 9/08|after a week, resume OneHundredPushups at week 2|
|!Wednesday Sep 10/08||
|!Thursday Sep 11/08|OneHundredPushups|
|!Friday Sep 12/08||
|!Saturday Sep 13/08||
[[10,000Steps]]
|!Sunday Sep 21/08||
|!Monday Sep 22/08|OneHundredPushups|
|!Tuesday Sep 23/08|OneHundredPushups|
|!Wednesday Sep 24/08||
|!Thursday Sep 25/08||
|!Friday Sep 26/08|OneHundredPushups, next stage|
|!Saturday Sep 27/08||
[[10,000Steps]]
|!Sunday Sep 28/08||
|!Monday Sep 29/08|OneHundredPushups|
|!Tuesday Sep 30/08||
|!Wednesday Oct 1/08||
|!Thursday Oct 2/08||
|!Friday Oct 3/08||
|!Saturday Oct 4/08||
Note, do not rename this template, copy and paste the contents into a new tiddler
----
[[10,000Steps]]
|!Sunday Aug 24/08||
|!Monday Aug 25/08||
|!Tuesday Aug 26/08||
|!Wednesday Aug 27/08||
|!Thursday Aug 28/08||
|!Friday Aug 29/08||
|!Saturday Aug 30/08||
As of 2008-11-11
|>|!|!SPH|!CYL|!AXIS|
|!Distance|!OD|+1.00|-1.75|100|
|~|!OS|+0.75|-1.50|085|
<html><p>Windows and Mac OS X: Offered as a free download from the Insurance Information Institute, the Know Your Stuff Home Inventory software is a full-featured tool for cataloging your possessions in case disaster should strike. Wizards guide you through the basic setup of your inventory, then using Know Your Stuff's simple interface you can add rooms and items to the inventory. For each item you enter you can assign photos, receipts or appraisals, make/model/serial number, quantity, and replacement cost.</p>
<p>There are guides to help you get started on the Know Your Stuff web site, very helpful if you've never done a home inventory before and aren't sure where to start or what to include in it. Obviously if you invest the time and energy to create a home inventory you'll want to make sure the it's is secure. From the Know Your Stuff application you can export the file you've created and save it to external media or to a remote location, upload the file to Vault 24 (a remote backup solution integrated into the software, which unfortunately costs $15 a year) , or you can go the old fashioned route and print the inventory off and store it in a safe location. The Know Your Stuff Home Inventory software is a free download for Windows or Mac.</p>
<div class="related"><a href="http://www.knowyourstuff.org/">Know Your Stuff Home Inventory Software</a> [via <a href="http://www.downloadsquad.com/2008/07/23/home-inventory-track-your-belongings-have-peace-of-mind/">Download Squad]</a></div></html>
Source: [[Featured Download: Know Your Stuff Inventories Your Home|http://lifehacker.com/399351/know-your-stuff-inventories-your-home]]
The Firefox web browser: http://www.mozilla.com/firefox/
!!add-ons:
* [[Copy Link Name|http://www.captaincaveman.nl/firefox-extensions-copy-link-name.aspx]]
* [[Firebug|http://getfirebug.com/]]
* [[FireGestures|http://www.xuldev.org/firegestures/]]
* [[Foxmarks]]
* [[IE View|http://ieview.mozdev.org/]]
* [[NoScript|http://noscript.net/]]
* [[Read It Later|http://www.ideashower.com/ideas/active/read-it-later/]]
* [[Speed Dial|http://speeddial.uworks.net/]]
* [[Stylish]]
* [[Tabs Open Relative|http://jomel.me.uk/software/firefox/tabsopenrelative/]]
* [[TiddlySnip|http://tiddlysnip.com/]]
* [[Ubiquity|https://wiki.mozilla.org/Labs/Ubiquity]]
* [[User Agent Switcher|http://chrispederick.com/work/user-agent-switcher/]]
* [[Web Developer|http://chrispederick.com/work/web-developer/]]
!!quick searches
|google|g|http://www.google.ca/search?hl=en&q=%s|
|wikipedia|wiki|http://en.wikipedia.org/wiki/Special:Search?search=%s|
|imdb|imdb|http://bama.ua.edu/cgi-bin/man-cgi?%s|
|tcl wiki|tcl|http://wiki.tcl.tk/_search?_charset_=&S=%s|
|cpan|cpan|http://search.cpan.org/search?query=%s&mode=all|
|youtube|youtube|http://youtube.com/results?search_query=%s&search_type=&aq=f&oq=|
|man pages|man|http://bama.ua.edu/cgi-bin/man-cgi?%s|
|dictionary.com|dict|http://dictionary.reference.com/search?q=%s|
!!about:config tweaks
* [[Set Firefox 3 to Launch Gmail for mailto Links|http://lifehacker.com/392287/set-firefox-3-to-launch-gmail-for-mailto-links]]
* [[Make Firefox 3's Bookmarks Available to Launchy and Quicksilver|http://lifehacker.com/399893/make-firefox-3s-bookmarks-available-to-launchy-and-quicksilver]]
* network.http.pipelining -> true
* network.http.pipelining.maxrequests -> 30
* network.http.proxy.pipelining -> true
[[FoodLog 2008w31]]
[[FoodLog 2008w32]]
[[FoodLog 2008w33]]
[[FoodLog 2008w34]]
[[FoodLog 2008w35]]
[[FoodLog 2008w36]]
[[FoodLog 2008w37]]
FoodLogTemplate
|>|!Friday Aug 8/08|
|breakfast|2 eggs with 1/4 of a hamburger fried in butter, roll with butter, water|
|coffee|decaf with sugar|
|lunch|pea soup, 6 crackers|
|coffee|decaf with sugar, water|
|snack|1 whippet cookie|
|dinner|large pho, 2 spring rolls, beer|
|>|!Saturday Aug 9/08|
|breakfast|2 fried eggs, roll with butter, water|
|snack|3 whippet cookie|
|lunch|?|
|snack|chocolate-chip-oatmeal squares|
|dinner|veg/tofu wraps, bean/plum salad, corn, biscuits, mousse, fruit, beer -- stuffed!|
|>|!Sunday Aug 10/08|
|breakfast|pancakes (boxed mix) with blueberries|
|snack|fruit, sweet biscuit|
|lunch|negligible|
|snack|apple pie with ice cream|
|dinner|nachos|
|>|!Monday Aug 11/08|
|breakfast|2 eggs, biscuit, leftover pancakes plain|
|lunch|turkey/rice soup crackers|
|coffee|3 cups decaf with sugar|
|snack|chocolate bar, chocolate-chip-oatmeal squares|
|dinner|leftover hash, heavy on carrots, salad roll, mousse, watermelon, pineapple, gin and tonic|
|>|!Tuesday Aug 12/08|
|breakfast|2 eggs, bagel, cookie|
|snack|licorice|
|coffee|yes|
|lunch|leftover leftover hash|
|snack|cookies|
|dinner|sausage, asparagus, salad, beer, pineapple|
|>|!Wednesday Aug 13/08|
|breakfast|pancakes (boxed mix) with raspberries|
|coffee|yes|
|lunch|beef soup, crackers|
|snack|chocolate bar|
|dinner|ravioli, salad, pineapple, G+T|
|>|!Thursday Aug 14/08|
|breakfast|2 eggs, bagel, salad|
|lunch|soup, crackers|
|snack|tortilla chips, apple|
|dinner|sausage, rice, corn, salad|
|>|!Friday Aug 15/08|
|breakfast|2 eggs, corn, bagel, banana, plum|
|lunch|vegetable soup, crackers|
|snack|tortilla chips, chocolate|
|dinner|2 slices pizza|
|>|!Saturday Aug 16/08|
|breakfast|scones, apple, salad, banana|
|lunch|eggs, toast|
|dinner|Agave: chips, bean dip, chicken with chevre, roast potatoes, peppers, burrito, cheesecake, beer|
|>|!Sunday Aug 17/08|
|breakfast|premix pancakes|
|lunch|cold pizza|
|snack|choco, coffee with caf|
|dinner|turkey, rice, salad, brocolli, cake, pie, beer, wine, "rhubarb juice"|
|>|!Monday Aug 18/08|
|breakfast|2 eggs w corn, banana, apple |
|lunch|soup, crackers |$2.75|
|coffee|decaf |
|snack|doughnut, sm iced cap., cupcake |$?|
|dinner|spaghetti |
|>|!Tuesday Aug 19/08|
|breakfast|eggs, corn, toast, salad |
|coffee|yes |
|lunch|(Fratelli's) minestrone soup, arugula salad, jacq's penne w chicken, beer |
|dinner|(New Dubrovnik) wiener schnitzle, spatzle, beer |$67|
|>|!Wednesday Aug 20/08|
|breakfast|eggs, corn, toast |
|coffee|yes |
|lunch|chili soup, crackers |$2.75|
|snack|pretzels|$1.25 |
|dinner|hamburgers, cole slaw, manhattan |
|>|!Thursday Aug 21/08|
|breakfast|eggs, corn, toast |
|coffee|yes |
|lunch|clam chowder, crackers |$2.75|
|snack|banana, roll, cheese(taste) |
|dinner|steak, corn, rice, cake, beer |
|>|!Friday Aug 22/08|
|breakfast|eggs, steak, toast, apple |
|lunch|steak, rice, apple, cake |
|coffee|decaf @ second cup |$2.00|
|snack|orange, G&T, tortilla chips |
|dinner|spaghetti |
|>|!Saturday Aug 23/08|
|breakfast|2 grilled cheese, water |
|lunch|leftover pizza & hamburger, cake, 1/4 of a whole watermelon, water|
|dinner|pork chops, LO hamburger, LO spag, salad, beer, grapes|
|>|!Sunday Aug 24/08|
|breakfast|eggs with mushroom and kale, bagel|
|snack|tea and cookies|
|lunch|none|
|snack|cake|
|dinner|[[Amish Chicken Casserole]]|
|>|!Monday Aug 25/08|
|breakfast|eggs with kale, bagel |
|coffee|decaf |
|lunch|LO chicken casserole, cake, apple, licorice |
|snack|licorice, orange |
|dinner|LO chicken casserole, cake, ice cream |
|>|!Tuesday Aug 26/08|
|breakfast|eggs, bagel |
|snack|bran muffin + decaf| |
|coffee|decaf|$2.00 |
|lunch|ham/cheese bun, croissant|$5.00 |
|snack|orange, banana, rice crackers, ginger ale |
|dinner|pork chops, carrot, rice, G+T |
|>|!Wednesday Aug 27/08|
|breakfast|eggs, toast |
|coffee|Y |
|lunch|soup|$2.75 |
|snack|licorice |
|dinner|omelet, vegetable juice, pie, ice cream |
|>|!Thursday Aug 28/08|
|breakfast|eggs, toast |
|lunch|vegetable juice, grilled cheese |
|dinner|(Cafe Soupe'Herbe) quesadilla, saladx2, roasted red pepper croissant, beer, pie|$50 w J |
|>|!Friday Aug 29/08|
|breakfast|eggs w kale+mushrooms, 1/2 bagel ½ |
|lunch|crackers|
|dinner|chili, "pizza bun", cheese curds, choco milk|
|>|!Saturday Aug 30/08|
|breakfast|eggs, kale, 1/2 bagel|
|lunch|pretzels, cheese curds, ginger ale, banana, apple|
|snack|banana milkshake|
|dinner|[["beer butt" chicken|The Frugal Whole Chicken (or, Waste Not, Want Not)]], vegetable stew|
|>|!Sunday Aug 31/08|
|breakfast|?|
|lunch|?|
|dinner|pizza, beer|$21|
|>|!Monday Sep 1/08|
|breakfast|pizza|
|lunch|KD|
|dinner|pork loin, salad, beer|
|>|!Tuesday Sep 2/08|
|breakfast|1 egg, toast w PB, banana|
|coffee|Y|
|lunch|pizza, salad, cake|
|dinner|chicken stir fry, beer, ice cream||:(|
|>|!Wednesday Sep 3/08|
|breakfast|eggs, toast, bacon, potatoes, caf coffee|$7|
|coffee|Y|
|lunch|hungarian goulash (i.e. chili soup), crackers|
|snack|tortilla chips|
|dinner|rice, LO veg stew, salad|
|>|!Thursday Sep 4/08|
|breakfast|oatmeal w br sugar, raisins, goat milk||:(|
|coffee|Y|
|lunch|chicken noodle soup, crackers|
|dinner|[[Tilapia With Spinach Pecan Pesto]], rice|
|>|!Friday Sep 5/08|
|breakfast|toast w PB & jam|
|coffee|Y|
|lunch|LO chicken stir fry|
|dinner|rice, LO veg stew, LO fish, ice cream, cupcake|
|>|!Saturday Sep 6/08|
|breakfast|eggs, kale, toast|
|snack|peach, OJ|
|lunch|sloppy joe|
|snack|movie junk: licorice, chocolate, gatorade|
|dinner|spring rolls, vietnamese soup|
|>|!Sunday Sep 7/08|
|breakfast|[[Blueberry Buttermilk Pancakes]]|
|lunch|quiche, LO appetizers|
|snack|cake, spinach & lentil salad, pineapple&melon|
|dinner|LO rice&greens, crudites, cake & ice cream||:(|
|>|!Monday Sep 8/08|
|breakfast|eggs, kale, toast|
|coffee|Y|
|lunch|quiche, cake, peach, nectarine|
|snack|pear|
|dinner|(Mel's potluck) salad, macaroni, chips&veg. pate, thai noodles&tofu, cake|
|>|!Tuesday Sep 9/08|
|breakfast|eggs, beet greens, toast|
|coffee|Y|
|lunch|LO quiche, salad, fruit|
|dinner|spaghetti, salad||:(|
|>|!Wednesday Sep 10/08|
|breakfast|eggs, kale, toast|
|coffee|Y|
|snack|mini brownies, mini cinnamon buns, grapes|
|lunch|beef soup|$2.75|
|dinner|baked chicken w pesto, roasted veggies, beer|
|>|!Thursday Sep 11/08|
|breakfast|eggs, kale, toast|
|coffee|Y|
|lunch|LO quiche, salad, fruit, mini cinnamon buns|
|dinner|spaghetti w meat sauce, salad, cheesecake|
|>|!Friday Sep 12/08|
|breakfast|eggs, spinach, toast|
|snack|cake|
|coffee|Y|
|lunch|LO spag, salad|
|dinner||
|>|!Saturday Sep 13/08|
|breakfast||
|lunch||
|snack||
|dinner||
|>|!Sunday Sep 14/08|
|breakfast|oatmeal w raisins|
|lunch|bagel, timbits, decaf|
|second lunch|sloppy joe|
|snack|cheezees, pear|
|dinner|spaghetti w meatballs|
|>|!Monday Sep 15/08|
|breakfast|oatmeal w raisins, almond custard croissant|
|coffee|Y|
|lunch|beef soup, crackers|
|dinner|ummm|
|>|!Tuesday Sep 16/08|
|breakfast|eggs, spinach, bagel|
|coffee|Y|
|lunch|chicken soup|
|snack|blueberries w ice cream|
|dinner|[[The Frugal Whole Chicken (or, Waste Not, Want Not)]], rice, spaghetti squash|
|>|!Wednesday Sep 17/08|
|breakfast|oatmeal w raisins|
|coffee|Y|
|lunch|LO chicken, rice, banana, pear|
|snack|orange, choco|
|dinner|tamales, rice|
|>|!Thursday Sep 18/08|
|breakfast|eggs,bagel|
|coffee|Y|
|lunch|tamales, rice, fruit|
|dinner|chicken soup, bagel, ice cream|
|>|!Friday Sep 19/08|
|breakfast||
|lunch||
|dinner||
|>|!Saturday Sep 20/08|
|breakfast||
|lunch||
|snack||
|dinner||
Note: don't rename this tiddler, cut and paste the contents
----
|>|!Sunday Aug 31/08|
|breakfast||
|snack||
|lunch||
|snack||
|dinner||
|>|!Monday Sep 1/08|
|breakfast||
|coffee||
|lunch||
|snack||
|dinner||
|>|!Tuesday Sep 2/08|
|breakfast||
|snack||
|coffee||
|lunch||
|snack||
|dinner||
|>|!Wednesday Sep 3/08|
|breakfast||
|coffee||
|lunch||
|snack||
|dinner||
|>|!Thursday Sep 4/08|
|breakfast||
|lunch||
|dinner||
|>|!Friday Sep 5/08|
|breakfast||
|lunch||
|dinner||
|>|!Saturday Sep 6/08|
|breakfast||
|lunch||
|snack||
|dinner||
Here are some examples that show the usage of the write action in the ForEachTiddlerMacro.
//''Select and Sort Examples''//
* InClauseExamples
* WhereClauseExamples
* SortClauseExamples
* ScriptClauseExamples
//''Action Examples''//
* AddToListActionExamples
* WriteActionExamples
Of cause you may also combine the examples, e.g. taking the whereClause of one example, the sortClause of a second and the action of a third.
//~~(Part of the [[ForEachTiddlerPlugin]])~~//
Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.
''Syntax:''
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
''Using JavaScript''
To give you a lot of flexibility the [[ForEachTiddlerMacro]] uses JavaScript in its arguments. Even if you are not that familiar with JavaScript you may find forEachTiddler useful. Just have a look at the various ready-to-use [[ForEachTiddlerExamples]] and adapt them to your needs.
''The Elements of the Macro''
The arguments of the ForEachTiddlerMacro consist of multiple parts, each of them being optional.
<<slider chkFETInClause [[inClause]] "inClause" "inClause">>
<<slider chkFETWhereClause [[whereClause]] "whereClause" "whereClause">>
<<slider chkFETSortClause [[sortClause]] "sortClause" "sortClause">>
<<slider chkFETScriptClause [[scriptClause]] "scriptClause" "scriptClause">>
<<slider chkFETActions [[Action Specification]] "Action Specification" "Action Specification">>
''Using Macros and ">" inside the forEachTiddler Macro''
You may use other macro calls into the expression, especially in the actionParameters. To avoid that the {{{>>}}} of such a macro call is misinterpreted as the end of the {{{<<forEachTiddler...>>}}} macro you must escape the {{{>>}}} of the inner macro with {{{$))}}} E.g. if you want to use {{{<<tiddler ...>>}}} inside the {{{forEachTiddler}}} macro you have to write {{{<<tiddler ...$))}}}.
In addition it is necessary to escape single {{{>}}} with the text {{{$)}}}.
''Using {{{<<tiddler ... with: ...>>}}} to re-use ForEachTiddler definitions''
Sometimes you may want to use a certain ForEachTiddler definition in slight variations. E.g. you may want to list either the tiddlers tagged with "ToDo" and in the other case with "Done". To do so you may use "Tiddler parameters". Here an example:
Replace the variable part of the ForEachTiddler definition with $1 ($2,... $9 are supported). E.g. you may create the tiddler "ListTaggedTiddlers" like this
{{{
<<forEachTiddler
where
'tiddler.tags.contains("$1")'
>>
}}}
Now you can use the ListTaggedTiddlers for various specific tags, using the {{{<<tiddler ...>>}}} macro:
{{{
<<tiddler ListTaggedTiddlers with: "systemConfig">>
}}}
{{{
<<tiddler ListTaggedTiddlers with: "Plugin">>
}}}
See also [[ForEachTiddlerExamples]].
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|© 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description
Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.
''Syntax:''
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].
!Revision history
* v1.0.8 (2007-04-12)
** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features:
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen)
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features:
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs:
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features:
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version
!Code
***/
//{{{
//============================================================================
//============================================================================
// ForEachTiddlerPlugin
//============================================================================
//============================================================================
// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {
if (!window.abego) window.abego = {};
version.extensions.ForEachTiddlerPlugin = {
major: 1, minor: 0, revision: 8,
date: new Date(2007,3,12),
source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"
};
// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
TiddlyWiki.prototype.forEachTiddler = function(callback) {
for(var t in this.tiddlers) {
callback.call(this,t,this.tiddlers[t]);
}
};
}
//============================================================================
// forEachTiddler Macro
//============================================================================
version.extensions.forEachTiddler = {
major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};
// ---------------------------------------------------------------------------
// Configurations and constants
// ---------------------------------------------------------------------------
config.macros.forEachTiddler = {
// Standard Properties
label: "forEachTiddler",
prompt: "Perform actions on a (sorted) selection of tiddlers",
// actions
actions: {
addToList: {},
write: {}
}
};
// ---------------------------------------------------------------------------
// The forEachTiddler Macro Handler
// ---------------------------------------------------------------------------
config.macros.forEachTiddler.getContainingTiddler = function(e) {
while(e && !hasClass(e,"tiddler"))
e = e.parentNode;
var title = e ? e.getAttribute("tiddler") : null;
return title ? store.getTiddler(title) : null;
};
config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);
if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// Parse the "in" clause
var tiddlyWikiPath = undefined;
if ((i < params.length) && params[i] == "in") {
i++;
if (i >= params.length) {
this.handleError(place, "TiddlyWiki path expected behind 'in'.");
return;
}
tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the where clause
var whereClause ="true";
if ((i < params.length) && params[i] == "where") {
i++;
whereClause = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the sort stuff
var sortClause = null;
var sortAscending = true;
if ((i < params.length) && params[i] == "sortBy") {
i++;
if (i >= params.length) {
this.handleError(place, "sortClause missing behind 'sortBy'.");
return;
}
sortClause = this.paramEncode(params[i]);
i++;
if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
sortAscending = params[i] == "ascending";
i++;
}
}
// Parse the script
var scriptText = null;
if ((i < params.length) && params[i] == "script") {
i++;
scriptText = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the action.
// When we are already at the end use the default action
var actionName = "addToList";
if (i < params.length) {
if (!config.macros.forEachTiddler.actions[params[i]]) {
this.handleError(place, "Unknown action '"+params[i]+"'.");
return;
} else {
actionName = params[i];
i++;
}
}
// Get the action parameter
// (the parsing is done inside the individual action implementation.)
var actionParameter = params.slice(i);
// --- Processing ------------------------------------------
try {
this.performMacro({
place: place,
inTiddler: tiddler,
whereClause: whereClause,
sortClause: sortClause,
sortAscending: sortAscending,
actionName: actionName,
actionParameter: actionParameter,
scriptText: scriptText,
tiddlyWikiPath: tiddlyWikiPath});
} catch (e) {
this.handleError(place, e);
}
};
// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {
var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);
var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
context["tiddlyWiki"] = tiddlyWiki;
// Get the tiddlers, as defined by the whereClause
var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
context["tiddlers"] = tiddlers;
// Sort the tiddlers, when sorting is required.
if (parameter.sortClause) {
this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
}
return {tiddlers: tiddlers, context: context};
};
// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
return this.getTiddlersAndContext(parameter).tiddlers;
};
// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
// The following properties are supported:
//
// place
// whereClause
// sortClause
// sortAscending
// actionName
// actionParameter
// scriptText
// tiddlyWikiPath
//
// All properties are optional.
// For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
var tiddlersAndContext = this.getTiddlersAndContext(parameter);
// Perform the action
var actionName = parameter.actionName ? parameter.actionName : "addToList";
var action = config.macros.forEachTiddler.actions[actionName];
if (!action) {
this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
return;
}
var actionHandler = action.handler;
actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};
// ---------------------------------------------------------------------------
// The actions
// ---------------------------------------------------------------------------
// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
return;
}
// Perform the action.
var list = document.createElement("ul");
place.appendChild(list);
for (var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var listItem = document.createElement("li");
list.appendChild(listItem);
createTiddlyLink(listItem, tiddler.title, true);
}
};
abego.parseNamedParameter = function(name, parameter, i) {
var beginExpression = null;
if ((i < parameter.length) && parameter[i] == name) {
i++;
if (i >= parameter.length) {
throw "Missing text behind '%0'".format([name]);
}
return config.macros.forEachTiddler.paramEncode(parameter[i]);
}
return null;
}
// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
if (p >= parameter.length) {
this.handleError(place, "Missing expression behind 'write'.");
return;
}
var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
// Parse the "begin" option
var beginExpression = abego.parseNamedParameter("begin", parameter, p);
if (beginExpression !== null)
p += 2;
var endExpression = abego.parseNamedParameter("end", parameter, p);
if (endExpression !== null)
p += 2;
var noneExpression = abego.parseNamedParameter("none", parameter, p);
if (noneExpression !== null)
p += 2;
// Parse the "toFile" option
var filename = null;
var lineSeparator = undefined;
if ((p < parameter.length) && parameter[p] == "toFile") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
return;
}
filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
p++;
if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
return;
}
lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
}
}
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
return;
}
// Perform the action.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
var count = tiddlers.length;
var text = "";
if (count > 0 && beginExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
for (var i = 0; i < count; i++) {
var tiddler = tiddlers[i];
text += func(tiddler, context, count, i);
}
if (count > 0 && endExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);
if (count == 0 && noneExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
if (filename) {
if (lineSeparator !== undefined) {
lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
text = text.replace(/\n/mg,lineSeparator);
}
saveFile(filename, convertUnicodeToUTF8(text));
} else {
var wrapper = createTiddlyElement(place, "span");
wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
}
};
// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------
// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
return {
place : placeParam,
whereClause : whereClauseParam,
sortClause : sortClauseParam,
sortAscending : sortAscendingParam,
script : scriptText,
actionName : actionNameParam,
actionParameter : actionParameterParam,
tiddlyWikiPath : tiddlyWikiPathParam,
inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
};
};
// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
if (!idPrefix) {
idPrefix = "store";
}
var lenPrefix = idPrefix.length;
// Read the content of the given file
var content = loadFile(this.getLocalPath(path));
if(content === null) {
throw "TiddlyWiki '"+path+"' not found.";
}
var tiddlyWiki = new TiddlyWiki();
// Starting with TW 2.2 there is a helper function to import the tiddlers
if (tiddlyWiki.importTiddlyWiki) {
if (!tiddlyWiki.importTiddlyWiki(content))
throw "File '"+path+"' is not a TiddlyWiki.";
tiddlyWiki.dirty = false;
return tiddlyWiki;
}
// The legacy code, for TW < 2.2
// Locate the storeArea div's
var posOpeningDiv = content.indexOf(startSaveArea);
var posClosingDiv = content.lastIndexOf(endSaveArea);
if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
throw "File '"+path+"' is not a TiddlyWiki.";
}
var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
// Create a "div" element that contains the storage text
var myStorageDiv = document.createElement("div");
myStorageDiv.innerHTML = storageText;
myStorageDiv.normalize();
// Create all tiddlers in a new TiddlyWiki
// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
var store = myStorageDiv.childNodes;
for(var t = 0; t < store.length; t++) {
var e = store[t];
var title = null;
if(e.getAttribute)
title = e.getAttribute("tiddler");
if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
title = e.id.substr(lenPrefix);
if(title && title !== "") {
var tiddler = tiddlyWiki.createTiddler(title);
tiddler.loadFromDiv(e,title);
}
}
tiddlyWiki.dirty = false;
return tiddlyWiki;
};
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
//
// (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
var script = context["script"];
var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
var fullText = (script ? script+";" : "")+functionText+";theFunction;";
return eval(fullText);
};
// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
var result = [];
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
tiddlyWiki.forEachTiddler(function(title,tiddler) {
if (func(tiddler, context, undefined, undefined)) {
result.push(tiddler);
}
});
return result;
};
// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
var message = "Extra parameter behind '"+actionName+"':";
for (var i = firstUnusedIndex; i < parameter.length; i++) {
message += " "+parameter[i];
}
this.handleError(place, message);
};
// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? -1
: +1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? +1
: -1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
// To avoid evaluating the sortClause whenever two items are compared
// we pre-calculate the sortValue for every item in the array and store it in a
// temporary property ("forEachTiddlerSortValue") of the tiddlers.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
var count = tiddlers.length;
var i;
for (i = 0; i < count; i++) {
var tiddler = tiddlers[i];
tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
}
// Do the sorting
tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);
// Delete the temporary property that holds the sortValue.
for (i = 0; i < tiddlers.length; i++) {
delete tiddlers[i].forEachTiddlerSortValue;
}
};
// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
displayMessage(message);
};
// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
var message ="<<"+macroName;
for (var i = 0; i < params.length; i++) {
message += " "+params[i];
}
message += ">>";
displayMessage(message);
};
// Internal.
//
// Creates an element that holds an error message
//
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
var message = (exception.description) ? exception.description : exception.toString();
return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};
// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
if (place) {
this.createErrorElement(place, exception);
} else {
throw exception;
}
};
// Internal.
//
// Encodes the given string.
//
// Replaces
// "$))" to ">>"
// "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
var reGTGT = new RegExp("\\$\\)\\)","mg");
var reGT = new RegExp("\\$\\)","mg");
return s.replace(reGTGT, ">>").replace(reGT, ">");
};
// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
//
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
// Remove any location part of the URL
var hashPos = originalPath.indexOf("#");
if(hashPos != -1)
originalPath = originalPath.substr(0,hashPos);
// Convert to a native file format assuming
// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
var localPath;
if(originalPath.charAt(9) == ":") // pc local file
localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(7));
else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(5));
else // pc network file
localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");
return localPath;
};
// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
"forEachTiddler");
//============================================================================
// End of forEachTiddler Macro
//============================================================================
//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
var n = prefix.length;
return (this.length >= n) && (this.slice(0, n) == prefix);
};
//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
var n = suffix.length;
return (this.length >= n) && (this.right(n) == suffix);
};
//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
return this.indexOf(substring) >= 0;
};
//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
for (var i = 0; i < this.length; i++) {
if (this[i] == item) {
return i;
}
}
return -1;
};
//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false.
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
return (this.indexOf(item) >= 0);
};
//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
for(var i = 0; i < items.length; i++) {
if (this.contains(items[i])) {
return true;
}
}
return false;
};
//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
//
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null]
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
for(var i = 0; i < items.length; i++) {
if (!this.contains(items[i])) {
return false;
}
}
return true;
};
} // of "install only once"
// Used Globals (for JSLint) ==============
// ... DOM
/*global document */
// ... TiddlyWiki Core
/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink,
displayMessage, endSaveArea, hasClass, loadFile, saveFile,
startSaveArea, store, wikify */
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
|!Example|!Comment|
|[[SimpleForm|SimpleForm (Card 1)]]|Three forms, using a simple template with "username" and "password" fields|
|[[BiggerForm|BiggerForm (Card 1)]]|Three forms, using a template with all supported Form input elements|
|[[Bugreports]]|Use forms and filtered lists to maintain bug reports|
|[[Contacts|JoeBlock]]|Manage your contacts in forms|
The [[FormTiddlerPlugin]] allows you to enter your data in a form and store the form's data in your tiddlers.
(For more information on tiddler data see the [[DataTiddlerPlugin]].)
//''Define ~FormTemplate''//
When you want to enter data in a form you first have to define a [[FormTemplate]] tiddler. A FormTemplate tiddler is a tiddler that contains named HTML INPUT elements (such as textfields, password fields, lists etc.) that define the stuff that should be edited in the form. E.g. you may have a FormTemplate that looks like this:
<html>
<b>Name:</b><br/>
<input name=userName type=text /><br/>
<b>Password:</b><br/>
<input name=pwd type=password /><br/>
</html>
The correspond HTML text looks like this
{{{
<html>
<b>Name:</b><br/>
<input name=userName type=text /><br/>
<b>Password:</b><br/>
<input name=pwd type=password /><br/>
</html>
}}}
The name of the INPUT element is also the name of the data field it is editing. E.g. a text field defined like this:
{{{
<input name=userName type=text />
}}}
will edit the data field "userName" of the tiddler.
You are free to layout the INPUT elements as you like, but don't add a "form" element around them and don't define 'onchange' handlers, since this will be done automatically by the {{{<<formTiddler ...>>}}} macro.
//''Use ~FormTemplates (through the {{{<<formTiddler ...>>}}} macro)''//
In a second step you add the {{{<<formTiddler ...>>}}} macro to tiddlers that should be edited. In the macro you are referencing the [[FormTemplate]] that should be used to edit the tiddler's data. You may refer to the same FormTemplate tiddler in as many tiddlers as you like. Every such tiddler displays the same INPUT elements as the FormTemplate, but with the "data" of each individual tiddler.
In addition you may more than one {{{<<formTiddler...>>}}} macro call in one tiddler. Just make sure that the names of the elements in the referenced FormTemplate tiddlers do not collide. This feature may be useful if you want to construct a larger input form from a set of smaller FormTemplates.
You can easily create tiddlers with an embedded {{{<<formTiddler...>>}}} macro call using the [[<<newTiddlerWithForm...>>|NewTiddlerWithFormMacro]] macro. The macro shows a button similar to the "new tiddler" button and creates the requested tiddler, ready to enter data. For details see NewTiddlerWithFormMacro.
//''"Structured" and "Free" Data''//
Typically you will edit a tiddler that uses the {{{<<formTiddler...>>}}} macro through the form. But you are free to also edit the tiddler "as usual", through the build-in edit feature. I.e. you may mix "structured data" (as entered through the form) with "free data". I.e. on a "Contact" tiddler you may add an image to the tiddler, or add extra links to related persons. Or you add more tags. Just make sure that you don't modify the {{{<data>...</data>}}} section of the tiddler, since this contains the data maintained by the form.
Also notice that since the data entered in the forms is stored in the tiddler's text (in the {{{<data>...</data>}}} section) using the "search" feature will also find the texts you entered in the forms (even though it will not hilite the texts in the fields).
//''Applications''//
Using the [[FormTiddlerPlugin]] it is easy to manage things like:
* [[Contacts]]
* [[Bugreports]]
* ~ToDo Lists
* and many more.
Since a FormTemplate is typically used for many tiddlers of the same kind you may also consider using the ForEachTiddlerMacro to collect data across multiple tiddlers (e.g. to get a list of all contacts, a summary page for the bug reports etc.)
(See also [[FormTiddler Examples]])
//''HTML Elements''//
For those not that familiar with the HTML INPUT elements here a short overview with HTML snippets.
|!Type|!HTML Example|!Comment|
|button|{{{<input name=btn type=button value="Just a button" />}}}|no data|
|checkbox|{{{<input name=isVIP type=checkbox />is VIP}}}||
|file|{{{<input name=attachment type=file />}}}|The "file" input element typically does not restore the path of the previously selected file. Nevertheless the path of the file is stored in the tiddler.|
|hidden|{{{<input name=hiddenValue type=hidden value="This is a hidden value" />}}}||
|password|{{{<input name=pwd type=password />}}}|The data entered in a "password" field is stored as clear text in the tiddler.|
|radio|{{{<input name=level type=radio value="Beginner" />Beginner<input name=level type=radio value="Expert" />Expert<input name=level type=radio value="Guru" />Guru}}}||
|reset|{{{<input name=btnReset type=reset />}}}|no data|
|select-one|{{{<select name=browser ><option>Firefox<option>Internet Explorer<option>Opera<option>Other</select >}}}||
|select-multiple|{{{<select name=music MULTIPLE ><option> R&B <option> Jazz <option> Blues <option> New Age</select >}}}||
|submit|{{{<input name=btnSubmit type=submit />}}}|no data|
|text|{{{<input name=userName type=text/>}}}||
|textarea|{{{<TEXTAREA name=notes rows=4 cols=80 ></TEXTAREA>}}}||
For details consult the Web or a textbook on HTML editing.
The {{{<<formTiddler ...>>}}} macro defined by the FormTiddlerPlugin.
When a tiddler T1 references the (FormTemplate) tiddler T2 in the FormTiddlerMacro, the data of T1 can be edited through the INPUT elements defined by T2.
/***
<<checkForDataTiddlerPlugin>>
|''Name:''|FormTiddlerPlugin|
|''Version:''|1.0.6 (2007-06-24)|
|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|
|''Requires:''|DataTiddlerPlugin|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Use form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).
''Syntax:''
|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|
|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|
|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|
|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|
|//buttonLabel//|The label of the button|
|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|
|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
For details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].
!Revision history
* v1.0.6 (2007-06-24)
** Fixed problem when using SELECT component in Internet Explorer (thanks to MaikBoenig for reporting)
* v1.0.5 (2006-02-24)
** Removed "debugger;" instruction
* v1.0.4 (2006-02-07)
** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)
* v1.0.3 (2006-02-05)
** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)
* v1.0.2 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.1 (2005-12-22)
** Features:
*** Support InternetExplorer
*** Added newTiddlerWithForm Macro
* v1.0.0 (2005-12-14)
** initial version
!Code
***/
//{{{
//============================================================================
//============================================================================
// FormTiddlerPlugin
//============================================================================
//============================================================================
if (!window.abego) window.abego = {};
abego.getOptionsValue = function(element,i) {
var v = element.options[i].value;
if (!v && element.options[i].text)
v = element.options[i].text;
return v;
};
version.extensions.FormTiddlerPlugin = {
major: 1, minor: 0, revision: 5,
date: new Date(2006, 2, 24),
type: 'plugin',
source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"
};
// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window;
if (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; }
//============================================================================
// formTiddler Macro
//============================================================================
// -------------------------------------------------------------------------------
// Configurations and constants
// -------------------------------------------------------------------------------
config.macros.formTiddler = {
// Standard Properties
label: "formTiddler",
version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},
prompt: "Edit tiddler data using forms",
// Define the "setters" that set the values of INPUT elements of a given type
// (must match the corresponding "getter")
setter: {
button: function(e, value) {/*contains no data */ },
checkbox: function(e, value) {e.checked = value;},
file: function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},
hidden: function(e, value) {e.value = value;},
password: function(e, value) {e.value = value;},
radio: function(e, value) {e.checked = (e.value == value);},
reset: function(e, value) {/*contains no data */ },
"select-one": function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},
"select-multiple": function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},
submit: function(e, value) {/*contains no data */},
text: function(e, value) {e.value = value;},
textarea: function(e, value) {e.value = value;}
},
// Define the "getters" that return the value of INPUT elements of a given type
// Return undefined to not store any data.
getter: {
button: function(e, value) {return undefined;},
checkbox: function(e, value) {return e.checked;},
file: function(e, value) {return e.value;},
hidden: function(e, value) {return e.value;},
password: function(e, value) {return e.value;},
radio: function(e, value) {return e.checked ? e.value : undefined;},
reset: function(e, value) {return undefined;},
"select-one": function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},
"select-multiple": function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},
submit: function(e, value) {return undefined;},
text: function(e, value) {return e.value;},
textarea: function(e, value) {return e.value;}
}
};
// -------------------------------------------------------------------------------
// The formTiddler Macro Handler
// -------------------------------------------------------------------------------
config.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {
return;
}
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// get the name of the form template tiddler
var formTemplateName = undefined;
if (i < params.length) {
formTemplateName = params[i];
i++;
}
if (!formTemplateName) {
config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
return;
}
// --- Processing ------------------------------------------
// Get the form template text.
// (This contains the INPUT elements for the form.)
var formTemplateTiddler = store.getTiddler(formTemplateName);
if (!formTemplateTiddler) {
config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");
return;
}
var templateText = formTemplateTiddler.text;
if(!templateText) {
// Shortcut: when template text is empty we do nothing.
return;
}
// Get the name of the tiddler containing this "formTiddler" macro
// (i.e. the tiddler, that will be edited and that contains the data)
var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);
// Append a "form" element.
var formName = "form"+formTemplateName+"__"+tiddlerName;
var e = document.createElement("form");
e.setAttribute("name", formName);
place.appendChild(e);
// "Embed" the elements defined by the templateText (i.e. the INPUT elements)
// into the "form" element we just created
wikify(templateText, e);
// Initialize the INPUT elements.
config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));
}
// -------------------------------------------------------------------------------
// Form Data Access
// -------------------------------------------------------------------------------
// Internal.
//
// Initialize the INPUT elements of the form with the values of their "matching"
// data fields in the tiddler. Also setup the onChange handler to ensure that
// changes in the INPUT elements are stored in the tiddler's data.
//
config.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {
// config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");
// find the form
var form = config.macros.formTiddler.findForm(formName);
if (!form) {
return;
}
try {
var elems = form.elements;
for (var i = 0; i < elems.length; i++) {
var c = elems[i];
var setter = config.macros.formTiddler.setter[c.type];
if (setter) {
var value = data[c.name];
if (value != null) {
setter(c, value);
}
c.onchange = onFormTiddlerChange;
} else {
config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");
}
}
} catch(e) {
config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);
}
}
// Internal.
//
// @return [may be null]
//
config.macros.formTiddler.findForm = function(formName) {
// We must manually iterate through the document's forms, since
// IE does not support the "document[formName]" approach
var forms = window.document.forms;
for (var i = 0; i < forms.length; i++) {
var form = forms[i];
if (form.name == formName) {
return form;
}
}
return null;
}
// Internal.
//
config.macros.formTiddler.setSelectOneValue = function(element,value) {
var n = element.options.length;
for (var i = 0; i < n; i++) {
element.options[i].selected = abego.getOptionsValue(element,i) == value;
}
}
// Internal.
//
config.macros.formTiddler.setSelectMultipleValue = function(element,value) {
var values = {};
for (var i = 0; i < value.length; i++) {
values[value[i]] = true;
}
var n = element.length;
for (var i = 0; i < n; i++) {
element.options[i].selected = !(!values[abego.getOptionsValue(element,i)]);
}
}
// Internal.
//
config.macros.formTiddler.getSelectOneValue = function(element) {
var i = element.selectedIndex;
return (i >= 0) ? abego.getOptionsValue(element,i) : null;
}
// Internal.
//
config.macros.formTiddler.getSelectMultipleValue = function(element) {
var values = [];
var n = element.length;
for (var i = 0; i < n; i++) {
if (element.options[i].selected) {
values.push(abego.getOptionsValue(element,i));
}
}
return values;
}
// -------------------------------------------------------------------------------
// Helpers
// -------------------------------------------------------------------------------
// Internal.
//
config.macros.formTiddler.checkForExtensions = function(place,macroName) {
if (!version.extensions.DataTiddlerPlugin) {
config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");
return false;
}
return true;
}
// Internal.
//
// Displays a trace message in the "TiddlyWiki" message pane.
// (used for debugging)
//
config.macros.formTiddler.trace = function(s) {
displayMessage("Trace: "+s);
}
// Internal.
//
// Display some error message in the "TiddlyWiki" message pane.
//
config.macros.formTiddler.displayFormTiddlerError = function(s) {
alert("FormTiddlerPlugin Error: "+s);
}
// Internal.
//
// Creates an element that holds an error message
//
config.macros.formTiddler.createErrorElement = function(place, message) {
return createTiddlyElement(place,"span",null,"formTiddlerError",message);
}
// Internal.
//
// Returns the name of the tiddler containing the given element.
//
config.macros.formTiddler.getContainingTiddlerName = function(element) {
return story.findContainingTiddler(element).id.substr(7);
}
// -------------------------------------------------------------------------------
// Event Handlers
// -------------------------------------------------------------------------------
// This function must be called by the INPUT elements whenever their
// data changes. Typically this is done through an "onChange" handler.
//
function onFormTiddlerChange (e) {
// config.macros.formTiddler.trace("onFormTiddlerChange "+e);
if (!e) var e = window.event;
var target = resolveTarget(e);
var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);
var getter = config.macros.formTiddler.getter[target.type];
if (getter) {
var value = getter(target);
DataTiddler.setData(tiddlerName, target.name, value);
} else {
config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");
}
}
// ensure that the function can be used in HTML event handler
window.onFormTiddlerChange = onFormTiddlerChange;
// -------------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// -------------------------------------------------------------------------------
setStylesheet(
".formTiddlerError{color: #ffffff;background-color: #880000;}",
"formTiddler");
//============================================================================
// checkForDataTiddlerPlugin Macro
//============================================================================
config.macros.checkForDataTiddlerPlugin = {
// Standard Properties
label: "checkForDataTiddlerPlugin",
version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},
prompt: "Check if the DataTiddlerPlugin exists"
}
config.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {
config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);
}
//============================================================================
// newTiddlerWithForm Macro
//============================================================================
config.macros.newTiddlerWithForm = {
// Standard Properties
label: "newTiddlerWithForm",
version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},
prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"
}
config.macros.newTiddlerWithForm.handler = function(place,macroName,params) {
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// get the name of the form template tiddler
var formTemplateName = undefined;
if (i < params.length) {
formTemplateName = params[i];
i++;
}
if (!formTemplateName) {
config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
return;
}
// get the button label
var buttonLabel = undefined;
if (i < params.length) {
buttonLabel = params[i];
i++;
}
if (!buttonLabel) {
config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");
return;
}
// get the (optional) tiddlerName script and "askUser"
var tiddlerNameScript = undefined;
var askUser = false;
if (i < params.length) {
tiddlerNameScript = params[i];
i++;
if (i < params.length && params[i] == "askUser") {
askUser = true;
i++;
}
}
// --- Processing ------------------------------------------
if(!readOnly) {
var onClick = function() {
var tiddlerName;
if (tiddlerNameScript) {
try {
tiddlerName = eval(tiddlerNameScript);
} catch (ex) {
}
}
if (!tiddlerName || askUser) {
tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");
}
while (tiddlerName && store.getTiddler(tiddlerName)) {
tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\n\n"+"Please specify a tiddler name.", tiddlerName);
}
// tiddlerName is either null (user canceled) or a name that is not yet in the store.
if (tiddlerName) {
var body = "<<formTiddler [["+formTemplateName+"]]>>";
var tags = [];
store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);
story.displayTiddler(null,tiddlerName,1);
}
}
createTiddlyButton(place,buttonLabel,buttonLabel,onClick);
}
}
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","category":"Forms and databases","description":"Use form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).","twversion":"1.2.38+, 2.0"}</data>
[[TiddlyWiki Markup|http://tiddlywiki.org/wiki/TiddlyWiki_Markup]]
This is the markup cheat sheet in tiddler format, so it can be copied and pasted into any TiddlyWiki.
!Inline Formatting /% DEBUG: buggy (-> monospaced) %/
|!Option|!Syntax|!Output|
|bold font|{{{''bold''}}}|''bold''|
|italic type|{{{//italic//}}}|//italic//|
|underlined text|{{{__underlined__}}}|__underlined__|
|strikethrough text|{{{--strikethrough--}}}|--strikethrough--|
|superscript text|{{{^^super^^script}}}|^^super^^script|
|subscript text|{{{~~sub~~script}}}|~~sub~~script|
|highlighted text|{{{@@highlighted@@}}}|@@highlighted@@|
|preformatted text|{{{{{{preformatted}}}}}}|{{{preformatted}}}|
!Block Elements
!!Headings
{{{
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
}}}
<<<
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
<<<
!!Lists
{{{
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3
# ordered list, level 1
## ordered list, level 2
### unordered list, level 3
; definition list, term
: definition list, description
}}}
<<<
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3
# ordered list, level 1
## ordered list, level 2
### unordered list, level 3
; definition list, term
: definition list, description
<<<
!!Blockquotes /% DEBUG: hack %/
{{{
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3
<<<
blockquote
<<<
}}}
<<<
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3
> blockquote
<<<
!!Preformatted Text /% DEBUG: hack %/
{{{
{{{
preformatted (e.g. code)
}}}
}}}
<<<
{{{
preformatted (e.g. code)
}}}
<<<
!!Tables
{{{
|CssClass|k
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |
|caption|c
}}}
''Annotation:''
* The {{{>}}} marker creates a "colspan", causing the current cell to merge with the one to the right.
* The {{{~}}} marker creates a "rowspan", causing the current cell to merge with the one above.
<<<
|CssClass|k
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |
|caption|c
<<<
!!Images /% DEBUG: to do %/
cf. [[TiddlyWiki.com|http://www.tiddlywiki.com/#EmbeddedImages]]
!Hyperlinks
* [[WikiWords|WikiWord]] are automatically transformed to hyperlinks to the respective tiddler
** the automatic transformation can be suppressed by preceding the respective WikiWord with a tilde ({{{~}}}): {{{~WikiWord}}}
* [[PrettyLinks]] are enclosed in square brackets and contain the desired tiddler name: {{{[[tiddler name]]}}}
** optionally, a custom title or description can be added, separated by a pipe character ({{{|}}}): {{{[[title|target]]}}}<br>'''N.B.:''' In this case, the target can also be any website (i.e. URL).
!Custom Styling
* {{{@@CssProperty:value;CssProperty:value;…@@}}}<br>''N.B.:'' CSS color definitions should use lowercase letters to prevent the inadvertent creation of WikiWords.
* {{{{{customCssClass{…}}}}}} /% DEBUG: buggy %/
* raw HTML can be inserted by enclosing the respective code in HTML tags: {{{<html> … </html>}}}
!Special Markers
* {{{<br>}}} forces a manual line break
* {{{----}}} creates a horizontal ruler
* [[HTML entities|http://www.tiddlywiki.com/#HtmlEntities]]
* {{{<<macroName>>}}} calls the respective [[macro|Macros]]
* To hide text within a tiddler so that it is not displayed, it can be wrapped in {{{/%}}} and {{{%/}}}.<br/>This can be a useful trick for hiding drafts or annotating complex markup.
* To prevent wiki markup from taking effect for a particular section, that section can be enclosed in three double quotes: e.g. {{{"""WikiWord"""}}}.
Retrieved from "http://tiddlywiki.org/wiki/TiddlyWiki_Markup/Tiddler"
FireFox extension to store bookmarks remotely to allow sharing between computers.
http://www.foxmarks.com/
username: weenie510
password: stored in KeePass
<html>If your PC's been humming along under your desk for more than a year or two, I've got news for you: chances are inside that case, half a dozen dust bunnies are dancing around your hard drive, leeching onto your CPU fan and fluttering about your motherboard having a grand old time.
</html>
Source: [[Geek to Live: Evacuate PC dust bunnies|http://lifehacker.com/software/geek-to-live/geek-to-live-evacuate-pc-dust-bunnies-153409.php]]
<html><div style="border: 1px solid rgb(204, 204, 204); margin: 7px 0pt 0pt 3px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; width: 100px; height: 15px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="margin-bottom: 0px; display: block; background-color: rgb(153, 153, 0); width: 84px; height: 15px;">
<span style="display: none;"></span>
</span>
</div>
<a href="http://www.justsayhi.com/bb/geek" class="geekquiz">84% Geek</a></html>
Source: [[comics|http://web.ncf.ca/xx087/comix/]]
<html><div class="recipe-head"><div class="recipe-meta"><h3>Glazed Carrots with Orange and Ginger</h3>
<p class="recipe-yield"><i>Yield</i> 4 servings</p>
<p class="recipe-time"><i>Time</i> 30 minutes</p>
<p class="recipe-author">Mark Bittman</p>
</div>
</div>
<span class="caption">Evan Sung for The New York Times</span>
<div class="recipe-summary"><h5>Summary</h5><p class="summary">Start with a little fat and a little liquid, along with whatever seasonings you choose; the carrots simmer, covered, until they are nearly done. Then the cover is removed and the liquid that remains combines with the fat to form a shiny sauce as the carrots become tender. Orange juice is an especially nice liquid to begin with, because the reducing process concentrates both its sweetness and its acidity. (A little lemon juice at the end adds the perfect balance.) If your liquid of choice is something more savory -- balsamic vinegar or soy sauce, for example -- the carrots' intrinsic sweetness provides a counterpoint.</p></div><div class="recipe-ingredients"><h5>Ingredients</h5><ul><li class="odd">1 pound carrots, trimmed and peeled if necessary, cut into coins or sticks</li><li class="even">2 tablespoons butter or extra virgin olive oil</li><li class="odd">Salt and freshly ground black pepper</li><li class="even">1 tablespoon minced or grated peeled fresh ginger</li><li class="odd">1/3 cup freshly squeezed orange juice</li><li class="even">1 teaspoon freshly squeezed lemon juice</li><li class="odd">Chopped fresh parsley, dill, mint, basil or chervil leaves for garnish (optional)</li></ul></div><div class="recipe-process"><h5>Method</h5><ul><li>1. Combine all ingredients except lemon juice and garnish in a saucepan no more than 6 inches across. Bring to a boil, then cover and adjust heat so mixture simmers.</li>
<li>2. Cook, more or less undisturbed, until carrots are tender and liquid is almost gone, 10 to 20 minutes. Uncover and boil off remaining liquid, then add lemon juice. Taste and adjust seasoning if necessary. Serve hot or within an hour or two, garnished with herbs, if you like. </li></ul></div></html>
Source: [[Recipe of the Day: Glazed Carrots With Orange and Ginger - Bitten Blog - NYTimes.com|http://bitten.blogs.nytimes.com/2008/03/03/recipe-of-the-day-glazed-carrots-with-orange-and-ginger/]]
Here's a typical GroceryList.
Play with this wiki formatting in the SandBox.
My WishList
CheckItOut
my [[family]]
I'm 84% geek: GeekQuiz
<html><h3 class="post-title entry-title"><a href="http://savoryseasonings.blogspot.com/2008/10/cheddar-goldfish-crackers.html">Cheddar Goldfish Crackers</a>
</h3>
<div class="post-header-line-1"></div>
<div class="post-body entry-content">
<p>1 cup all-purpose flour<br>3/4 tsp. salt<br>1/2 tsp. white ground pepper (optional) <br>4 TBSP cold unsalted butter, cut into small pieces<br>8 ounces grated cheddar cheese<br>3-4 TBSP water<br><br>Pulse the flour, salt and pepper, then add butter and pulse until the mixture resembles coarse meal. Add grated cheese a little at a time until the mixture again resembles coarse meal. <br><br>Pulse in 3 to 4 tablespoons of water, one tablespoon at a time, and only enough so that the dough forms a ball and rides the blade. <br><br>Remove, wrap in plastic, and chill for 20 minutes or up to 24 hours. <br><br>Roll the dough out to 1/8th-inch thickness directly onto a baking sheet. <br>Using a knife or pizza cutter, cut 1 inch squares, then bake at 350° F for 15-20 minutes or until crackers are golden brown. If the outer edges your pan are done but the crackers in the center still need a few more minutes- remove crackers on the edges and bake the center crackers for a few more minutes. <br><br>Remove from oven and recut any squares that may be stuck together. Store in an airtight container for up to one week or freeze</p></div></html>
Source: [[Savory Seasonings: Breads: Crackers|http://savoryseasonings.blogspot.com/search/label/Breads%3A%20Crackers]]
<html><h2 class="entry-title"><a class="entry-title-link" target="_blank" href="http://feeds.gawker.com/%7Er/lifehacker/full/%7E3/iM2LNIgKtFM/the-per+diem-system-is-a-seriously-easy-budget-to-follow">The Per-Diem System Is a Seriously Easy Budget to Follow [Budgeting]<div class="entry-title-go-to"></div></a></h2><div class="entry-author"><span class="entry-source-title-parent">from <a href="/reader/view/feed/http%3A%2F%2Flifehacker.com%2Findex.xml" class="entry-source-title" target="_blank">Lifehacker</a></span> by <span class="entry-author-name">Adam Pash</span></div><div class="entry-annotations"></div><div class="entry-body"><div><div class="item-body"><div><p><img src="http://cache.gawker.com/assets/images/lifehacker/2009/04/quarters.png" vspace="2" width="287" align="left" height="181" hspace="4">If you've ever taken a work-related trip, chances are you're familiar with the concept of the per diem (Latin for "per day")—a daily cash stipend intended to cover your expenses.</p> <p><i>Photo by <a target="_blank" href="http://www.flickr.com/photos/chrisdlugosz/3406071170/">chrisdlugosz</a></i>.</p> <p>Weblog Get Rich Slowly details how to apply this concept to your monthly budget, creating a per-diem budget for all your spending cash.<br> </p><blockquote>As a guy who just finished paying off $14,000 in credit card debt, I wanted to share one tip that helped me get over the bad debt hump. I allocate my spending money on a <i>per diem</i> system. At the beginning of each cycle of my monthly budget, I set aside funds for: <ul> <li>Every fixed expense that I have (rent, cable/internet, groceries, power)</li> <li>Any unique expenses (a plane ticket, for example)</li> <li>And, of course, my savings (about 8 percent of my after-tax, after-401k income)</li></ul><br> After allocating this money, I go to the bank, withdraw the remaining funds in cash, and divide it among envelopes for each day of the month. Each day, I open an envelope and add the day's cash to my wallet. For me, the physical parceling of the cash is an important psychological step.</blockquote> <p>Granted, using this method does mean a lot more cash transactions, which can be difficult to track and don't have any benefits (of the credit card rewards ilk), but since most of the spending you need to track will have been paid before you set aside your per diem cash, it's not a bad method—especially for folks who have a hard time sticking to a budget when there's no physical limit.</p> <p>In college, I went on a similar (but decidedly more insane) budget in which $1 per day was all I allowed myself. Extreme, yes, but I saved some serious cash over that summer. With a more reasonable approach, I can imagine a per-diem budget could be very effective.</p></div></div></div></div></html>
Source: [[Google Reader (21)|http://www.google.ca/reader/view/#stream/user%2F17524043921841641396%2Flabel%2Flifehacker]]
<html><h3 class="post-title entry-title"><a href="http://savoryseasonings.blogspot.com/2008/08/graham-crackers.html">Graham Crackers</a>
</h3>
<div class="post-header-line-1"></div>
<div class="post-body entry-content">
<p>1/2 cup all purpose flour<br>1/2 cup whole wheat flour<br>1/2 cup oat flour (process ½ cup of rolled oats in food processor until powdery)<br>1/3 cup plus 1 TBSP sugar<br>1/2 tsp. baking soda<br>Pinch of salt<br><br>1/3 cup butter or oil<br>1-3 TBSP milk or water<br>1 TBSP honey<br><br>Mix dry ingredients in a large bowl. Heat oil, honey and water until melted. Pour honey mixture into dry ingredients and mix until dough can be formed into a ball (dough will be closer to the consistency of very dry cookie dough). Chill for at least 30 minutes. Roll out dough onto an ungreased cookie sheet 1/4” thick or less. Bake at 350 F for 7-10 minutes. Prick with a fork as it comes out of the oven and quickly cut into rectangles with a pizza cutte</p></div></html>
Source: [[Savory Seasonings: Breads: Crackers|http://savoryseasonings.blogspot.com/search/label/Breads%3A%20Crackers]]
A typical list:
----
! [[Loblaws|http://www.superstore.ca/ontario/default.aspx]]
* Goat Milk (3.25% for Joshua)
* Organic Milk (2% for Jacq)
* Organic Eggs
* Fruit/Veg
** Organic bananas
** cheap apples
** romaine
** mushrooms
! Herb & Spice
* Organic yogurt ([[Pinehedge Farms|http://www.pinehedge.com/]], 1kg)
<html>The Most Powerful Food Combinations</html>
Source: [[Healthy Food Combinations: Men's Health.com|http://www.menshealth.com/mhlists/healthy-food-combinations/]]
<<top>>
<<toggleSideBar>><<renameButton '>' >>
<<jump J '' top>>
<<newTiddler>><<renameButton N>>
/% <<saveChanges>><<renameButton 'Save TiddlyWiki'>>%/
/***
|Name|HoverMenuPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#HoverMenuPlugin|
|Version|1.11|
|Requires|~TW2.x|
!Description:
Provides a hovering menu on the edge of the screen for commonly used commands, that scrolls with the page.
!Demo:
Observe the hovering menu on the right edge of the screen.
!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
To customize your HoverMenu, edit the HoverMenu shadow tiddler.
To customize whether the menu sticks to the right or left edge of the screen, and its start position, edit the HoverMenu configuration settings part of the code below. It's well documented, so don't be scared!
The menu has an id of hoverMenu, in case you want to style the buttons in it using css.
!Notes:
Since the default HoverMenu contains buttons for toggling the side bar and jumping to the top of the screen and to open tiddlers, the ToggleSideBarMacro, JumpMacro and the JumpToTopMacro are included in this tiddler, so you dont need to install them separately. Having them installed separately as well could lead to complications.
If you dont intend to use these three macros at all, feel free to remove those sections of code in this tiddler.
!To Do:
* rework code to allow multiple hovering menus in different positions, horizontal etc.
* incorporate code for keyboard shortcuts that correspond to the buttons in the hovermenu
!History:
*03-08-06, ver 1.1.2: compatibility fix with SelectThemePlugin
*03-08-06, ver 1.11: fixed error with button tooltips
*27-07-06, ver 1.1 : added JumpMacro to hoverMenu
*23-07-06
!Code
***/
/***
start HoverMenu plugin code
***/
//{{{
config.hoverMenu={};
//}}}
/***
HoverMenu configuration settings
***/
//{{{
config.hoverMenu.settings={
align: 'right', //align menu to right or left side of screen, possible values are 'right' and 'left'
x: 1, // horizontal distance of menu from side of screen, increase to your liking.
y: 300 //vertical distance of menu from top of screen at start, increase or decrease to your liking, original value=158
};
//}}}
//{{{
//continue HoverMenu plugin code
config.hoverMenu.handler=function()
{
if (!document.getElementById("hoverMenu"))
{
var theMenu = createTiddlyElement(document.getElementById("contentWrapper"), "div","hoverMenu");
theMenu.setAttribute("refresh","content");
theMenu.setAttribute("tiddler","HoverMenu");
var menuContent = store.getTiddlerText("HoverMenu");
wikify(menuContent,theMenu);
}
var Xloc = this.settings.x;
Yloc =this.settings.y;
var ns = (navigator.appName.indexOf("Netscape") != -1);
function SetMenu(id)
{
var GetElements=document.getElementById?document.getElementById(id):document.all?document.all[id]:document.layers[id];
if(document.layers)GetElements.style=GetElements;
GetElements.sP=function(x,y){this.style[config.hoverMenu.settings.align]=x +"px";this.style.top=y +"px";};
GetElements.x = Xloc;
GetElements.y = findScrollY();
GetElements.y += Yloc;
return GetElements;
}
window.LoCate_XY=function()
{
var pY = findScrollY();
ftlObj.y += (pY + Yloc - ftlObj.y)/15;
ftlObj.sP(ftlObj.x, ftlObj.y);
setTimeout("LoCate_XY()", 10);
}
ftlObj = SetMenu("hoverMenu");
LoCate_XY();
};
window.old_lewcid_hovermenu_restart = restart;
restart = function()
{
window.old_lewcid_hovermenu_restart();
config.hoverMenu.handler();
};
setStylesheet(
"#hoverMenu .imgLink, #hoverMenu .imgLink:hover {border:none; padding:0px; float:right; margin-bottom:2px; margin-top:0px;}\n"+
"#hoverMenu .button, #hoverMenu .tiddlyLink {border:none; font-weight:bold; background:#18f; color:#FFF; padding:0 5px; float:right; margin-bottom:4px;}\n"+
"#hoverMenu .button:hover, #hoverMenu .tiddlyLink:hover {font-weight:bold; border:none; color:#fff; background:#000; padding:0 5px; float:right; margin-bottom:4px;}\n"+
"#hoverMenu .button {width:100%; text-align:center}"+
"#hoverMenu { position:absolute; width:7px;}\n"+
"\n","hoverMenuStyles");
config.macros.renameButton={};
config.macros.renameButton.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
if (place.lastChild.tagName!="BR")
{
place.lastChild.firstChild.data = params[0];
if (params[1]) {place.lastChild.title = params[1];}
}
};
config.shadowTiddlers["HoverMenu"]="<<top>>\n<<toggleSideBar>><<renameButton '>' >>\n<<jump j '' top>>\n<<saveChanges>><<renameButton s 'Save TiddlyWiki'>>\n<<newTiddler>><<renameButton n>>\n";
//}}}
//end HoverMenu plugin code
//Start ToggleSideBarMacro code
//{{{
config.macros.toggleSideBar={};
config.macros.toggleSideBar.settings={
styleHide : "#sidebar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 1em;}\n"+"",
styleShow : " ",
arrow1: "«",
arrow2: "»"
};
config.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
var tooltip= params[1]||'toggle sidebar';
var mode = (params[2] && params[2]=="hide")? "hide":"show";
var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
var label= (params[0]&¶ms[0]!='.')?params[0]+" "+arrow:arrow;
var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");
if (mode == "hide")
{
(document.getElementById("sidebar")).setAttribute("toggle","hide");
setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");
}
};
config.macros.toggleSideBar.onToggleSideBar = function(){
var sidebar = document.getElementById("sidebar");
var settings = config.macros.toggleSideBar.settings;
if (sidebar.getAttribute("toggle")=='hide')
{
setStylesheet(settings.styleShow,"ToggleSideBarStyles");
sidebar.setAttribute("toggle","show");
this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
}
else
{
setStylesheet(settings.styleHide,"ToggleSideBarStyles");
sidebar.setAttribute("toggle","hide");
this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
}
return false;
}
setStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleSideBarButtonStyles");
//}}}
//end ToggleSideBarMacro code
//start JumpToTopMacro code
//{{{
config.macros.top={};
config.macros.top.handler=function(place,macroName)
{
createTiddlyButton(place,"^","jump to top",this.onclick);
}
config.macros.top.onclick=function()
{
window.scrollTo(0,0);
};
config.commands.top =
{
text:" ^ ",
tooltip:"jump to top"
};
config.commands.top.handler = function(event,src,title)
{
window.scrollTo(0,0);
}
//}}}
//end JumpToStartMacro code
//start JumpMacro code
//{{{
config.macros.jump= {};
config.macros.jump.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
var label = (params[0] && params[0]!=".")? params[0]: 'jump';
var tooltip = (params[1] && params[1]!=".")? params[1]: 'jump to an open tiddler';
var top = (params[2] && params[2]=='top') ? true: false;
var btn =createTiddlyButton(place,label,tooltip,this.onclick);
if (top==true)
btn.setAttribute("top","true")
}
config.macros.jump.onclick = function(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
var top = theTarget.getAttribute("top");
var popup = Popup.create(this);
if(popup)
{
if(top=="true")
{createTiddlyButton(createTiddlyElement(popup,"li"),'Top ↑','Top of TW',config.macros.jump.top);
createTiddlyElement(popup,"hr");}
story.forEachTiddler(function(title,element) {
createTiddlyLink(createTiddlyElement(popup,"li"),title,true);
});
}
Popup.show(popup,false);
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
config.macros.jump.top = function()
{
window.scrollTo(0,0);
}
//}}}
//end JumpMacro code
//utility functions
//{{{
Popup.show = function(unused,slowly)
{
var curr = Popup.stack[Popup.stack.length-1];
var rootLeft = findPosX(curr.root);
var rootTop = findPosY(curr.root);
var rootHeight = curr.root.offsetHeight;
var popupLeft = rootLeft;
var popupTop = rootTop + rootHeight;
var popupWidth = curr.popup.offsetWidth;
var winWidth = findWindowWidth();
if (isChild(curr.root,'hoverMenu'))
var x = config.hoverMenu.settings.x;
else
var x = 0;
if(popupLeft + popupWidth+x > winWidth)
popupLeft = winWidth - popupWidth -x;
if (isChild(curr.root,'hoverMenu'))
{curr.popup.style.right = x + "px";}
else
curr.popup.style.left = popupLeft + "px";
curr.popup.style.top = popupTop + "px";
curr.popup.style.display = "block";
addClass(curr.root,"highlight");
if(config.options.chkAnimate)
anim.startAnimating(new Scroller(curr.popup,slowly));
else
window.scrollTo(0,ensureVisible(curr.popup));
}
window.isChild = function(e,parentId) {
while (e != null) {
var parent = document.getElementById(parentId);
if (parent == e) return true;
e = e.parentNode;
}
return false;
};
//}}}
<html>Blanching is an easy technique that many cooks use to keep vegetables crisp and tender. By boiling vegetables briefly, chilling them in ice water, then reheating them slowly, blanching preserves texture, color and flavor.</html>
Source: [[How to Blanch Vegetables : eHow.com|http://www.ehow.com/how_13887_blanch-vegetables.html]]
@@font-size:larger;font-weight:bold; See also [[Blanch Vegetables Before Freezing]]@@
<html><div class="intro FLC"><h1 id="nointelliTXT" class="Heading1a">How to Cook Ribs in a Slow Cooker</h1>
<ol id="intelliTxt">
<pre>
Things You'll Need:
* 2.5 lb. slab of baby back ribs
* Dry meat rub
* 4 or 5 qt. slow cooker
* Barbecue sauce
* Broiler
* Cutting board
* Sharp knife
</pre>
<li id="jsArticleStep1">
<div class="stepBg">Step <span>1</span></div>
<p>Coat the surface area of the ribs with a dry meat rub of your choice. Ensure that all of the meat is covered, and then roll the ribs up and put them into the slow cooker.</p>
</li>
<li id="jsArticleStep2">
<div class="stepBg">Step <span>2</span></div>
<p>Put the lid on the slow cooker, and set the heat to low. Allow the ribs to cook, undisturbed, for 9 to 10 hours.</p>
</li>
<li id="jsArticleStep3">
<div class="stepBg">Step <span>3</span></div>
<p>Remove the ribs from the slow cooker. Lift them out slowly and gently, as the meat should be falling off the bone.</p>
</li>
<li id="jsArticleStep4">
<div class="stepBg">Step <span>4</span></div>
<p>Brush the meaty side of the ribs with a <a class="StrongLink" href="http://www.ehow.com/barbecue/">barbecue</a> sauce of your choice. Choose a flavor that complements the flavor of the meat rub for best results.</p>
</li>
<li id="jsArticleStep5">
<div class="stepBg">Step <span>5</span></div>
<p>Lay the ribs across a broiler rack, meat side up. Set the broiler to high, and allow the ribs to cook for 7 to 8 minutes. If a broiler is not available, the ribs can be seared, meat side up, on a gas grill set to high heat for 7 to 8 minutes.</p>
</li>
<li id="jsArticleStep6">
<div class="stepBg">Step <span>6</span></div>
<p>Remove the ribs from the broiler or grill, and place them on a cutting board. Carve the ribs with a sharp knife, and serve immediately.</p>
</li>
</ol>
</div>
<div class="resources tips">
<div class="sectionTitle Heading3a">Tips & Warnings</div>
<ul>
<li class="FLC"><div class="IconIdea1"></div><div class="text">To add a smoky flavor to the ribs, purchase liquid smoke, which can be found at grocery stores. Simply brush the liquid smoke onto the ribs before applying the dry rub.</div></li>
<li class="FLC"><div class="IconFlag1"></div><div class="text">Watch the ribs vigilantly while broiling or searing. If they are left on too long, the barbecue sauce will burn.</div></li></ul></div></html>
Source: [[How to Cook Ribs in a Slow Cooker : eHow.com|http://www.ehow.com/how_5061448_cook-ribs-slow-cooker.html]]
<html><div class="sectionTitle FLC"><div class="Heading3a">Instructions</div>
</div>
<!-- google_ad_section_start() -->
<div class="thingsYouNeed">
<h4 class="Heading4a">Things You'll Need:</h4>
<ul class="BulletList">
<li>
<span>1/4 c. cider or white wine vinegar</span>
</li>
<li>
<span>1/3 c. molasses</span>
</li>
<li>
<span>1 c. tomato ketchup</span>
</li>
<li>
<span>1 tbsp. mustard</span>
</li>
<li>
<span>1 tsp. each garlic powder, onion powder, chili powder and black pepper</span>
</li>
<li>
<span>liquid smoke (optional)</span>
</li>
<li>
<a href="http://www.ehow.com/shop_groceries.html">Groceries</a>
</li>
<li>
<span>Saucepans</span>
</li>
<li>
<span>Saucepans</span>
</li>
</ul>
</div>
<ol id="intelliTxt">
<li id="jsArticleStep1">
<div class="stepBg">Step <span>1</span></div>
<p>Heat the vinegar and molasses together in a small non-reactive saucepan until the molasses is dissolved.</p>
</li>
<li id="jsArticleStep2">
<div class="stepBg">Step <span>2</span></div>
<p>Remove from the heat and stir in remaining ingredients.</p>
</li>
<li id="jsArticleStep3">
<div class="stepBg">Step <span>3</span></div>
<p>Experiment with this sauce. Try these variations:</p>
</li>
<li id="jsArticleStep4">
<div class="stepBg">Step <span>4</span></div>
<p>Make a zestier sauce: Begin recipe by sautéing 1 c. minced onions and a few garlic cloves until soft. Proceed with recipe.</p>
</li>
<li id="jsArticleStep5">
<div class="stepBg">Step <span>5</span></div>
<p>Make a sweeter sauce: Add honey or brown sugar. Or soak raisins in rum and puree into the sauce.</p>
</li>
<li id="jsArticleStep6">
<div class="stepBg">Step <span>6</span></div>
<p>Make an herbed sauce: Add dry or fresh herbs to taste - especially dry rubbed sage or fresh, minced <a class="StrongLink" href="http://www.ehow.com/rosemary/">rosemary</a>.</p>
</li>
<li id="jsArticleStep7">
<div class="stepBg">Step <span>7</span></div>
<p>Make a whiskey sauce (bourbon works best because of its high sugar content): Begin recipe by simmering 1/2 c. bourbon for 1 minute, and use half the vinegar called for in the master recipe.</p></li></ol></html>
Source: [[How to Make Basic Barbecue Sauce : eHow.com|http://www.ehow.com/how_17358_make-basic-barbecue.html]]
* 1 cup of pumpkin seeds
* 1 tbsp oil
* salt to taste
# preheat oven to 300 F
# carefully wash pumpkin/squash seeds to remove fiber. pat dry with towerl
# mix seeds, oil, salt
# spread on baking sheet
# bake for 45-55 min until golden brown
<html><div id="title"><h1>Hummus</h1>
<div id="articlebody">
<!--gc-->
Hummus is one of the more popular Middle Eastern dips. Served with fresh or toasted <a href="/od/breadsrice/r/pitabreadrecipe.htm">pita bread</a>, hummus makes for a great snack or appetizer. <a href="/od/dipsandsauces/r/tahinirecipe.htm">Tahini</a> is an important part of the hummus recipe and cannot be substituted. However, it can be omitted.
<h3>Prep Time: 10 minutes</h3><h3>Ingredients:</h3><ul><li>1 16 oz can of chickpeas or garbanzo beans</li><li>1/4 cup liquid from can of chickpeas</li><li>3-5 tablespoons lemon juice (depending on taste)</li><li>1 1/2 tablespoons tahini</li><li>2 cloves garlic, crushed</li><li>1/2 teaspoon salt</li><li>2 tablespoons olive oil</li></ul><h3>Preparation:</h3>
Drain chickpeas and set aside liquid from can. Combine remaining ingredients in blender or food processor. Add 1/4 cup of liquid from chickpeas. Blend for 3-5 minutes on low until thoroughly mixed and smooth. <br><br>Place in serving bowl, and create a shallow well in the center of the hummus.<br><br>Add a small amount (1-2 tablespoons) of olive oil in the well. Garnish with parsley (optional).<br><br>Serve immediately with fresh, warm or toasted pita bread, or cover and refrigerate. <h3>Variations</h3>For a spicier hummus, add a sliced red chile or a dash of cayenne pepper. <h3>Storing Hummus</h3>Hummus can be refrigerated for up to 3 days and can be kept in the freezer for up to one month. Add a little olive oil if it appears to be too dry.
</div></div></div></html>
Source: [[Hummus Recipe - How to Make Hummus|http://mideastfood.about.com/od/appetizerssnacks/r/hummusbitahini.htm]]
<html><div id="title"><h1>Hummus without Tahini</h1>
<div id="articlebody">
<!--gc--> This hummus recipe is perfect for those who like hummus, but not with <a href="/od/dipsandsauces/r/tahinirecipe.htm">tahini</a>. Many children don't like tahini, so this is a great recipe to make for them.
<h3>Prep Time: 10 minutes</h3><h3>Ingredients:</h3><ul><li>1 can garbanzo beans/chickepeas</li><li>1/4 cup olive oil</li><li>1 tablespoon lemon juice</li><li>1 teaspoon cumin</li></ul><h3>Preparation:</h3>
In a food processor, blend all ingredients together until smooth and creamy. <br><br>Serve immediately with <a href="/od/breadsrice/r/pitabreadrecipe.htm">pita bread</a>, pita chips, or veggies. <br><br>Store in a airtight container for up to three days.
</div></div></div></html>
Source: [[Hummus without Tahini Recipe - Hummus Recipe- How to Make Hummus without Tahini|http://mideastfood.about.com/od/dipsandsauces/r/hummustahini.htm]]
Here are some examples that show the usage of the inClause in the ForEachTiddlerMacro.
<<forEachTiddler
where
'tiddler.tags.contains("inClauseExample")'
>>
See also ForEachTiddlerExamples.
/***
|''Name:''|IntelliTaggerPlugin|
|''Version:''|1.0.2 (2007-07-25)|
|''Type:''|plugin|
|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Documentation:''|[[IntelliTaggerPlugin Documentation]]|
|''~SourceCode:''|[[IntelliTaggerPlugin SourceCode]]|
|''Licence:''|[[BSD open source license (abego Software)]]|
|''~CoreVersion:''|2.0.8|
|''Browser:''|Firefox 1.5.0.2 or better|
***/
/***
!Version History
* 1.0.2 (2007-07-25):
** Feature: "Return" key may be used to accept first tag suggestion (beside "Alt-1")
** Bugfix: Keyboard shortcuts (Alt+3 etc.) shifted
* 1.0.1 (2007-05-18): Improvement: Speedup when using TiddlyWikis with many tags
* 1.0.0 (2006-04-26): Initial release
***/
// /%
if(!version.extensions.IntelliTaggerPlugin){if(!window.abego){window.abego={};}if(!abego.internal){abego.internal={};}abego.alertAndThrow=function(s){alert(s);throw s;};if(version.major<2){abego.alertAndThrow("Use TiddlyWiki 2.0.8 or better to run the IntelliTagger Plugin.");}version.extensions.IntelliTaggerPlugin={major:1,minor:0,revision:2,date:new Date(2007,6,25),type:"plugin",source:"http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin",documentation:"[[IntelliTaggerPlugin Documentation]]",sourcecode:"[[IntelliTaggerPlugin SourceCode]]",author:"Udo Borkowski (ub [at] abego-software [dot] de)",licence:"[[BSD open source license (abego Software)]]",tiddlywiki:"Version 2.0.8 or better",browser:"Firefox 1.5.0.2 or better"};abego.createEllipsis=function(_2){var e=createTiddlyElement(_2,"span");e.innerHTML="…";};abego.isPopupOpen=function(_4){return _4&&_4.parentNode==document.body;};abego.openAsPopup=function(_5){if(_5.parentNode!=document.body){document.body.appendChild(_5);}};abego.closePopup=function(_6){if(abego.isPopupOpen(_6)){document.body.removeChild(_6);}};abego.getWindowRect=function(){return {left:findScrollX(),top:findScrollY(),height:findWindowHeight(),width:findWindowWidth()};};abego.moveElement=function(_7,_8,_9){_7.style.left=_8+"px";_7.style.top=_9+"px";};abego.centerOnWindow=function(_a){if(_a.style.position!="absolute"){throw "abego.centerOnWindow: element must have absolute position";}var _b=abego.getWindowRect();abego.moveElement(_a,_b.left+(_b.width-_a.offsetWidth)/2,_b.top+(_b.height-_a.offsetHeight)/2);};abego.isDescendantOrSelf=function(_c,e){while(e){if(_c==e){return true;}e=e.parentNode;}return false;};abego.toSet=function(_e){var _f={};for(var i=0;i<_e.length;i++){_f[_e[i]]=true;}return _f;};abego.filterStrings=function(_11,_12,_13){var _14=[];for(var i=0;i<_11.length&&(_13===undefined||_14.length<_13);i++){var s=_11[i];if(s.match(_12)){_14.push(s);}}return _14;};abego.arraysAreEqual=function(a,b){if(!a){return !b;}if(!b){return false;}var n=a.length;if(n!=b.length){return false;}for(var i=0;i<n;i++){if(a[i]!=b[i]){return false;}}return true;};abego.moveBelowAndClip=function(_1b,_1c){if(!_1c){return;}var _1d=findPosX(_1c);var _1e=findPosY(_1c);var _1f=_1c.offsetHeight;var _20=_1d;var _21=_1e+_1f;var _22=findWindowWidth();if(_22<_1b.offsetWidth){_1b.style.width=(_22-100)+"px";}var _23=_1b.offsetWidth;if(_20+_23>_22){_20=_22-_23-30;}if(_20<0){_20=0;}_1b.style.left=_20+"px";_1b.style.top=_21+"px";_1b.style.display="block";};abego.compareStrings=function(a,b){return (a==b)?0:(a<b)?-1:1;};abego.sortIgnoreCase=function(arr){var _27=[];var n=arr.length;for(var i=0;i<n;i++){var s=arr[i];_27.push([s.toString().toLowerCase(),s]);}_27.sort(function(a,b){return (a[0]==b[0])?0:(a[0]<b[0])?-1:1;});for(i=0;i<n;i++){arr[i]=_27[i][1];}};abego.getTiddlerField=function(_2d,_2e,_2f){var _30=document.getElementById(_2d.idPrefix+_2e);var e=null;if(_30!=null){var _32=_30.getElementsByTagName("*");for(var t=0;t<_32.length;t++){var c=_32[t];if(c.tagName.toLowerCase()=="input"||c.tagName.toLowerCase()=="textarea"){if(!e){e=c;}if(c.getAttribute("edit")==_2f){e=c;}}}}return e;};abego.setRange=function(_35,_36,end){if(_35.setSelectionRange){_35.setSelectionRange(_36,end);var max=0+_35.scrollHeight;var len=_35.textLength;var top=max*_36/len,bot=max*end/len;_35.scrollTop=Math.min(top,(bot+top-_35.clientHeight)/2);}else{if(_35.createTextRange!=undefined){var _3b=_35.createTextRange();_3b.collapse();_3b.moveEnd("character",end);_3b.moveStart("character",_36);_3b.select();}else{_35.select();}}};abego.internal.TagManager=function(){var _3c=null;var _3d=function(){if(_3c){return;}_3c={};store.forEachTiddler(function(_3e,_3f){for(var i=0;i<_3f.tags.length;i++){var tag=_3f.tags[i];var _42=_3c[tag];if(!_42){_42=_3c[tag]={count:0,tiddlers:{}};}_42.tiddlers[_3f.title]=true;_42.count+=1;}});};var _43=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_44,_45,_46,_47,_48,_49){var _4a=this.fetchTiddler(_44);var _4b=_4a?_4a.tags:[];var _4c=(typeof _49=="string")?_49.readBracketedList():_49;_43.apply(this,arguments);if(!abego.arraysAreEqual(_4b,_4c)){abego.internal.getTagManager().reset();}};var _4d=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_4e){var _4f=this.fetchTiddler(_4e);var _50=_4f&&_4f.tags.length>0;_4d.apply(this,arguments);if(_50){abego.internal.getTagManager().reset();}};this.reset=function(){_3c=null;};this.getTiddlersWithTag=function(tag){_3d();var _52=_3c[tag];return _52?_52.tiddlers:null;};this.getAllTags=function(_53){_3d();var _54=[];for(var i in _3c){_54.push(i);}for(i=0;_53&&i<_53.length;i++){_54.pushUnique(_53[i],true);}abego.sortIgnoreCase(_54);return _54;};this.getTagInfos=function(){_3d();var _56=[];for(var _57 in _3c){_56.push([_57,_3c[_57]]);}return _56;};var _58=function(a,b){var a1=a[1];var b1=b[1];var d=b[1].count-a[1].count;return d!=0?d:abego.compareStrings(a[0].toLowerCase(),b[0].toLowerCase());};this.getSortedTagInfos=function(){_3d();var _5e=this.getTagInfos();_5e.sort(_58);return _5e;};this.getPartnerRankedTags=function(_5f){var _60={};for(var i=0;i<_5f.length;i++){var _62=this.getTiddlersWithTag(_5f[i]);for(var _63 in _62){var _64=store.getTiddler(_63);if(!(_64 instanceof Tiddler)){continue;}for(var j=0;j<_64.tags.length;j++){var tag=_64.tags[j];var c=_60[tag];_60[tag]=c?c+1:1;}}}var _68=abego.toSet(_5f);var _69=[];for(var n in _60){if(!_68[n]){_69.push(n);}}_69.sort(function(a,b){var d=_60[b]-_60[a];return d!=0?d:abego.compareStrings(a.toLowerCase(),b.toLowerCase());});return _69;};};abego.internal.getTagManager=function(){if(!abego.internal.gTagManager){abego.internal.gTagManager=new abego.internal.TagManager();}return abego.internal.gTagManager;};(function(){var _6e=2;var _6f=1;var _70=30;var _71;var _72;var _73;var _74;var _75;var _76;if(!abego.IntelliTagger){abego.IntelliTagger={};}var _77=function(){return _72;};var _78=function(tag){return _75[tag];};var _7a=function(s){var i=s.lastIndexOf(" ");return (i>=0)?s.substr(0,i):"";};var _7d=function(_7e){var s=_7e.value;var len=s.length;return (len>0&&s[len-1]!=" ");};var _81=function(_82){var s=_82.value;var len=s.length;if(len>0&&s[len-1]!=" "){_82.value+=" ";}};var _85=function(tag,_87,_88){if(_7d(_87)){_87.value=_7a(_87.value);}story.setTiddlerTag(_88.title,tag,0);_81(_87);abego.IntelliTagger.assistTagging(_87,_88);};var _89=function(n){if(_76&&_76.length>n){return _76[n];}return (_74&&_74.length>n)?_74[n]:null;};var _8b=function(n,_8d,_8e){var _8f=_89(n);if(_8f){_85(_8f,_8d,_8e);}};var _90=function(_91){var pos=_91.value.lastIndexOf(" ");var _93=(pos>=0)?_91.value.substr(++pos,_91.value.length):_91.value;return new RegExp(_93.escapeRegExp(),"i");};var _94=function(_95,_96){var _97=0;for(var i=0;i<_95.length;i++){if(_96[_95[i]]){_97++;}}return _97;};var _99=function(_9a,_9b,_9c){var _9d=1;var c=_9a[_9b];for(var i=_9b+1;i<_9a.length;i++){if(_9a[i][1].count==c){if(_9a[i][0].match(_9c)){_9d++;}}else{break;}}return _9d;};var _a0=function(_a1,_a2){var _a3=abego.internal.getTagManager().getSortedTagInfos();var _a4=[];var _a5=0;for(var i=0;i<_a3.length;i++){var c=_a3[i][1].count;if(c!=_a5){if(_a2&&(_a4.length+_99(_a3,i,_a1)>_a2)){break;}_a5=c;}if(c==1){break;}var s=_a3[i][0];if(s.match(_a1)){_a4.push(s);}}return _a4;};var _a9=function(_aa,_ab){return abego.filterStrings(abego.internal.getTagManager().getAllTags(_ab),_aa);};var _ac=function(){if(!_71){return;}var _ad=store.getTiddlerText("IntelliTaggerMainTemplate");if(!_ad){_ad="<b>Tiddler IntelliTaggerMainTemplate not found</b>";}_71.innerHTML=_ad;applyHtmlMacros(_71,null);refreshElements(_71,null);};var _ae=function(e){if(!e){var e=window.event;}var tag=this.getAttribute("tag");if(_73){_73.call(this,tag,e);}return false;};var _b2=function(_b3){createTiddlyElement(_b3,"span",null,"tagSeparator"," | ");};var _b4=function(_b5,_b6,_b7,_b8,_b9){if(!_b6){return;}var _ba=_b8?abego.toSet(_b8):{};var n=_b6.length;var c=0;for(var i=0;i<n;i++){var tag=_b6[i];if(_ba[tag]){continue;}if(c>0){_b2(_b5);}if(_b9&&c>=_b9){abego.createEllipsis(_b5);break;}c++;var _bf="";var _c0=_b5;if(_b7<10){_c0=createTiddlyElement(_b5,"span",null,"numberedSuggestion");_b7++;var key=_b7<10?""+(_b7):"0";createTiddlyElement(_c0,"span",null,"suggestionNumber",key+") ");var _c2=_b7==1?"Return or ":"";_bf=" (Shortcut: %1Alt-%0)".format([key,_c2]);}var _c3=config.views.wikified.tag.tooltip.format([tag]);var _c4=(_78(tag)?"Remove tag '%0'%1":"Add tag '%0'%1").format([tag,_bf]);var _c5="%0; Shift-Click: %1".format([_c4,_c3]);var btn=createTiddlyButton(_c0,tag,_c5,_ae,_78(tag)?"currentTag":null);btn.setAttribute("tag",tag);}};var _c7=function(){if(_71){window.scrollTo(0,ensureVisible(_71));}if(_77()){window.scrollTo(0,ensureVisible(_77()));}};var _c8=function(e){if(!e){var e=window.event;}if(!_71){return;}var _cb=resolveTarget(e);if(_cb==_77()){return;}if(abego.isDescendantOrSelf(_71,_cb)){return;}abego.IntelliTagger.close();};addEvent(document,"click",_c8);var _cc=Story.prototype.gatherSaveFields;Story.prototype.gatherSaveFields=function(e,_ce){_cc.apply(this,arguments);var _cf=_ce.tags;if(_cf){_ce.tags=_cf.trim();}};var _d0=function(_d1){story.focusTiddler(_d1,"tags");var _d2=abego.getTiddlerField(story,_d1,"tags");if(_d2){var len=_d2.value.length;abego.setRange(_d2,len,len);window.scrollTo(0,ensureVisible(_d2));}};var _d4=config.macros.edit.handler;config.macros.edit.handler=function(_d5,_d6,_d7,_d8,_d9,_da){_d4.apply(this,arguments);var _db=_d7[0];if((_da instanceof Tiddler)&&_db=="tags"){var _dc=_d5.lastChild;_dc.onfocus=function(e){abego.IntelliTagger.assistTagging(_dc,_da);setTimeout(function(){_d0(_da.title);},100);};_dc.onkeyup=function(e){if(!e){var e=window.event;}if(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.keyCode>=48&&e.keyCode<=57)){_8b(e.keyCode==48?9:e.keyCode-49,_dc,_da);}else{if(e.ctrlKey&&e.keyCode==32){_8b(0,_dc,_da);}}if(!e.ctrlKey&&(e.keyCode==13||e.keyCode==10)){_8b(0,_dc,_da);}setTimeout(function(){abego.IntelliTagger.assistTagging(_dc,_da);},100);return false;};_81(_dc);}};var _e0=function(e){if(!e){var e=window.event;}var _e3=resolveTarget(e);var _e4=_e3.getAttribute("tiddler");if(_e4){story.displayTiddler(_e3,_e4,"IntelliTaggerEditTagsTemplate",false);_d0(_e4);}return false;};var _e5=config.macros.tags.handler;config.macros.tags.handler=function(_e6,_e7,_e8,_e9,_ea,_eb){_e5.apply(this,arguments);abego.IntelliTagger.createEditTagsButton(_eb,createTiddlyElement(_e6.lastChild,"li"));};var _ec=function(){if(_71&&_72&&!abego.isDescendantOrSelf(document,_72)){abego.IntelliTagger.close();}};setInterval(_ec,100);abego.IntelliTagger.displayTagSuggestions=function(_ed,_ee,_ef,_f0,_f1){_74=_ed;_75=abego.toSet(_ee);_76=_ef;_72=_f0;_73=_f1;if(!_71){_71=createTiddlyElement(document.body,"div",null,"intelliTaggerSuggestions");_71.style.position="absolute";}_ac();abego.openAsPopup(_71);if(_77()){var w=_77().offsetWidth;if(_71.offsetWidth<w){_71.style.width=(w-2*(_6e+_6f))+"px";}abego.moveBelowAndClip(_71,_77());}else{abego.centerOnWindow(_71);}_c7();};abego.IntelliTagger.assistTagging=function(_f3,_f4){var _f5=_90(_f3);var s=_f3.value;if(_7d(_f3)){s=_7a(s);}var _f7=s.readBracketedList();var _f8=_f7.length>0?abego.filterStrings(abego.internal.getTagManager().getPartnerRankedTags(_f7),_f5,_70):_a0(_f5,_70);abego.IntelliTagger.displayTagSuggestions(_a9(_f5,_f7),_f7,_f8,_f3,function(tag,e){if(e.shiftKey){onClickTag.call(this,e);}else{_85(tag,_f3,_f4);}});};abego.IntelliTagger.close=function(){abego.closePopup(_71);_71=null;return false;};abego.IntelliTagger.createEditTagsButton=function(_fb,_fc,_fd,_fe,_ff,id,_101){if(!_fd){_fd="[edit]";}if(!_fe){_fe="Edit the tags";}if(!_ff){_ff="editTags";}var _102=createTiddlyButton(_fc,_fd,_fe,_e0,_ff,id,_101);_102.setAttribute("tiddler",(_fb instanceof Tiddler)?_fb.title:String(_fb));return _102;};abego.IntelliTagger.getSuggestionTagsMaxCount=function(){return 100;};config.macros.intelliTagger={label:"intelliTagger",handler:function(_103,_104,_105,_106,_107,_108){var _109=_107.parseParams("list",null,true);var _10a=_109[0]["action"];for(var i=0;_10a&&i<_10a.length;i++){var _10c=_10a[i];var _10d=config.macros.intelliTagger.subhandlers[_10c];if(!_10d){abego.alertAndThrow("Unsupported action '%0'".format([_10c]));}_10d(_103,_104,_105,_106,_107,_108);}},subhandlers:{showTags:function(_10e,_10f,_110,_111,_112,_113){_b4(_10e,_74,_76?_76.length:0,_76,abego.IntelliTagger.getSuggestionTagsMaxCount());},showFavorites:function(_114,_115,_116,_117,_118,_119){_b4(_114,_76,0);},closeButton:function(_11a,_11b,_11c,_11d,_11e,_11f){var _120=createTiddlyButton(_11a,"close","Close the suggestions",abego.IntelliTagger.close);},version:function(_121){var t="IntelliTagger %0.%1.%2".format([version.extensions.IntelliTaggerPlugin.major,version.extensions.IntelliTaggerPlugin.minor,version.extensions.IntelliTaggerPlugin.revision]);var e=createTiddlyElement(_121,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">"+t+"<font>";},copyright:function(_124){var e=createTiddlyElement(_124,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">© 2006-2007 <b><font color=\"red\">abego</font></b> Software<font>";}}};})();config.shadowTiddlers["IntelliTaggerStyleSheet"]="/***\n"+"!~IntelliTagger Stylesheet\n"+"***/\n"+"/*{{{*/\n"+".intelliTaggerSuggestions {\n"+"\tposition: absolute;\n"+"\twidth: 600px;\n"+"\n"+"\tpadding: 2px;\n"+"\tlist-style: none;\n"+"\tmargin: 0;\n"+"\n"+"\tbackground: #eeeeee;\n"+"\tborder: 1px solid DarkGray;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .currentTag {\n"+"\tfont-weight: bold;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .suggestionNumber {\n"+"\tcolor: #808080;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .numberedSuggestion{\n"+"\twhite-space: nowrap;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .intelliTaggerFooter {\n"+"\tmargin-top: 4px;\n"+"\tborder-top-width: thin;\n"+"\tborder-top-style: solid;\n"+"\tborder-top-color: #999999;\n"+"}\n"+".intelliTaggerSuggestions .favorites {\n"+"\tborder-bottom-width: thin;\n"+"\tborder-bottom-style: solid;\n"+"\tborder-bottom-color: #999999;\n"+"\tpadding-bottom: 2px;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .normalTags {\n"+"\tpadding-top: 2px;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .intelliTaggerFooter .button {\n"+"\tfont-size: 10px;\n"+"\n"+"\tpadding-left: 0.3em;\n"+"\tpadding-right: 0.3em;\n"+"}\n"+"\n"+"/*}}}*/\n";config.shadowTiddlers["IntelliTaggerMainTemplate"]="<!--\n"+"{{{\n"+"-->\n"+"<div class=\"favorites\" macro=\"intelliTagger action: showFavorites\"></div>\n"+"<div class=\"normalTags\" macro=\"intelliTagger action: showTags\"></div>\n"+"<!-- The Footer (with the Navigation) ============================================ -->\n"+"<table class=\"intelliTaggerFooter\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody>\n"+" <tr>\n"+"\t<td align=\"left\">\n"+"\t\t<span macro=\"intelliTagger action: closeButton\"></span>\n"+"\t</td>\n"+"\t<td align=\"right\">\n"+"\t\t<span macro=\"intelliTagger action: version\"></span>, <span macro=\"intelliTagger action: copyright \"></span>\n"+"\t</td>\n"+" </tr>\n"+"</tbody></table>\n"+"<!--\n"+"}}}\n"+"-->\n";config.shadowTiddlers["IntelliTaggerEditTagsTemplate"]="<!--\n"+"{{{\n"+"-->\n"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\n"+"<div class='title' macro='view title'></div>\n"+"<div class='tagged' macro='tags'></div>\n"+"<div class='viewer' macro='view text wikified'></div>\n"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\n"+"<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n"+"<!--\n"+"}}}\n"+"-->\n";config.shadowTiddlers["BSD open source license (abego Software)"]="See [[Licence|http://tiddlywiki.abego-software.de/#%5B%5BBSD%20open%20source%20license%5D%5D]].";config.shadowTiddlers["IntelliTaggerPlugin Documentation"]="[[Documentation on abego Software website|http://tiddlywiki.abego-software.de/doc/IntelliTagger.pdf]].";config.shadowTiddlers["IntelliTaggerPlugin SourceCode"]="[[Plugin source code on abego Software website|http://tiddlywiki.abego-software.de/archive/IntelliTaggerPlugin/Plugin-IntelliTagger-src.1.0.2.js]]\n";(function(){var _126=restart;restart=function(){setStylesheet(store.getTiddlerText("IntelliTaggerStyleSheet"),"IntelliTaggerStyleSheet");_126.apply(this,arguments);};})();}
// %/
/***
|''Name:''|IntelliTagsEditCommandPlugin|
|''Version:''|1.0.0 (2007-10-03)|
|''Type:''|plugin|
|''Description:''|A command for your tiddler's toolbar to directly edit the tiddler's tags using the IntelliTaggerPlugin, without switching to "edit mode".|
|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTagsEditCommandPlugin|
|''Requires:''|IntelliTaggerPlugin http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)]]|
|''~CoreVersion:''|2.0.8|
|''Browser:''|Firefox 1.5.0.2 or better|
***/
/***
!Using the "IntelliTagsEditCommandPlugin"
Add the command {{{intelliTagsEdit}}} into the 'macro' attribute of the 'toolbar' {{{<div...>}}} in your ViewTemplate.
''Example:''
{{{
<div class='toolbar'
macro='toolbar -closeTiddler closeOthers +editTiddler intelliTagsEdit permalink references jump'>
</div>
}}}
This adds a "tags" button to the toolbar of the tiddlers (next to the ''edit'' button). Pressing the "tags" button will open the input field for the tiddler's tags and let you edit the tags with all the [[IntelliTaggerPlugin|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin]] features.
***/
/***
!Source Code
***/
//{{{
(function(){
if (!version.extensions.IntelliTaggerPlugin)
throw Error("IntelliTagsEditCommandPlugin requires the IntelliTaggerPlugin (http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin)");
if (config.commands.intelliTagsEdit)
return;
config.commands.intelliTagsEdit = {
text: "tags",
tooltip: "edit the tags"
};
config.commands.intelliTagsEdit.handler = function(event,src,title) {
var button = abego.IntelliTagger.createEditTagsButton(title, null, "tags", "edit the tags");
button.onclick(event);
return false;
};
})();
//}}}
Secure password database.
http://keepass.info
From: JQ Adderley <jadderley@yahoo.ca>
Subject: LabourAde refreshment
Date: Friday, 22 August, 2008, 11:01 AM
> Here's the recipe for LabourAde, an
> electrolyte-balanced solution roughly equivalent to IV
> solution. I drank it during labour and enjoyed it both hot
> and cold (I vomited from time to time so I wasn't keen
> on eating). Some hospitals don't like you to eat or
> drink anything other than water. More progressive
> nurses/hospitals realize that's just darn silly -- why
> give you an IV when you can hydrate or nourish yourself?
> You wouldn't run a marathon without any nourishment,
> would you?
>
> LabourAde
>
> 1/3 cup lemon juice
> 1/4 tsp sea salt
> 1/3 cup honey
> 1 crushed dolomite tablet (we used vitamin C)
>
> Stir ingredients into enough spring water to make 1 quart
> (approx 1 litre or 4 cups) of refreshment.
1 lb gr beef
1 tsp oil
1 19-oz can tomato sauce
1 tsp minced onion
1/4 c minced gr pepper
1 tsp sugar
1 tsp garlic salt or powder
1/2 tsp oregano
1/8 tsp pepper
^ ^ ^ A ^ ^ ^
1 pt cottage cheese
1 egg beaten
2 tsp salt
1/8 tsp pepper
1 tsp dried parsley
1/4 c parmesan
1/2 lb mozzerella, grated
lasagne noodles cooked, 10 or so, enough for 2 layers in the pan
# brown beef in oil. add ingredients (A). simmer 10 minutes.
# mix together cottage cheese, egg, s&p, parsley and parmesan
# put a bit of sauce in lasagne pan
# lay 1/2 noodles, spread 1/2 cheese, spread 1/2 sauce. repeat
# cover with grated mozz.
# cook at 350F for 45 min
last saved: <<date filedate "YYYY-0MM-0DD hh12:0mm:0ssam">>
last backup: {{{Mon Mar 22 17:40:31 2010 -- CAOTTN0L3APR0L}}}
[[this wiki online|http://web.ncf.ca/xx087/MyTiddlyWiki]]
http://www.macworld.com/article/49438/2006/02/asexcerpt.html
Romaine lettuce, washed and dried
Croutons
Parmesan Ch, grated
Bacon bits
Mix together:
* 3 garlic cloves
* 2 dashes tobasco
* drop or two worcestershire sauce
* 2 tbsp dijon mustard
* 1 egg yolk
* s & p to taste
* 1.5 tbsp vinegar
* 2 squirts lemon juice
While continually beating, *slowly* add 3/4 to 1 cup oil, adding oil until thick.
[[Bookmarks]]
[[journal]]
FoodLog
ExerciseLog
[[recipes]]
[[toDo]]
TiddlySnip
CalendarThisMonth
Maple-Glazed Butternut Squash
Recipe #129356 | 30 min | 10 min prep | add private note
(0) RATE IT NOW Print Recipe
By: Whisper
Jul 11, 2005
I love anything squash and anything maple! Put them together and you have a winning combination. In this recipe, from the Maple Syrup Cookbook by Ken Haedrich, the squash is glazed with maple syrup and subtly seasoned with the nutmeg flavor of mace. The rum adds another interesting flavor to the mix.
SERVES 4 (change servings and units)
Ingredients
1 medium butternut squash (about 1 1/2 pounds)
2/3 cup water
1/4 cup pure maple syrup
1/4 cup dark rum
1/4 teaspoon ground mace
Directions
1Peel, seed and quarter the squash.
2Cut, crosswise, into 1/2-inch slices to make about 5 1/2 cups.
3Bring the squash, water, maple syrup, rum and mace to a boil in a large saucepan over medium-high heat.
4Reduce the heat and simmer, covered, for 15 minutes, or until the squash is tender.
5While the squash is simmering, warm a serving dish in a 200 F oven or by filling it with very hot water.
6Reserving the cooking liquid, transfer the squash with a slotted spoon to the warmed serving dish.
7Increase the heat and boil the cooking liquid about 3 minutes, or until it is thickened.
8Pour the thickened liquid over the squash.
!Minimalist Fitness: How to Get In Lean Shape With Little or No Equipment
Two common barriers for people who want to exercise and get in shape are a lack of time and money needed for fitness.
Who has the time to go to the gym, or buy expensive equipment, or take long bike rides?
Well, if those are the things stopping you, you’re in luck.
It takes no equipment to get a great workout and get in shape, and with one or two pieces of simple equipment, you can turn that great workout into a fantastic one, you magnificent beast, you.
And with little or no equipment required for a fantastic workout, you can do it at home, or wherever you are. Even if you’re in [[solitary confinement|http://www.likelytool.com/Isometrics.htm]].
It’s hard not to find time for this type of workout — you can do it while watching TV, for goodness sake!
!!The Pros and Cons of Bodyweight Exercises
Using just your bodyweight, you can do a large number of challenging exercises. I designed a workout that I do when I can’t make it to the gym, for example, and I can testify that it’s incredibly challenging (more on that below).
If you add just one or two pieces of equipment: a dumbbell, a kettlebell, a jump rope, a medicine ball, or a chinup bar, for example, you can increase the challenge even more.
Now, I’m not putting down lifting weights — I truly believe in lifting heavy weights when you can, but there are tremendous benefits from bodyweight exercises as well:
# No gym fees or need to buy expensive equipment.
# You can do the workout anywhere, anytime.
# Most exercises involve many muscles working in coordination, resulting in great overall fitness and strength.
# For people who are just starting with strength training, bodyweight is often more than enough to begin with. And it gives you a good foundation of strength you can build on later.
Bodyweight exercises aren’t the only thing you should ever do, however, for several reasons:
# After awhile (a couple months perhaps), they aren’t all that challenging. You’ll need to continue to build your strength by adding weights. You can do that with some simple equipment (see below).
# If you don’t have at least one or two pieces of equipment — a chinup bar or a resistance band perhaps — some muscles don’t get worked out as much as others. That’s not a problem over the short term, but over the long term you’ll want to make sure you get a balance.
I suggest starting with bodyweight exercises, and then slowly transitioning to a combination of bodyweight and weight training to get a good balance. And even if you’re doing a complete weight training program, you can always use bodyweight exercises anytime you can’t make it to the gym.
!!My Workout — Just a Sample
What follows is a little workout I’ve been doing recently when I can’t go to the gym — it’s just a collection of exercises that use compound muscles and joints to give me a total-body workout with nothing but my bodyweight and my chinup bar.
However, this is not the only workout you can do — not by a long shot. This is a sample, but you should look at the next section for a much wider variety of challenges.
''How to do this workout'': do a bit of a warmup — jumping jacks, jump rope, or just jogging in place for a few minutes will get your heart rate going. Then do the exercises in order, for 30 seconds to two minutes (depending on what kind of shape you’re in), with as little rest in between as possible. If you’re new to exercise, feel free to rest fully between exercises, but if you’re in decent shape, doing them one after another is a great workout. Like me, you’ll probably have to stop to catch your breath a few times — it’s a tough workout!
# Pullups (palms facing away from you). ([[video|http://www.youtube.com/watch?v=RDA84beh6Os]])
# Pushups. As many as you can ([[video|http://www.youtube.com/watch?v=Km1v-jbeNsw]]).
# Jump squats. Basically you squat down until your thighs are parallel to the floor, then jump up as high as you can, and repeat. ([[video|http://www.youtube.com/watch?v=MJ6KJintn70]])
# Bicycle crunches. I don’t normally recommend crunches, but these use a good combination of core muscles. ([[video|http://www.youtube.com/watch?v=wqoD0Bdggto]])
# Jumping lunges. ([[video|http://www.youtube.com/watch?v=_zLTDUFjbXA]])
# Burpees. ([[video|http://www.youtube.com/watch?v=c_Dq_NCzj8M]])
# Hanging knee raises. Chinup bar required. ([[video|http://www.youtube.com/watch?v=kCI13rqqHj8]])
# Hindu pushups. ([[video|http://www.youtube.com/watch?v=9ZgKSSDISSo]])
# Russian twists. ([[video|http://www.youtube.com/watch?v=oCB3kxqhbuY]], but you don’t need to use the medicine ball as shown.)
# Diamond pushups. ([[video|http://www.youtube.com/watch?v=cnvVeq_r3ro]])
# Chinups (palms facing toward you). Chinup bar required. ([[video|http://www.youtube.com/watch?v=uz-SW04cMOc]])
!!Create Your Own Awesome Workout
Now that you’ve seen my sample workout, you can create your own by picking whatever exercises tickle your fancy. Just choose 5-12 exercises and do them all, either with or without resting. Once that gets easy, do a second circuit.
''A few suggestions:''
# Choose a variety of exercises that work out all the parts of your body. Don’t do all variations of pushups, for example. You should be doing some pulling exercises (like pullups), some lower-body exercises, like lunges and squats, and others that work out all of your body, like burpees.
# If you want a real challenge, mix cardio exercises (see below) with the strength exercises.
# If you have some of the equipment listed below, definitely use them. Or buy one or two pieces of equipment … but there’s no need to rush out and buy a whole bunch of things. You can get a great workout without equipment, at least for awhile.
# If you’re just starting out, take it easy and gradually build up. Don’t get discouraged, and don’t overdo it!
# As you get stronger, gradually add weights. Dumbbells, barbells, kettlebells, and medicine balls are some good ways to do that. It’ll take a couple months of bodyweight exercises, though, before you really need to move to weights.
!!Basic bodyweight exercises
There are many, many variations of bodyweight exercises, but here are some of the more common ones:
* Pushups (there are many variations — Hindu pushups ([[video|http://www.youtube.com/watch?v=9ZgKSSDISSo]]), dive bombers, diamond pushups ([[video|http://www.youtube.com/watch?v=cnvVeq_r3ro]]) and [[others|http://www.youtube.com/watch?v=rtcH9JUzurY]])
* Burpees ([[video|http://www.youtube.com/watch?v=c_Dq_NCzj8M]])
* Squats ([[video|http://www.youtube.com/watch?v=qRnGI3c5Jjs]]) (variations: jump squats ([[video|http://www.youtube.com/watch?v=MJ6KJintn70]]), Hindu squats ([[video|http://www.youtube.com/watch?v=jPSVpo4mzNI]]))
* Lunges ([[video|http://www.youtube.com/watch?v=S_hoiumFkgE]]) (variation: jumping lunges, side lunges) //([[glennj]] notes: the video indicates jumping or stepping lunges are hard on the knees and should be approached with caution by beginners)//
* Chair dips ([[video|http://www.youtube.com/watch?v=0vOy7D1P5tA]])
* Planks ([[video|http://www.youtube.com/watch?v=MHQmRINu4jU]]) (variation: side plank)
* Crunches - my favorite: bicycle crunches ([[video|http://www.youtube.com/watch?v=wqoD0Bdggto]])
* Bear crawl - crawl quickly on hands and feet ([[video|http://www.youtube.com/watch?v=m8-zBUSOjrw]])
* Lateral barrier jump - jump sideways, over an obstacle ([[video|http://www.youtube.com/watch?v=hADsX-H2O5w]])
* [[Isometrics|http://en.wikipedia.org/wiki/Isometrics]]
* [[Plyometrics|http://en.wikipedia.org/wiki/Plyometrics]]
!!Exercises requiring minimal equipment
You don’t need to buy all of this equipment, but if you have any, these are great. Or buy one or two pieces in order to add an extra challenge to your workout:
* Pullup bar: Chinups, pullups, hanging knee raises
* Resistance band
* Medicine ball
* Kettlebell ([[video|http://www.youtube.com/watch?v=Lwme8rkzetg]])
* Dumbbells
* Tractor tires — there are lots of exercises where you flip tires, jump through them, etc.
!!Cardio exercises
* Jumping jacks
* Jump rope - requires jump rope, of course, but it’s a great workout ([[video|http://www.youtube.com/watch?v=k9DPme8v6kc]])
* Side shuffles
* Touchdowns
* Run 800 meters (or a mile)
* Interval running
* Rowing (requires a rowing machine)
* Other cardio exercise machine if you have it
Source: [[Minimalist Fitness: How to Get In Lean Shape With Little or No Equipment : Zen Habits|http://zenhabits.net/2008/08/minimalist-fitness-how-to-get-in-lean-shape-with-little-or-no-equipment/]]
!ministry moment: communion ministry
I started coming to church 4 or 5 years ago before married Jacqueline.
I started coming because this is where Jacq wanted to get married but also I was looking for a community—I was coming from a solitary time after divorce
I would come up to the altar rail before I was baptized.
I couldn’t receive communion, but Fr. David could give me a blessing.
It’s a very powerful act to have someone lay hands upon you and pray
I was baptized in summer of ‘04 and I could take communion.
A few months later, David asked me if I would like to become a lay minister
On the one hand I was nervous about it:
- I didn’t really know what communion meant for me let alone others.
- honestly I felt a bit presumptuous as I was so new to the congregation
On the other hand, it was validation of me becoming a part of this fellowship and I felt eager to strengthen that bond with you.
I remember the first few times how I would flip to the page in the BAS to practice my lines beforehand
The blood of Christ (shed for you)
The blood of Christ, the cup of salvation.
I’ve come to think that communion is a very intimate moment between me and God.
The order of service leads me through the prayers that allow me
- to let go of the events of the past week
-to acknowledge my worries and failings and to be forgiven them
- and to be able to come up to the railing with an open heart to receive the gifts of the Holy Spirit
when I receive wine, I enjoy sharing a smile with the bearer .
Communion is a joyous moment for me and I like to spread that feeling around.
It’s even better when my son is up with me.
That’s my perspective.
I realize that all of you have your own thoughts and prayers when you come up for communion
My task as a chalice bearer is to be respectful of your worship.
To communicate with you, verbally or not,
whether you want to hold the cup or not
if you want to share a smile or if you’re introspective
whether you want to take wine at all,
David has described the bread and wine as the spiritual nourishment we take to strengthen ourselves for the coming week.
The eucharistic prayer talks about taking the bread and wine in remembrance of Jesus.
I’m happy and grateful to play a part in that in whatever role you want me to play.
Source: [[Writeboard: ministry moment: communion ministry|https://123.writeboard.com/72e09d639d65d6c3e]]
preheat oven to 350 F
2 squares unsweetened chocolate
1/3 c oil
3/4 c water
1 c sugar
1 egg
1 1/4 c flour
1/2 tspn salt
1/2 tspn baking sode
1 tspn almond extract -- //ed: use 3/4 or even 1/2//
175 g semi-sweet choc chips (optionally mint chips)
1/3 c slivered almonds (optional)
# In 8" square pan, heat oil and choc squares for about 4 min
# add water, sugar, egg, flour, salt, soda and extract
# beat with fork until smooth, about 2 min
# spread batter evenly, sprinkle with choc chips (and almonds)
# bake about 40 min.
''Dry Mixture:''
1-1/2 c all-purpose flour
2 tsp baking powder
1 tsp baking soda
1/4 tsp salt
1/2 tsp nutmeg
pinch ground cloves
1/2 c raisins (can subst nuts)
''Wet Mixture:''
2 eggs
1/2 c lightly packed brown sugar
1/2 c vegetable oil
1/2 c buttermilk
1 tsp vanilla extract
1/2 c mashed banana
1 c grated carrot (about 4 large carrots)
Preheat oven to 400F and prepare 12 muffin cups (grease w butter or use paper liners)
In large bowl combine dry mixture
In medium bowl, beat eggs lightly and combine w moist mixture
Add moist to dry (all at once) and stir just until moist but still lumpy.
Fill muffin cups 3/4 full
Bake 20 minutes
''Dry Mixture:''
1-1/4 c all-purpose flour
1/2 tbsp baking powder
1/4 tsp baking soda
1/2 tsp salt
1/2 tbsp cinnamon
1/8 tsp nutmeg
1/2 c raisins (can subst nuts)
''Wet Mixture:''
2 eggs
3/4 c lightly packed brown sugar
1/3 c vegetable oil
1/4 c buttermilk
1 tsp vanilla extract
1/2 c finely shredded zucchini
1/2 c finely shredded carrot
Preheat oven to 350F and prepare 12 muffin cups (grease w butter or use paper liners)
In large bowl combine dry mixture
In medium bowl, beat eggs lightly and combine w moist mixture
Add moist to dry (all at once) and stir just until moist but still lumpy.
Fill muffin cups 3/4 full
Bake 30 minutes
!!Mushroom stuffed hamburgers
Ingredients:
* 1 1/2 pounds hamburger
* 1/4 cup finely diced onion
* 1/2 teaspoon salt
* 1/8 teaspoon pepper
* 2 tablespoons butter or margarine
* 1/2 pound sliced mushrooms
* 6 slices cheddar cheese
Preparation:
Combine the hamburger, onion, salt and pepper. Mix well. Sauté mushrooms in butter until slightly browned and softened. Form meat mixture into 12 patties, about a quarter inch thick. Spoon about 1/6 of the mushrooms on to half the patties. Top with cheese and second patty. Seal around the edges, making sure that the patties are good and solid. Place on preheated grill and cook for a couple minutes (4 to 5) per side. Remove when done and serve.
Source: [[Backpack: Recipes|http://glennj.backpackit.com/pages/1519412]]
<html><hide linebreaks>
<style> .rolodex table {border: 0px solid; background-color:#eeeff;}
.rolodex tr, .rolodex td {border: 0px solid;}
</style><span class="rolodex">
<table>
<tr>
<td align="right"><b>Author:</b></td>
<td colspan="3"><input name=author style="width:100%" />
</td></tr>
<tr>
<td align="right"><b>Link:</b></td>
<td colspan="3"><input name=link style="width:100%" />
</td></tr>
<tr>
<td align="right"><b>Format:</b></td>
<td colspan="3"><input name=format style="width:100%" />
</td></tr>
<tr>
<td align="right"><b>For TW version:</b>
</td><td colspan="3"><input name=twversion type=text width:100%;" /></td></tr>
<tr><td align="right"><b>Category:</b></td>
<td colspan="3"><input name=category style="width:100%" />
</td></tr>
<tr>
<td align="right" valign="top"><b>Description:</b></td>
<td colspan="3"><textarea name=description rows="7" cols="40" style="width:100%" ></textarea></td></tr>
</table></span> </html>
Goal: be able to perform one hundred consecutive pushups
http://hundredpushups.com/
|>|!Stage|!Program|!Actual|!Date|
|>|Initial test|max|22|Thu Aug 14|
|week 1|day 1|10,10,8,6,max(7) [60 sec rests]|10,10,8,6,18|Sat Aug 16|
|~|day 2|12,12,10,10,max(10) [90 sec rests]|12,12,10,10,15|Mon Aug 18|
|~|day 3|15,13,10,10,max(15) [120 sec rests]|15,13,10,10,15|Wed Aug 20|
|week 2|day 1|12,12,9,7,max(10) [60 sec rests]|12,12,9,7,14<br>12,12,9,7,22|Fri Aug 22<br>Tue Sep 9|
|~|day 2|16,13,11,11,max(15) [90 sec rests]|16,13,11,11,15<br>16,13,11,11,20|Mon Aug 25<br>Thu Sep 11|
|~|day 3|15,15,12,12,max(15) [120 sec rests]|15,15,12,12,20 <br>15,15,12,12,30 <br>15,15,12,12,20|Wed Aug 27<br>Mon Sep 22<br>Tue Sep 23|
|>|Exhaustion test|max|27|Fri Aug 29|
|week 3|day 1|25,17,17,15,max(25) [60 sec rests]|25,17,17,10,6|Fri Sep 26|
|~|day 2|27,19,19,15,max(25) [90 sec rests]|27,19,15,17,17|Mon Sep 29|
|~|day 3|30,22,22,20,max(27) [120 sec rests]|||
|week 4|day 1|27,20,20,17,max(27) [60 sec rests]|||
|~|day 2|27,21,21,18,max(25) [90 sec rests]|||
|~|day 3|30,22,22,20,max(29) [120 sec rests]|||
|>|Exhaustion test|max|||
To replace or shore up the front and back stairs.
Dad will be bach between Aug 20 and Sep 2.
Mom and Dad will be travelling starting Sep 8
[[2008-09-02: Tuesday, September 2]]
<div class='header'>
<div class='titleLine'>
<div class='siteTitle' refresh='content' tiddler='SiteTitle'></div>
<div class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></div>
</div>
<div class='headerLine'></div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='ContentsSlider'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
Specifications for the Web Site
Here is my first pass at a spec for a web site. Please feel free to edit as you see fit.
Deliverables
* The contractor shalldeliver a web-site that is perational without link, formatting, or spelling errors
* The contractor shall provide a 90-day warrantee for the correction of any operational, link, formatting, or spelling errors
* The contractor shall not be liable for fixing any issues caused by modifications made to the deliverable by the Parish of March
* All information and pages created while the contractor is developing the site shall be delivered to the Parish of March, and shall become the property of the Parish of March on completion of the contract
* The contractor shall provide the following information as part of the deliverables:
o the storage space requirements for the raw site
o the names and versions of any authoring tools used for creating and editing the site
o the manufacturer of the tools and contact information for the manufacturer
Functional specifications
* The web site must be able to store and render the following types of information:
o raw HTML 3
o JavaScript for things like animated menus
o audio clips in avi format
o video clips in mpeg format
o graphics in JPEG or PNG format
* Authoring tools to edit the site and any e-content tools must be off-the shelf and cost no more than $100 (how much?) CDN per licence. Preferrably, open-source tools should be used.
* Authoring tools must have security features that allow one administrator and 3 designated authors to modify the contents of the site and prohibit authoring by anyone else
* (Nice to have). Authoring tools must provide a means to restrict write privileges on some pages to just the administrator and one of the authors while providing read-only access to the other 2 authors.
Content Specifications
General
* The general impression we would like to create is one of welcoming and that people are the center of our focus.
* Use of JavaScript should be kept to a minimum so that the index page and the sub-pages load quickly for users who still have a dial-up connection.
* The Metadata tag of the main page must contain the following information so that Google can register the site:
o Parish of March
o St. Mary's
o St. John's
* All pages that make up the site shall contain Metadata that identifies the creator of the page and the creation date. If the page is modified, the metadata shall provide a means to store the modification date and the name of the author who updated the page.
* All pages shall have a consistent look and feel. By this we mean that:
o if a background image or wallpaper is used, the same image or wallpaper must be used on all pages in the site
o Font sizes, colour, and style must allow a visitor to easily distinguish between various heading levels
o Font sizes, colour, and style used in headings must be consistent on all pages
Main page
The main page:
* shall contain a corporate banner at the top of the page
* shall be divided into three frames
o a navigation frame at the left side of the page
o a topic frame at the right side of the page
o a corporate logo frame at the top of the page
* The navigation frame shall contain a vertical menu with with links that will allow readers to access each of the sub-pages in the site. The links in the navigation frame shall provide access to the following items:
o Home
o Find a church (directions to churches)
o Facilities (information about halls and rentals)
o Upcoming Events (calendar of events)
o Services
o Sunday Schools
o Outreach programs
o Ministries
o Site map
o Search facility
* The topic frame shall contain the following items:
o a mission statement
o an image of the rector, and a link below the image to an audio file of the rector's message
* The corporate logo frame shall contain a logo for the Parish of March whose form is to be decided on through a competition within all three churches in the Parish.
Sub pages
* Every sub-page will have a link back to the home page
* If a sub-page contains links to child pages, the sub-page will be divided into two frames: a Navigation frame at the left side of the sub-page and a topic frame at the right side of the page. The navigation frame shall provide a menu of links to the child page and a link back to the home page
Hosting Specifications (not Web designer's responsiblity)
When the Wep page is posted to a server, it needs to be ailiased such that any one of the following common names will be translated to the web page:
Parish of March.<x>
St. Pauls Dunrobin. <x>
St. Mary's Kanata.<x>
St, Marys, Dunrobin <.x>
Stt. John's Parish of March<.x>
Source: [[ParishOfMarch: Specifications for the Web Site|http://stjohnskanata.ca/wiki/wikka.php?wakka=SpecificationsPage]]
<html>You can get a free credit report once a year, but <a href="http://www.nytimes.com/2008/08/04/business/media/04adco.html?_r=1&partner=rssuserland&oref=slogin">not at ~FreeCreditReport.com</a>. Despite its catchy jingles, the site will sign you up for a not-free monthly credit monitoring service, the New York Times reports. <a href="https://www.annualcreditreport.com/cra/index.jsp">~AnnualCreditReport.com</a> is the site you want for your actually-free report.</html>
Source: [[Personal Finance: Make Sure Your Free Credit Report Is Actually Free|http://lifehacker.com/399763/make-sure-your-free-credit-report-is-actually-free]]
<html><p>If you're looking to save money on ink but don't feel like dealing with the hassle of manually refilling your ink, Amazon's new Ink & Toner Finder tool makes it easy to quickly find a cheap off-brand printer refill made for your printer. Just give the tool your printer brand, series, and model number, and it returns all ink cartridges that will work with your printer. It's a very simple tool, but if you're never sure which off-brands support your printer, it's a quick way to get the results you're looking for and save a few bucks (choosing off-brand with my printer, for example, saves roughly $8). While you're at it, check out more <a href="http://lifehacker.com/5031086/smart-and-easy-ways-to-reduce-printing-costs">smart and easy ways to reduce printing costs</a>, like using <a href="http://lifehacker.com/349743/save-ink-paper-and-money-with-greenprint">previously mentioned GreenPrint</a> to remove unnecessary pages from your print job.</p>
<div class="related"><a href="http://www.amazon.com/b/ref=pe_17040_10191370_as_txt_1/?node=672508011">Ink & Toner Finder</a> [Amazon]</div></html>
Source: [[Printing: Amazon's Ink & Toner Finder Finds Cheap Printer Refills|http://lifehacker.com/5044401/amazons-ink--toner-finder-finds-cheap-printer-refills]]
<html>I’m not a champion Scrabble player by any means - I often resort to words like “at” and “it” just to use up a turn. But with this list, hopefully I’ll be a little more creative when using tiny little words. And if all else fails, there’s always “ZQFMGB”… a worm found in New Guinea, according to Calvin of <em>Calvin and Hobbes</em>.<br>
<br>
<strong>1. Aa. </strong> And I don’t mean the acronym for Alcoholics Anonymous, either. Aa is “basaltic lava having a rough surface.”<br>
<strong>2. Qat</strong> – a flowering plant native to East Africa and the Arabian peninsula.<br>
<strong>3. Zax</strong> – a slater or slate mason, or the tool used to cut and punch nail holes in roofing slate.<br>
<strong>4. Cwm</strong> – a valley, especially one created by glacial movement. Be warned: this one won’t get you many points, but it <em>is</em> good for using up pesky, low-score consonants taking up valuable space on your rack.<br>
<strong>5. Xu</strong> – Vietnamese money<br>
<strong>6. Qua</strong> – as or as being, or in the character of.<br>
<strong>7. Suq</strong> – a market, or part of a market, in an Arab city.<br>
<strong>8. Adz</strong> – an axe-like tool.<br>
<strong>9. Jo</strong> – sweetheart or dear<br>
<strong>10. Qadi </strong>– a judge in the Muslim community.</html>
Source: [[mental_floss Blog » Quick 10: 10 Words That Will Help You Win at Scrabble|http://www.mentalfloss.com/blogs/archives/17972]]
<html><p><b>INGREDIENTS</b>
</p><p>1 tablespoon extra-virgin olive oil<br>
1 large onion, finely chopped<br>
3 or 4 cloves garlic, finely chopped<br>
4 1-pound cans black beans, drained and rinsed<br>
Juice of 1/2 lemon<br>
1/2 teaspoon ground cumin<br>
1/2 teaspoon dried oregano<br>
2 tablespoons finely chopped parsley<br>
Freshly-ground black pepper, to taste<br>
4 cups water
</p><p>Optional toppings: Green onions, thinly sliced, soy yogurt, reduced-fat sour cream, or low-fat yogurt.
</p><p>1. Heat the oil in a large soup pot. Saute the onions over moderate heat until translucent, 3 or 4 minutes. Add the garlic and saute until the onion is lightly golden, another 3 or 4 minutes.
</p><p>2. Add the remaining ingredients, except the toppings, along with the water, and bring to a simmer.
</p><p>3. Mash some of the beans with a potato-masher, just enough to thicken the liquid base of the soup. Cover and simmer gently but steadily for 10 minutes.
</p><p>4. Serve hot topped with one or two of the optional toppings.
</p><p>Serves 6 to 8.</p></html>
Source: [[Quick Black Bean Soup Recipe : Healthy and Green Living|http://www.care2.com/greenliving/quick-black-bean-soup-recipe.html]]
Preparation
# Heat oven to 450 degrees. Put turkey on a stable cutting board breast side down and cut out backbone. Turn turkey over, and press on it to flatten. Put it, breast side up, in a roasting pan. Wings should partly cover breasts, and legs should protrude a bit.
# Tuck garlic and tarragon under the bird and in the nooks of the wings and legs. Drizzle with olive oil, and sprinkle liberally with salt and pepper.
# Roast for 20 minutes, undisturbed. Turkey should be browning. Remove from oven, baste with pan juices, and return to oven. Reduce heat to 400 degrees (if turkey browns too quickly, reduce temperature to 350 degrees).
# Begin to check turkey’s temperature about 15 minutes later (10 minutes if bird is on the small side). It is done when thigh meat registers 165 degrees on an instant-read meat thermometer. Check it in a couple of places.
# Let turkey rest for a few minutes before carving, then serve with garlic cloves and pan juices.
Source: [[How Five Minutes Can Save You Hours of Turkey-Roasting Time - Bitten Blog - NYTimes.com|http://bitten.blogs.nytimes.com/2008/11/24/how-five-minutes-can-save-you-hours-of-turkey-roasting-time/?scp=1&sq=roast%20a%20turkey&st=cse]]
<html>Recycler blightdesign demonstrates how you can turn cereal and other similar boxes into gift boxes over at DIY site Instructables. As long as you have a pair of scissors, some glue and the ability to execute some well-placed folds, the only thing standing between you and a cool little recycled gift box is that last bowl of Lucky Charms. To sharpen your gift box folding skills with regular paper, check out <a href="http://lifehacker.com/software/gift-giving/how-to-fold-a-paper-gift-box-253025.php">how to fold a paper gift box</a>.</html>
Source: [[Recycling: Recycle a Cereal Box Into a Gift Box|http://lifehacker.com/400633/recycle-a-cereal-box-into-a-gift-box]]
Whether you're polishing your resume because you've been laid off or you just like to be prepared, weblog Squawkfox suggests six words you should banish from your curriculum vitae.
The six words or phrases described in the post include:
* Responsible for
* Experienced
* Excellent written communication skills
* Team player
* Detail oriented
* Successful
According to the author, these common phrases are problematic because they gloss over what should be an opportunity to demonstrate something specific that you've done. Sure a hiring manager wants you to have experience, but she'd rather know the details. For example:
BAD
* Responsible for writing user guides on deadline.
GOOD
* Wrote six user guides for 15,000 users two weeks before deadline.
Head to the post for more details on how you can spin your resume no-no into a strong addition. If you're resume-reading employer or just an expert at constructing a great CV, let's hear your biggest resume pet peeves in the comments.
Source: [[Resume: Six Words You Should Drop from Your Resume|http://lifehacker.com/5137212/six-words-you-should-drop-from-your-resume]]
Play with formatting, etc.
----
<<gradient vert #ffffff #ffdddd #ff8888>>gradient fill>>
Here's a comment added using Camino on Mac ... updated options on Camino ... foo, here's Mac FF
<html><h2><b>Scalloped Potato Recipe:</b><br></h2>
<p align="left">6 medium potatoes, peeled and thinly sliced <br>
4 tablespoons butter<br>
3 tablespoons flour<br>
1 teaspoon salt<br>
1/4 teaspoon pepper<br>
2 1/2 cups milk<br>
1 small onion, finely chopped<br></p>
<p align="left">Preheat oven to 325ºF.
</p><p align="left">Heat 3 tablespoons of butter in a saucepan over low heat until melted. Blend in flour, salt and pepper. Cook over low heat, stirring constantly, until mixture is smooth and bubbly. Gradually stir in milk, 1/2 cup at a time. Heat to boiling. Boil and stir 1 minute.
</p><p align="left">Arrange potatoes in greased 2 quart casserole in 3 layers, topping each layer with part of the chopped onions and 1/3 of the sauce. Dot the top with the remaining 1 tablespoon of butter, broken into little pieces.
</p><p align="left">Cover and bake until potatoes are tender, about 60-70 minutes. Let stand 5 to 10 minute before serving.
</p></html>
Source: [[Best Scalloped Potatoes : Scalloped Potato Recipe : CookingNook.com|http://www.cookingnook.com/best-scalloped-potatoes.html]]
<html><p>Productivity guru and Mac lover Merlin Mann walks through his favorite Mac <a class="tagautolink autolink" title="Click here to read more posts tagged MENU BAR" href="http://lifehacker.com/tag/menu-bar/">menu bar</a> applications, highlighting his favorite time-saving apps.</p>
<p>We've actually covered most of the apps Merlin's mentioned at one time or another in the past, including:</p>
<p></p><ul><li><a href="http://cocoatech.com/">Path Finder</a>: Lifehacker readers voted Path Finder the <a href="http://lifehacker.com/399155/five-best-alternative-file-managers">best alternative Mac file manager</a>, and we chose it as <a href="http://lifehacker.com/software/lifehacker-top-10/top-10-apps-that-shouldve-been-in-leopard-267978.php">the number one app that should've been included in Leopard</a>.</li><li><a href="https://mail.google.com/mail/help/notifier/notifier_mac.html">Google Notifier</a>: Mann has ditched Mail.app for Gmail, bringing <a href="https://mail.google.com/mail/help/notifier/notifier_mac.html">Google Notifier</a> to prominence in his <a class="tagautolink autolink" title="Click here to read more posts tagged MENU BAR" href="http://lifehacker.com/tag/menu-bar/">menu bar</a>.</li><li><a href="https://www.getdropbox.com/">Dropbox</a>: The <a href="http://lifehacker.com/398696/five-best-file-syncing-tools">best file syncing tool</a> according to Lifehacker readers, Dropbox handles his file syncing needs (and kicks the crap out of iDisk).</li><li><a href="http://skitch.com/">Skitch</a>: Grab screenshots, edit and annotate photos, and instantly share them over the web. Skitch is <em>very</em> good. It's also one of <a href="http://lifehacker.com/399296/the-lifehacker-editors-favorite-software-and-hardware">Gina's favorite software apps</a>.</li><li><a href="http://www.noodlesoft.com/hazel.php">Hazel</a>: If you're not keen on cleaning and organizing your files and folders yourself, just let Hazel take care of the hassle. This app monitors folders of your choosing, then, for example, moves, deletes, or renames any file matching rules you've set up. For more, check out how you can <a href="http://lifehacker.com/software/geek-to-live/set-up-a-self+cleaning-mac-with-hazel-320951.php">set up a self-cleaning Mac with Hazel</a>. Windows users can use our very own <a href="http://lifehacker.com/341950/belvedere-automates-your-self+cleaning-pc">Belvedere</a>.</li><li><a href="http://www.objectpark.org/FuzzyClock.html">FuzzyClock</a>: For those of us who get stressed out watching every minute tick by, FuzzyClock let's you know about what time it is—for example, "quarter to five."</li><li><a href="https://www.evernote.com/">Evernote</a>: You can capture just about anything you need with Evernote, and it syncs to virtually anywhere you need it. If you're new to Evernote, take a look at how I've <a href="http://lifehacker.com/5041631/expand-your-brain-with-evernote">expanded my brain</a> with Evernote.</li></ul><br>
I've only listed my favorites from Merlin's picks, but check out the full video for more.
<div class="related">[via <a href="http://www.informationweek.com/blog/main/archives/2009/01/13_mac_producti.html">InformationWeek</a>]</div></html>
Source: [[Show And Tell: Merlin Mann Takes a Tour Through His Menu Bar|http://lifehacker.com/5138144/merlin-mann-takes-a-tour-through-his-menu-bar]]
----
Other items I noted:
* [[busySync|http://www.busymac.com/]] to sync ical with gcal
* [[Spirited Away|http://drikin.com/spiritedaway/]] for a tidy desktop
<html><h1>Contribute</h1></html><<newTiddler>><<newJournal "YYYY-0MM-0DD: DDD, MMM DD" "journal">><<saveChanges>>[[FormattingHelp]]<html><h1>Navigation</h1></html><<search>><<jump>><<permaview>><<closeAll>><html><h1>Options</h1></html><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
GlennJackman's TiddlyWiki
lots of protein and dairy!
lots of water
* bowl of cereal
* cheese/avocado and crackers
* yogurt
* smoothie (1c yogurt, 1c fruit, ice, splash of juice, wheatgerm)
* 1/4 cup nuts
* granola/protein bar
* hard boiled egg
* pita with hummus
* bagel w cream cheese
* crudite
* apple w nut butter
* FireFox
* [[Vim]]
* [[Komodo]]
* [[VLC]]
!!Work
* PuTTY & [[Pageant]]
* WinCVS
* WinMerge
* [[bwclock]]
* [[Cygwin]] & [[bash]]
* [[VirtuaWin|http://virtuawin.sourceforge.net/]] (virtual desktops, trying it out)
!!Home
* [[Alarm]]
* SSHAgent
!!NCF
* slrn
* [[mutt]]
See also [[Squash]]
<html><h1>Spaghetti Squash with Herb Butter
<span class="article_author">
by The Canadian Living Test Kitchen
</span>
</h1>
<div id="current_rating"></div>
<div id="goto_ratings" onclick="$('rate_recipe').show();$('show_ratings').hide()" style="cursor: pointer;"><a href="#comments_anchor">Rate this recipe »</a></div>
<a href="http://www.canadianliving.com/food/cooking_school/the_canadian_living_test_kitchen.php" target="_top"><img src="http://www.canadianliving.com/images/tested_till_perfect.gif" alt="Tested Till Perfect" class="tested_till_perfect"></a> <p class="recipe_intro"> Spaghetti squash, so named because its flesh comes apart in long strands when cooked, gets dressed up in an easy way for a satisfying side dish.</p>
<p class="servings">Servings: 6</p>
<h2>Ingredients:</h2>
<div id="recipe_nutrition_supplemental">
<table id="nutrition_chart">
<thead>
<tr>
<td colspan="2">Nutritional Info</td>
</tr>
</thead>
<tbody>
<tr>
<td class="nutrition_name">
<b>Per serving:</b> about</td>
<td class="nutrition_value">-</td>
</tr><tr>
</tr><tr>
<td class="nutrition_name">
protein</td>
<td class="nutrition_value">120 calories 3 g</td>
</tr><tr>
</tr><tr>
<td class="nutrition_name">
fat 12 g carbohydrate</td>
<td class="nutrition_value">8 g</td>
</tr><tr>
</tr></tbody>
</table>
</div>
<ul>
1 spaghetti squash (3 lb/1.5 kg)<br>1/4 cup (50 mL) freshly grated Parmesan cheese<br> <strong>Herb Butter:</strong><br>3 tbsp (50 mL) butter<br>1 large clove garlic, minced<br>1/4 tsp (1 mL) salt<br>2 tbsp (25 mL) chopped fresh sage, basil or parsley<br>1/4 tsp (1 mL) pepper </ul>
<h2>Preparation:</h2>
<div>
<p>Halve and seed squash. Place, cut side down, on lightly greased baking sheet; bake in 400°F (200°C) oven for about 1 hour or until flesh is easily pierced. (Alternatively, microwave, flesh side up and covered with plastic wrap, at High for 15 minutes or until easily pierced.) Using fork, gently scrape cooked strands from squash; transfer to large bowl.</p>
<p><strong>Herb Butter:</strong> Meanwhile, in small saucepan, melt butter over medium-low heat; add garlic and salt. Cook for about 5 minutes or until garlic starts to turn golden. Remove from heat; stir in sage and pepper. Pour over squash; add cheese and toss. </p></div></html>
Source: [[Canadian Living: Spaghetti Squash with Herb Butter|http://www.canadianliving.com/food/spaghetti_squash_with_herb_butter.php]]
<html><div id="title"><h1>Spinach Hummus</h1>
<div id="articlebody">
<!--gc-->
Spinach hummus is a delicious variation of Traditional Middle Eastern hummus. This recipe for spinach hummus is super easy and is sure to be a crowd pleaser!<br><ul><li><a href="/od/middleeasternfood101/a/hummus101.htm">More hummus recipes</a></li></ul>
<h3>Prep Time: 10 minutes</h3><h3>Ingredients:</h3><ul><li>1 can garbanzo beans/chickpeas (15 oz), drained</li><li>1/2 cup fresh spinach, chopped</li><li>1/4 cup tahini</li><li>2 tablespoons garlic</li><li>3 tablespoons lemon juice</li><li>2 tablespoons olive oil</li><li>1/4 teaspoon kosher salt</li></ul><h3>Preparation:</h3>
In a food processor, process beans, garlic, spinach and olive oil. Add lemon and salt and blend. If spinach hummus is too thick, add 1 tablespoon water until desired consistency. Hummus should be smooth and creamy.<br><br>Spinach hummus can be made up to two days in advance. Store in airtight container in the refrigerator. It can be served hot or cold. Serve with <a href="/od/breadsrice/r/pitabreadrecipe.htm">pita bread</a>, <a href="/od/appetizerssnacks/r/pitachips.htm">pita chips</a>, or fresh veggies.
</div></div></div></html>
Source: [[Hummus Recipes - Spinach Hummus Recipe - How to Make Spinach|http://mideastfood.about.com/od/dipsandsauces/r/spinachhummus.htm]]
<html><div id="title"><h1>Spinach and Feta Hummus</h1>
<div id="articlebody">
<!--gc--> Spinach and feta hummus is an excellent variation of traditional Middle Eastern hummus. Fresh spinach combined with rich, crumbled feta cheese make for the ultimate appetizer!
<h3>Prep Time: 10 minutes</h3><h3>Ingredients:</h3><ul><li>1 can garbanzo beans/chickpeas (15 oz), drained</li><li>1/2 cup fresh spinach</li><li>3 oz, crumbled feta cheese</li><li>1/4 cup olive oil</li><li>3 tablespoons lemon juice</li><li>2 tablespoons tahini</li><li>1/4 cups red pepper flakes</li><li>1 teaspoon roasted garlic</li></ul><h3>Preparation:</h3>
In a food processor combine, beans, <a href="/od/dipsandsauces/r/tahinirecipe.htm">tahini</a>, spinach, garlic, olive oil, and lemon juice. Blend well. Add cheese and red pepper flakes and blend to a smooth and creamy dip.<br><br>Spinach and feta hummus can be made up to two days in advance. Store in airtight container in the refrigerator. Spinach and feta hummus can be served hot or cold. Serve with <a href="/od/breadsrice/r/pitabreadrecipe.htm">pita bread</a>, pita chips, or fresh veggies.
</div></div></div></html>
Source: [[Spinach and Feta Hummus Recipe - How to Make Spinach and Feta Hummus - Hummus Recipe|http://mideastfood.about.com/od/dipsandsauces/r/spinachfetahumm.htm]]
See also [[Spaghetti Squash with Herb Butter]] and [[How to roast pumpkin seeds]]
!!Baked
any type (acorn, butternut)
# preheat oven to 400 F
# wash and dry squash
# cut squash in half.
# Scoop out seeds and stringy parts. Discard or save seeds for roasting
# Place squash cut side down on baking tray
# bake until skin is shiny and a fork can easily pierce the skin
# remove from oven, cool with skin side down
!!Grilled
ideal: butternut
# wash and dry squash
# slice into 1-1/2 to 2 inch thick discs. Discard seeds and pulp. Skin stays on
# oil slices or use bbq sauce
# place on medium hot grill
# grill each side about 4 minutes or until fork can easily pierce flesh.
# serve on fresh greens with cranberry sauce
!!Boiled
ideal: thin skinned squash (buttercup)
# wash and dry squash
# cut squash in half.
# Scoop out seeds and stringy parts. Discard or save seeds for roasting
# cut into chunkd and peel. cube
# place in pot with enough water "to be seen to the top cubes of squash"
# cover. bring to boil, simmer
# cook until tender.
# drain, mash and serve
# optional, add applesauce or maple syrup before mashing
http://stjohnskanata.ca -- http://www.magma.ca/~march
Also, StJohnsPeople
|>|!9:00 am Readers|>|!10:30 am Readers|
|Pauline & Don Cherry |836-1349|Bob Austin |592-6000|
|David Garred |599-8313|Glenn Jackman |724-2869|
|Peter Murphy |592-3613|Colin Lockie |839-5472|
|Jim Ritchie |592-5775|Marion Saunderson |592-4963|
|Marguerite Rodrigues |592-1962|Ruth White |591-7521|
|Peter Wilson |591-3278|Marianne & Bob Wilkinson |592-4834|
|>|!9:00 am Lay Assistants|>|!10:30 am Lay Assistants|
|Ron Burkill |592-2701|Barb & Rob Apro |271-9970|
|Jane Grant |592-4197|David Barron |287-5061|
|Marguerite & Les Rodrigues |592-1962|Joanne Goodings |599-8558|
|Jacqui & Harold Thompson |599-6529|Glenn Jackman |724-2869|
|||Linda Linean & Todd Sloan|591-3609|
|||Sue & Colin Lockie |839-5472|
|||Marion Saunderson |592-4963|
/***
!Zeldman
http://tiddlystyles.com/#theme:Zeldman
!Colors used by this Theme
*@@background(#f79b60):#f79b60@@
*@@background(#c51):#c51@@
*@@background(#d16400):#d16400@@
*@@background(#be540b):#be540b@@
*@@background(#b44):#b44@@
*@@background(#930):#930@@
*@@background(#922):#922@@
*@@background(#f5d7b4):#f5d7b4@@
*@@background(#cf936c):#cf936c@@
*@@background(#c5886b):#c5886b@@
*@@background(#b8764c):#b8764c@@
*@@background(#867663):#867663@@ Used for MSG Area, Tiddler Title, text, and SubTitle
*@@background(#fff):#fff@@
*@@background(#ccc):#ccc@@
*@@background(#aaa):#aaa@@
*@@background(#888):#888@@
*@@background(#666):#666@@
*@@background(#333):#333@@
*@@background(#000):#000@@
!Popup styles /% =========================================================== %/
***/
/*{{{*/
#popup {
border: 1px solid #aaa;
padding: 0;
background: #fff;
color: #f79b60;
}
#popup a{
color: #f79b60;
font-weight: normal;
}
#popup a:hover {
background: #f5d7b4;
color: #930;
}
#popup hr {border-top: solid 1px #f5d7b48;}
#popup li.disabled{color: #cf936c;}
#popup .currentlySelected,
#popup .currentlySelected:hover{
background: #f5d7b4;
}
/*}}}*/
/***
!Generic styles /% ===================================================== %/
***/
/*{{{*/
h1,h2,h3,h4,h5,h6 {
background-color: transparent;
margin: .25em 0;
}
h1 {
border-bottom: 2px dotted #ccc;
}
h2 {
border-bottom: 1px dotted #ccc;
}
a{
color: #f79b60;
color: #c51;
}
a.button:active,
a:hover{
color: #f79b60;
background: transparent;
}
a.button,
a.button:active{
border: 0;
}
/*}}}*/
/***
!Header styles /% ================================================================== %/
***/
/*{{{*/
.header{
position: static;
}
.titleLine {
height: 7.5em;
background: #c51;
border-bottom: 8px solid #b8764c;
color: #fff;
left:0;
}
.titleLine a,
.titleLine a:link,
.titleLine a:hover{
color: #fff;
}
.titleLine a:hover{
border-bottom: 2px dotted;
}
.headerLine{
padding: 0;
border-top: 5px solid #cf936c;
border-bottom: 3px solid #f5d7b4;
}
.siteTitle {
text-align: left;
font-size: 3.5em;
font-weight: bold;
padding-left: .5em;
}
.siteSubtitle {
text-align: left;
font-size: 1.5em;
font-family: georgia,times;
padding-left: 1.5em;
}
/*}}}*/
/***
!Main menu styles /% ================================================================== %/
***/
/*{{{*/
#mainMenu {
width: 12em;
margin-top: 0.5em;
left: .5em;
padding: 0;
border: 1px solid #f5d7b4;
color: #666
}
#mainMenu ul,
#mainMenu li{
list-style: none;
margin: 0;
padding: 0;
}
#mainMenu li strong a {
color: #fff;
background: #d16400;
}
#mainMenu li strong a:hover,#mainMenu li strong .button:hover{
color: #f5d7b4;
background: #930;
text-decoration: none;
}
/* The bold has to be a block to contain the links <a>
because inline elements can't contain blocks */
#mainMenu li strong,
#mainMenu li span{
display: block;
}
#mainMenu li a,
#mainMenu li a:link{
display: block;
width: 100%;
text-decoration: none;
padding-right: 5px;
margin-right: 0;
color: #f79b60;
border: 0;
}
#mainMenu li a:hover, #mainMenu li .button:hover{
background-color: #f5d7b4;
text-decoration: none;
}
#mainMenu a:link{
text-decoration: none;
color: #f79b60;
margin-right: 5px;
}
#mainMenu a:hover,#mainMenu .button:hover{
text-decoration: underline;
background: transparent;
color: #930;
}
/*}}}*/
/***
!Message area styles /% ================================================================== %/
***/
/*{{{*/
#messageArea {
background-color: #f5d7b4;
color: #867663;
padding: 0.5em;
border: 1px solid #ccc;
}
#messageArea a:link, #messageArea a:visited {
color: #c51;
}
#messageArea a:hover {
color: #f79b60;
}
#messageArea a:active {
color: #fff;
}
/*}}}*/
/***
!Sidebar styles /% ================================================================== %/
***/
/*{{{*/
#sidebar {
width: 14.5em;
border-bottom:1px solid #aaa;
border-left: 1px solid #aaa;
}
#sidebarOptions{
background-color: #fff;
}
#sidebarOptions a{
color: #f79b60;
background: transparent;
text-decoration: none;
border: 0;
}
#sidebarOptions a:hover{
color: #c51;
background: #fff;
text-decoration: underline;
}
#sidebarOptions .sliderPanel{
background: #f5d7b4;
margin: 0;
}
#sidebarOptions .sliderPanel a{
color: #922;
font-weight:normal;
}
#sidebarOptions .sliderPanel a:hover{
color: #b44;
background: transparent;
}
#sidebarTabs {
background-color: #fff;
}
#sidebarTabs a {
background: transparent;
}
#sidebarTabs .tabContents a:hover {
color: #922;
text-decoration: underline;
background-color: transparent;
}
.tab {
margin: 0px 1px;
border:1px solid #aaa;
border-bottom:none;
color: #922;
}
.tab:hover {
border-color: black;
text-decoration: none;
}
#sidebarTabs .tabSelected {
background: #f5d7b4;
padding: 2px 4px;
color: #922;
}
#sidebarTabs .tabUnselected {
background: #c51;
padding: 2px 4px 0px 4px;
color: #fff;
}
#sidebarTabs .tabContents {
background-color: #f5d7b4;
}
#sidebarTabs .tabContents a{
color: #922;
}
#sidebarTabs .tabContents a:hover{
color: #b44;
}
#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tabSelected:hover{
background: #cf936c ;
color: #000 ;
text-decoration: none;
}
#sidebarTabs .txtMoreTab .tabUnselected,
#sidebarTabs .txtMoreTab .tabUnselected:hover{
background: #f5d7b4 ;
color: #000 ;
text-decoration: none;
}
#sidebarTabs .txtMoreTab .tabContents {
color: #fff;
background: #cf936c;
border-bottom: solid #aaa 1px;
}
/*}}}*/
/***
!Tiddler display styles /% ================================================================== %/
***/
/*{{{*/
#displayArea {
margin: 0.5em 15em 0em 15em;
}
.tiddler{
padding: 0;
border: 1px solid #ccc;
padding: 5px;
margin-bottom: 0.5em;
}
.title {
font-size: 1.5em;
color: #867663;
font-weight: bold;
}
.toolbar {
font-size: .9em;
}
.toolbar a.button{
color: #f79b60;
border: 1px solid #fff;
}
.tiddler .toolbar a.button:hover,
.tiddler .toolbar a.button:active {
color: #930;
background: #f5d7b4;
border: 1px solid #f79b60;
}
.toolbar a.button:active {
color: #666;
}
.body {
border-top:1px solid #ccc;
padding-top: 0.5em;
margin-top:0.3em;
}
/*}}}*/
/***
''Viewer styles'' /% --------------------------------------------------------------------------------------------- %/
***/
/*{{{*/
.tiddler a.button {
color: #f79b60;
}
.tiddler a.button:hover {
color: #be540b;
background: transparent;
}
.subtitle,
.viewer {
color: #867663;
}
.viewer .button{
background: transparent;
color: #888;
border: 1px solid transparent;
}
.viewer a:link, .body a:visited{
color: #be540b;
}
.viewer a:hover {
background-color: transparent;
text-decoration: underline;
}
.viewer blockquote {
border-left: 1px solid #ccc;
}
.viewer table {
border: 2px solid #333;
}
.viewer td, tr {
border: 1px solid #666;
padding: 3px;
}
.viewer hr {
border-color: #666;
color: #666;
}
.viewer pre {
border: 1px solid #aaa;
background: #f5d7b4;
color: #333;
}
.viewer code {
color: #922;
}
.selected .isTag .tagging,
.selected .tagged,
.isTag .tagging,
.tagged {
float: none;
display: inline;
border: 0;
border-bottom: 1px solid #ccc;
background: transparent;
color: #f79b60;
margin: 0;
margin-bottom: 0.5em;
}
.tagged li, .tagged ul {
display: inline;
}
.tagged li:before { content: " <<"; }
.tagged li:after { content: ">> "; }
.tagged li:first-child:before { content: ""; }
.tagged li:first-child:after { content: ""; }
.tagged li:last-child:before{ content: ""; }
.tagged li:last-child:after { content: ""; }
.tiddler .tagging .listTitle,
.tiddler .tagged .listTitle{
color: #ccc;
}
.tiddler .tagging a.button,
.tiddler .tagged a.button{
margin: 0;
padding: 0;
color: #ccc;
}
.selected .tagging .listTitle,
.selected .tagged .listTitle,
.selected .tagging a.button,
.selected .tagged a.button{
color: #333;
}
/*}}}*/
/***
''Editor styles'' /% --------------------------------------------------- %/
***/
/*{{{*/
.editor input,
.editor textarea {
border: 1px solid black;
}
.editor textarea{
font-family: Verdana, Ariel, sans-serif;
}
/*}}}*/
FireFox extension to force changes to a site's stylesheet.
Styles I use:
* [[Combine Stop/Reload buttons|http://userstyles.org/styles/10]]
* [[Firefox 3 - Hide Search and Go buttons|http://userstyles.org/styles/3292]]
* [[iGoogle: Compact and Transparent Top Bar|http://userstyles.org/styles/8037]]
* [[Yellow https location bar|http://userstyles.org/styles/8248]]
<html><h1 class="title">The 20 Healthiest Foods for Under $1</h1>
<p>
By: <a href="/public/user/profile?user_id=36" class="author" title="Brie Cadman">Brie Cadman</a>
(<a href="http://www.divinecaroline.com/public/user/profile?user_id=36" class="view_profile_link">View Profile</a>)
</p>
<div class="text">
<p class="MsoNormal">Food prices are climbing, and some might be looking to fast foods and packaged foods for their cheap bites. But low cost doesn’t have to mean low quality. In fact, some of the most inexpensive things you can buy are the best things for you. At the grocery store, getting the most nutrition for the least amount of money means hanging out on the peripheries—near the fruits and veggies, the meat and dairy, and the bulk grains—while avoiding the expensive packaged interior. By doing so, not only will your kitchen be stocked with excellent foods, your wallet won’t be empty.</p>
<p class="MsoNormal"><strong style="">1. Oats</strong><br>
High in fiber and complex carbohydrates, oats have also been shown to lower cholesterol. And they sure are cheap—a dollar will buy you more than a week’s worth of hearty breakfasts. </p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Sprinkle with nuts and fruit in the morning, make <a href="../../../../article/45003/49558-simple-oatmeal-chocolate-chip-muffins" target="_blank">oatmeal cookies</a> for dessert.</p>
<p class="MsoNormal"><strong style="">2. Eggs</strong><br>
You can get about a half dozen of eggs for a dollar, making them one of the cheapest and most versatile sources of protein. They are also a good source of the antioxidants lutein and zeaxanthin, which may ward off age-related eye problems.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: <a href="../../../../article/45003/48031-huevos-rancheros--fast-fly--" target="_blank">Huevos rancheros</a> for breakfast, egg salad sandwiches for lunch, and frittatas for dinner.</p>
<p class="MsoNormal"><strong style="">3. Kale</strong><br>
This dark, leafy green is loaded with vitamin C, carotenoids, and calcium. Like most greens, it is usually a dollar a bunch.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Chop up some kale and add to your favorite stir-fry; try <a href="../../../../article/33615/40756-gr-nkohl--german-kale-" target="_blank">German-Style Kale</a> or traditional <a href="../../../../article/33615/45974-irish-colcannon" target="_blank">Irish Colcannon</a>.</p>
<p class="MsoNormal"><strong style="">4. Potatoes</strong><br>
Because we often see potatoes at their unhealthiest—as fries or chips—we don’t think of them as nutritious, but they definitely are. Eaten with the skin on, potatoes contain almost half a day’s worth of Vitamin C, and are a good source of potassium. If you opt for sweet potatoes or yams, you’ll also get a good wallop of beta carotene. Plus, they’re dirt cheap and have almost endless culinary possibilities.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: In the a.m., try <a href="../../../../article/45003/45019-easy-breakfast-potatoes" target="_blank">Easy Breakfast Potatoes</a>; for lunch, make potato salad; for dinner, have them with sour cream and chives.</p>
<p class="MsoNormal" style=""><strong style="">5. Apples</strong><br>
I’m fond of apples because they’re inexpensive, easy to find, come in portion-controlled packaging, and taste good. They are a good source of pectin—a fiber that may help reduce cholesterol—and they have the antioxidant Vitamin C, which keeps your blood vessels healthy.</p>
<p class="MsoNormal" style=""><em style="">Serving suggestions</em>: Plain; as applesauce; or in baked goods like <a href="http://divinecaroline.com/article/38/36038" target="_blank">Pumpkin-Apple Breakfast Bread</a>.</p>
<p class="MsoNormal"><strong style="">6. Nuts</strong><br>
Though nuts have a high fat content, they’re packed with the good-for-you fats—unsaturated and monounsaturated. They’re also good sources of essential fatty acids, Vitamin E, and protein. And because they’re so nutrient-dense, you only need to eat a little to get the nutritional benefits. Although some nuts, like pecans and macadamias, can be costly, peanuts, walnuts, and almonds, especially when bought in the shell, are low in cost.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Raw; roasted and salted; sprinkled in salads.</p>
<p class="MsoNormal"><strong style="">7. Bananas</strong><br>
At a local Trader Joe’s, I found bananas for about 19¢ apiece; a dollar gets you a banana a day for the workweek. High in potassium and fiber (9 grams for one), bananas are a no-brainer when it comes to eating your five a day quotient of fruits and veggies.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: In smoothies, by themselves, in cereal and yogurt.</p>
<p class="MsoNormal" style=""><strong>8. Garbanzo Beans</strong><br>
With beans, you’re getting your money’s worth and then some. Not only are they a great source of protein and fiber, but ’bonzos are also high in fiber, iron, folate, and manganese, and may help reduce cholesterol levels. And if you don’t like one type, try another—black, lima, lentils … the varieties are endless. Though they require soaking and cooking, the most inexpensive way to purchase these beans is in dried form; a precooked can will still only run you around a buck.</p>
<p class="MsoNormal" style=""><em style="">Serving suggestions</em>: In salads, curries, and <a href="http://divinecaroline.com/article/38/41449" target="_blank">Orange Hummus</a>.</p>
<p class="MsoNormal" style=""><strong>9. Broccoli</strong><br>
Broccoli contains tons of nice nutrients—calcium, vitamins A and C, potassium, folate, and fiber. As if that isn’t enough, broccoli is also packed with phytonutrients, compounds that may help prevent heart disease, diabetes, and certain cancers. Plus, it’s low in calories and cost.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Throw it in salads, stir fries, or served as an accompaniment to meat in this <a href="http://divinecaroline.com/article/33616/41600-steamed-ginger-chicken-asian-greens" target="_blank">Steamed Ginger Chicken with Asian Greens</a> recipe.</p>
<hr class="page_break">
<p><strong style="">10. Watermelon</strong><br>
Though you may not be able to buy an <em style="">entire</em> watermelon for a dollar, your per serving cost isn’t more than a few dimes. This summertime fruit is over 90 percent water, making it an easy way to hydrate, and gives a healthy does of Vitamin C, potassium, and lycopene, an antioxidant that may ward off cancer.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Freeze chunks for popsicles; eat straight from the rind; squeeze to make watermelon margaritas (may negate the hydrating effect!).</p>
<p class="MsoNormal"><strong style="">11. Wild Rice</strong><br>
It won’t cost you much more than white rice, but wild rice is much better for you. Low in fat and high in protein and fiber, this gluten-free rice is a great source of complex carbohydrates. It packs a powerful potassium punch and is loaded with B vitamins. Plus, it has a nutty, robust flavor.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Mix with nuts and veggies for a cold rice salad; blend with brown rice for a side dish.</p>
<p class="MsoNormal"><strong style="">12. Beets</strong><br>
Beets are my kind of vegetable—their natural sugars make them sweet to the palate while their rich flavor and color make them nutritious for the body. They’re powerhouses of folate, iron, and antioxidants.</p>
<p class="MsoNormal"><em>Serving suggestions:</em> Shred into salads, slice with goat cheese. If you buy your beets with the greens on, you can braise them in olive oil like you would other greens.</p>
<p class="MsoNormal"><strong style="">13. Butternut Squash</strong><br>
This beautiful gourd swings both ways: sometimes savory, sometimes sweet. However you prepare the butternut, it will not only add color and texture, but also five grams of fiber per half cup and chunks and chunks of Vitamin A and C. When in season, butternut squash and related gourds are usually less than a dollar a pound.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Try <a href="../../../../article/33613/44254-pear-recipes" target="_blank">Pear and Squash Bruschetta</a>; cook and dot with butter and salt.</p>
<p class="MsoNormal"><strong style="">14. Whole Grain Pasta</strong><br>
In the days of Atkins, pasta was wrongly convicted, for there is nothing harmful about a complex carbohydrate source that is high in protein and B vitamins. Plus, it’s one of the cheapest staples you can buy.</p>
<p class="MsoNormal"><em style="">Serving suggestions: </em>Mix clams and white wine with linguine; top orzo with tomatoes and garlic; eat cold <a href="../../../../article/33614/31149-farfalle-salad" target="_blank">Farfalle Salad</a> on a picnic.</p>
<p class="MsoNormal"><strong style="">15. Sardines<br>
</strong>As a kid, I used to hate it when my dad would order sardines on our communal pizzas, but since then I’ve acquired a taste for them. Because not everyone has, you can still get a can of sardines for relatively cheap. And the little fish come with big benefits: calcium, iron, magnesium, zinc, and B vitamins. And, because they’re low on the food chain, they don’t accumulate mercury.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Mash them with parsley, lemon juice, and olive oil for a spread; eat them plain on crackers; enjoy as a pizza topping (adults only).</p>
<p class="MsoNormal"><strong style="">16. Spinach</strong><br>
Spinach is perhaps one of the best green leafies out there—it has lots of Vitamin C, iron, and trace minerals. Plus, you can usually find it year round for less than a dollar.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Sautéed with eggs, as a salad, or a <a href="../../../../article/33616/26645-spinach-frittata" target="_blank">Spinach Frittata</a>.</p>
<p class="MsoNormal"><strong style="">17. Tofu</strong><br>
Not just for vegetarians anymore, tofu is an inexpensive protein source that can be used in both savory and sweet recipes. It’s high in B vitamins and iron, but low in fat and sodium, making it a healthful addition to many dishes. </p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Use silken varieties in <a href="../../../../article/33618/50464-et-tu--tofu-" target="_blank">Tofu Cheesecake</a>; add to smoothies for a protein boost; cube and marinate for barbecue kebobs<strong style="">. </strong></p>
<p class="MsoNormal"><strong style="">18. Lowfat Milk</strong><br>
Yes, the price of a gallon of milk is rising, but per serving, it’s still under a dollar; single serving milk products, like yogurt, are usually less than a dollar, too. Plus, you’ll get a lot of benefit for a small investment. Milk is rich in protein, vitamins A and D, potassium, and niacin, and is one of the easiest ways to get bone-strengthening calcium.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: In smoothies, hot chocolate, or coffee; milk products like low fat cottage cheese and yogurt.</p>
<p class="MsoNormal"><strong style="">19. Pumpkin Seeds</strong><br>
When it’s time to carve your pumpkin this October, don’t shovel those seeds into the trash—they’re a goldmine of magnesium, protein, and trace minerals. Plus, they come free with the purchase of a pumpkin.</p>
<p class="MsoNormal"><em style="">Serving suggestions</em>: Salt, roast, and eat plain; toss in salads.</p>
<p class="MsoNormal"><strong style="">20. Coffee</strong><br>
The old cup-o-joe has been thrown on the stands for many a corporeal crime—heart disease, cancer, osteoporosis—but exonerated on all counts. In fact, coffee, which is derived from a bean, contains beneficial antioxidants that protect against free radicals and may actually help thwart heart disease and cancer. While it’s not going to fill you up like the other items on this list, it might make you a lot perkier. When made at home, coffee runs less than 50¢ cents a cup.<br>
<em style=""><br>
Serving suggestions</em>: Just drink it.</p></div></html>
Source: [[The 20 Healthiest Foods for Under $1|http://www.divinecaroline.com/articles/printer_friendly/22145/52070]]
<html>The 2000s – Best of the Decade: The New Issue of Rolling Stone</html>
Source: [[The 2000s – Best of the Decade: The New Issue of Rolling Stone : Rolling Stone : Rock and Roll Daily|http://www.rollingstone.com/rockdaily/index.php/2009/12/09/the-2000s-best-of-the-decade-the-new-issue-of-rolling-stone/]]
<html><p><strong><span style="font-size: 120%;">Meal #1: The Chicken Itself</span></strong><br>
Cooking a whole chicken is really easy. All you have to do is unwrap it, remove the neck and gizzards (usually already separated for you - but save them for later), rinse it down well, rub the skin with salt (two tablespoons or so) and pepper (a few dashes) and a bit of vegetable oil (two tablespoons or so), then cook it. </p>
<p>“How do you cook it?” is the next obvious question. If you have an oven or a grill, one very simple way to do it is with a can of beer. Just open one up, drink about half of it, then insert the can into the chicken’s cavity, open end inside the chicken. Then, you can literally sit the chicken on the can. Toss it on the grill over indirect heat (off to the side) or in the oven at a low temperature and cook it until you get a temperature reading of about 165 degrees Fahrenheit from the breast. That’s it.</p>
<b>
<p><i>review: excellent! rub with salt, pepper, garlic, and ... 2 hrs in the oven at 325 is plenty</i></p>
<p><i>review 2: rub liberally with salt, pepper and thyme, and lots of garlic inside 1.5 hrs in the oven at 325/350 is plenty</i></p>
</b>
<p>Then, just cut off the tastiest parts - most people enjoy the breasts, legs, wings, and thighs. Don’t worry about knowing how to cut it - just get the pieces off that you want. Serve it with a side vegetable, and you have cheap meal #1.</p>
<p><strong><span style="font-size: 120%;">Meal #2: Leftover Pieces</span></strong><br>
When you’re done eating the chicken, you’ll have a carcass with quite a bit of meat still on it. Spend some time carefully extracting these little pieces of cooked meat and save them in a baggie in the freezer.</p>
<p>Why? <em>This stuff is the perfect basis for any dish with chicken in it</em>. Use it on a homemade chicken pizza, in a casserole, or in soup. Any recipe that uses diced chicken can use this stuff. Usually, you’ll have more than enough left to satisfy any recipe you might have.</p>
<p><strong><span style="font-size: 120%;">Meal #3: Even the Waste Parts</span></strong><br>
Now, what about those leftover “junk” pieces you don’t want to eat? Even those are useful. Throw <em>all</em> of the leftover pieces (bones, skin, neck, gizzards, all of it!) into a big pot, add enough cold water so that the pieces are thoroughly covered, add a dash of salt and a dash of pepper, toss in a few vegetables (I like a small amount of onion, celery, and carrots - maybe 1/2 cup each), then crank it up to a boil. Once it’s boiling, drop it down to a low simmer and just let it cook all day - four hours, minimum. </p>
<p>When it’s done, remove the bones and strain what’s left, removing the chunks. The remaining liquid is <em>chicken stock</em>, and it’s infinitely useful in all sorts of dishes. It can be the basis of a soup, the liquid ingredient in a savory casserole, stir fry, curries, or anything else. Any recipe that uses bouillon or broth can use this liquid instead and will taste substantially better for it. You can freeze this stuff in freezer bags if you’d like.</p>
<p><strong>One good way to do this</strong> is to have the whole chicken on Friday or Saturday evening, remove the extra meat after dinner, then boil the remnants the next day while you’re doing other household tasks.</p>
<p><strong><span style="font-size: 120%;">A Look at the Costs</span></strong><br>
Let’s say, hypothetically, that you can get a whole four pound chicken for $7.50. You’ll also need perhaps $3 worth of vegetables to go with it, $0.50 in cooking materials, and you might burn $0.50 worth of energy in the cooking process. That’s a total of $11.50.</p>
<p>From that, you can produce a meal of chicken and vegetables to feed a family of four, a meal worth of leftovers, a bag full of chicken pieces in the freezer for a future meal for a family of four, and a bag of chicken stock for another meal or two. That’s five complete meals and the key ingredients for eight more meals.</p>
<p><strong><span style="font-size: 120%;">What’s the Lesson Here?</span></strong><br>
For the most part, <strong>being frugal with food is just like being frugal with anything else: the more stuff you can reuse, the less expensive day to day life becomes</strong>. An ordinary whole chicken seems like a ho-hum purchase, but when you look at the <em>possibilities</em> that it provides, it becomes a much stronger purchase.</p>
<p>Here’s another example. Let’s say that you often buy vegetables, but only intend to eat part of it. I know, for example, that my family tends to eat about one and a half sliced zucchinis as a side dish, leaving that other half of a zucchini as a waste. Just go ahead and slice it and throw it with other miscellaneous vegetables into a freezer bag - whenever you have a leftover vegetable, just toss it in there. Then, once every few weeks (when the bag gets full), toss a bit of olive oil and a bit of garlic in a pan and make a stir fry out of the leftover vegetables. It’s an incredibly cheap meal (plus you can toss in some of those leftover chicken pieces).</p>
<p><strong>If you spend a few minutes thinking about what you can do with the left over elements of any meal you prepare, you can usually come up with a tasty use</strong>. And when that tasty use keeps you from tossing those pieces in the trash, then it’s as good as found money.</p></html>
Source: [[The Simple Dollar » The Frugal Whole Chicken (or, Waste Not, Want Not)|http://www.thesimpledollar.com/2008/08/19/the-frugal-whole-chicken-or-waste-not-want-not/]]
The ~TiddlySaver Java applet allows ~TiddlyWiki to save changes in a local version (from a file:// URL) of Safari, Opera and other browsers. It is a small file named [["TiddlySaver.jar"|TiddlySaver.jar]] that must be placed in the same directory as your ~TiddlyWiki file. As of August 2008, when an empty ~TiddlyWiki file is downloaded using either Safari or Opera, it is bundled with a copy of the ~TiddlySaver.jar file in a zip file - both files must be in the same directory ''whenever the ~TiddlyWiki file is opened'' in order to work.
[["TiddlySaver.jar"|TiddlySaver.jar]] is signed by [[UnaMesa Association|UnaMesa]]. The [[UnaMesa Association|UnaMesa]] certificate is signed by the ''Thawte Code Signing CA'' intermediate certificate which is chained to the ''Thawte Premium Server CA'' root certificate. You need to trust this certificate Chain to be able to use the applet.
Note that there is currently [[a bug|http://trac.tiddlywiki.org/ticket/172]] that prevents ~TiddlySaver from working if you have specified a backup directory in AdvancedOptions and the directory doesn't exist.
Thanks to Andrew Gregory for the original TiddlySaver code, and ~BidiX for arranging all the certificate magic.
About
TiddlySnip is a Firefox extension that lets you use your TiddlyWiki as a scrapbook! Simply select text, right click and choose 'TiddlySnip selection'. Next time you open your TiddlyWiki file, your snippets will be there, already tagged and organised.
Source: [[TiddlySnip - About|http://tiddlysnip.com/#About]]
http://www.tiddlywiki.com/
[[plugins|http://tiddlyvault.tiddlyspot.com/]] and [[themes|http://tiddlythemes.com/#Home]]
<html>Jim Bouton’s tell-all book <em>Ball Four</em> in 1970</html>
Source: [[Tiger Woods needs new PR strategy|http://www.cbc.ca/sports/story/2009/12/09/spf-woods-pr-strategy.html]]
<html><div id="rInt">Easy spinach pesto tops tilapia slices. Serve this easy baked tilapia with hot cooked rice or pasta.</div><div id="rIng"><h4>INGREDIENTS:</h4><ul><li>Pesto:</li><li>3 cups baby spinach leaves, packed, about 3 ounces</li><li>1/4 cup olive oil</li><li>1/2 cup pecan halves</li><li>1/3 cup fresh shredded Parmesan cheese</li><li>2 medium cloves garlic, smashed and minced</li><li>1/4 teaspoon salt, or to taste</li><li>.</li><li>Tilapia:</li><li>2 to 3 cups baby spinach leaves packed</li><li>8 tilapia fillets </li><li>salt and freshly ground black pepper</li></ul></div><div id="rPrp"><h4>PREPARATION:</h4><div>Lightly butter a 9x13-inch baking dish. Heat oven to 400°.
<p>
In a food processor, pulse the 3 cups of spinach leaves, 1/4 cup olive oil, pecan halves, Parmesan cheese, garlic, and 1/4 teaspoon salt until the mixture is a fine consistency.
</p><p>
Arrange remaining spinach leaves over the bottom of the baking dish. Place a tilapia fillet on the bed of spinach and put about 1 tablespoon of the pesto mixture on the fillet. Spread lightly to cover most of the fillet. Repeat with remaining fillets and pesto, overlapping fish slightly as needed. Sprinkle lightly with salt and pepper. </p><p>
Bake for 15 to 20 minutes, or until tilapia flakes easily with a fork.
<br>
Serve with hot cooked rice or pasta.<br>Serves 4.</p></div></div></html>
Source: [[Tilapia With Spinach Pecan Pesto - Tilapia Recipe With Easy Pesto|http://southernfood.about.com/od/tilapiarecipes/r/r70129e.htm]]
[[UdoBorkowski's Extensions for TiddlyWiki|http://tiddlywiki.abego-software.de/]]
<html><p><i></i></p>
<p>You can never go wrong with the great essayists of the modern era:<br>
<a href="http://en.wikipedia.org/wiki/Joan_Didion">Joan Didion</a> on culture and relationships<br>
<a href="http://en.wikipedia.org/wiki/Bruce_Chatwin">Bruce Chatwin</a> on travel, art and architecture<br>
<a href="http://en.wikipedia.org/wiki/Anthony_Lane">Anthony Lane</a>, on film, books, theater and pop culture<br>
<a href="http://en.wikipedia.org/wiki/Nick_Tosches">Nick Tosches</a>, on music<br>
Richard Meltzer, on music<br>
<a href="http://www.julianbarnes.com/bib/letters.html">Julian Barnes, on London</a></p></html>
Source: [[Ungeek To Live: On Reading Well|http://lifehacker.com/5052122/on-reading-well]]
[[_vimrc]]
[[_gvimrc]]
vimfiles
* colors
** [[glennj.vim]]
* [[filetype.vim]]
* ftplugin
** [[bash.vim]], [[html.vim]], [[mail.vim]], [[make.vim]], [[perl.vim]], [[php.vim]], [[ruby.vim]], [[tcl.vim]]
* plugin
** [[TagList|http://vim-taglist.sourceforge.net/]]
** [[ToggleOnly.vim|http://www.vim.org/scripts/script.php?script_id=1280]]
<html><p>Peek over walls and look around corners with a periscope—a long tool that uses two mirrors to show you hard-to-reach places. Over at how-to site Instructables, they've got the step by step for putting together a periscope using a thin mints box, duct tape, two small mirrors, and an X-Acto knife. The kids will <i>love</i> this one.<br>
</p><div class="related"><a href="http://www.instructables.com/id/Super-Stealthy-Spy-Periscope%20">Super Stealthy Spy Periscope!</a> [Instructables via <a href="http://blog.makezine.com/archive/2008/07/up_periscope.html?CMP=OTC-0D6B48984890">Make</a>]</div></html>
Source: [[Weekend Project: Look Around Corners and Over Walls with a DIY Periscope|http://lifehacker.com/398868/look-around-corners-and-over-walls-with-a-diy-periscope]]
<html>What are the greatest rockumentaries of all time?</html>
Source: [[Things That Go Pop!: What are the greatest rockumentaries of all time?|http://www.cbc.ca/arts/media/blogs/popculture/2009/04/what_are_the_greatest_rockumen.html]]
<html><h3 class="post-title entry-title"><a href="http://savoryseasonings.blogspot.com/2008/04/wheat-thin-crackers.html">Wheat Thin Crackers</a>
</h3>
<div class="post-header-line-1"></div>
<div class="post-body entry-content">
<p>1 1/2 cups whole wheat flour <br>1 1/2 cups white flour <br>1 cup milk or water<br>1/4 tsp. salt <br>4 TBSP canola oil<br>2 TBSP sugar <br>3 TBSP sesame seeds <br>2 TBSP brown sugar<br><br>Mix ingredients together until well blended, knead well. Divide into 4 pieces. Roll out 1 at a time unto a 12x16 rectangle 1/16" thick. Place on cookie sheet and sprinkle lightly with salt. <br><br>With pizza cutter, cut into 2" squares. Bake 12-15 minutes at 350. Cool and break apart. Freezes well. Recipe courtesy of Battling the “MSG Myth” A Survival Guide and Cookbook</p></div></html>
Source: [[Savory Seasonings: Breads: Crackers|http://savoryseasonings.blogspot.com/search/label/Breads%3A%20Crackers]]
Here are some examples that show the usage of the whereClause in the ForEachTiddlerMacro.
<<forEachTiddler
where
'tiddler.tags.contains("whereClauseExample")'
>>
See also ForEachTiddlerExamples.
Wiki links are typically created by ...
wish list at backpack.com: [[private|http://glennj.backpackit.com/pages/1321064]] / [[public|http://glennj.backpackit.com/pub/1321064]]
[[mail something there|mailto:xeneje28@glennj.backpackit.com]]
Miniscule 1
Source: [[YouTube - Miniscule 1|http://www.youtube.com/watch?v=EknFC2ZjkvY]]
<div class='header'>
<div class='titleLine'>
<div class='siteTitle' refresh='content' tiddler='SiteTitle'></div>
<div class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></div>
</div>
<div class='headerLine'></div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
/***
!Zeldman
http://tiddlystyles.com/#theme:Zeldman
!Colors used by this Theme
*@@background(#f79b60):#f79b60@@
*@@background(#c51):#c51@@
*@@background(#d16400):#d16400@@
*@@background(#be540b):#be540b@@
*@@background(#b44):#b44@@
*@@background(#930):#930@@
*@@background(#922):#922@@
*@@background(#f5d7b4):#f5d7b4@@
*@@background(#cf936c):#cf936c@@
*@@background(#c5886b):#c5886b@@
*@@background(#b8764c):#b8764c@@
*@@background(#867663):#867663@@ Used for MSG Area, Tiddler Title, text, and SubTitle
*@@background(#fff):#fff@@
*@@background(#ccc):#ccc@@
*@@background(#aaa):#aaa@@
*@@background(#888):#888@@
*@@background(#666):#666@@
*@@background(#333):#333@@
*@@background(#000):#000@@
!Popup styles /% =========================================================== %/
***/
/*{{{*/
#popup {
border: 1px solid #aaa;
padding: 0;
background: #fff;
color: #f79b60;
}
#popup a{
color: #f79b60;
font-weight: normal;
}
#popup a:hover {
background: #f5d7b4;
color: #930;
}
#popup hr {border-top: solid 1px #f5d7b48;}
#popup li.disabled{color: #cf936c;}
#popup .currentlySelected,
#popup .currentlySelected:hover{
background: #f5d7b4;
}
/*}}}*/
/***
!Generic styles /% ===================================================== %/
***/
/*{{{*/
h1,h2,h3,h4,h5,h6 {
background-color: transparent;
margin: .25em 0;
}
h1 {
border-bottom: 2px dotted #ccc;
}
h2 {
border-bottom: 1px dotted #ccc;
}
a{
color: #f79b60;
color: #c51;
}
a.button:active,
a:hover{
color: #f79b60;
background: transparent;
}
a.button,
a.button:active{
border: 0;
}
/*}}}*/
/***
!Header styles /% ================================================================== %/
***/
/*{{{*/
.header{
position: static;
}
.titleLine {
height: 7.5em;
background: #c51;
border-bottom: 8px solid #b8764c;
color: #fff;
left:0;
}
.titleLine a,
.titleLine a:link,
.titleLine a:hover{
color: #fff;
}
.titleLine a:hover{
border-bottom: 2px dotted;
}
.headerLine{
padding: 0;
border-top: 5px solid #cf936c;
border-bottom: 3px solid #f5d7b4;
}
.siteTitle {
text-align: right;
font-size: 4.5em;
font-weight: bold;
padding-right: .5em;
}
.siteSubtitle {
text-align: right;
font-size: 1.5em;
font-family: georgia,times;
padding-right: 1.5em;
}
/*}}}*/
/***
!Main menu styles /% ================================================================== %/
***/
/*{{{*/
#mainMenu {
width: 12em;
margin-top: .5em;
left: .5em;
padding: 0;
border: 1px solid #f5d7b4;
color: #666
}
#mainMenu ul,
#mainMenu li{
list-style: none;
margin: 0;
padding: 0;
}
#mainMenu li strong a {
color: #fff;
background: #d16400;
}
#mainMenu li strong a:hover,#mainMenu li strong .button:hover{
color: #f5d7b4;
background: #930;
text-decoration: none;
}
/* The bold has to be a block to contain the links <a>
because inline elements can't contain blocks */
#mainMenu li strong,
#mainMenu li span{
display: block;
}
#mainMenu li a,
#mainMenu li a:link{
display: block;
width: 100%;
text-decoration: none;
padding-right: 5px;
margin-right: 0;
color: #f79b60;
border: 0;
}
#mainMenu li a:hover, #mainMenu li .button:hover{
background-color: #f5d7b4;
text-decoration: none;
}
#mainMenu a:link{
text-decoration: none;
color: #f79b60;
margin-right: 5px;
}
#mainMenu a:hover,#mainMenu .button:hover{
text-decoration: underline;
background: transparent;
color: #930;
}
/*}}}*/
/***
!Message area styles /% ================================================================== %/
***/
/*{{{*/
#messageArea {
background-color: #f5d7b4;
color: #867663;
padding: 0.5em;
border: 1px solid #ccc;
}
#messageArea a:link, #messageArea a:visited {
color: #c51;
}
#messageArea a:hover {
color: #f79b60;
}
#messageArea a:active {
color: #fff;
}
/*}}}*/
/***
!Sidebar styles /% ================================================================== %/
***/
/*{{{*/
#sidebar {
width: 14.5em;
border-bottom:1px solid #aaa;
border-left: 1px solid #aaa;
}
#sidebarOptions{
background-color: #fff;
}
#sidebarOptions a{
color: #f79b60;
background: transparent;
text-decoration: none;
border: 0;
}
#sidebarOptions a:hover{
color: #c51;
background: #fff;
text-decoration: underline;
}
#sidebarOptions .sliderPanel{
background: #f5d7b4;
margin: 0;
}
#sidebarOptions .sliderPanel a{
color: #922;
font-weight:normal;
}
#sidebarOptions .sliderPanel a:hover{
color: #b44;
background: transparent;
}
#sidebarTabs {
background-color: #fff;
}
#sidebarTabs a {
background: transparent;
}
#sidebarTabs .tabContents a:hover {
color: #922;
text-decoration: underline;
background-color: transparent;
}
.tab {
margin: 0px 1px;
border:1px solid #aaa;
border-bottom:none;
color: #922;
}
.tab:hover {
border-color: black;
text-decoration: none;
}
#sidebarTabs .tabSelected {
background: #f5d7b4;
padding: 2px 4px;
color: #922;
}
#sidebarTabs .tabUnselected {
background: #c51;
padding: 2px 4px 0px 4px;
color: #fff;
}
#sidebarTabs .tabContents {
background-color: #f5d7b4;
}
#sidebarTabs .tabContents a{
color: #922;
}
#sidebarTabs .tabContents a:hover{
color: #b44;
}
#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tabSelected:hover{
background: #cf936c ;
color: #000 ;
text-decoration: none;
}
#sidebarTabs .txtMoreTab .tabUnselected,
#sidebarTabs .txtMoreTab .tabUnselected:hover{
background: #f5d7b4 ;
color: #000 ;
text-decoration: none;
}
#sidebarTabs .txtMoreTab .tabContents {
color: #fff;
background: #cf936c;
border-bottom: solid #aaa 1px;
}
/*}}}*/
/***
!Tiddler display styles /% ================================================================== %/
***/
/*{{{*/
#displayArea {
margin: 1em 15em 0em 15em;
}
.tiddler{
padding: 0;
border: 1px solid #ccc;
padding: 5px;
}
.title {
font-size: 1.5em;
color: #867663;
font-weight: bold;
}
.toolbar {
font-size: .9em;
}
.toolbar a.button{
color: #f79b60;
border: 1px solid #fff;
}
.tiddler .toolbar a.button:hover,
.tiddler .toolbar a.button:active {
color: #930;
background: #f5d7b4;
border: 1px solid #f79b60;
}
.toolbar a.button:active {
color: #666;
}
.body {
border-top:1px solid #ccc;
padding-top: 0.5em;
margin-top:0.3em;
}
/*}}}*/
/***
''Viewer styles'' /% --------------------------------------------------------------------------------------------- %/
***/
/*{{{*/
.tiddler a.button {
color: #f79b60;
}
.tiddler a.button:hover {
color: #be540b;
background: transparent;
}
.subtitle,
.viewer {
color: #867663;
}
.viewer .button{
background: transparent;
color: #888;
border: 1px solid transparent;
}
.viewer a:link, .body a:visited{
color: #be540b;
}
.viewer a:hover {
background-color: transparent;
text-decoration: underline;
}
.viewer blockquote {
border-left: 1px solid #ccc;
}
.viewer table {
border: 2px solid #333;
}
.viewer td, tr {
border: 1px solid #666;
padding: 3px;
}
.viewer hr {
border-color: #666;
color: #666;
}
.viewer pre {
border: 1px solid #aaa;
background: #f5d7b4;
color: #333;
}
.viewer code {
color: #922;
}
.selected .isTag .tagging,
.selected .tagged,
.isTag .tagging,
.tagged {
float: none;
display: inline;
border: 0;
background: transparent;
color: #f79b60;
margin: 0;
}
.tagged li, .tagging li,
.tagged ul, .tagging ul{
display: inline;
}
.tiddler .tagging .listTitle,
.tiddler .tagged .listTitle{
color: #ccc;
}
.tiddler .tagging a.button,
.tiddler .tagged a.button{
margin: 0;
padding: 0;
color: #ccc;
}
.selected .tagging .listTitle,
.selected .tagged .listTitle,
.selected .tagging a.button,
.selected .tagged a.button{
color: #333;
}
/*}}}*/
/***
''Editor styles'' /% --------------------------------------------------- %/
***/
/*{{{*/
.editor input,
.editor textarea {
border: 1px solid black;
}
.editor textarea{
font-size: .8em;
}
/*}}}*/
!Zenib Alison Eudokia Jackman
Born Wednesday October 1, 2008 at 3:14am
Draft birth announcement:
<<<
Mon 23:20 - pre-labour begins
Tue 16:30 - stretch'n'sweep from Teresa
Tue 19:00 - real labour begins
first page to Diane
Tue 20:00 - Joshua goes to Alison's
secibd oage to Diane
Tue 23:20 - Joshua gets to sleep
third page to Diane
Wed 00:30 - midwives Diane and Genia arrive. Jacq at 3cm
around 2:00 - contractions become "un-intellectually-manageable"
2:30 - Joshua begins tossing and turning in his sleep
2:30 - jacq begins pushing
3:14 - zenib is born out the wazoo
<<<
BabyDimensions
{{{
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" .gvimrc settings
set lines=48
set columns=88
" specify a specific font
let defaultGuiFontSet=&guifontset
set guifontset=
set guifont=Lucida_Console:h10:cANSI
"set guifont=-dec-terminal-medium-r-normal-*-*-140-*-*-c-*-iso8859-1,-b&h-lucidatypewriter-medium-r-normal-*-*-120-*-*-m-*-iso8859-1,-misc-fixed-medium-r-normal-*-*-130-*-*-c-*-iso8859-1
set guioptions-=t " no tearoff menus
set guioptions-=T " no toolbar
if has("mouse")
set mouse=hnv
endif
" Tags Menu
" http://members.home.net/jayglanville/tagsmenu/
if filereadable("$VIM/../TagsMenu/TagsMenu.vim")
source "$VIM/../TagsMenu/TagsMenu.vim"
let TM_GROUP_BY_TYPE=0
let TM_DEBUG=1
endif
"
function! UseLightGUI()
set background=light
"highlight Normal guibg=LightGreen
highlight Normal guibg=LightGrey guifg=Black
endfunction
command! Light call UseLightGUI()
function! UseDarkGUI()
set background=light
highlight Normal guibg=DarkGrey guifg=LightGrey
endfunction
command! Dark call UseDarkGUI()
Light
}}}
{{{
" vim settings file
"set verbose=9
"
set compatible
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" .exrc settings
set showmode " show me when I'm in insert mode
set wrapmargin=0 " do not break lines while typing
set ignorecase " case-insensitive searches
set autoindent " keep the previous line's indentation
set shiftwidth=4 " used for << and >> commands.
set tabstop=4 "
set nowrapscan " stop searches at top or end of file
set nonumber " show line numbers
set modeline " allow files to over-ride these settings
set nrformats= " ^A and ^X incr/decr without octal or hex
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" .vimrc settings
"
" Vi (in)compatibility options:
" -----------------------------
set cpoptions=aAbBcdeEfFklLmorsStWy$!%
set fileformats=dos,unix,mac " read all file formats
set history=20 " command history
set backspace=2 " allow backspace over EOL and insertion point
set viminfo='100,f1,h " remember 100 files, remember file marks, nohlsearch
set matchpairs+=<:> " allow '%' to know about angle brackets
" Syntax highlighting:
" --------------------
"if has('syntax') && ( has("gui_running") || (&t_Co > 2) )
" if filereadable($HOME . "/.vim.filetypes.vim")
" let myfiletypefile = "$HOME/.vim.filetypes.vim"
" else
" let myfiletypefile = "$VIM/.vim.filetypes.vim"
" endif
" syntax enable " enable syntax highlighting
"endif
"filetype on
filetype plugin on
syntax enable
colorscheme glennj
" Text Formatting options:
" ------------------------
set textwidth=0 " maximum text before line break
set nolist " enable display of tabs and eol
set listchars=eol:$,tab:\\_
"set listchars=eol:$,tab:»· " show a tab as »···
" (digraphs: »=^K>>, ·=^K.M)
set smarttab
set expandtab " tabs are replaced by spaces
set smartindent " set smartindenting on
set shiftround " first < and > to a shiftwidth
set formatoptions=t " Auto-wrap text using textwidth
set formatoptions+=c " Auto-wrap comments using textwidth, inserting
" the current comment leader automatically.
set formatoptions+=q " Allow formatting of comments with 'gq'.
set formatoptions+=2 " allow 1st line to have different indent
set formatoptions+=r " Automatically insert the current comment leader
set comments=
set comments+=s1:/*,mb:*,ex:*/ " C-style comments
set comments+=://,b:# " C++ '//' and script '# '
set comments+=n:> " mail/news reply leaders
set comments+=fb:- " bullet '- ' has hanging indent
" window title is full path, not default 'file (dir)'
set titlestring=%F
set titlelen=150
"
" variables and functions
" -----------------------
let myLineWidth=76
let defaultCinwords=&cinwords
" toggle 'coding' and 'letter-writing' modes
function! ToggleCoding()
if &number && &textwidth == 0
call SetToPlainText()
else
call SetToCoding()
endif
endfunction
" this is 'letter-writing' mode: no line numbers and textwidth is set
function! SetToPlainText(...)
if a:0 == 0
"execute "set nonumber textwidth=" . g:myLineWidth . " cinwords=\"\""
execute "set textwidth=" . g:myLineWidth
else
"execute "set nonumber textwidth=" . a:1 . " cinwords=\"\""
execute "set textwidth=" . a:1
endif
set nolist nonumber cinwords=""
imap =- <BS> -
endfunction
" this is 'coding' mode
function! SetToCoding()
"execute "set list number textwidth=0 cinwords=" . g:defaultCinwords
execute "set textwidth=0 cinwords=" . g:defaultCinwords
iunmap =-
endfunction
"
" Appearance options:
" -------------------
set noequalalways " don't equalize window size when splitting
set ruler " show line,col of cursor
set showcmd " show partially entered cmds on status bar
set hlsearch " hightlight matching search patterns
"set nohlsearch " hightlight matching search patterns
set incsearch " incremental searching
set more " page when screen fills
set display=lastline " last line of screen, show as much as will fit
" Miscellaneous options:
" ----------------------
set esckeys " allow arrow keys while inserting
set smartcase " override ignorecase IF explicitly specifying
" upper case letters in pattern
set shortmess=at " avoid 'hit Return' messages
set wildchar=<TAB> " command expansion key a la tcsh
set wildmode=list:longest,full " show all matches, expand to longest partial,
" and then cycle through choices with tab
" File explorer options:
" ----------------------
let g:explVertical=1
let g:explSplitRight=1
let g:explDetailedList=1
let g:explDetailedHelp=1
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" MAPS
map =0 mjO<ESC>i....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8<Esc>`j
map =# mjO<ESC>i################################################################################<Esc>`j
iabbrev =# ################################################################################<CR>
" toggle list mode
map =l :set list!<CR>
" underline current line
map =- "ayy"ap:s/./-/g<CR>
map == "ayy"ap:s/./=/g<CR>
" quote variable
map ={ lF$a{<ESC>ea}<ESC>
" quote word
map =" lBi"<ESC>Ea"<ESC>
""""""""
" 20020910 - hmm, only f1-f4 seem to work reliably in putty and screen...
" 20030620 - seems ok in solaris land...
" don't open help window on F1
map <F1> :help
map! <F1> <C-O><F1>
" text/code modes
"if has('user_commands')
command! TC call ToggleCoding()
"map <F2> :TC<CR>
"else
" map <F10> :execute "set nonumber textwidth=" . myLineWidth<CR>
" map <F12> :set number textwidth=0<CR>
" map! <F12> <C-O><F12>
"endif
"map! <F2> <C-O><F2>
"map =tc :TC<CR>
" toggle autoindenting
"map <F3> :set paste! paste?<CR>
"set pastetoggle=<F3>
map <F2> :set paste! paste?<CR>
set pastetoggle=<F2>
map =tp :set paste! paste?<CR>
"nmap <F4> :set filetype=tcl<CR>
"nmap <S-F4> :set filetype=
"toggles whether or not the current window is automatically zoomed
function! ToggleWindowMaximized()
if exists ('g:windowMaximized')
au! maximizeCurrentWindow
execute "normal \<c-w>="
unlet g:windowMaximized
else
augroup maximizeCurrentWindow
au! WinEnter * execute "normal \<c-w>_"
augroup END
do maximizeCurrentWindow WinEnter
let g:windowMaximized=1
endif
endfunction
nmap <F6> :call ToggleWindowMaximized()<CR>
command! TM call ToggleWindowMaximized()
" toggle search highlighting
map <F8> :nohlsearch<CR>
map! <F8> <C-O><F8>
" textual bullet: ' - '
imap <F9> <BS> -
imap =- <BS> -
" for command mode, make <space> and '-' behave like pine, as pgdn and pgup
map <Space> <C-F>
map - <C-B>
" use z+ and z^ to avoid keeping 2 lines of context.
"map <Space> z+
"map - z^
" 20071107 - don't waste ^a and ^x - useful incr commands
" emulate windows 'select all' -- set mark 'q'
"nmap <C-A> mqggVG
nmap =cp mqggVG
" emulate windows cut/copy/paste
"vmap <C-X> "+x
vmap <C-C> "+y`q
nmap <C-V> "+P
" the following line prevents forcing # to be inserted in column 1
inoremap # X<BS>#
" avoid the annoying command-line window when mis-typing :q
"nmap q: :q
" common typos for :commands
command! Q quit
command! Qa quitall
command! W write
command! Wq wq
command! Set set
" next doesn't work -- :X is already a built-in command
"command! X xit
" use this instead:
cabbrev X x
" can't make command out of q1 (lower case), so abbrev it
cabbrev q1 quit!
"" smart tab function for word completion
"function InsertTabWrapper()
" let col = col('.') - 1
" if !col || getline('.')[col - 1] !~ '\k'
" return "\<tab>"
" else
" return "\<c-p>"
" endif
"endfunction
"inoremap <tab> <c-r>=InsertTabWrapper()<cr>
}}}
[[Gift guidelines|http://glennj.backpackit.com/pub/1405046]]
[[.bashrc for cygwin]]
[[.profile for cygwin]]
[[.bashrc for telnet.ncf.ca]]
[[.bash_profile for telnet.ncf.ca]]
http://pegasus.rutgers.edu/~elflord/vim/syntax/bash.vim
{{{
" Filename: bash.vim
" Purpose: Vim syntax file
" Language: Bash - Unix Shell
" Maintainer: Donovan Rebbechi elflord@pegasus.rutgers.edu
" URL: http://pegasus.rutgers.edu/~elflord/vim/syntax/bash.vim
" Last update: Tue Aug 4 09:02:08 EDT 1998
"
" Updated 1998 July 27
" Fixed bugs with embedded echos and command subs in bash
" Updated 1998 August 1
" Changed Colouring. Added bash environment variables. Added keywords
" and command options.
" Updated 1998 August 2
" Use awk syntax file
"
" Remove any old syntax stuff hanging around
syn clear
if !exists("bash_minlines")
let bash_minlines = 100
endif
if !exists("bash_maxlines")
let bash_minlines = 2 * bash_minlines
endif
"syn include @bashAwk <sfile>:p:h/awk.vim
"syn region bashAwkBlockSingle matchgroup=bashStatement start=+g\=awk[ \t]*-[^ \t]*[ \t]*'{+ end=+}'+ contains=@bashAwk
"syn region bashAwkBlockSingle matchgroup=bashStatement start=+g\=awk[ \t]*-[^ \t]*[ \t]*"{+ end=+}"+ contains=@bashAwk,bashDeref
" Comment out this to get less colour
" let hi_color=1
" bash syntax is case sensitive
syn case match
syn keyword bashTodo contained TODO
syn match bashComment "#.*$" contains=bashTodo
" String and Character constants
"===============================
syn match bashNumber "-\=\<\d\+\>"
syn match bashSpecial contained "\\\d\d\d\|\\[abcfnrtv]"
syn region bashSinglequote matchgroup=bashOperator start=+'+ end=+'+
syn region bashDoubleQuote matchgroup=bashOperator start=+"+ skip=+\\"+ end=+"+ contains=bashDeref,bashCommandSub,bashSpecialShellVar,bashSpecial
syn match bashSpecial "\\[\\\"\'`$]"
" This must be after the strings, so that bla \" be correct
syn region bashEmbeddedEcho contained matchgroup=bashStatement start="\<echo\>" skip="\\$" matchgroup=bashOperator end="$" matchgroup=NONE end="[<>;&|`)]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=bashNumber,bashSinglequote,bashDeref,bashSpecialVar,bashSpecial,bashOperator,bashDoubleQuote
" This one is needed INSIDE a CommandSub, so that
" `echo bla` be correct
syn region bashEcho matchgroup=bashStatement start="\<echo\>" skip="\\$" matchgroup=bashOperator end="$" matchgroup=NONE end="[<>;&|]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=bashNumber,bashCommandSub,bashSinglequote,bashDeref,bashSpecialVar,bashSpecial,bashOperator,bashDoubleQuote,bashDotStrings,bashFileNames
"Error Codes
syn match bashDoError "\<done\>"
syn match bashIfError "\<fi\>"
syn match bashInError "\<in\>"
syn match bashCaseError ";;"
syn match bashEsacError "\<esac\>"
syn match bashCurlyError "}"
syn match bashParenError ")"
if exists("is_kornshell")
syn match bashDTestError "]]"
endif
syn match bashTestError "]"
" Tests
"======
syn region bashNone transparent matchgroup=bashOperator start="\[" skip=+\\\\\|\\$+ end="\]" contains=ALLBUT,bashFunction,bashTestError,bashIdentifier,bashCase,bashDTestError,bashDerefOperator,@bashSedStuff
syn region bashNone transparent matchgroup=bashStatement start="\<test\>" skip=+\\\\\|\\$+ matchgroup=NONE end="[;&|]"me=e-1 end="$" contains=ALLBUT,bashFunction,bashIdentifier,bashCase,bashDerefOperator,@bashSedStuff
syn match bashTestOpr contained "[!=]\|-.\>\|-\(nt\|ot\|ef\|eq\|ne\|lt\|le\|gt\|ge\)\>"
" DO/IF/FOR/CASE : Repitition operaters
" ======================================
syn region bashDo transparent matchgroup=bashBlock start="\<do\>" end="\<done\>" contains=ALLBUT,bashFunction,bashDoError,bashCase,bashDerefOperator,@bashSedStuff
syn region bashIf transparent matchgroup=bashBlock start="\<if\>" end="\<fi\>" contains=ALLBUT,bashFunction,bashIfError,bashCase,bashDerefOperator,@bashSedStuff
syn region bashFor matchgroup=bashStatement start="\<for\>" end="\<in\>" contains=ALLBUT,bashFunction,bashInError,bashCase,bashDerefOperator,@bashSedStuff
syn region bashCaseEsac transparent matchgroup=bashBlock start="\<case\>" matchgroup=NONE end="\<in\>"me=s-1 contains=ALLBUT,bashFunction,bashCaseError nextgroup=bashCaseEsac,bashDerefOperator,@bashSedStuff
syn region bashCaseEsac matchgroup=bashBlock start="\<in\>" end="\<esac\>" contains=ALLBUT,bashFunction,bashCaseError,bashDerefOperator,@bashSedStuff
syn region bashCase matchgroup=bashBlock contained start=")" end=";;" contains=ALLBUT,bashFunction,bashCaseError,bashCase,bashDerefOperator,@bashSedStuff
syn region bashNone transparent matchgroup=bashOperator start="{" end="}" contains=ALLBUT,bashCurlyError,bashCase,bashDerefOperator,@bashSedStuff
syn region bashSubSh transparent matchgroup=bashOperator start="(" end=")" contains=ALLBUT,bashParenError,bashCase,bashDerefOperator,@bashSedStuff
" Misc
"=====
syn match bashOperator "[!&;|=]"
syn match bashWrapLineOperator "\\$"
syn region bashCommandSub matchGroup=bashSpecial start="`" skip="\\`" end="`" contains=ALLBUT,bashFunction,bashCommandSub,bashTestOpr,bashCase,bashEcho,bashDerefOperator,@bashSedStuff
syn region bashCommandSub matchgroup=bashOperator start="$(" end=")" contains=ALLBUT,bashFunction,bashCommandSub,bashTestOpr,bashCase,bashEcho,bashDerefOperator,@bashSedStuff
syn match bashSource "^\.\s"
syn match bashSource "\s\.\s"
syn region bashColon start="^\s*:" end="$\|" end="#"me=e-1 contains=ALLBUT,bashFunction,bashTestOpr,bashCase,bashDerefOperator,@bashSedStuff
" File redirection highlighted as operators
"==========================================
syn match bashRedir "\d\=>\(&[-0-9]\)\="
syn match bashRedir "\d\=>>-\="
syn match bashRedir "\d\=<\(&[-0-9]\)\="
syn match bashRedir "\d<<-\="
" Shell Input Redirection (Here Documents)
syn region bashHereDoc matchgroup=bashRedir start="<<-\=\s*\**END[a-zA-Z_0-9]*\**" matchgroup=bashRedir end="^END[a-zA-Z_0-9]*$"
syn region bashHereDoc matchgroup=bashRedir start="<<-\=\s*\**EOF\**" matchgroup=bashRedir end="^EOF$"
" Identifiers
"============
syn match bashIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>="me=e-1
syn region bashIdentifier matchgroup=bashStatement start="\<\(declare\|typeset\|local\|export\|set\|unset\)\>[^/]"me=e-1 matchgroup=bashOperator skip="\\$" end="$\|[;&]" matchgroup=NONE end="#\|="me=e-1 contains=bashTestError,bashCurlyError,bashWrapLineOperator,bashDeref
" The [^/] in the start pattern is a kludge to avoid bad
" highlighting with cd /usr/local/lib...
syn region bashFunction transparent matchgroup=bashFunctionName start="^\s*\<[a-zA-Z_][a-zA-Z0-9_]*\>\s*()\s*{" end="}" contains=ALLBUT,bashFunction,bashCurlyError,bashCase,bashDerefOperator,@bashSedStuff
" CHanged this
syn region bashDeref start="\${" end="}" contains=bashDerefOperator,bashSpecialVariables
syn match bashDeref "\$\<[a-zA-Z_][a-zA-Z0-9_]*\>" contains=bashSpecialVariables
" A bunch of useful bash keywords
syn keyword bashStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait bg fg jobs stop suspend alias fc getopts hash history let print time times type whence unalias source bind builtin dirs disown enable help history logout popd pushd shopt login newgrp gnugrep grep egrep fgrep du find gnufind expr tail sort clear less sleep ls rm install chmod mkdir rmdir strip rpm mv touch sed
syn keyword bashAdminStatement killproc daemon start stop restart reload status killall nice
syn keyword bashConditional else then elif while
syn keyword bashRepeat select until
syn keyword bashFunction function
" Syncs
" =====
if !exists("bash_minlines")
let bash_minlines = 100
endif
exec "syn sync minlines=" . bash_minlines
syn sync match bashDoSync grouphere bashDo "\<do\>"
syn sync match bashDoSync groupthere bashDo "\<done\>"
syn sync match bashIfSync grouphere bashIf "\<if\>"
syn sync match bashIfSync groupthere bashIf "\<fi\>"
syn sync match bashForSync grouphere bashFor "\<for\>"
syn sync match bashForSync groupthere bashFor "\<in\>"
syn sync match bashCaseEsacSync grouphere bashCaseEsac "\<case\>"
syn sync match bashCaseEsacSync groupthere bashCaseEsac "\<esac\>"
syn match bashDerefOperator contained +##\=\|%%\=+
" command line options
syn match bashCommandOpts "\(--\=\|+\)\([a-zA-Z]\)\=\([a-zA-Z0-9]\)*"
" special variables
if exists("is_bash")
syn keyword bashSpecialVariables contained PPID PWD OLDPWD REPLY UID EUID GROUPS BASH BASH_VERSION BASH_VERSINFO SHLVL RANDOM SECONDS LINENO HISTCMD DIRSTACK PIPESTATUS OPTARG OPTIND HOSTNAME HOSTTYPE OSTYPE MACHTYPE SHELLOPTS IFS PATH HOME CDPATH BASH_ENV MAIL MAILCHECK PS1 PS2 PS3 PS4 TIMEFORMAT HISTSIZE HISTFILE HISTFILESIZE LANG LC_ALL LC_COLLATE LC_MESSAGES PROMPT_COMMAND IGNOREEOF TIMEOUT FCEDIT FIGNORE GLOBIGNORE INPUTRC HISTCONTROL histchars HOSTFILE auto_resume HISTIGNORE OPTERR MAILPATH
endif
syn match bashSpecialShellVariables "\$[-#@*$?!0-9]"
" The default methods for highlighting. Can be overridden later
if !exists("did_bash_syntax_inits")
let did_bash_syntax_inits = 1
hi link bashAdminStatement Function
hi link bashBlock Function
hi link bashCaseError Error
hi link bashColon bashStatement
hi link bashCommandOpts Operator
hi link bashComment Comment
hi link bashConditional Conditional
hi link bashCurlyError Error
hi link bashDeref bashShellVariables
hi link bashDerefOperator bashOperator
hi link bashDoError Error
hi link bashDoubleQuote bashString
hi link bashEcho bashString
hi link bashEmbeddedEcho bashString
hi link bashEsacError Error
hi link bashFunction Function
hi link bashFunctionName Function
hi link bashHereDoc bashString
hi link bashIdentifier Identifier
hi link bashIfError Error
hi link bashInError Error
hi link bashNumber Number
hi link bashOperator Operator
hi link bashParenError Error
hi link bashRedir bashOperator
hi link bashRepeat Repeat
hi link bashShellVariables PreProc
hi link bashSinglequote bashString
hi link bashSource bashOperator
hi link bashSpecial Special
hi link bashSpecial Special
hi link bashSpecialShellVar bashSpecialVariables
hi link bashSpecialVariables bashSpecialVars
hi link bashSpecialVars Identifier
hi link bashStatement Statement
hi link bashString String
hi link bashTestError Error
hi link bashTestOpr bashConditional
hi link bashTodo Todo
hi link bashVariables PreProc
hi link bashWrapLineOperator bashOperator
endif
let b:current_syntax = "bash"
" vim: ts=8
}}}
A desktop clock with alarms and calendar.
[img[bwclock|http://web.ncf.ca/glennj/purl.org/tcl/bwclock/screenshots/bwclock.PNG][http://web.ncf.ca/glennj/purl.org/tcl/bwclock/]]
http://web.ncf.ca/glennj/purl.org/tcl/bwclock/
To Do:
* --allow """URLs""" in alarm dialogs--
* store alarms, etc in an sqlite database to "autosave"
{{{
" my filetype file -- :help new-filetype
if exists("did_load_filetypes")
finish
endif
augroup filetypedetect
" mql files normally contain tcl commands
au! BufRead,BufNewFile *.mql setfiletype tcl
au! BufRead,BufNewFile *.jad setfiletype java
"au! BufRead,BufNewFile *.sh setfiletype bash
augroup END
}}}
{{{
" local syntax file - set colors on a per-machine basis:
" vim: tw=0 ts=4 sw=4
" Vim color file
set background=light
hi clear
if exists("syntax_on")
syntax reset
endif
let g:colors_name = "glennj"
hi Normal ctermfg=Black
hi Comment ctermfg=DarkBlue
hi Constant ctermfg=DarkMagenta
hi Special ctermfg=Magenta
hi Identifier ctermfg=DarkGray
hi Statement ctermfg=DarkRed
"hi Type ctermfg=Black
hi Type ctermfg=DarkGrey
hi LineNr ctermfg=Black
hi StatusLine ctermfg=Yellow ctermbg=Blue cterm=bold
hi StatusLineNC ctermfg=Gray ctermbg=Blue cterm=NONE
hi Question ctermfg=white ctermbg=yellow
hi MoreMsg ctermfg=white ctermbg=yellow
hi Search ctermbg=white
hi Visual term=reverse cterm=reverse guifg=Black guibg=Gray
hi link String Constant
hi link Character Constant
hi link Number Constant
hi link Boolean Constant
hi link Float Number
hi link Function Identifier
hi link Conditional Statement
hi link Repeat Statement
hi link Label Statement
hi link Operator Statement
hi link Keyword Statement
hi link Exception Statement
hi link Include PreProc
hi link Define PreProc
hi link Macro PreProc
hi link PreCondit PreProc
hi link StorageClass Type
hi link Structure Type
hi link Typedef Type
hi link SpecialChar Special
hi link Delimiter Special
hi link SpecialComment Special
hi link Debug Special
}}}
{{{
call SetToPlainText(76)
map =/ 0i<!-- <esc>A --><esc>
}}}
<<newJournal "YYYY-0MM-0DD: DDD, MMM DD" "journal">>
A lot of NCF office admin in here:
{{{
set cinwords=
" Jacq
abbreviate jq Jacqueline
"######################################################################
"## maps
"######################################################################
" spoof sysadmin@ncf.ca
map =sy migg0WCNCF System Administration <sysadmin@ncf.ca><Esc>Gk2ddA (xx087)<CR>NCF System Administration<CR>sysadmin@ncf.ca<Esc>`i
" spoof sysadmin@ncf.ca for slrn
map =nsy miggOReply-To: NCF System Administration <sysadmin@ncf.ca><Esc>Gk2ddA (xx087)<CR>NCF System Administration<CR>sysadmin@ncf.ca<Esc>`i
" spoof idesk@ncf.ca
map =id migg0WCNCF Internet Desktop Support <idesk@ncf.ca><Esc>Gk2ddA (xx087)<CR>NCF Internet Desktop Support<CR>idesk@ncf.ca<Esc>`i
" spoof idesk@ncf.ca for slrn
map =nid miggOReply-To: NCF Internet Desktop Support <idesk@ncf.ca><Esc>Gk2ddA (xx087)<CR>NCF Internet Desktop Support<CR>idesk@ncf.ca<Esc>`i
" spoof office@ncf.ca
map =of migg0WCNCF Office <office@ncf.ca><Esc>Gk2ddA (es087)<CR>office@ncf.ca Tel: 520-9001 Fax: 520-3524<CR>National Capital FreeNet / Libertel de la Capitale Nationale<CR>402 Dunton Tower, Carleton University, Ottawa ON K1S 5B6<Esc>`i
" generic virus alert
map =V gg=sy/^cc:<CR>0CCC:<Esc>/^subject:<CR>0WCA message from the NCF system administrator<ESC>}jma/^-- <CR>kkV'axk:r ~/virus/generic.message<cr>gg/^to:<CR>0WC
" spelling
map =sp gg}:w<CR>:r!env H_SPELL=$HOME/spell.history spell -b +$HOME/spell.glennj %<CR>o<ESC>
" insert '--- forwarded ...' lines when forwarding from slrn
map =nf migg/^Xref:<CR>"ayy{"aP2cW<CR>----- Forwarded from <Esc>f:s #<Esc>A -----<Esc>Go<CR>----- End of forwarded message -----<CR><Esc>=nsi`i
" office mail forwarded from John (from webmail)
" set an appropriate attribution line
map =at gg}/^> *Date:<CR>kV{jd0cf,On<Esc>2f:C,<Esc>JDJdf:A wrote:<Esc>jdd
" responding to board moderations
map =bd /subject: confirm<CR>k"a2yyggj"apkWDJdf:j0dtSj4dd2}/^> $<CR>dG
map =ba /subject: confirm<CR>k"a2yyggj"apkWDJdf:j0dtSj4cjApproved: hotair4all<Esc>2}dG
" LDAP lookup: enter an alias or userid, and:
map =L gewmk:r! ~/.mutt/ldap_lookup.pl -f <cword><CR>0"kDdd`kde"kP
" send to rogers abuse
map =vvr Aabuse@rogers.com<Esc>/^subj<CR>WCvirus received from <Esc>ma}}}?iPlanet<CR>?^Received:<CR>V/^[^ ]<CR>k"ay{{"aPO<Esc>jV}k:s/^/>/<CR>{/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+<CR>"ayt]`a"apG{{{kV{6js[...]<Esc>gg}O<CR>XYZ virus detected by ClamAV<Esc>0ce
map =vsr Aabuse@rogers.com<Esc>/^subj<CR>WCspam received from <Esc>ma}}}?iPlanet<CR>?^Received:<CR>V/^[^ ]<CR>k"ay{{"aPO<Esc>jV}k:s/^/>/<CR>{/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+<CR>"ayt]`a"ap
" send to magma abuse
map =vvm Aabuse@magma.ca<Esc>/^subj<CR>WCvirus received from <Esc>ma}}}?^Received<CR>V/^[^ ]<CR>k"ay{{PO<Esc>jV}k:s/^/>/<CR>{/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+<CR>"ayt]`a"apG{{{kV{6js[...]<Esc>gg}O<CR>XYZ virus detected by ClamAV<Esc>0ce
map =vsm Aabuse@magma.ca<Esc>/^subj<CR>WCspam received from <Esc>ma}}}?^Received<CR>V/^[^ ]<CR>k"ay{{PO<Esc>jV}k:s/^/>/<CR>{/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+<CR>"ayt]`a"ap
" send to sympatico abuse
map =vvs Aabuse@in.bell.ca<Esc>/^subj<CR>WCvirus received from <Esc>ma}}}?iPlanet<CR>/^Received<CR>V/^[^ ]<CR>k"ay{{PO<Esc>jV}k:s/^/>/<CR>{/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+<CR>"ayt]`a"apG{{{kV{6js[...]<Esc>gg}O<CR>XYZ virus detected by ClamAV<Esc>0ce
map =vss Aabuse@in.bell.ca<Esc>/^subj<CR>WCspam received from <Esc>ma}}}?iPlanet<CR>?^Received<CR>V/^[^ ]<CR>k"ay{{PO<Esc>jV}k:s/^/>/<CR>{/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+<CR>"ayt]`a"ap
" hotmail spam reply
map =vsh Aabuse@hotmail.com<Esc>/^subj<CR>WCspam received from <Esc>ma}}}?iPlanet<CR>?^Received<CR>V/<CR>k"ay{{PO<Esc>jV}k:s/^/>/<CR>{/(<CR>lvh%h"ay`a"apG?^Received<CR>2W"ayWgg}"aPO<Esc>wiOriginating IP address: <Esc>o<Esc>
" an anonymous attribute
map =om 0C--- Original Message ---<Esc>
}}}
{{{
setlocal list
setlocal noexpandtab
setlocal shiftwidth=8
}}}
{{{
" ref: /usr/local/share/vim/ftplugin
if exists("b:did_ftplugin") | finish | endif
let b:did_ftplugin = 1
setlocal comments=:#
setlocal cindent
setlocal cinkeys-=0#
nmap =px :!perl -Mdiagnostics %<CR>
" check for error by running the script just through the perl compilation step
nmap =pc :!perl -Mdiagnostics -c %<CR>
" ... and when the script uses -T
nmap =pt :!perl -Mdiagnostics -Tc %<CR>
"map =c j{jV}k:s/^/#/<CR>:nohls<CR>
"map =C j{jV}k:s/^#//<CR>:nohls<CR>
vmap =c :s/^/#_#/<CR>:nohls<CR>
vmap =C :s/^#_#//<CR>:nohls<CR>
}}}
{{{
" ref: /usr/local/share/vim/ftplugin
if exists("b:did_ftplugin") | finish | endif
let b:did_ftplugin = 1
vmap =c :s/^/#_#/<CR>:nohls<CR>
vmap =C :s/^#_#//<CR>:nohls<CR>
call SetToCoding()
}}}
!prep for birth
--double stroller! need all the accoutrements with no car--
hire doula by end of june
maybe rosie from 3 bakers
clean out kid’s room
get bassinet from katie
cradle from lisa or janice
retrieve newborn diapers and clothes—fix velcro
--names!--
--later: exersaucer--
gymini and other baby toys
sept: swing from katie
Source: [[Whiteboard: prep for birth|https://123.writeboard.com/c22385edd32b3d23d]]
LabourAde
{{{
" ref: /usr/local/share/vim/ftplugin
if exists("b:did_ftplugin") | finish | endif
let b:did_ftplugin = 1
setlocal comments=:#
setlocal cindent
setlocal cinkeys-=0#
setlocal shiftwidth=2
vmap =c :s/^/#_#/<CR>:nohls<CR>
vmap =C :s/^#_#//<CR>:nohls<CR>
nmap =px :!ruby -dw %<CR>
" check for error by running the script just through the perl compilation step
nmap =pc :!ruby -dwc %<CR>
" ... and when the script uses -T
nmap =pt :!ruby -dwTc %<CR>
}}}
{{{
" ref: /usr/local/share/vim/ftplugin
if exists("b:did_ftplugin") | finish | endif
let b:did_ftplugin = 1
setlocal comments=:#
setlocal cindent
setlocal cinkeys-=0#
vmap =c :s/^/#_#/<CR>:nohls<CR>
vmap =C :s/^#_#//<CR>:nohls<CR>
" send file to static syntax checker
nmap =ch :!frink -DMJ %<CR>
}}}