The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Kwiki::EscapeURI;
use strict;
use warnings;
use Kwiki::Plugin -Base;
use mixin 'Kwiki::Installer';

use URI::Escape qw(uri_escape_utf8);

our $VERSION = '0.02';

const class_id => 'escape_uri';
const class_title => "uri escape to raw UTF8 links";

sub init {
    super;
    my $formatter = $self->hub->load_class('formatter');
    $formatter->table->{forced} = 'Kwiki::EscapeURI::ForcedLink';
}

sub register {
    my $registry = shift;
    $registry->add(preload => 'escape_uri');
    $registry->add(hook => 'page:kwiki_link', pre => 'uri_hook');
}

sub uri_hook {
    my $hook = pop;
    $hook->code(undef);
    my ($label) = @_;
    my $page_uri = uri_escape_utf8($self->uri);
    $label = $self->title
      unless defined $label;
    my $class = $self->active
      ? '' : ' class="empty"';
    qq(<a href="?$page_uri"$class>$label</a>);
}

package Kwiki::EscapeURI::ForcedLink;
use base 'Kwiki::Formatter::ForcedLink';

use URI::Escape qw(uri_escape_utf8);

sub html {
    $self->matched =~ $self->pattern_start;
    my $target = $1;
    my $page_uri = uri_escape_utf8($target);
    my $class = $self->hub->pages->new_from_name($target)->exists
      ? '' : ' class="empty"';
    my $text = $self->escape_html($target);
    return qq(<a href="?$page_uri"$class>$text</a>);
}

package Kwiki::EscapeURI;
__DATA__

=head1 NAME 

Kwiki::EscapeURI - uri escape to raw UTF8 links

=head1 SYNOPSIS

 $ cd /path/to/kwiki
 $ kwiki -add Kwiki::EscapeURI

=head1 DESCRIPTION

Changes the internal links that Kwiki create. Instead of
raw UTF8 links, it will just be uri escaped.

=head1 AUTHOR

Kzuhiro Osawa

=head1 SEE ALSO

L<URI::Escape>

=head1 COPYRIGHT

Copyright (c) 2006. Kazuhiro Osawa All rights reserved.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=cut