Name:
	Image
FullName:
	SuikaWikiImage
URI:
	IW:SuikaWiki:WikiAdmin

# Require SuikaWiki::Plugin::SuikaWiki09

{
Name:
	wikiformat/SuikaWikiImage/0.9-to-HTML
FullName:
	SuikaWikiImage/0.9 document format -> HTML
URI:
	IW:SuikaWiki:SuikaWiki
Format:
	my $c = $o->{content};
	$c =~ s(\x0D?\x0A__IMAGE__\x0D?\x0A.+$){}s;
	my $embed = '[[#embed:IMG:'.$o->{page}.']]';
	unless (index ($c, $embed) > -1) {
	  $c = $embed . "\n" . $c;
	}
	if ($c !~ /\[\[\#comment/ && $o->{p}->{comment} && $o->{magic} !~ /obsoleted="yes"/ && !$main::database->meta (IsFrozen => $o->{page})) {
	  $c .= qq(\n[[#comment]]);
	}
	$r = SuikaWiki::Plugin::SuikaWiki09::text_to_html ($c, %$o);
}
{
Name:
	wikiformat/SuikaWikiImage/0.9-to-image-png
FullName:
	SuikaWikiImage/0.9 document format -> PNG image
URI:
	IW:SuikaWiki:SuikaWiki
Format:
	if ($o->{content} =~ /\x0D?\x0A__IMAGE__\x0D?\x0A(.+)$/s) {
	  require MIME::Base64;
	  $r = MIME::Base64::decode ($1);
	  if ($o->{magic} =~ m#image-type="(image/[0-9a-z_.+-]+)"#) {
	    my $type = $1;
	    $r = convert_image_type ($o, $r, $Type{$type} => $Type{'image/png'})
	      if $type ne 'image/png' && ref $Type{$type};
	  }
	}
}
{
Name:
	wikiformat/SuikaWikiImage/0.9-to-image-jpeg
FullName:
	SuikaWikiImage/0.9 document format -> JPEG image
URI:
	IW:SuikaWiki:SuikaWiki
Format:
	if ($o->{content} =~ /\x0D?\x0A__IMAGE__\x0D?\x0A(.+)$/s) {
	  require MIME::Base64;
	  $r = MIME::Base64::decode ($1);
	  if ($o->{magic} =~ m#image-type="(image/[0-9a-z_.+-]+)"#) {
	    my $type = $1;
	    $r = convert_image_type ($o, $r, $Type{$type} => $Type{'image/jpeg'})
	      if $type ne 'image/jpeg' && ref $Type{$type};
	  }
	}
}

{
Name:
	wikiformat/SuikaWikiImage/0.9-to-image-x-icon
FullName:
	SuikaWikiImage/0.9 document format -> Windows icon
URI:
	IW:SuikaWiki:"Wiki//Icon"
Format:
	if ($o->{magic} =~ m#image-type="image/x-icon"#) {
	  if ($o->{content} =~ /\x0D?\x0A__IMAGE__\x0D?\x0A(.+)$/s) {
	    require MIME::Base64;
	    $r = MIME::Base64::decode ($1);
	  }
	}
}
{
Name:
	wikiformat/SuikaWikiImage/0.9-to-HTML-fragment
FullName:
	SuikaWikiImage/0.9 document format -> HTML fragment
URI:
	IW:SuikaWiki:SuikaWiki
Format:
	if ($o->{magic} =~ m#image-type="([^"]+)"#) {
	  my $type = $1; $type =~ tr/\x00-\x20\x7F//d;
	  $type =~ s/[^0-9A-Za-z_]/_/g;
	  my $uri = $o->uri('wiki'); my $epage = $o->encode($o->{page});
	  my $alt = ''; $alt = $1 if $o->{magic} =~ /image-alt="([^"]+)"/;
	  $r = qq(<img src="$uri?mypage=$epage;mycmd=$type" alt="$alt" title="@{[$o->escape($o->{page})]}" longdesc="$uri?$epage" class="embed" />);
	} else {
	  $r = qq(<span class="error-embed-image">).$o->resource('Embed:ImageNotFound',escape=>1).q(</span>);
	}
}
{
Name:
	wikiview/link-favicon
FullName:
	Returns LINK element for favicon
Format:
	my $page = $p->{page} || 'Wiki//Icon';
	$page = get_icon_page_name ($o, $page) if $p->{use_page_icon};
	if ($o->_database_exist ($page)) {
	  my ($magic, $content) = $o->magic_and_content ($main::database{$page});
	  if ($magic =~ m!^\#\?SuikaWikiImage/0\.9! && $magic =~ m#image-type="([^"]+)"#) {
	    my ($type0,$type) = ($1,$1); $type =~ tr/\x00-\x20\x7F//d;
	    $type =~ s/[^0-9A-Za-z_]/_/g;
	    my $alt = ''; $alt = $1 if $magic =~ /image-alt="([^"]+)"/;
	    $r = qq(<link rel="icon" type="@{[$o->escape($type0)]}" href="@{[$o->uri('wiki')]}?mypage=@{[$o->encode($page)]};mycmd=$type" title="$alt" class="favicon" />);
	  }
	} else {
	  $r = qq(<!-- icon (@{[$o->escape($page)]}) not exist -->);
	}
}
{
Name:
	wikiview/img-favicon
FullName:
	Returns IMG element for favicon
Format:
	my $page = $p->{page} || 'Wiki//Icon';
	$page = get_icon_page_name ($o, $page) if $p->{use_page_icon};
	if ($o->_database_exist ($page)) {
	  my ($magic, $content) = $o->magic_and_content ($main::database{$page});
	  if ($magic =~ m!^\#\?SuikaWikiImage/0\.9! && $magic =~ m#image-type="([^"]+)"#) {
	    my ($type0,$type) = ($1,$1); $type =~ tr/\x00-\x20\x7F//d;
	    $type =~ s/[^0-9A-Za-z_]/_/g;
	    $r = qq(<img type="@{[$o->escape($type0)]}" src="@{[$o->uri('wiki')]}?mypage=@{[$o->encode($page)]};mycmd=$type" class="favicon" alt=" " />);
	  }
	}
}

Initialize:
	our %Type;
	
MODULE:
	$Type{'image/png'} = {
		type	=> 'image/png',
		suffix	=> 'png',
	};
	$Type{'image/jpeg'} = {
		type	=> 'image/jpeg',
		suffix	=> 'jpeg',
	};
	$Type{'image/j2k'} = {
		type	=> 'image/j2k',
		suffix	=> 'j2k',
	};
	$Type{'image/jng'} = {
		type	=> 'image/jng',
		suffix	=> 'jng',
	};
	$Type{'image/svg+xml'} = {
		type	=> 'image/svg+xml',
		suffix	=> 'svg',
	};
	$Type{'image/x-icon'} = {
		type	=> 'image/x-icon',
		suffix	=> 'ico',
	};
	sub get_icon_page_name ($$) {
	  my ($o, $page) = @_;
	  my @name = SuikaWiki::Name::Space::split_name ($o->{page});
	  for (my $i = $#name; $i >= 0; $i--) {
	    my $p_name = &SuikaWiki::Name::Space::join_names ([@name[0..$i]]);
	    my ($pmagic) = $o->magic_and_content ($main::database{$p_name});
	    if ($pmagic =~ m!\#\?SuikaWiki! && $pmagic =~ m#page-icon="([^"]+)"#) {
	      $page = $1;
	      last;
	    } else {
	      $p_name = &SuikaWiki::Name::Space::join_names ([@name[0..$i], 'Icon']);
	      if ($o->_database_exist ($p_name)) {
	        $page = $p_name; last;
	      }
	    }
	  }
	  $page;
	}
	sub convert_image_type ($$$$) {
	  my ($o, $r, $from => $to) = @_;
	  $from ||= {}; $to ||= {};
	  if ($from->{type} && $to->{type}) {
	    my $fname = $o->_path_to ('TempPrefix').time.'.tmp.';
	    open PNG, '>', $fname . $from->{suffix};
	      binmode PNG;
	      print PNG $r;
	    close PNG;
	    system ('convert', $fname . $from->{suffix} => $fname . $to->{suffix});
	    if ($fname . $to->{suffix}) {
	      open ICO, $fname . $to->{suffix}; {
	        binmode ICO;
	        local $/ = undef;
	        $r = <ICO>;
	      } close ICO;
	    } else {
	      $r = '';
	    }
	    unlink $fname . $from->{suffix};
	    unlink $fname . $to->{suffix};
	  } else {
	    $r = '';
	  }
	  $r;
	}
	SuikaWiki::View->template ('links')->add_line (q(%link-favicon(use-page-icon);));
	## TODO: Provide better check function
	SuikaWiki::View->definition (image_jpeg => {
		media => {type => 'image/jpeg', expires => 240*3600},
		check => sub { ref ($_[0]->format_converter ($_[0]->{magic} => 'image_jpeg'))
				&& $_[0]->{magic} =~ m#image-type="image/# ? 1 : 0 },
		template => '%read(to=>image_jpeg);'});
	SuikaWiki::View->definition (image_png => {
		media => {type => 'image/png', expires => 240*3600},
		check => sub { ref ($_[0]->format_converter ($_[0]->{magic} => 'image_png'))
				&& $_[0]->{magic} =~ m#image-type="image/# ? 1 : 0 },
		template => '%read(to=>image_png);'});
	SuikaWiki::View->definition (image_x_icon => {
		media => {type => 'image/x-icon', expires => 240*3600},
		check => sub { ref ($_[0]->format_converter ($_[0]->{magic} => 'image_x_icon'))
				&& $_[0]->{magic} =~ m#image-type="image/# ? 1 : 0 },
		template => '%read(to=>image_x_icon);'});

POD:LICENSE:
	Copyright 2003 Wakaba <w@suika.fam.cx>
	
	%%GNUGPL2%%