tiddlyblog/0000755000076500007650000000000010364466143014002 5ustar pboudapbouda00000000000000tiddlyblog/._.DS_Store0000400000076500000000000000012210357770557015504 0ustar pboudawheel00000000000000Mac OS X  2 R@tiddlyblog/.DS_Store0000700000076500007650000001400410357770557015466 0ustar pboudapbouda00000000000000Bud1  up_sty backup_styleIlocblobÛ.ÿÿÿÿÿÿblogIlocblob_ ÿÿÿÿÿÿblogfwi0blobicnvblogfwswlong{blogicspblob blosxom.cgiIlocblob ÿÿÿÿÿÿpluginsIlocblobÔÿÿÿÿÿÿpluginsicspblobtxtIlocblobÛÔÿÿÿÿÿÿtxtfwi0blobicnvtxtfwswlong{txticspblobN  @€ @€ @€ @ E DSDB `€ @€ @€ @tiddlyblog/backup_style/0000755000076500007650000000000010263310633016455 5ustar pboudapbouda00000000000000tiddlyblog/backup_style/content_type.html0000644000076500007650000000001210263310633022047 0ustar pboudapbouda00000000000000text/html tiddlyblog/backup_style/date.html0000644000076500007650000000016410263310633020261 0ustar pboudapbouda00000000000000
$date_translate::dw, $da. $date_translate::mo $yr
tiddlyblog/backup_style/foot.html0000644000076500007650000000026010263310633020310 0ustar pboudapbouda00000000000000
    tiddlyblog/backup_style/head.html0000700000076500007650000000440210263310633020235 0ustar pboudapbouda00000000000000 $blog_title
$blog_title
   


$blog_title
$blog_description

Sepp Seestern
sepp.seestern ät gmx.de

RSS (inkl. Podcast)

Impressum

Links

  • Kura
  • Alexander E. Osthelder
  • Linguatec
  • u.s.w
  • Kategorien $categorytree::display


           
    tiddlyblog/backup_style/story.html0000644000076500007650000000046310263310633020526 0ustar pboudapbouda00000000000000
    $title
    $body
    [$path] permanent link
    tiddlyblog/blog/0000755000076500007650000000000010364471706014726 5ustar pboudapbouda00000000000000tiddlyblog/blog/._.DS_Store0000400000076500000000000000012210364471636016421 0ustar pboudawheel00000000000000Mac OS X  2 R@tiddlyblog/blog/.DS_Store0000700000076500007650000003000410364471636016401 0ustar pboudapbouda00000000000000Bud1%  @€ @€ @€ @ E%DSDB`€ @€ @€ @ E DSDB `€ @€ @€ @tiddlyblog/blog/2006/0000755000076500007650000000000010364471706015315 5ustar pboudapbouda00000000000000tiddlyblog/blog/2006/index.html0000644000076500007650000045466310364471706017334 0ustar pboudapbouda00000000000000 TiddlyWiki - a reusable non-linear personal web notebook
    Blogtitle
    Blogsubtitle
    [[category|http://www.yourdomain.de/category]] (2) [[podcast|http://www.yourdomain.de/podcast]] (1) [[Archive 2006|/2006/index.html]]\n[[RSS|index.rss]]\n\nerstellt mit [[tiddlywiki|http://www.tiddlywiki.com]]\nund [[blosxom|http://www.blosxom.com]]
    [[Merkel dir...]] [[Back again (Update)]] [[Blog dich halt selbst]]
    [podcast[Spaß mit TTS|http://www.j-sus.de/voicebox/20050930114959.mp3|24764|mpeg/audio]] \n\n//Kategorie:// [[/podcast|http://www.yourdomain.de/podcast]]\n
    Nach Umzug im Virtuellen sowie in der wirklichen Welt bin ich nun zurück. Aber [[andere|http://www.spreeblick.de]] ziehen ja auch um. Brauchen nur nicht so lang. Leben dafür vom Bloggen. Jedenfalls habe ich gleich noch das neueste [[TiddlyWiki|http://www.tiddlywiki.com]] verwendet, sogar mit Tag-Unterstüzung. Ich werde demnächst hier mal alles veröffentlichen, wie das so funktioniert. Dann kan Wordpress einpacken... Hehe! [Update: Jetzt auch mit TiddlyWiki 2.0, Veröffentlichung war kurz nachdem ich alle Änderungen an Version 1.29 gemacht hatte... Grrr!]\n\n//Kategorie:// [[/category|http://www.yourdomain.de/category]]\n
    Ach ja, wie schön, dass es heutzutage so etwas wie [[Blogs|http://www.feisar.de/content/gfx_de_breakingnews.html]] gibt.\n\n//Kategorie:// [[/category|http://www.yourdomain.de/category]]\n
    tiddlyblog/blog/2006/index.rss0000644000076500007650000000317710364471706017165 0ustar pboudapbouda00000000000000 Blogtitle http://www.yourdomain.de Blogsubtitle de Merkel dir... http://www.yourdomain.de/2006/#[[Merkel dir...]] [podcast[Spaß mit TTS|http://www.j-sus.de/voicebox/20050930114959.mp3|24764|mpeg/audio]] Back again (Update) http://www.yourdomain.de/2006/#[[Back again (Update)]] Nach Umzug im Virtuellen sowie in der wirklichen Welt bin ich nun zurück. Aber [[andere|http://www.spreeblick.de]] ziehen ja auch um. Brauchen nur nicht so lang. Leben dafür vom Bloggen. Jedenfalls habe ich gleich noch das neueste [[TiddlyWiki|http://www.tiddlywiki.com]] verwendet, sogar mit Tag-Unterstüzung. Ich werde demnächst hier mal alles veröffentlichen, wie das so funktioniert. Dann kan Wordpress einpacken... Hehe! [Update: Jetzt auch mit TiddlyWiki 2.0, Veröffentlichung war kurz nachdem ich alle Änderungen an Version 1.29 gemacht hatte... Grrr!] Blog dich halt selbst http://www.yourdomain.de/2006/#[[Blog dich halt selbst]] Ach ja, wie schön, dass es heutzutage so etwas wie [[Blogs|http://www.feisar.de/content/gfx_de_breakingnews.html]] gibt. tiddlyblog/blog/category/0000755000076500007650000000000010364471706016543 5ustar pboudapbouda00000000000000tiddlyblog/blog/category/index.html0000644000076500007650000045422310364471706020552 0ustar pboudapbouda00000000000000 TiddlyWiki - a reusable non-linear personal web notebook
    Blogtitle
    Blogsubtitle
    [[category|http://www.yourdomain.de/category]] (2) [[podcast|http://www.yourdomain.de/podcast]] (1) [[Archive 2006|/2006/index.html]]\n[[RSS|index.rss]]\n\nerstellt mit [[tiddlywiki|http://www.tiddlywiki.com]]\nund [[blosxom|http://www.blosxom.com]]
    [[Back again (Update)]] [[Blog dich halt selbst]]
    Nach Umzug im Virtuellen sowie in der wirklichen Welt bin ich nun zurück. Aber [[andere|http://www.spreeblick.de]] ziehen ja auch um. Brauchen nur nicht so lang. Leben dafür vom Bloggen. Jedenfalls habe ich gleich noch das neueste [[TiddlyWiki|http://www.tiddlywiki.com]] verwendet, sogar mit Tag-Unterstüzung. Ich werde demnächst hier mal alles veröffentlichen, wie das so funktioniert. Dann kan Wordpress einpacken... Hehe! [Update: Jetzt auch mit TiddlyWiki 2.0, Veröffentlichung war kurz nachdem ich alle Änderungen an Version 1.29 gemacht hatte... Grrr!]\n\n//Kategorie:// [[/category|http://www.yourdomain.de/category]]\n
    Ach ja, wie schön, dass es heutzutage so etwas wie [[Blogs|http://www.feisar.de/content/gfx_de_breakingnews.html]] gibt.\n\n//Kategorie:// [[/category|http://www.yourdomain.de/category]]\n
    tiddlyblog/blog/category/index.rss0000644000076500007650000000261210364471706020404 0ustar pboudapbouda00000000000000 Blogtitle http://www.yourdomain.de Blogsubtitle de Back again (Update) http://www.yourdomain.de/2006/#[[Back again (Update)]] Nach Umzug im Virtuellen sowie in der wirklichen Welt bin ich nun zurück. Aber [[andere|http://www.spreeblick.de]] ziehen ja auch um. Brauchen nur nicht so lang. Leben dafür vom Bloggen. Jedenfalls habe ich gleich noch das neueste [[TiddlyWiki|http://www.tiddlywiki.com]] verwendet, sogar mit Tag-Unterstüzung. Ich werde demnächst hier mal alles veröffentlichen, wie das so funktioniert. Dann kan Wordpress einpacken... Hehe! [Update: Jetzt auch mit TiddlyWiki 2.0, Veröffentlichung war kurz nachdem ich alle Änderungen an Version 1.29 gemacht hatte... Grrr!] Blog dich halt selbst http://www.yourdomain.de/2006/#[[Blog dich halt selbst]] Ach ja, wie schön, dass es heutzutage so etwas wie [[Blogs|http://www.feisar.de/content/gfx_de_breakingnews.html]] gibt. tiddlyblog/blog/index.html0000644000076500007650000045466310364471706016745 0ustar pboudapbouda00000000000000 TiddlyWiki - a reusable non-linear personal web notebook
    Blogtitle
    Blogsubtitle
    [[category|http://www.yourdomain.de/category]] (2) [[podcast|http://www.yourdomain.de/podcast]] (1) [[Archive 2006|/2006/index.html]]\n[[RSS|index.rss]]\n\nerstellt mit [[tiddlywiki|http://www.tiddlywiki.com]]\nund [[blosxom|http://www.blosxom.com]]
    [[Merkel dir...]] [[Back again (Update)]] [[Blog dich halt selbst]]
    [podcast[Spaß mit TTS|http://www.j-sus.de/voicebox/20050930114959.mp3|24764|mpeg/audio]] \n\n//Kategorie:// [[/podcast|http://www.yourdomain.de/podcast]]\n
    Nach Umzug im Virtuellen sowie in der wirklichen Welt bin ich nun zurück. Aber [[andere|http://www.spreeblick.de]] ziehen ja auch um. Brauchen nur nicht so lang. Leben dafür vom Bloggen. Jedenfalls habe ich gleich noch das neueste [[TiddlyWiki|http://www.tiddlywiki.com]] verwendet, sogar mit Tag-Unterstüzung. Ich werde demnächst hier mal alles veröffentlichen, wie das so funktioniert. Dann kan Wordpress einpacken... Hehe! [Update: Jetzt auch mit TiddlyWiki 2.0, Veröffentlichung war kurz nachdem ich alle Änderungen an Version 1.29 gemacht hatte... Grrr!]\n\n//Kategorie:// [[/category|http://www.yourdomain.de/category]]\n
    Ach ja, wie schön, dass es heutzutage so etwas wie [[Blogs|http://www.feisar.de/content/gfx_de_breakingnews.html]] gibt.\n\n//Kategorie:// [[/category|http://www.yourdomain.de/category]]\n
    tiddlyblog/blog/index.rss0000644000076500007650000000317710364471706016576 0ustar pboudapbouda00000000000000 Blogtitle http://www.yourdomain.de Blogsubtitle de Merkel dir... http://www.yourdomain.de/2006/#[[Merkel dir...]] [podcast[Spaß mit TTS|http://www.j-sus.de/voicebox/20050930114959.mp3|24764|mpeg/audio]] Back again (Update) http://www.yourdomain.de/2006/#[[Back again (Update)]] Nach Umzug im Virtuellen sowie in der wirklichen Welt bin ich nun zurück. Aber [[andere|http://www.spreeblick.de]] ziehen ja auch um. Brauchen nur nicht so lang. Leben dafür vom Bloggen. Jedenfalls habe ich gleich noch das neueste [[TiddlyWiki|http://www.tiddlywiki.com]] verwendet, sogar mit Tag-Unterstüzung. Ich werde demnächst hier mal alles veröffentlichen, wie das so funktioniert. Dann kan Wordpress einpacken... Hehe! [Update: Jetzt auch mit TiddlyWiki 2.0, Veröffentlichung war kurz nachdem ich alle Änderungen an Version 1.29 gemacht hatte... Grrr!] Blog dich halt selbst http://www.yourdomain.de/2006/#[[Blog dich halt selbst]] Ach ja, wie schön, dass es heutzutage so etwas wie [[Blogs|http://www.feisar.de/content/gfx_de_breakingnews.html]] gibt. tiddlyblog/blog/podcast/0000755000076500007650000000000010364471706016363 5ustar pboudapbouda00000000000000tiddlyblog/blog/podcast/index.html0000644000076500007650000045255710364471706020402 0ustar pboudapbouda00000000000000 TiddlyWiki - a reusable non-linear personal web notebook
    Blogtitle
    Blogsubtitle
    [[category|http://www.yourdomain.de/category]] (2) [[podcast|http://www.yourdomain.de/podcast]] (1) [[Archive 2006|/2006/index.html]]\n[[RSS|index.rss]]\n\nerstellt mit [[tiddlywiki|http://www.tiddlywiki.com]]\nund [[blosxom|http://www.blosxom.com]]
    [[Merkel dir...]]
    [podcast[Spaß mit TTS|http://www.j-sus.de/voicebox/20050930114959.mp3|24764|mpeg/audio]] \n\n//Kategorie:// [[/podcast|http://www.yourdomain.de/podcast]]\n
    tiddlyblog/blog/podcast/index.rss0000644000076500007650000000117610364471706020230 0ustar pboudapbouda00000000000000 Blogtitle http://www.yourdomain.de Blogsubtitle de Merkel dir... http://www.yourdomain.de/2006/#[[Merkel dir...]] [podcast[Spaß mit TTS|http://www.j-sus.de/voicebox/20050930114959.mp3|24764|mpeg/audio]] tiddlyblog/blosxom.cgi0000700000076500007650000004235210357770525016154 0ustar pboudapbouda00000000000000#!/usr/bin/perl # Blosxom # Author: Rael Dornfest # Version: 2.0 # Home/Docs/Licensing: http://www.raelity.org/apps/blosxom/ package blosxom; # --- Configurable variables ----- # What's this blog's title? $blog_title = "Blogtitle"; # What's this blog's description (for outgoing RSS feed)? $blog_description = "Blogsubtitle"; # What's this blog's primary language (for outgoing RSS feed)? $blog_language = "de"; # Where are this blog's entries kept? $datadir = "/Users/pbouda/tiddlyblog/txt"; # What's my preferred base URL for this blog (leave blank for automatic)? $url = "http://www.yourdomain.de/"; # Should I stick only to the datadir for items or travel down the # directory hierarchy looking for items? If so, to what depth? # 0 = infinite depth (aka grab everything), 1 = datadir only, n = n levels down $depth = 0; # How many entries should I show on the home page? $num_entries = 15; # What file extension signifies a blosxom entry? $file_extension = "txt"; # What is the default flavour? $default_flavour = "html"; # Should I show entries from the future (i.e. dated after now)? $show_future_entries = 0; # --- Plugins (Optional) ----- # Where are my plugins kept? $plugin_dir = "/Users/pbouda/tiddlyblog/plugins"; # Where should my modules keep their state information? $plugin_state_dir = "$plugin_dir/state"; # --- Static Rendering ----- # Where are this blog's static files to be created? $static_dir = "/Users/pbouda/tiddlyblog/blog"; # What's my administrative password (you must set this for static rendering)? $static_password = "test"; # What flavours should I generate statically? @static_flavours = qw/html rss/; # Should I statically generate individual entries? # 0 = no, 1 = yes $static_entries = 0; # -------------------------------- use vars qw! $version $blog_title $blog_description $blog_language $datadir $url %template $template $depth $num_entries $file_extension $default_flavour $static_or_dynamic $plugin_dir $plugin_state_dir @plugins %plugins $static_dir $static_password @static_flavours $static_entries $path_info $path_info_yr $path_info_mo $path_info_da $path_info_mo_num $flavour $static_or_dynamic %month2num @num2month $interpolate $entries $output $header $show_future_entries %files %indexes %others !; use strict; use FileHandle; use File::Find; use File::stat; use Time::localtime; use CGI qw/:standard :netscape/; $version = "2.0"; my $fh = new FileHandle; %month2num = (nil=>'00', Jan=>'01', Feb=>'02', Mar=>'03', Apr=>'04', May=>'05', Jun=>'06', Jul=>'07', Aug=>'08', Sep=>'09', Oct=>'10', Nov=>'11', Dec=>'12'); @num2month = sort { $month2num{$a} <=> $month2num{$b} } keys %month2num; # Use the stated preferred URL or figure it out automatically $url ||= url(); $url =~ s/^included:/http:/; # Fix for Server Side Includes (SSI) $url =~ s!/$!!; # Drop ending any / from dir settings $datadir =~ s!/$!!; $plugin_dir =~ s!/$!!; $static_dir =~ s!/$!!; # Fix depth to take into account datadir's path $depth and $depth += ($datadir =~ tr[/][]) - 1; # Global variable to be used in head/foot.{flavour} templates $path_info = ''; $static_or_dynamic = (!$ENV{GATEWAY_INTERFACE} and param('-password') and $static_password and param('-password') eq $static_password) ? 'static' : 'dynamic'; $static_or_dynamic eq 'dynamic' and param(-name=>'-quiet', -value=>1); # Path Info Magic # Take a gander at HTTP's PATH_INFO for optional blog name, archive yr/mo/day my @path_info = split m{/}, path_info() || param('path'); shift @path_info; while ($path_info[0] and $path_info[0] =~ /^[a-zA-Z].*$/ and $path_info[0] !~ /(.*)\.(.*)/) { $path_info .= '/' . shift @path_info; } # Flavour specified by ?flav={flav} or index.{flav} $flavour = ''; if ( $path_info[$#path_info] =~ /(.+)\.(.+)$/ ) { $flavour = $2; $1 ne 'index' and $path_info .= "/$1.$2"; pop @path_info; } else { $flavour = param('flav') || $default_flavour; } # Strip spurious slashes $path_info =~ s!(^/*)|(/*$)!!g; # Date fiddling ($path_info_yr,$path_info_mo,$path_info_da) = @path_info; $path_info_mo_num = $path_info_mo ? ( $path_info_mo =~ /\d{2}/ ? $path_info_mo : ($month2num{ucfirst(lc $path_info_mo)} || undef) ) : undef; # Define standard template subroutine, plugin-overridable at Plugins: Template $template = sub { my ($path, $chunk, $flavour) = @_; do { return join '', <$fh> if $fh->open("< $datadir/$path/$chunk.$flavour"); } while ($path =~ s/(\/*[^\/]*)$// and $1); return join '', ($template{$flavour}{$chunk} || $template{error}{$chunk} || ''); }; # Bring in the templates %template = (); while () { last if /^(__END__)?$/; my($ct, $comp, $txt) = /^(\S+)\s(\S+)\s(.*)$/; $txt =~ s/\\n/\n/mg; $template{$ct}{$comp} = $txt; } # Plugins: Start if ( $plugin_dir and opendir PLUGINS, $plugin_dir ) { foreach my $plugin ( grep { /^\w+$/ && -f "$plugin_dir/$_" } sort readdir(PLUGINS) ) { my($plugin_name, $off) = $plugin =~ /^\d*(\w+?)(_?)$/; my $on_off = $off eq '_' ? -1 : 1; require "$plugin_dir/$plugin"; $plugin_name->start() and ( $plugins{$plugin_name} = $on_off ) and push @plugins, $plugin_name; } closedir PLUGINS; } # Plugins: Template # Allow for the first encountered plugin::template subroutine to override the # default built-in template subroutine my $tmp; foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('template') and defined($tmp = $plugin->template()) and $template = $tmp and last; } # Provide backward compatibility for Blosxom < 2.0rc1 plug-ins sub load_template { return &$template(@_); } # Define default find subroutine $entries = sub { my(%files, %indexes, %others); find( sub { my $d; my $curr_depth = $File::Find::dir =~ tr[/][]; return if $depth and $curr_depth > $depth; if ( # a match $File::Find::name =~ m!^$datadir/(?:(.*)/)?(.+)\.$file_extension$! # not an index, .file, and is readable and $2 ne 'index' and $2 !~ /^\./ and (-r $File::Find::name) ) { # to show or not to show future entries ( $show_future_entries or stat($File::Find::name)->mtime < time ) # add the file and its associated mtime to the list of files and $files{$File::Find::name} = stat($File::Find::name)->mtime # static rendering bits and ( param('-all') or !-f "$static_dir/$1/index." . $static_flavours[0] or stat("$static_dir/$1/index." . $static_flavours[0])->mtime < stat($File::Find::name)->mtime ) and $indexes{$1} = 1 #and $d = join('/', (nice_date($files{$File::Find::name}))[5,2,3]) and $d = (nice_date($files{$File::Find::name}))[5] and $indexes{$d} = $d and $static_entries and $indexes{ ($1 ? "$1/" : '') . "$2.$file_extension" } = 1 } else { !-d $File::Find::name and -r $File::Find::name and $others{$File::Find::name} = stat($File::Find::name)->mtime } }, $datadir ); #print %indexes; return (\%files, \%indexes, \%others); }; # Plugins: Entries # Allow for the first encountered plugin::entries subroutine to override the # default built-in entries subroutine my $tmp; foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('entries') and defined($tmp = $plugin->entries()) and $entries = $tmp and last; } my ($files, $indexes, $others) = &$entries(); %files = %$files; %indexes = %$indexes; %others = ref $others ? %$others : (); # Plugins: Filter foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('filter') and $entries = $plugin->filter(\%files, \%others) } # Static if (!$ENV{GATEWAY_INTERFACE} and param('-password') and $static_password and param('-password') eq $static_password) { param('-quiet') or print "Blosxom is generating static index pages...\n"; # Home Page and Directory Indexes my %done; foreach my $path ( sort keys %indexes) { my $p = ''; foreach ( ('', split /\//, $path) ) { $p .= "/$_"; $p =~ s!^/!!; $path_info = $p; $done{$p}++ and next; (-d "$static_dir/$p" or $p =~ /\.$file_extension$/) or mkdir "$static_dir/$p", 0755; foreach $flavour ( @static_flavours ) { my $content_type = (&$template($p,'content_type',$flavour)); $content_type =~ s!\n.*!!s; my $fn = $p =~ m!^(.+)\.$file_extension$! ? $1 : "$p/index"; param('-quiet') or print "$fn.$flavour\n"; my $fh_w = new FileHandle "> $static_dir/$fn.$flavour" or die "Couldn't open $static_dir/$p for writing: $!"; $output = ''; print $fh_w $indexes{$path} == 1 ? &generate('static', $p, '', $flavour, $content_type) : &generate('static', '', $p, $flavour, $content_type); #print $fh_w &generate('static', $p, '', $flavour, $content_type); $fh_w->close; } } } } # Dynamic else { my $content_type = (&$template($path_info,'content_type',$flavour)); $content_type =~ s!\n.*!!s; $header = {-type=>$content_type}; print generate('dynamic', $path_info, "$path_info_yr/$path_info_mo_num/$path_info_da", $flavour, $content_type); } # Plugins: End foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('end') and $entries = $plugin->end() } # Generate sub generate { my($static_or_dynamic, $currentdir, $date, $flavour, $content_type) = @_; my %f = %files; # Plugins: Skip # Allow plugins to decide if we can cut short story generation my $skip; foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('skip') and defined($tmp = $plugin->skip()) and $skip = $tmp and last; } # Define default interpolation subroutine $interpolate = sub { package blosxom; my $template = shift; $template =~ s/(\$\w+(?:::)?\w*)/"defined $1 ? $1 : ''"/gee; return $template; }; unless (defined($skip) and $skip) { # Plugins: Interpolate # Allow for the first encountered plugin::interpolate subroutine to # override the default built-in interpolate subroutine my $tmp; foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('interpolate') and defined($tmp = $plugin->interpolate()) and $interpolate = $tmp and last; } # Head my $head = (&$template($currentdir,'head',$flavour)); # Plugins: Head foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('head') and $entries = $plugin->head($currentdir, \$head) } $head = &$interpolate($head); $output .= $head; # Stories my $curdate = ''; my $ne = $num_entries; if ( $currentdir =~ /(.*?)([^\/]+)\.(.+)$/ and $2 ne 'index' ) { $currentdir = "$1$2.$file_extension"; $files{"$datadir/$1$2.$file_extension"} and %f = ( "$datadir/$1$2.$file_extension" => $files{"$datadir/$1$2.$file_extension"} ); } else { $currentdir =~ s!/index\..+$!!; } # Define a default sort subroutine my $sort = sub { my($files_ref) = @_; return sort { $files_ref->{$b} <=> $files_ref->{$a} } keys %$files_ref; }; # Plugins: Sort # Allow for the first encountered plugin::sort subroutine to override the # default built-in sort subroutine my $tmp; foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('sort') and defined($tmp = $plugin->sort()) and $sort = $tmp and last; } foreach my $path_file ( &$sort(\%f, \%others) ) { last if $ne <= 0 && $date !~ /\d/; use vars qw/ $path $fn /; ($path,$fn) = $path_file =~ m!^$datadir/(?:(.*)/)?(.*)\.$file_extension!; # Only stories in the right hierarchy $path =~ /^$currentdir/ or $path_file eq "$datadir/$currentdir" or next; # Prepend a slash for use in templates only if a path exists $path &&= "/$path"; # Date fiddling for by-{year,month,day} archive views use vars qw/ $dw $mo $mo_num $da $ti $yr $hr $min $hr12 $ampm /; ($dw,$mo,$mo_num,$da,$ti,$yr) = nice_date($files{"$path_file"}); ($hr,$min) = split /:/, $ti; ($hr12, $ampm) = $hr >= 12 ? ($hr - 12,'pm') : ($hr, 'am'); $hr12 =~ s/^0//; $hr12 == 0 and $hr12 = 12; # Only stories from the right date my($path_info_yr,$path_info_mo_num, $path_info_da) = split /\//, $date; next if $path_info_yr && $yr != $path_info_yr; last if $path_info_yr && $yr < $path_info_yr; next if $path_info_mo_num && $mo ne $num2month[$path_info_mo_num]; next if $path_info_da && $da != $path_info_da; last if $path_info_da && $da < $path_info_da; # Date my $date = (&$template($path,'date',$flavour)); # Plugins: Date foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('date') and $entries = $plugin->date($currentdir, \$date, $files{$path_file}, $dw,$mo,$mo_num,$da,$ti,$yr) } $date = &$interpolate($date); $curdate ne $date and $curdate = $date and $output .= $date; use vars qw/ $title $body $raw $tags /; if (-f "$path_file" && $fh->open("< $path_file")) { chomp($title = <$fh>); ($title,$tags) = split(/\|/,$title); chomp($body = join '', <$fh>); $fh->close; $raw = "$title\n$body"; } my $story = (&$template($path,'story',$flavour)); # Plugins: Story foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('story') and $entries = $plugin->story($path, $fn, \$story, \$title, \$body) } if ($content_type =~ m{\Wxml$}) { # Escape <, >, and &, and to produce valid RSS my %escape = ('<'=>'<', '>'=>'>', '&'=>'&', '"'=>'"'); my $escape_re = join '|' => keys %escape; $title =~ s/($escape_re)/$escape{$1}/g; $body =~ s/($escape_re)/$escape{$1}/g; } $story = &$interpolate($story); $output .= $story; $fh->close; $ne--; } # Foot my $foot = (&$template($currentdir,'foot',$flavour)); # Plugins: Foot foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('foot') and $entries = $plugin->foot($currentdir, \$foot) } $foot = &$interpolate($foot); $output .= $foot; # Plugins: Last foreach my $plugin ( @plugins ) { $plugins{$plugin} > 0 and $plugin->can('last') and $entries = $plugin->last() } } # End skip # Finally, add the header, if any and running dynamically $static_or_dynamic eq 'dynamic' and $header and $output = header($header) . $output; $output; } sub nice_date { my($unixtime) = @_; my $c_time = ctime($unixtime); my($dw,$mo,$da,$ti,$yr) = ( $c_time =~ /(\w{3}) +(\w{3}) +(\d{1,2}) +(\d{2}:\d{2}):\d{2} +(\d{4})$/ ); $da = sprintf("%02d", $da); my $mo_num = $month2num{$mo}; return ($dw,$mo,$mo_num,$da,$ti,$yr); } # Default HTML and RSS template bits __DATA__ html content_type text/html html head $blog_title $path_info_da $path_info_mo $path_info_yr
    $blog_title
    $path_info_da $path_info_mo $path_info_yr

    html story

    $title
    $body

    posted at: $ti | path: $path | permanent link to this entry

    \n html date

    $dw, $da $mo $yr

    \n html foot

    rss content_type text/xml rss head \n\n\n\n\n \n $blog_title $path_info_da $path_info_mo $path_info_yr\n $url\n $blog_description\n $blog_language\n rss story \n $title\n $url/$yr/#[[$title]]\n $body\n $podcast::enclosure\n \n rss date \n rss foot \n podcast content_type text/xml podcast head \n\n\n\n\n \n $blog_title $path_info_da $path_info_mo $path_info_yr\n $url\n $blog_description\n $blog_language\n podcast story \n $title\n $url/$yr/$mo_num/$da#$fn\n -- \n $podcast::enclosure\n \n podcast date \n podcast foot \n error content_type text/html error head

    Error: I'm afraid this is the first I've heard of a "$flavour" flavoured Blosxom. Try dropping the "/+$flavour" bit from the end of the URL.\n\n error story

    $title
    $body #

    \n error date

    $dw, $da $mo $yr

    \n error foot __END__ tiddlyblog/._blosxom.LICENSE0000400000076500000000000000012210362441300016461 0ustar pboudawheel00000000000000Mac OS X  2 R****Hdratiddlyblog/blosxom.LICENSE0000644000076500000000000000205610362441300016266 0ustar pboudawheel00000000000000License Blosxom Copyright 2003, Rael Dornfest 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 above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 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. tiddlyblog/plugins/0000755000076500007650000000000010357771161015464 5ustar pboudapbouda00000000000000tiddlyblog/plugins/._.DS_Store0000400000076500000000000000012210357771163017157 0ustar pboudawheel00000000000000Mac OS X  2 R@tiddlyblog/plugins/.DS_Store0000700000076500007650000001400410357771163017141 0ustar pboudapbouda00000000000000Bud1 gorytr categorytreeIlocblob_ ÿÿÿÿÿÿ headlinesIlocblobÛzÿÿÿÿÿÿinterpolate_fancyIlocblobzÿÿÿÿÿÿpodcastIlocblob_zÿÿÿÿÿÿstateIlocblob ÿÿÿÿÿÿ  @€ @€ @€ @ E DSDB `€ @€ @€ @tiddlyblog/plugins/categorytree0000700000076500007650000001304310263310633020063 0ustar pboudapbouda00000000000000# Blosxom Plugin: categorytree # Author(s): Eric Davis foobargeek com> # Version: $Id: categorytree,v 1.7 2004/02/27 20:53:58 edavis Exp $ # Documentation: See the bottom of this file or type: perldoc categorytree # Modifications for indentation and counts by: Eric Davis http://www.foobargeek.com package categorytree; # --- Configurable variables ----- # If both $iWantIndents and $iDontWantSlashes are set then # $iWantIndents is shown and $iDontWantSlashes is overridden. # If neither are set then the normal directoy path with slashes # is displayed. # Set this to show an indented list tree. my $iWantIndents = 0; # This is the text used to indent a line one level to the right. # You could use special character codes (i.e. lines, corners, etc) my $indent = qq{  }; # Use these settings to show the number of entries in a category. my $iWantTheCount = 1; my $showCategoryIfZero = 0; my $showCountIfZero = 0; # These strings are tacked onto the beginning/end of the count. my $countPreStr = "("; my $countPostStr = ")"; # Set this to 1 if you want the slashes removed from your display # menu. Only valid if $iWantIndents is 0. my $iDontWantSlashes = 1; # Make this equal to what you want the non-leading slashes # replaced with when $iDontWantSlashes is 1. my $slashReplacement = " :: "; # -------------------------------- $display; # $categorytree::display use File::Find; use File::Basename; sub start { return 1; } sub filter { my ($pkg, $files_ref) = @_; my %categorycount; foreach (keys %$files_ref) { $_ =~ s/$blosxom::datadir//; $tmp = dirname($_); while (!($tmp =~ /^\/$/)) { if (exists($categorycount{$tmp})) { $categorycount{$tmp} += 1 } else { $categorycount{$tmp} = 1; } $tmp = dirname($tmp); } } @categorytree = sort keys %categorycount; #$display .= qq{
      \n}; foreach $thing (@categorytree) { if (($categorycount{$thing} != 0) || $showCategoryIfZero) { my $displayString = $thing; my $thisin; if ($iWantIndents) { $displayString =~ s!^\/!!; while ($displayString =~ s!(( \;)*)\w+\/!$1!) { $thisin .= $indent; } } elsif ($iDontWantSlashes) { $displayString =~ s!^\/!!; $displayString =~ s!\/!$slashReplacement!g; } $display .= qq{[[$displayString|$blosxom::url$thing]]}; if ($iWantTheCount) { if (($categorycount{$thing} != 0) || $showCountIfZero) { $display .= qq{ $countPreStr$categorycount{$thing}$countPostStr}; } } $display .= qq{\n}; } } #$display .= qq{
    }; return 1; } 1; __END__ =head1 NAME Blosxom Plugin: categorytree =head1 USAGE Just drop this into your blosxom plugins directory. Then, you can insert the B<$categorytree::display> variable into your flavour files wherever you want a list of your categories to go. Each line holds the name of one category, each one linked to the appropriate place in your blosxom weblog. By default a tree style list with indents is shown. This is controlled by the B<$iWantIndents> config variable. If B<$iWantIndents> is set to 0 then then the normal directory path with slashes is displayed. The B<$iDontWantSlashes> and B<$slashReplacement> variables are used to modify the normal directory path output. You can also show the number of blogs in each category by setting B<$iWantTheCount> equal to 1. This will show the number of blogs to the right of the category name. A parent category will show the number of blogs in itself and all children. If B<$showCategoryIfZero> is equal to 1 then an empty category is displayed. If B<$showCountIfZero> is equal to 1 then zero counts are displayed. Lastly you can specify the text before and after the count with B<$countPreStr> and B<$countPostStr>. The following class identifiers are used for CSS control of the list: B: the unordered list as a whole B: a single category item in the unordered list Note that you will want to run this plugin very early (i.e. before any other plugins that might modify the entries list). Rename this plugin to B<01categortytree> or something similar based on your plugin runtime priority naming scheme. =head1 VERSION 1.7 now runs during blosxom filter and no longer uses File::Find now much faster generation times since disk access is no more fixed bug with indents (links were underlining indent spaces) =head1 VERSION HISTORY 1.6 fixed bug where File::Find output being parsed incorrectly 1.5 fixed to use configured blosxom file extension instead of .txt 1.4 added newlines to output to html code is easier to read 1.3 now generates XHTML 1.0 strict code 1.2 fixed problem with how the global variable was defined 1.1 initial implementation =head1 AUTHORS Eric Davis foobargeek com> http://www.foobargeek.com =head1 LICENSE This source is submitted to the public domain. Feel free to use and modify it. If you like, a comment in your modified source attributing credit for my original work would be appreciated. THIS SOFTWARE IS PROVIDED AS IS AND WITHOUT ANY WARRANTY OF ANY KIND. USE AT YOUR OWN RISK! tiddlyblog/plugins/headlines0000700000076500007650000003405010361220135017317 0ustar pboudapbouda00000000000000# Blosxom Plugin: headlines # Author(s): Eric Davis foobargeek com> # Documentation: See the bottom of this file or type: perldoc headlines package headlines; # --- Configurable variables ----- # set this to the file used as the headline cache my $cachefile = "$blosxom::plugin_state_dir/headlines.dat"; # if you are going to want writeback counts then set this to 1 my $want_writeback_counts = 0; # if you are going to want comment counts then set these to # the same values you use for WritebackPlus (note that ONLY # WritebackPlus is supported) my $writeback_dir = "$blosxom::plugin_state_dir/writeback"; my $writeback_file_extension = "wb"; # if you want long dates then set your desired month strings here my @monthabbr = qw{Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec}; # -------------------------------- use CGI qw/:standard/; my $reindex = 0; my %blogs; sub start { #$reindex = 1 if (CGI::param('reindex')); $reindex = 1; return 1; } sub filter { my ($pkg, $files_ref) = @_; # open the $cachefile for reading/writing(append) and create if doesn't exist open(CACHE, "+>>$cachefile"); flock(CACHE, LOCK_EX); # if the file was just created then force a reindex if ((stat($cachefile))[7] == 0) { $reindex = 1; } if ($reindex) # re-cache all the headlines { truncate(CACHE, 0); foreach $key (keys %$files_ref) { # grab the headline for this blog entry open(FILE, "<$key") or next; $headline = ; close(FILE); # get the number of writebacks for this blog entry $wb_count = 0; $wb_count = get_writeback_count($key) if $want_writeback_counts; # cache the writeback count and blog headline print(CACHE "$key=wb=>$wb_count=hl=>$headline"); $blogs->{$key}->{headline} = $headline; $blogs->{$key}->{wb_count} = $wb_count; $blogs->{$key}->{date} = $files_ref->{$key}; } } else { seek(CACHE, 0, 0); # seek to the beginning of the cache file # grab all the cached headlines while () { if (/^(.*)=wb=>(.*)=hl=>(.*)$/) { $blogs->{$1}->{headline} = $3; $blogs->{$1}->{wb_count} = $2; $blogs->{$1}->{date} = $files_ref->{$1}; } } } flock(CACHE, LOCK_UN); close(CACHE); return 1; } sub get_writeback_count { my ($blog_entry) = @_; my $count = 0; # convert the full story path to the full writeback path $blog_entry =~ s/^$blosxom::datadir(.*)$blosxom::file_extension$/$writeback_dir$1$writeback_file_extension/; # open the WritebackPlus file for reading open(WB_FILE, "$blog_entry") or return 0; # count up the number of writebacks while () { $count++ if (/^-----$/) } close(WB_FILE); return $count; } sub get { my ($self, $attributes, $content) = @_; my $category = $attributes->{"category"}; my $css_class = $attributes->{"css_class"}; my $css_date_class = $attributes->{"css_date_class"}; my $css_item_class = $attributes->{"css_item_class"}; my $css_link_class = $attributes->{"css_link_class"}; my $max_to_show = $attributes->{"max_to_show"}; my $sort_method = $attributes->{"sort_method"}; my $show_dates = $attributes->{"show_dates"}; my $show_long_dates = $attributes->{"show_long_dates"}; my $indent = $attributes->{"indent"}; my $show_wb_count = $attributes->{"show_wb_count"}; my $wb_prefix = $attributes->{"wb_prefix"}; my $wb_postfix = $attributes->{"wb_postfix"}; my $return_data = ''; my $count = 0; my @sorted; my $url; my $hl; my $lastmonth; my $lastday; my $lastyear; my $month; my $day; my $year; if ($sort_method eq 'by_path_name') { @sorted = sort keys %$blogs; } if ($sort_method eq 'by_path_name_reverse') { @sorted = reverse sort keys %$blogs; } elsif ($sort_method eq 'by_title') { @sorted = sort { $blogs->{$a}->{headline} cmp $blogs->{$b}->{headline} } keys %$blogs; } elsif ($sort_method eq 'by_title_reverse') { @sorted = reverse sort { $blogs->{$a}->{headline} cmp $blogs->{$b}->{headline} } keys %$blogs; } elsif ($sort_method eq 'by_date_reverse') { @sorted = reverse sort { $blogs->{$b}->{date} <=> $blogs->{$a}->{date} } keys %$blogs; } else # ($sort_method eq 'by_date') { @sorted = sort { $blogs->{$b}->{date} <=> $blogs->{$a}->{date} } keys %$blogs; } #$return_data .= qq{
      \n}; foreach (@sorted) { # skip this entry if not part of the specified category next if !/^$blosxom::datadir$category.*$/; next if (!/^$blosxom::datadir\/$blosxom::path_info.*$/) #and $blosxom::path_info ne '' and (!($blosxom::path_info =~ /^20\d\d/)); $hl = $blogs->{$_}->{headline}; my @date = localtime($blogs->{$_}->{date}); $month = $date[4] + 1; $day = $date[3]; $year = $date[5] + 1900; next if ($blosxom::path_info =~ /^20\d\d/) and (!($blosxom::path_info =~ /$year/)); $url = $_; $url =~ s/^$blosxom::datadir(.*)$blosxom::file_extension$/$blosxom::url$1$blosxom::flavour/; if ($show_dates) { if (($month != $lastMonth) or ($day != $lastDay) or ($year != $lastYear)) { if ($show_long_dates) { $return_data .= qq{
    • @monthabbr[$month-1] $day, $year
    • \n}; } else { $return_data .= qq{
    • $month/$day/$year
    • \n}; } $lastMonth = $month; $lastDay = $day; $lastYear = $year; } } if ($show_wb_count) { $return_data .= qq{
    • $indent$hl $wb_prefix$blogs->{$_}->{wb_count}$wb_postfix
    • \n}; } else { $hl =~ s/\n$//; ($hl,$tags) = split(/\|/,$hl); $return_data .= qq{[[$hl]] }; } last if ($max_to_show and (++$count == $max_to_show)); } #$return_data .= qq{
    \n}; $return_data =~ s/( )$//; return $return_data; } 1; __END__ =head1 NAME Blosxom Plugin: headlines =head1 DESCRIPTION This plugin provides the ability to present a list of headlines for all the stories found by blosxom. Each headline in the list is a path based permalink to the story. The headlines shown is determined by a function call using the B plugin. The arguments to this function describe which headlines to show and how to show them. Therefore, you can implement multiple calls within your flavour files. Each call can present a completely different set of headlines (i.e. different categories, different sort methods, different layout, etc). You can also configure this plugin to display the number of writeback comments with each headline. Note that ONLY the WritebackPlus plugin is currently supported but it should be easy to support other comment type plugins. The following configuration variables must be configured properly before this plugin will work: B<$cachefile>: set this to the file used as the headline cache B<$want_writeback_counts>: if you are going to want writeback counts tacked on to each headline then set this (1 = on, 0 = off) B<$writeback_dir>: the location of the writeback data (make sure this variable is set to the same location as that configured in the WritebackPlus plugin) B<$writeback_file_extension>: the file extension of a writeback data file (make sure this variable is set to the same file extension as that configured in the WritebackPlus plugin) B<@monthabbr>: if you are going to use the long date format, modify this array to the month strings you would like to use Now the details on how to display a set of headlines within your flavour files. As already mentioned, you must have the B plugin installed for this to work. There is no configuration necessary for the B plugin so if you haven't already done so, download it and drop it into your plugin directory. Once you get familiar with B you'll get excited about the endless possibilitees. The headlines B function is simply called B. The most basic call is as follows: <@headlines.get output="yes" /> This would return an unordered list of all the story headlines on your site. There are a number of arguments you can pass to the B function that are used to modify the list returned. Here are the descriptions of each and their default setting if not passed to the B function: B: the category to pull headlines from (default: all categories) B: how to sort the headlines (default: B) The available sort methods are: B sorted by date (newest to oldest) B sorted by date (oldest to newest) B sorted alpha by the story's path B sorted reverse alpha by the story's path B sorted alpha by headline B sorted reverse alpha by headline B: the max number of headlines to show in the list (default: all) B: show a date string before the headline, headlines occuring on the same day fall under the same date headline (1 = yes, 0 = no) (default: 0) B: show Apr 8, 1973 instead of 4/8/1973 (1 = yes, 0 = no) (default: 0) B: indent string inserted before a headline, useful with B for contrast between the date and headline strings (default: "") B: show the number of writeback comments after each headline (1 = on, 0 = off) (default: 0) B: the string to prefix the writeback comment count (default: "") B: the string to postfix the writeback comment count (default: "") B: the CSS class identifier to use for the unordered list tag (default: "") B: the CSS class identifier to use for the date string list item (default: "") B: the CSS class identifier to use for the headline string list item (default: "") Here are some examples: The following will display the last 10 headlines from the "/sports" category with the writeback count for each headline and each count looking like "- N". <@headlines.get category="/sports" show_wb_count="1" wb_prefix="- " max_to_show="10" output="yes" /> The following will display the last 30 headlines (any category) with the writeback count for each headline and each count looking like "-N-". <@headlines.get show_wb_count="1" wb_prefix="-" wb_postfix="-" max_to_show="30" output="yes" /> The following will display all headlines sorted alphabetically by the title string. <@headlines.get sort_method="by_title" output="yes" /> The following will display the last 25 headlines (any category) with the date headers. Also specified are some CSS class identifiers. <@headlines.get show_dates="1" max_to_show="25" css_class="headlines" css_date_class="headlines_date" css_item_class="headlines_item" output="yes" /> The following will display the last 100 headlines from the "/computers/software/blosxom" category sorted in reverse date order (i.e. from oldest to newest). Long date strings will be inserted into the headline list and each headline will be indented four spaces and show a writeback count looking like "(N)". Also specified are some CSS class identifiers. <@headlines.get category="/computers/software/blosxom" sort_method="by_date_reverse" show_dates="1" show_long_dates="1" indent="    " max_to_show="100" show_wb_count="1" wb_prefix="(" wb_postfix=")" css_class="blosxom_headlines" css_date_class="blosxom_headlines_date" css_item_class="blosxom_headlines_item" output="yes" /> As you can see from the above examples, these B functions are very easy to use and also very powerful. Hopefully these examples are enough to help you on your way to creating an awesome site. Note that you will want to run this plugin very early (i.e. after the entry dates have been set and before any other plugins that might modify the entries list during the filter routine). Rename this plugin to B<01headlines> or something similar based on your plugin runtime priority naming scheme. The cache file is automatically created if it doesn't exist and the CGI parameter setting B will force the cache file be re-generated. Note that the original headline cache file is not compatible with that used by this new deviation of the headlines plugin. =head1 VERSION 2.1 deviation from original headlines v1.10 with lots of changes: almost a complete rewrite, added ability to get headlines on a per category basis, and added ability to show the number of writeback comments per headline =head1 VERSION HISTORY 2.1 deviation from original headlines v1.10 =head1 AUTHORS Eric Davis foobargeek com> http://www.foobargeek.com =head1 LICENSE This source is submitted to the public domain. Feel free to use and modify it. If you like, a comment in your modified source attributing credit for my original work would be appreciated. THIS SOFTWARE IS PROVIDED AS IS AND WITHOUT ANY WARRANTY OF ANY KIND. USE AT YOUR OWN RISK! tiddlyblog/plugins/interpolate_fancy0000700000076500007650000003001710263310632021073 0ustar pboudapbouda00000000000000# Blosxom Plugin: interpolate_fancy # Author(s): Rael Dornfest # Version: 2003-09-09:12:10 # Documentation: See the bottom of this file or type: # perldoc interpolate_fancy package interpolate_fancy; # --- Configurable variables ----- # Do you want me to recursively interpolate into the story $title # and $body? Consider and reconsider carefully before turning this # on as if anyone other than you has the ability to post stories, # there's a chance of some tomfoolery, exposing variables and calling # actions/subroutines you might not want called. # 0 = No (default), 1 = Yes my $recurse_into_story = 0; # -------------------------------- sub start { 1; } sub interpolate { return sub { package blosxom; # Halt recursive interpolation of story $body # by mangling interpolation tags (to be unmangled in a moment) unless ($recurse_into_story) { $blosxom::title =~ s/<(\@|\??\$)/<#INTERPOLATE_FANCY_DEFANG#$1/gsi; $blosxom::body =~ s/<(\@|\??\$)/<#INTERPOLATE_FANCY_DEFANG#$1/gsi; } my $template = shift; # Backward Compatibility with core Blosxom style interpolation $template =~ s#(?#gs; # Defined # e.g. display if defined $template =~ s#<\?(\$\w+(?:::)?\w*)>(.*?)<\/\?>#"defined $1 ? \$2 : undef"#gsee; # Undefined # e.g. display if not defined $template =~ s#<\?!(\$\w+(?:::)?\w*)>(.*?)<\/\?>#"!defined $1 ? \$2 : undef"#gsee; # Tests # eq (eq), ne (ne), lt (<), gt (>), like (=~), unlike (!~) # e.g. display if $var less than 123 $template =~ s#<\?(\$\w+(?:::)?\w*)\s+?(.+?)>(.*?)<\/\?>#"interpolate_fancy::_test(qq{$1}, q{$2}, q{$3})"#gsee; # Unconditional, Recursive # e.g. <$var /> while( $template =~ s/<\$([a-zA-Z?]\w+(?:::)?\w*)\s+?\/>/"defined \$$1 ? \$$1 : undef"/gsee ) { } # Actions # e.g. <@plugin.subroutine arg1="a" output="no" /> # e.g. <@plugin.subroutine encoding="Latin1" output="yes">pass content $template =~ s#<\@(\w+?)\.(\w+?)\s+?(.+?)?(?:>(.*?)<\/\@\1\.\2>|\s+?\/>)#&interpolate_fancy::_action($1,$2,$3,$4)#gse; # Unmangle mangled interpolation tags in story $title and $body # (by now in the template itself) unless ($recurse_into_story) { $template =~ s/<#INTERPOLATE_FANCY_DEFANG#(\@|\??\$)/<$1/gsi; } return $template; }; } sub _test { my($variable, $attr, $content) = @_; my $result; my $attributes = interpolate_fancy::_attributes($attr); defined $attributes->{eq} and return $variable eq $attributes->{eq} ? $content : undef; defined $attributes->{ne} and return $variable ne $attributes->{ne} ? $content : undef; defined $attributes->{gt} and return $variable > $attributes->{gt} ? $content : undef; defined $attributes->{lt} and return $variable < $attributes->{lt} ? $content : undef; defined $attributes->{like} and return $variable =~ /$attributes->{like}/ ? $content : undef; defined $attributes->{unlike} and return $variable !~ /$attributes->{unlike}/ ? $content : undef; return undef; } sub _action { my($plugin, $action, $attr, $content) = @_; $content =~ s#<\@(\w+?)\.(\w+?)\s+?(.+?)?(?:>(.*?)<\/\@\1\.\2>|\s+?\/>)#&interpolate_fancy::_action($1,$2,$3,$4)#gse; my $attributes = interpolate_fancy::_attributes($attr); $blosxom::plugins{$plugin} and $plugin->can($action) and $result = $plugin->$action($attributes, $content); return $attributes->{'output'} =~ /yes/i ? $result : undef; } sub _attributes { my $attr = shift; my $attributes = {}; while ( $attr =~ /\b(\w+?)\s*?=\s*?(["'])(.*?)\2/g ) { $attributes->{$1} = $3; } return $attributes; } 1; __END__ =head1 NAME Blosxom Plug-in: interpolate_fancy =head1 SYNOPSIS Overrides Blosxom's far simpler to use, but more limited, default interpolate() subroutine. Include bits of text and template variable values in templates, either conditionally or unconditionally: Perform actions (i.e. call plug-in subroutines) at any point in your page, whether to act on current content and return results or no. =head2 Includes * Unconditionally and recursively e.g. include a link to the story's path using various template variables. <$path /> Limited by the $recurse_into_story configuration directive (see the CONFIGURATION below). * Unconditionally and recursively (backward compatibility with Blosxom's standard interpolation) e.g. include a link to the story's path using various template variables. $path Limited by the $recurse_into_story configuration directive (see the CONFIGURATION below). * The template variable has a value (i.e. is defined) e.g. include a hyperlink to the story's path if it has a path (i.e. $path is defined). <$path /> * The template variable doesn't have a value (i.e. is NOT defined) e.g. include a hyperlink to home if path is undefined. home * The template variable is equal (=) to a particular value e.g. include "1 writeback" (singular) if the value of writeback count is 1 <$writeback::count /> writeback * The template variable is not equal (!=) to a particular value e.g. include "x writebacks" (plural) if the value of writeback count (x) is not 1 <$writeback::count /> writebacks * The template variable is less than (<) a particular value e.g. include "no writebacks" if the value of writeback count is < 1 no writebacks * The template variable is greater than (>) a particular value e.g. include "oodles of writebacks" if the value of writeback count is > 50 oodles of writebacks * The template variable is like (=~) a particular regular expression e.g. Greet a visitor properly, depending on their courtesy title Howdy, Sir M'am * The template variable is unlike (!~) a particular regular expression e.g. The posting is neither a film nor a book no review =head2 Actions Perform an action (i.e. call a plug-in's subroutine) at any point in your page. Optionally pass arguments as key/value pairs stated as XML-style attributes. For example: <@plugin.subroutine arg1="a" arg2="bee" /> calls &plugin::subroutine( {'arg1'=>'a', 'arg2'=>'bee' } ). Specify that results should be sent to the browser using the output="yes" attribute like so: <@plugin.subroutine arg1="a" arg2="bee" output="yes" /> Otherwise, subroutines will still have their effect, but the results will be tossed out. Content wrapped in the action call is sent as another argument to the subroutine: <@plugin.subroutine encoding="Latin1" output="yes"> pass this content This calls &plugin::subroutine( {'encoding'=>'Latin1', 'output'=>'yes' }, "pass this content" ). Actions are recursive, meaning that you can embed an action inside another, and so on and so on and so on. Actions are unfolded from the inside out, with the most deeply embedded first, second deepest second, and so forth until the outermost action is performed last. Recursion is limited by the $recurse_into_story configuration directive (see the CONFIGURATION below). =head3 An Example For those of you interested in writing plugin actions or using some of the more advanced features in your Blosxom blog templates, here are a couple of sample actions: -- # For the sake of this example, assume these actions live in a "myplugin" # plugin # This action strips HTML from its content sub strip_html { my($self, $attributes, $content) = @_; $content =~ s!!!g; return $content; } # This action foreshortens its content to a length specified in the call to # action's length attribute sub foreshorten { my($self, $attributes, $content) = @_; my $default_length = 144; return substr($content, 0, $attributes{'length'}||$default_length); } -- Calling these individually in a Blosxom flavour template looks something like: The following bit of text is devoid of HTML: <@myplugin.strip_html output="Yes"> Silly me, I plumb forgot to remove the HTML. The following bit of text is only 20 characters in length: <@myplugin.foreshorten output="Yes"> This text is far longer than 20 characters on the page, but will only appear as "This text is far lon" in the resulting page. And in combination, stripping the HTML _before_ foreshortening (notice the strip_html action is embedded inside the foreshorten action and thus is run first): The following bit of text is only 20 characters in length and devoid of HTML: <@myplugin.foreshorten output="Yes"> <@myplugin.strip_html output="Yes"> Silly me, I plumb forgot to remove the HTML. This text is far longer than 20 characters on the page, but will only appear as "This text is far lon" in the resulting page. =head1 INSTALLATION Drop the interpolate_fancy plug-in into your Blosxom plugins folder. =head1 CONFIGURATION None necessary; interpolate_fancy will run out of the box with no need of additional configuration or fiddling on your part (caveat: see BACKWARD COMPATILITY below). The interpolate_fancy plugin does sport one configuration directive which you should very much consider leaving alone. # 0 = No (default), 1 = Yes my $recurse_into_story = 0; $recurse_into_story decides whether or not the interpolation engine should respect and interpolate (swap for the associated value) variables and actions embedded in story $title and $body themselves. Off by default, you should consider and reconsider carefully before turning this on as if anyone other than you has the ability to post stories to your blog, there's a chance of some tomfoolery, exposing variables and calling actions/subroutines you might not want called. =head1 BACKWARD COMPATIBILITY If you've been using core Blosxom's interpolation style (e.g. $title), this plugin will provide backward compatibility, requiring no template rewriting on your part. If you've been using the interpolate_conditional plugin, the conditional bits won't be respected by default. You should run your templates through the interpolate2fancy utility [http://www.blosxom.com/downloads/utilities/interpolate2fancy.py]. =head1 VERSION 2003-09-09:12:10 =head1 AUTHOR Rael Dornfest , http://www.raelity.org/ =head1 SEE ALSO Blosxom Home/Docs/Licensing: http://www.raelity.org/apps/blosxom/ Blosxom Plugin Docs: http://www.raelity.org/apps/blosxom/plugin.shtml =head1 BUGS Address bug reports and comments to the Blosxom mailing list [http://www.yahoogroups.com/group/blosxom]. =head1 LICENSE Blosxom and this Blosxom Plug-in Copyright 2003, Rael Dornfest 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 above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 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. tiddlyblog/plugins/podcast0000744000076500007650000000164510357246003017043 0ustar pboudapbouda00000000000000# Blosxom Plugin: Podcast # Author(s): Peter Bouda # Version: 0.1 # Blosxom Home/Docs/Licensing: http://www.raelity.org/apps/blosxom/ package podcast; # --- Configurable variables ----- # -------------------------------- $enclosure; sub start { 1; } sub story { my ($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_; $enclosure = undef; #print "$filename\n$path\n"; open(F,"<$blosxom::datadir/$path/$filename.txt"); @lines = ; close(F); foreach (@lines) { if (/\.mp3/ and /embed/) { #$$body_ref="Podcast"; chomp(); (@tiles) = split(/ /); foreach (@tiles) { if (/^src/) { s/src="(.*?)"/$1/; $src = $_; } if (/^size/) { s/size="(.*?)"(.*)/$1/; $length = $_; } } $enclosure = ''; } } return 1; } 1; __END__ tiddlyblog/plugins/state/0000755000076500007650000000000010263310633016571 5ustar pboudapbouda00000000000000tiddlyblog/plugins/state/headlines.dat0000644000076500007650000000043310364471706021232 0ustar pboudapbouda00000000000000/Users/pbouda/tiddlyblog/txt/category/20050704203004.txt=wb=>0=hl=>Blog dich halt selbst /Users/pbouda/tiddlyblog/txt/podcast/20050930114959.txt=wb=>0=hl=>Merkel dir...|podcast politics /Users/pbouda/tiddlyblog/txt/category/20060106155600.txt=wb=>0=hl=>Back again (Update)|blog wiki tiddlyblog/._README0000400000076500000000000000012210364471236014667 0ustar pboudawheel00000000000000Mac OS X  2 R****Hdratiddlyblog/README0000644000076500000000000000066410364471236014477 0ustar pboudawheel00000000000000This is TiddlyBlog, a blogging software based on blosxom (http://www.blosxom.com) and TiddlyWiki (http://www.tiddlywiki.com). The website of TiddlyBlog is http://www.j-sus.de/wiki.html#TiddlyBlog. Instructions: Download and "tar -xjf" the package, open shell: > cd tiddlyblog > perl blosxom.cgi -password="test" Your blog will be created to the blog/ directory. Comments and questions are welcome: peter (dot) bouda (at) gmx (dot) de tiddlyblog/txt/0000755000076500007650000000000010361220306014603 5ustar pboudapbouda00000000000000tiddlyblog/txt/._.DS_Store0000400000076500000000000000012210357767760016325 0ustar pboudawheel00000000000000Mac OS X  2 R@tiddlyblog/txt/.DS_Store0000700000076500007650000003000410357767760016305 0ustar pboudapbouda00000000000000Bud1 ent_tycontent_type.htmlIlocblob_ ÿÿÿÿÿÿ date.htmlIlocblob ÿÿÿÿÿÿ foot.htmlIlocblob_zÿÿÿÿÿÿ head.htmlIlocblobzÿÿÿÿÿÿpodcastIlocblob_Ôÿÿÿÿÿÿ story.htmlIlocblobÛÔÿÿÿÿÿÿ  @€ @€ @€ @ E DSDB `€ @€ @€ @ E DSDB `€ @€ @€ @tiddlyblog/txt/category/0000755000076500007650000000000010357767563016452 5ustar pboudapbouda00000000000000tiddlyblog/txt/category/20050704203004.txt0000644000076500007650000000022010357231267020542 0ustar pboudapbouda00000000000000Blog dich halt selbst Ach ja, wie schön, dass es heutzutage so etwas wie [[Blogs|http://www.feisar.de/content/gfx_de_breakingnews.html]] gibt. tiddlyblog/txt/category/._20060106155600.txt0000400000076500000000000000012210357767563020600 0ustar pboudawheel00000000000000Mac OS X  2 R****Hdratiddlyblog/txt/category/20060106155600.txt0000644000076500007650000000112510357767563020571 0ustar pboudapbouda00000000000000Back again (Update)|blog wiki Nach Umzug im Virtuellen sowie in der wirklichen Welt bin ich nun zurück. Aber [[andere|http://www.spreeblick.de]] ziehen ja auch um. Brauchen nur nicht so lang. Leben dafür vom Bloggen. Jedenfalls habe ich gleich noch das neueste [[TiddlyWiki|http://www.tiddlywiki.com]] verwendet, sogar mit Tag-Unterstüzung. Ich werde demnächst hier mal alles veröffentlichen, wie das so funktioniert. Dann kan Wordpress einpacken... Hehe! [Update: Jetzt auch mit TiddlyWiki 2.0, Veröffentlichung war kurz nachdem ich alle Änderungen an Version 1.29 gemacht hatte... Grrr!] tiddlyblog/txt/content_type.html0000644000076500007650000000001210263310602020175 0ustar pboudapbouda00000000000000text/html tiddlyblog/txt/date.html0000700000076500007650000000000010263310602016365 0ustar pboudapbouda00000000000000tiddlyblog/txt/foot.html0000700000076500007650000000003610263310602016430 0ustar pboudapbouda00000000000000 tiddlyblog/txt/._head.html0000400000076500000000000000012210364471466016422 0ustar pboudawheel00000000000000Mac OS X  2 R****Hdratiddlyblog/txt/head.html0000644000076500007650000045202310364471466016422 0ustar pboudapbouda00000000000000 TiddlyWiki - a reusable non-linear personal web notebook
    $blog_title
    $blog_description
    $categorytree::display[[Archive 2006|/2006/index.html]]\n[[RSS|index.rss]]\n\nerstellt mit [[tiddlywiki|http://www.tiddlywiki.com]]\nund [[blosxom|http://www.blosxom.com]]
    <@headlines.get output="yes" max_to_show="15" />
    tiddlyblog/txt/podcast/0000755000076500007650000000000010357767051016262 5ustar pboudapbouda00000000000000tiddlyblog/txt/podcast/20050930114959.txt0000644000076500007650000000017210364471701020412 0ustar pboudapbouda00000000000000Merkel dir...|podcast politics [podcast[Spaß mit TTS|http://www.j-sus.de/voicebox/20050930114959.mp3|24764|mpeg/audio]] tiddlyblog/txt/story.html0000700000076500007650000000020210361220675016645 0ustar pboudapbouda00000000000000
    $body\n\n//Kategorie:// [[$path|$url$path]]\n