package SilkiX::Converter::Kwiki::HTMLToWiki; BEGIN { $SilkiX::Converter::Kwiki::HTMLToWiki::VERSION = '0.03'; } use strict; use warnings; use namespace::autoclean; use Silki::Schema::Page; use Moose; use MooseX::SemiAffordanceAccessor; use MooseX::StrictConstructor; extends 'Silki::Formatter::HTMLToWiki'; has _wiki_link_fixer => ( is => 'ro', isa => 'CodeRef', required => 1, init_arg => 'wiki_link_fixer', ); sub _handle_a { my $self = shift; my $node = shift; my $href = $node->attr('href'); unless ( defined $href ) { $self->_handle_events_from_tree($node); return; } if ( $href =~ m{^/wiki/} ) { return $self->_handle_a_as_wiki_link( $node, $href ); } elsif ( $href =~ m{index\.cgi\?(\w+)} ) { my $kwiki_title = $1; my $new_title = $self->_wiki_link_fixer->($kwiki_title); return $self->_handle_a_as_wiki_link( $node, $self->_wiki->uri( view => 'page/' . Silki::Schema::Page->TitleToURIPath($new_title) ), $kwiki_title, ); } elsif ( $href =~ m{/plugin/attachments/([^/]+)/([^/]+)} ) { my $kwiki_title = $1; my $filename = $2; my $new_title = $self->_wiki_link_fixer->($kwiki_title); $self->_print_to_stream( '{{file:' . $new_title . q{/} . $filename . '}}' ); } else { return $self->_handle_a_as_external_link( $node, $href ); } } sub _handle_a_as_wiki_link { my $self = shift; my $node = shift; my $href = shift; my $kwiki_title = shift; if ( $href =~ m{^/wiki/([^/]+)/page/([^/]+)} ) { my $title = Silki::Schema::Page->URIPathToTitle($2); return $self->_page_link( $node, $1, $title, $kwiki_title ); } elsif ( $href =~ m{^/wiki/([^/]+)/file/([^/]+)} ) { my $file = Silki::Schema::File->new( file_id => $2 ); unless ($file) { $self->_print_to_stream( loc('(Link to non-existent file)') ); return; } return $self->_file_link( $node, $1, $file ); } else { return $self->_handle_a_as_external_link( $node, $href ); } } sub _page_link { my $self = shift; my $node = shift; my $wiki_name = shift; my $title = shift; my $kwiki_title = shift; my $link = q{}; if ( $wiki_name ne $self->_wiki()->short_name() ) { my $wiki = Silki::Schema::Wiki->new( short_name => $wiki_name ); unless ($wiki) { $self->_print_to_stream( loc( '(Link to non-existent wiki: %1)', $wiki_name ) ); return; } $link = $wiki->title() . q{/}; } $link .= $title; my $child_text = $self->_text_from_node($node); $self->_print_to_stream( '[' . $child_text . ']' ) unless $child_text eq $title || ( defined $kwiki_title && $child_text eq $kwiki_title ); $self->_print_to_stream( '((' . $link . '))' ); } __PACKAGE__->meta()->make_immutable(); 1; # ABSTRACT: Custom HTML to wiki conversion to do conversion from Kwiki __END__ =pod =head1 NAME SilkiX::Converter::Kwiki::HTMLToWiki - Custom HTML to wiki conversion to do conversion from Kwiki =head1 VERSION version 0.03 =head1 AUTHOR Dave Rolsky =head1 COPYRIGHT AND LICENSE This software is Copyright (c) 2010 by Dave Rolsky. This is free software, licensed under: The Artistic License 2.0 =cut