From d71caffb7b249bded2ab1902953fa321dc90011c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 2 Nov 2008 12:21:15 -0500 Subject: preprocess text before htmlizing it --- IkiWiki/Plugin/format.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'IkiWiki') diff --git a/IkiWiki/Plugin/format.pm b/IkiWiki/Plugin/format.pm index a219190e8..1e21a0bdc 100644 --- a/IkiWiki/Plugin/format.pm +++ b/IkiWiki/Plugin/format.pm @@ -23,7 +23,8 @@ sub preprocess (@) { #{{{ error(sprintf(gettext("unsupported page format %s"), $format)); } - return IkiWiki::htmlize($params{page}, $params{destpage}, $format, $text); + return IkiWiki::htmlize($params{page}, $params{destpage}, $format, + IkiWiki::preprocess($params{page}, $params{destpage}, $text)); } #}}} 1 -- cgit v1.2.3 From c731a81b4320fc39f7877cc8a36849f13edf149a Mon Sep 17 00:00:00 2001 From: intrigeri Date: Tue, 4 Nov 2008 17:56:42 +0100 Subject: po plugin: fix preview for PO files As a trick, use editcontent hook to mark the page as unfiltered, to force our filter() sub's to proceed again. Signed-off-by: intrigeri --- IkiWiki/Plugin/po.pm | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) (limited to 'IkiWiki') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 9dda8c0db..779571984 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -38,6 +38,7 @@ sub import { hook(type => "filter", id => "po", call => \&filter); hook(type => "htmlize", id => "po", call => \&htmlize); hook(type => "pagetemplate", id => "po", call => \&pagetemplate); + hook(type => "editcontent", id => "po", call => \&editcontent); inject(name => "IkiWiki::bestlink", call => \&mybestlink); inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath); inject(name => "IkiWiki::targetpage", call => \&mytargetpage); @@ -282,25 +283,31 @@ sub mybestlink ($$) { #{{{ return ""; } #}}} -# We use filter to convert PO to the master page's type, -# since other plugins should not work on PO files +# We use filter to convert PO to the master page's format, +# since the rest of ikiwiki should not work on PO files. sub filter (@) { #{{{ my %params = @_; my $page = $params{page}; my $destpage = $params{destpage}; my $content = decode_utf8(encode_utf8($params{content})); - # decide if this is a PO file that should be converted into a translated document, - # and perform various sanity checks - if (! istranslation($page) || $filtered{$page}{$destpage}) { - return $content; - } + return $content if ( ! istranslation($page) + || ( exists $filtered{$page}{$destpage} + && $filtered{$page}{$destpage} eq 1 )); + + # CRLF line terminators make poor Locale::Po4a feel bad + $content=~s/\r\n/\n/g; + + # Locale::Po4a needs an input file, and I'm too lazy to learn + # how to disguise a variable as a file + my $infile = File::Temp->new(TEMPLATE => "ikiwiki-po-filter-in.XXXXXXXXXX", + TMPDIR => 1)->filename; + writefile(basename($infile), File::Spec->tmpdir, $content); my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); - my $file=srcfile(exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page}); my $masterfile = srcfile($pagesources{$masterpage}); my (@pos,@masters); - push @pos,$file; + push @pos,$infile; push @masters,$masterfile; my %options = ( "markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0, @@ -311,11 +318,11 @@ sub filter (@) { #{{{ 'file_in_name' => \@masters, 'file_in_charset' => 'utf-8', 'file_out_charset' => 'utf-8', - ) or error("[po/filter:$file]: failed to translate"); - my $tmpfh = File::Temp->new(TEMPLATE => "/tmp/ikiwiki-po-filter-out.XXXXXXXXXX"); - my $tmpout = $tmpfh->filename; - $doc->write($tmpout) or error("[po/filter:$file] could not write $tmpout"); - $content = readfile($tmpout) or error("[po/filter:$file] could not read $tmpout"); + ) or error("[po/filter:$infile]: failed to translate"); + my $tmpout = File::Temp->new(TEMPLATE => "ikiwiki-po-filter-out.XXXXXXXXXX", + TMPDIR => 1)->filename; + $doc->write($tmpout) or error("[po/filter:$infile] could not write $tmpout"); + $content = readfile($tmpout) or error("[po/filter:$infile] could not read $tmpout"); $filtered{$page}{$destpage}=1; return $content; } #}}} @@ -438,6 +445,16 @@ sub pagetemplate (@) { #{{{ } } # }}} +sub editcontent () { #{{{ + my %params=@_; + # as we're previewing or saving a page, the content may have + # changed, so tell the next filter() invocation it must not be lazy + if (exists $filtered{$params{page}}{$params{page}}) { + delete $filtered{$params{page}}{$params{page}}; + } + return $params{content}; +} #}}} + sub istranslatable ($) { #{{{ my $page=shift; my $file=$pagesources{$page}; -- cgit v1.2.3 From cfcb7454db57481060f4caccd501ca8d281b22c5 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Tue, 4 Nov 2008 19:23:58 +0100 Subject: po plugin: aesthetics Signed-off-by: intrigeri --- IkiWiki/Plugin/po.pm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'IkiWiki') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 779571984..cc8e9b2ed 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -19,11 +19,12 @@ use Memoize; my %translations; our %filtered; -## FIXME: makes some test cases cry once every two tries; this may be -## related to the artificial way the testsuite is run, or not. -# memoize("istranslatable"); memoize("_istranslation"); memoize("percenttranslated"); +# FIXME: memoizing istranslatable() makes some test cases fail once every +# two tries; this may be related to the artificial way the testsuite is +# run, or not. +# memoize("istranslatable"); # backup references to subs that will be overriden my %origsubs; -- cgit v1.2.3 From bc5b875de85419d38688b47e0d40ff808f0ebd86 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Tue, 4 Nov 2008 20:05:21 +0100 Subject: po plugin: remove broken parentlinks for home page's translations Signed-off-by: intrigeri --- IkiWiki/Plugin/po.pm | 17 +++++++++++------ doc/plugins/po.mdwn | 7 ------- 2 files changed, 11 insertions(+), 13 deletions(-) (limited to 'IkiWiki') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index cc8e9b2ed..a5bf4fb54 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -38,7 +38,7 @@ sub import { hook(type => "needsbuild", id => "po", call => \&needsbuild); hook(type => "filter", id => "po", call => \&filter); hook(type => "htmlize", id => "po", call => \&htmlize); - hook(type => "pagetemplate", id => "po", call => \&pagetemplate); + hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1); hook(type => "editcontent", id => "po", call => \&editcontent); inject(name => "IkiWiki::bestlink", call => \&mybestlink); inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath); @@ -398,9 +398,10 @@ sub otherlanguages ($) { #{{{ sub pagetemplate (@) { #{{{ my %params=@_; - my $page=$params{page}; - my $destpage=$params{destpage}; - my $template=$params{template}; + my $page=$params{page}; + my $destpage=$params{destpage}; + my $template=$params{template}; + my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/) if istranslation($page); if (istranslation($page) && $template->query(name => "percenttranslated")) { $template->param(percenttranslated => percenttranslated($page)); @@ -419,7 +420,6 @@ sub pagetemplate (@) { #{{{ } } elsif (istranslation($page)) { - my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/); add_depends($page, $masterpage); foreach my $translation (values %{$translations{$masterpage}}) { add_depends($page, $translation); @@ -434,7 +434,6 @@ sub pagetemplate (@) { #{{{ # prevent future breakage when ikiwiki internals change. # Known limitations are preferred to future random bugs. if ($template->param('discussionlink') && istranslation($page)) { - my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); $template->param('discussionlink' => htmllink( $page, $destpage, @@ -444,6 +443,12 @@ sub pagetemplate (@) { #{{{ linktext => gettext("Discussion"), )); } + # remove broken parentlink to ./index.html on home page's translations + if ($template->param('parentlinks') + && istranslation($page) + && $masterpage eq "index") { + $template->param('parentlinks' => []); + } } # }}} sub editcontent () { #{{{ diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index 6aa63b429..61ed9e107 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -259,13 +259,6 @@ be fixed by something like [[todo/using_meta_titles_for_parentlinks]]. Which configuration settings are safe enough for websetup? -### parentlinks - -When the wiki home page is translatable, the parentlinks plugin sets -`./index.html` as its translations' single parent link. Ideally, the -home page's translations should get no parent link at all, just like -the version written in the master language. - ### backlinks If a given translatable `sourcepage.mdwn` links to \[[destpage]], -- cgit v1.2.3 From 225e21f6c5da40f3beea27e084515daf83471d95 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Tue, 4 Nov 2008 23:32:32 +0100 Subject: po plugin: redesign refresh mechanism after master page update manually triggering IkiWiki::refresh() was at least dubious, and more or less buggy (it randomly broke the whole backlinks feature); thinking a bit more to add the necessary bits to @needsbuild seems like a better way. don't play with ikiwiki's internals if not absolutely needed. Signed-off-by: intrigeri --- IkiWiki/Plugin/po.pm | 20 ++++++++++++-------- doc/plugins/po.mdwn | 6 ------ 2 files changed, 12 insertions(+), 14 deletions(-) (limited to 'IkiWiki') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index a5bf4fb54..936fe3c49 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -112,14 +112,16 @@ sub checkconfig () { #{{{ sub potfile ($) { #{{{ my $masterfile=shift; (my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/); - return File::Spec->catfile($dir, $name . ".pot"); + $dir='' if $dir eq './'; + return File::Spec->catpath('', $dir, $name . ".pot"); } #}}} sub pofile ($$) { #{{{ my $masterfile=shift; my $lang=shift; (my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/); - return File::Spec->catfile($dir, $name . "." . $lang . ".po"); + $dir='' if $dir eq './'; + return File::Spec->catpath('', $dir, $name . "." . $lang . ".po"); } #}}} sub refreshpot ($) { #{{{ @@ -173,17 +175,22 @@ sub needsbuild () { #{{{ # refresh/create POT and PO files as needed my $updated_po_files=0; foreach my $page (keys %pagesources) { - my $pageneedsbuild = grep { $_ eq $pagesources{$page} } @$needsbuild; if (istranslatable($page)) { + my $pageneedsbuild = grep { $_ eq $pagesources{$page} } @$needsbuild; + my $updated_pot_file=0; my $file=srcfile($pagesources{$page}); if ($pageneedsbuild || ! -e potfile($file)) { refreshpot($file); + $updated_pot_file=1; } my @pofiles; foreach my $lang (keys %{$config{po_slave_languages}}) { my $pofile=pofile($file, $lang); - if ($pageneedsbuild || ! -e $pofile) { + my $pofile_rel=pofile($pagesources{$page}, $lang); + if ($pageneedsbuild || $updated_pot_file || ! -e $pofile) { push @pofiles, $pofile; + push @$needsbuild, $pofile_rel + unless grep { $_ eq $pofile_rel } @$needsbuild; } } if (@pofiles) { @@ -194,7 +201,7 @@ sub needsbuild () { #{{{ } } - # check staged changes in and trigger a wiki refresh. + # check staged changes in if ($updated_po_files) { if ($config{rcs}) { IkiWiki::disable_commit_hook(); @@ -203,8 +210,6 @@ sub needsbuild () { #{{{ IkiWiki::enable_commit_hook(); IkiWiki::rcs_update(); } - IkiWiki::refresh(); - IkiWiki::saveindex(); # refresh module's private variables undef %filtered; undef %translations; @@ -213,7 +218,6 @@ sub needsbuild () { #{{{ } } - # make existing translations depend on the corresponding master page foreach my $master (keys %translations) { foreach my $slave (values %{$translations{$master}}) { diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index 61ed9e107..173a26ac4 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -242,12 +242,6 @@ gettext/po4a rough corners Misc. improvements ------------------ -### automatic POT/PO update - -- Use the `change` hook instead of `needsbuild`? -- Fix (apparently harmless) undefined values that pollute logs when - saving a master page in the CGI - ### page titles Use nice page titles from meta plugin in links, as inline already -- cgit v1.2.3