CGI-Kwiki
view release on metacpan or search on metacpan
lib/CGI/Kwiki/Formatter.pm view on Meta::CPAN
package CGI::Kwiki::Formatter;
$VERSION = '0.18';
use strict;
use base 'CGI::Kwiki', 'CGI::Kwiki::Privacy';
use CGI::Kwiki qw(:char_classes);
sub process_order {
return qw(
table code function
header_1 header_2 header_3 header_4 header_5 header_6
escape_html
lists comment horizontal_line
paragraph
named_http_link no_http_link http_link
no_mailto_link mailto_link
no_wiki_link force_wiki_link wiki_link
inline version negation
bold italic underscore
);
}
my $slide_num;
sub process {
$slide_num = 0;
my ($self, $wiki_text) = @_;
my $array = [];
push @$array, $wiki_text;
for my $method ($self->process_order) {
$array = $self->dispatch($array, $method);
}
return $self->combine_chunks($array);
}
sub dispatch {
my ($self, $old_array, $method) = @_;
return $old_array unless $self->can($method);
my $new_array;
for my $chunk (@$old_array) {
if (ref $chunk eq 'ARRAY') {
push @$new_array, $self->dispatch($chunk, $method);
}
else {
if (ref $chunk) {
push @$new_array, $chunk;
}
else {
push @$new_array, $self->$method($chunk);
}
}
}
return $new_array;
}
sub combine_chunks {
my ($self, $chunk_array) = @_;
my $formatted_text = '';
for my $chunk (@$chunk_array) {
$formatted_text .=
(ref $chunk eq 'ARRAY') ? $self->combine_chunks($chunk) :
(ref $chunk) ? $$chunk :
$chunk
}
return $formatted_text;
}
sub split_method {
my ($self, $text, $regexp, $method) = @_;
my $i = 0;
map {$i++ % 2 ? \ $self->$method($_) : $_} split $regexp, $text;
}
sub user_functions {
qw(
SLIDESHOW_SELECTOR
total_bullets
);
}
lib/CGI/Kwiki/Formatter.pm view on Meta::CPAN
my $dot = ($text =~ s/\.$//) ? '.' : '';
qq{<a href="mailto:$text">$text</a>$dot};
}
sub img_format {
my ($self, $url) = @_;
return qq{<img src="$url">};
}
sub link_format {
my ($self, $text) = @_;
$text =~ s/(^\s*|\s+(?=\s)|\s$)//g;
my $url = $text;
$url = $1 if $text =~ s/(.*?) +//;
$url =~ s/^http:(?!=\/\/)//; # relative links
return qq{<a href="$url">$text</a>};
}
sub named_http_link {
my ($self, $text) = @_;
$self->split_method($text,
qr{(?<!\!)\[([^\[\]]*?(?:https?|ftp|irc):\S.*?)\]},
'named_http_link_format',
);
}
sub named_http_link_format {
my ($self, $text) = @_;
if ($text =~ m#(.*)((?:https?|ftp|irc):\S+)(.*)#) {
$text = "$2 $1$3";
}
return $self->link_format($text);
}
sub version {
my ($self, $text) = @_;
$text =~ s#(?<!\!)\[\#\.\#\]#$CGI::Kwiki::VERSION#g;
return $text;
}
sub inline {
my ($self, $text) = @_;
$self->split_method($text,
qr{(?<!\!)\[=(.*?)(?<!\\)\]},
'inline_format',
);
}
sub inline_format {
my ($self, $text) = @_;
$text =~ s{\\ ([ \[\] ]) }{$1}xg; # Translate \] escapes to ]
"<code>$text</code>";
}
sub negation {
my ($self, $text) = @_;
$text =~ s#\!(?=\[)##g;
return $text;
}
sub bold {
my ($self, $text) = @_;
$text =~ s#(?<![$WORD])\*(\S.*?\S|\S)\*(?![$WORD])#<b>$1</b>#g;
return $text;
}
sub italic {
my ($self, $text) = @_;
$text =~ s#(?<![$WORD<])/(\S.*?\S|\S)/(?![$WORD])#<em>$1</em>#g;
return $text;
}
sub underscore {
my ($self, $text) = @_;
$text =~ s#(?<![$WORD])_(\S.*?\S|\S)_(?![$WORD])#<u>$1</u>#g;
return $text;
}
sub code {
my ($self, $text) = @_;
$self->split_method($text,
qr{(^ +[^ \n].*?\n)(?-ms:(?=[^ \n]|$))}ms,
'code_format',
);
}
sub code_format {
my ($self, $text) = @_;
$self->code_postformat($self->code_preformat($text));
}
sub code_preformat {
my ($self, $text) = @_;
my ($indent) = sort { $a <=> $b } map { length } $text =~ /^( *)\S/mg;
$text =~ s/^ {$indent}//gm;
return $self->escape_html($text);
}
sub code_postformat {
my ($self, $text) = @_;
return "<blockquote><pre>$text</pre></blockquote>\n";
}
sub escape_html {
my ($self, $text) = @_;
$text =~ s/&/&/g;
$text =~ s/</</g;
$text =~ s/>/>/g;
$text;
}
sub lists {
my ($self, $text) = @_;
my $switch = 0;
return map {
my $level = 0;
my @tag_stack;
if ($switch++ % 2) {
my $text = '';
my @lines = /(.*\n)/g;
for my $line (@lines) {
( run in 1.068 second using v1.01-cache-2.11-cpan-5a3173703d6 )