--- deliantra/server/lib/cf/pod.pm 2007/07/03 01:10:38 1.8 +++ deliantra/server/lib/cf/pod.pm 2018/11/17 23:40:02 1.32 @@ -1,5 +1,30 @@ +# +# This file is part of Deliantra, the Roguelike Realtime MMORPG. +# +# Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team +# Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team +# +# Deliantra is free software: you can redistribute it and/or modify it under +# the terms of the Affero GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the Affero GNU General Public License +# and the GNU General Public License along with this program. If not, see +# . +# +# The authors can be reached via e-mail to +# + package cf::pod; +use common::sense; + use Pod::POM; our $indent; @@ -8,16 +33,19 @@ package cf::pod::AsParagraphs; -use strict; +use common::sense; use base "Pod::POM::View"; -sub asxml($) { +my %E = ( + "<" => "E", + ">" => "E", +); + +sub aspod($) { local $_ = $_[0]; - s/&/&/g; - s/>/>/g; - s/]/$E{$1}/g; $_ } @@ -25,7 +53,6 @@ sub flatten($) { local $_ = $_[0]; - s/<[^>]+>//g; s/^\s+//; s/\s+$//; s/\s+/ /g; @@ -33,18 +60,21 @@ $_ } -*view_seq_file = -*view_seq_code = -*view_seq_bold = sub { "$_[1]" }; -*view_seq_italic = sub { "$_[1]" }; -*view_seq_zero = sub { }; +*view_seq_file = sub { "C<$_[1]>" }; +*view_seq_code = sub { "C<$_[1]>" }; +*view_seq_bold = sub { "B<$_[1]>" }; +*view_seq_italic = sub { "I<$_[1]>" }; +*view_seq_T = sub { "T<$_[1]>" }; +*view_seq_G = sub { "G<$_[1]>" }; +*view_seq_zero = sub { "Z<>" }; *view_seq_space = sub { my $text = $_[1]; $text =~ s/ /\xa0/g; $text }; *view_seq_index = sub { push @{ $result[-1]{index} }, $_[1]; "" }; +#view_seq_entity sub view_seq_text { my $text = $_[1]; $text =~ s/\s+/ /g; - asxml $text + aspod $text } sub view_seq_link { @@ -53,9 +83,9 @@ my $text = $link =~ s/^(.*)\|// ? $1 : $link; if ($link =~ /http:/) { - "" . (asxml $link) . "" + "U<" . (aspod $link) . ">" } else { - () + aspod $text } } @@ -78,7 +108,7 @@ type => "verbatim", indent => $indent * 16, level => $level, - markup => asxml $_[1], + markup => $_[1], }; () } @@ -166,12 +196,10 @@ package cf::pod; -sub pom_as_paragraphs($) { +sub pom_as_paragraphs_ng($) { my ($pom) = @_; # we suckers use global variables, unfortunately. - my $guard = cf::lock_acquire "cf::pod::as_paragraphs"; - local $indent = 0; local $level = 1; local @result = ( { } ); @@ -181,22 +209,31 @@ [grep $_->{index} || exists $_->{markup}, @result] } +sub pom_as_paragraphs($) { + my ($pom) = @_; + + my $guard = cf::lock_acquire "cf::pod::as_paragraphs"; + + $pom->pom_as_paragraphs_ng +} + sub load_pod($) { my ($path) = @_; Coro::Storable::thaw cf::cache "cf::pod::as_paragraphs/$path" => [$path], - 1 => sub { + 9 => sub { my ($src) = @_; + cf::fork_call { - my $pod = $src->[0]; - utf8::decode $pod; - Coro::Storable::freeze pom_as_paragraphs +(Pod::POM->new->parse_text ($pod)) + Coro::Storable::blocking_nfreeze + pom_as_paragraphs_ng + +(Pod::POM->new->parse_text ($src->[0])) } }; } # format as cfpod-style text -sub as_text($) { +sub as_cfpod($) { my ($pars) = @_; my $res; @@ -205,9 +242,9 @@ if ($par->{type} =~ /^head\d+$/) { $res .= "B<$par->{markup}>\n\n"; } elsif ($par->{type} eq "verbatim") { - $res .= "\n$par->{markup}\n\n"; + $res .= "$par->{markup}\n\n"; } elsif ($par->{type} eq "item") { - $res .= "\n* I<$par->{markup}>\n\n"; + $res .= "* I<$par->{markup}>\n\n"; } else { $res .= "$par->{markup}\n\n"; }