+# Blosxom Plugin: textile2 -*- perl -*-
+# Author: Todd Larason (jtl@molehill.org)
+# Version: 0+1i
+# Blosxom Home/Docs/Licensing: http://www.raelity.org/blosxom
+# Textile plugin Home/Docs/Licensing:
+# http://molelog.molehill.org/blox/Computers/Internet/Web/Blosxom/Plugins/Textile/
+
+package textile2;
+
+# Configuration Variables
+# ----------------------------------------------------------------------------
+#$flavour = "xhtml" unless defined $flavour;
+$flavor = "xhtml" unless defined $flavour;
+$character_encoding = 1 unless defined $character_encoding;
+$character_set = "utf-8" unless defined $character_set;
+$head_offset = 3 unless defined $head_offset;
+$image_root = $blosxom::datadir unless defined $image_root;
+$handle_textile_1 = 0 unless defined $handle_textile_1;
+# ----------------------------------------------------------------------------
+use strict;
+
+# Blosxom interface
+
+use lib qq{$blosxom::plugin_dir/lib};
+use vars qw/$flavor $character_encoding $character_set $head_offset
+ $image_root $handle_textile_1 $textile/;
+sub start {
+ eval {require Text::Textile;};
+ return 1 if (!$@);
+ return 0;
+}
+
+sub story {
+ my($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_;
+ if ($meta::markup eq 'textile2' ||
+ ($handle_textile_1 && $meta::markup eq 'textile')) {
+ my $c = {
+ image_root => $image_root,
+ image_rel_base => "$blosxom::datadir/$path"
+ };
+
+ $$body_ref = blostile($$body_ref, $c);
+ }
+ return 1;
+}
+
+# Simplified interface to Blosxom::Textile
+
+# context items:
+# image_root absolute image filenames relative to this
+# image_rel_base relative image filenames relative to this
+
+sub blostile {
+ # modif : http://groups.yahoo.com/group/blosxom/message/4052
+ local $_;
+ my $str = shift @_;
+ my $ctx = shift @_;
+ if (!$textile) {
+ $textile = new Blosxom::Textile;
+ # XXX named filters
+ $textile->char_encoding($character_encoding);
+ $textile->charset($character_set);
+ }
+ $textile->flavor($flavor);
+ $textile->filter_param($ctx);
+
+ $str = $textile->process($str);
+
+ if (defined $head_offset && ($head_offset > 1)) {
+ for (my $h = 7 - $head_offset; $h > 0; $h--) {
+ my $h2 = $h + $head_offset - 1;
+ $str =~ s/(<\/?)h$h([ >])/$1h$h2$2/g;
+ }
+ }
+
+ # XXX beautifier
+ # XXX smarty?
+
+ return $str;
+}
+
+# Blosxom::Textile
+package Blosxom::Textile;
+use Text::Textile;
+@Blosxom::Textile::ISA = qw(Text::Textile);
+
+sub image_size {
+ my ($self, $src) = @_;
+ my $ctx = $self->filter_param;
+ if ($src !~ m{^http:}) {
+ eval {require Image::Size;};
+ if (!$@) {
+ my $file;
+ if ($src =~ m{^/}) {
+ $file = "$ctx->{image_root}$src";
+ } else {
+ $file = "$ctx->{image_rel_base}/$src";
+ }
+ my ($w, $h) = Image::Size::imgsize($file);
+ return ($w, $h);
+ }
+ }
+ warn "Image sizing without Image::Size not implemented";
+ undef;
+}
+
+# XXX format_link ?
+# XXX format_url ?
+
+1;