aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki')
-rw-r--r--IkiWiki/Plugin/brokenlinks.pm31
-rw-r--r--IkiWiki/Plugin/calendar.pm6
-rw-r--r--IkiWiki/Plugin/editpage.pm5
-rw-r--r--IkiWiki/Plugin/htmltidy.pm4
-rw-r--r--IkiWiki/Plugin/img.pm53
-rw-r--r--IkiWiki/Plugin/inline.pm47
-rw-r--r--IkiWiki/Plugin/map.pm4
-rw-r--r--IkiWiki/Plugin/meta.pm2
-rw-r--r--IkiWiki/Plugin/opendiscussion.pm3
-rw-r--r--IkiWiki/Plugin/orphans.pm11
-rw-r--r--IkiWiki/Plugin/po.pm101
-rw-r--r--IkiWiki/Plugin/teximg.pm40
-rw-r--r--IkiWiki/Render.pm78
13 files changed, 233 insertions, 152 deletions
diff --git a/IkiWiki/Plugin/brokenlinks.pm b/IkiWiki/Plugin/brokenlinks.pm
index cf8f25281..eb698b0be 100644
--- a/IkiWiki/Plugin/brokenlinks.pm
+++ b/IkiWiki/Plugin/brokenlinks.pm
@@ -27,32 +27,27 @@ sub preprocess (@) {
# register a dependency.
add_depends($params{page}, $params{pages});
- my %broken;
- foreach my $page (pagespec_match_list([keys %links],
- $params{pages}, location => $params{page})) {
- my $discussion=gettext("Discussion");
- my %seen;
- foreach my $link (@{$links{$page}}) {
- next if $seen{$link};
- $seen{$link}=1;
- next if $link =~ /.*\/\Q$discussion\E/i && $config{discussion};
- my $bestlink=bestlink($page, $link);
- next if length $bestlink;
- push @{$broken{$link}}, $page;
+ my @broken;
+ foreach my $link (keys %IkiWiki::brokenlinks) {
+ next if $link =~ /.*\/\Q$config{discussionpage}\E/i && $config{discussion};
+
+ my @pages;
+ foreach my $page (@{$IkiWiki::brokenlinks{$link}}) {
+ push @pages, $page
+ if pagespec_match($page, $params{pages}, location => $params{page});
}
- }
+ next unless @pages;
- my @broken;
- foreach my $link (keys %broken) {
- my $page=$broken{$link}->[0];
+ my $page=$IkiWiki::brokenlinks{$link}->[0];
push @broken, sprintf(gettext("%s from %s"),
htmllink($page, $params{destpage}, $link, noimageinline => 1),
join(", ", map {
htmllink($params{page}, $params{destpage}, $_, noimageinline => 1)
- } @{$broken{$link}}));
+ } @pages)
+ );
}
- return gettext("There are no broken links!") unless %broken;
+ return gettext("There are no broken links!") unless @broken;
return "<ul>\n"
.join("\n",
map {
diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
index fe4b16072..5d16dff75 100644
--- a/IkiWiki/Plugin/calendar.pm
+++ b/IkiWiki/Plugin/calendar.pm
@@ -211,8 +211,10 @@ EOF
# matching the pagespec are added or removed.
add_depends($params{page}, $params{pages});
# Explicitly add all currently linked pages as dependencies, so
- # that if they are removed, the calendar will be sure to be updated.
- add_depends($params{page}, join(" or ", @list));
+ # that if they are removed, the calendar will be sure to be updated.
+ foreach my $p (@list) {
+ add_depends($params{page}, $p);
+ }
return $calendar;
}
diff --git a/IkiWiki/Plugin/editpage.pm b/IkiWiki/Plugin/editpage.pm
index 467cd9ed5..fca970c60 100644
--- a/IkiWiki/Plugin/editpage.pm
+++ b/IkiWiki/Plugin/editpage.pm
@@ -229,8 +229,9 @@ sub cgi_editpage ($$) {
my $dir=$from."/";
$dir=~s![^/]+/+$!!;
- if ((defined $form->field('subpage') && length $form->field('subpage')) ||
- $page eq lc(gettext('Discussion'))) {
+ if ((defined $form->field('subpage') &&
+ length $form->field('subpage')) ||
+ $page eq lc($config{discussionpage})) {
$best_loc="$from/$page";
}
else {
diff --git a/IkiWiki/Plugin/htmltidy.pm b/IkiWiki/Plugin/htmltidy.pm
index 6f3379ef4..e6d377f8a 100644
--- a/IkiWiki/Plugin/htmltidy.pm
+++ b/IkiWiki/Plugin/htmltidy.pm
@@ -46,7 +46,9 @@ sub sanitize (@) {
waitpid $pid, 0;
$SIG{PIPE}="DEFAULT";
- return "" if $sigpipe || ! defined $ret;
+ if ($sigpipe || ! defined $ret) {
+ return gettext("htmltidy failed to parse this html");
+ }
return $ret;
}
diff --git a/IkiWiki/Plugin/img.pm b/IkiWiki/Plugin/img.pm
index 68b001671..9ae85c4e6 100644
--- a/IkiWiki/Plugin/img.pm
+++ b/IkiWiki/Plugin/img.pm
@@ -65,6 +65,8 @@ sub preprocess (@) {
my $imglink;
my $r;
+ my ($dwidth, $dheight);
+
if ($params{size} ne 'full') {
add_depends($params{page}, $image);
@@ -86,7 +88,15 @@ sub preprocess (@) {
$r = $im->Read($srcfile);
error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r;
- $r = $im->Resize(geometry => "${w}x${h}");
+ # don't resize any larger
+ my ($rw, $rh) = ($w, $h);
+ if ((length $rw && $rw > $im->Get("width")) ||
+ (length $rh && $rh > $im->Get("height"))) {
+ $rw=$im->Get("width");
+ $rh=$im->Get("height");
+ }
+
+ $r = $im->Resize(geometry => "${rw}x${rh}");
error sprintf(gettext("failed to resize: %s"), $r) if $r;
# don't actually write file in preview mode
@@ -98,11 +108,34 @@ sub preprocess (@) {
$imglink = $file;
}
}
+
+ # since we don't really resize larger, set the display
+ # size, so the browser can scale the image up if necessary
+ if (length $w && length $h) {
+ ($dwidth, $dheight)=($w, $h);
+ }
+ # avoid division by zero on 0x0 image
+ elsif ($im->Get("width") == 0 || $im->Get("height") == 0) {
+ ($dwidth, $dheight)=(0, 0);
+ }
+ # calculate unspecified size from the other one, preserving
+ # aspect ratio
+ elsif (length $w) {
+ $dwidth=$w;
+ $dheight=$w / $im->Get("width") * $im->Get("height");
+ }
+ elsif (length $h) {
+ $dheight=$h;
+ $dwidth=$h / $im->Get("height") * $im->Get("width");
+ }
+
}
else {
$r = $im->Read($srcfile);
error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r;
$imglink = $file;
+ $dwidth = $im->Get("width");
+ $dheight = $im->Get("height");
}
my ($fileurl, $imgurl);
@@ -120,8 +153,8 @@ sub preprocess (@) {
}
my $imgtag='<img src="'.$imgurl.
- '" width="'.$im->Get("width").
- '" height="'.$im->Get("height").'"'.
+ '" width="'.$dwidth.
+ '" height="'.$dheight.'"'.
(exists $params{alt} ? ' alt="'.$params{alt}.'"' : '').
(exists $params{title} ? ' title="'.$params{title}.'"' : '').
(exists $params{align} ? ' align="'.$params{align}.'"' : '').
@@ -135,11 +168,15 @@ sub preprocess (@) {
elsif ($params{link} =~ /^\w+:\/\//) {
$imgtag='<a href="'.$params{link}.'">'.$imgtag.'</a>';
}
- elsif (length bestlink($params{page}, $params{link})) {
- add_depends($params{page}, $params{link});
- $imgtag=htmllink($params{page}, $params{destpage},
- $params{link}, linktext => $imgtag,
- noimageinline => 1);
+ else {
+ my $b = bestlink($params{page}, $params{link});
+
+ if (length $b) {
+ add_depends($params{page}, $b);
+ $imgtag=htmllink($params{page}, $params{destpage},
+ $params{link}, linktext => $imgtag,
+ noimageinline => 1);
+ }
}
if (exists $params{caption}) {
diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index 04ad6ed23..ccfadfd69 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
@@ -195,10 +195,10 @@ sub preprocess_inline (@) {
@list = map { bestlink($params{page}, $_) }
split ' ', $params{pagenames};
-
- $params{pages} = join(" or ", @list);
}
else {
+ add_depends($params{page}, $params{pages});
+
@list = pagespec_match_list(
[ grep { $_ ne $params{page} } keys %pagesources ],
$params{pages}, location => $params{page});
@@ -247,14 +247,15 @@ sub preprocess_inline (@) {
@list=@list[0..$params{show} - 1];
}
- add_depends($params{page}, $params{pages});
# Explicitly add all currently displayed pages as dependencies, so
# that if they are removed or otherwise changed, the inline will be
# sure to be updated.
- add_depends($params{page}, join(" or ", $#list >= $#feedlist ? @list : @feedlist));
+ foreach my $p ($#list >= $#feedlist ? @list : @feedlist) {
+ add_depends($params{page}, $p);
+ }
if ($feeds && exists $params{feedpages}) {
- @feedlist=grep { pagespec_match($_, $params{feedpages}, location => $params{page}) } @feedlist;
+ @feedlist=pagespec_match_list(\@feedlist, $params{feedpages}, location => $params{page});
}
my ($feedbase, $feednum);
@@ -305,17 +306,7 @@ sub preprocess_inline (@) {
# Add a blog post form, with feed buttons.
my $formtemplate=template("blogpost.tmpl", blind_cache => 1);
$formtemplate->param(cgiurl => $config{cgiurl});
- my $rootpage;
- if (exists $params{rootpage}) {
- $rootpage=bestlink($params{page}, $params{rootpage});
- if (!length $rootpage) {
- $rootpage=$params{rootpage};
- }
- }
- else {
- $rootpage=$params{page};
- }
- $formtemplate->param(rootpage => $rootpage);
+ $formtemplate->param(rootpage => rootpage(%params));
$formtemplate->param(rssurl => $rssurl) if $feeds && $rss;
$formtemplate->param(atomurl => $atomurl) if $feeds && $atom;
if (exists $params{postformtext}) {
@@ -371,15 +362,14 @@ sub preprocess_inline (@) {
my $file = $pagesources{$page};
my $type = pagetype($file);
if ($config{discussion}) {
- my $discussionlink=lc(gettext("Discussion"));
- if ($page !~ /.*\/\Q$discussionlink\E$/ &&
+ if ($page !~ /.*\/\Q$config{discussionpage}\E$/ &&
(length $config{cgiurl} ||
- exists $links{$page."/".$discussionlink})) {
+ exists $links{$page."/".$config{discussionpage}})) {
$template->param(have_actions => 1);
$template->param(discussionlink =>
htmllink($page,
$params{destpage},
- gettext("Discussion"),
+ $config{discussionpage},
noimageinline => 1,
forcesubpage => 1));
}
@@ -653,4 +643,21 @@ sub pingurl (@) {
exit 0; # daemon done
}
+
+sub rootpage (@) {
+ my %params=@_;
+
+ my $rootpage;
+ if (exists $params{rootpage}) {
+ $rootpage=bestlink($params{page}, $params{rootpage});
+ if (!length $rootpage) {
+ $rootpage=$params{rootpage};
+ }
+ }
+ else {
+ $rootpage=$params{page};
+ }
+ return $rootpage;
+}
+
1
diff --git a/IkiWiki/Plugin/map.pm b/IkiWiki/Plugin/map.pm
index 826dbbd66..54146dc46 100644
--- a/IkiWiki/Plugin/map.pm
+++ b/IkiWiki/Plugin/map.pm
@@ -73,7 +73,9 @@ sub preprocess (@) {
add_depends($params{page}, $params{pages});
# Explicitly add all currently shown pages, to detect when pages
# are removed.
- add_depends($params{page}, join(" or ", keys %mapitems));
+ foreach my $item (keys %mapitems) {
+ add_depends($params{page}, $item);
+ }
# Create the map.
my $parent="";
diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
index b2295923e..514b09369 100644
--- a/IkiWiki/Plugin/meta.pm
+++ b/IkiWiki/Plugin/meta.pm
@@ -191,11 +191,11 @@ sub preprocess (@) {
if ($value !~ /^\w+:\/\//) {
my ($redir_page, $redir_anchor) = split /\#/, $value;
- add_depends($page, $redir_page);
my $link=bestlink($page, $redir_page);
if (! length $link) {
error gettext("redir page not found")
}
+ add_depends($page, $link);
$value=urlto($link, $page);
$value.='#'.$redir_anchor if defined $redir_anchor;
diff --git a/IkiWiki/Plugin/opendiscussion.pm b/IkiWiki/Plugin/opendiscussion.pm
index 60b193eca..1bec4b013 100644
--- a/IkiWiki/Plugin/opendiscussion.pm
+++ b/IkiWiki/Plugin/opendiscussion.pm
@@ -23,8 +23,7 @@ sub canedit ($$) {
my $cgi=shift;
my $session=shift;
- my $discussion=lc(gettext("Discussion"));
- return "" if $page=~/(\/|^)\Q$discussion\E$/;
+ return "" if $page=~/(\/|^)\Q$config{discussionpage}\E$/;
return undef;
}
diff --git a/IkiWiki/Plugin/orphans.pm b/IkiWiki/Plugin/orphans.pm
index 7c938ef74..711226772 100644
--- a/IkiWiki/Plugin/orphans.pm
+++ b/IkiWiki/Plugin/orphans.pm
@@ -27,23 +27,16 @@ sub preprocess (@) {
# register a dependency.
add_depends($params{page}, $params{pages});
- my %linkedto;
- foreach my $p (keys %links) {
- map { $linkedto{bestlink($p, $_)}=1 if length $_ }
- @{$links{$p}};
- }
-
my @orphans;
- my $discussion=lc(gettext("Discussion"));
foreach my $page (pagespec_match_list(
- [ grep { ! $linkedto{$_} && $_ ne 'index' }
+ [ grep { ! IkiWiki::backlink_pages($_) && $_ ne 'index' }
keys %pagesources ],
$params{pages}, location => $params{page})) {
# If the page has a link to some other page, it's
# indirectly linked to a page via that page's backlinks.
next if grep {
length $_ &&
- ($_ !~ /\/\Q$discussion\E$/i || ! $config{discussion}) &&
+ ($_ !~ /\/\Q$config{discussionpage}\E$/i || ! $config{discussion}) &&
bestlink($page, $_) !~ /^(\Q$page\E|)$/
} @{$links{$page}};
push @orphans, $page;
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index 52677076e..792d84261 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -51,8 +51,6 @@ sub import {
hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
hook(type => "formbuilder", id => "po", call => \&formbuilder);
- $origsubs{'bestlink'}=\&IkiWiki::bestlink;
- inject(name => "IkiWiki::bestlink", call => \&mybestlink);
$origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath;
inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath);
$origsubs{'targetpage'}=\&IkiWiki::targetpage;
@@ -61,6 +59,8 @@ sub import {
inject(name => "IkiWiki::urlto", call => \&myurlto);
$origsubs{'cgiurl'}=\&IkiWiki::cgiurl;
inject(name => "IkiWiki::cgiurl", call => \&mycgiurl);
+ $origsubs{'rootpage'}=\&IkiWiki::rootpage;
+ inject(name => "IkiWiki::rootpage", call => \&myrootpage);
}
@@ -99,7 +99,7 @@ sub getsetup () {
type => "string",
example => {
'fr' => 'Français',
- 'es' => 'Castellano',
+ 'es' => 'Español',
'de' => 'Deutsch'
},
description => "slave languages (PO files)",
@@ -153,6 +153,12 @@ sub checkconfig () {
warn(gettext('po_link_to=negotiated requires usedirs to be enabled, falling back to po_link_to=default'));
$config{po_link_to}='default';
}
+ unless ($config{po_link_to} eq 'default') {
+ if (! exists $origsubs{'bestlink'}) {
+ $origsubs{'bestlink'}=\&IkiWiki::bestlink;
+ inject(name => "IkiWiki::bestlink", call => \&mybestlink);
+ }
+ }
push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/;
@@ -204,10 +210,7 @@ sub scan (@) {
if (istranslation($page)) {
foreach my $destpage (@{$links{$page}}) {
if (istranslatable($destpage)) {
- # replace one occurence of $destpage in $links{$page}
- # (we only want to replace the one that was added by
- # IkiWiki::Plugin::link::scan, other occurences may be
- # there for other reasons)
+ # replace the occurence of $destpage in $links{$page}
for (my $i=0; $i<@{$links{$page}}; $i++) {
if (@{$links{$page}}[$i] eq $destpage) {
@{$links{$page}}[$i] = $destpage . '.' . lang($page);
@@ -284,17 +287,16 @@ sub pagetemplate (@) {
map add_depends($page, $_), (values %{otherlanguages($page)});
}
if ($config{discussion} && istranslation($page)) {
- my $discussionlink=gettext("discussion");
- if ($page !~ /.*\/\Q$discussionlink\E$/i &&
+ if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
(length $config{cgiurl} ||
- exists $links{$masterpage."/".$discussionlink})) {
+ exists $links{$masterpage."/".lc($config{discussionpage})})) {
$template->param('discussionlink' => htmllink(
$page,
$destpage,
- $masterpage . '/' . gettext("Discussion"),
+ $masterpage . '/' . $config{discussionpage},
noimageinline => 1,
forcesubpage => 0,
- linktext => gettext("Discussion"),
+ linktext => $config{discussionpage},
));
}
}
@@ -306,6 +308,9 @@ sub pagetemplate (@) {
&& $masterpage eq "index") {
$template->param('parentlinks' => []);
}
+ if (ishomepage($page) && $template->query(name => "title")) {
+ $template->param(title => $config{wikiname});
+ }
} # }}}
# Add the renamed page translations to the list of to-be-renamed pages.
@@ -415,7 +420,7 @@ sub change (@) {
}
if (@pofiles) {
refreshpofiles($masterfile, @pofiles);
- map { IkiWiki::rcs_add($_) } @pofiles if $config{rcs};
+ map { s/^\Q$config{srcdir}\E\/*//; IkiWiki::rcs_add($_) } @pofiles if $config{rcs};
$updated_po_files=1;
}
}
@@ -530,10 +535,23 @@ sub formbuilder (@) {
if ($form->field("do") eq "create") {
foreach my $field ($form->field) {
next unless "$field" eq "type";
- if ($field->type eq 'select') {
- # remove po from the list of types
- my @types = grep { $_ ne 'po' } $field->options;
- $field->options(\@types) if @types;
+ next unless $field->type eq 'select';
+ my $orig_value = $field->value;
+ # remove po from the list of types
+ my @types = grep { $_->[0] ne 'po' } $field->options;
+ $field->options(\@types) if @types;
+ # favor the type of linking page's masterpage
+ if ($orig_value eq 'po') {
+ my ($from, $type);
+ if (defined $form->field('from')) {
+ ($from)=$form->field('from')=~/$config{wiki_file_regexp}/;
+ $from = masterpage($from);
+ }
+ if (defined $from && exists $pagesources{$from}) {
+ $type=pagetype($pagesources{$from});
+ }
+ $type=$config{default_pageext} unless defined $type;
+ $field->value($type) ;
}
}
}
@@ -544,15 +562,18 @@ sub formbuilder (@) {
# `----
# Implement po_link_to 'current' and 'negotiated' settings.
+# Not injected otherwise.
sub mybestlink ($$) {
my $page=shift;
my $link=shift;
my $res=$origsubs{'bestlink'}->(masterpage($page), $link);
+ my @caller = caller(1);
if (length $res
- && ($config{po_link_to} eq "current" || $config{po_link_to} eq "negotiated")
&& istranslatable($res)
- && istranslation($page)) {
+ && istranslation($page)
+ && !(exists $caller[3] && defined $caller[3]
+ && ($caller[3] eq "IkiWiki::PageSpec::match_link"))) {
return $res . "." . lang($page);
}
return $res;
@@ -603,17 +624,21 @@ sub myurlto ($$;$) {
# so that one is redirected to the just-edited page rather than to the
# negociated translation; to prevent unnecessary fiddling with caller/inject,
# we only do so when our beautify_urlpath would actually do what we want to
- # avoid, i.e. when po_link_to = negotiated
+ # avoid, i.e. when po_link_to = negotiated.
+ # also avoid doing so when run by cgi_goto, so that the links on recentchanges
+ # page actually lead to the exact page they pretend to.
if ($config{po_link_to} eq "negotiated") {
my @caller = caller(1);
- my $run_by_editpage = 0;
- $run_by_editpage = 1 if (exists $caller[3] && defined $caller[3]
- && $caller[3] eq "IkiWiki::cgi_editpage");
+ my $use_orig = 0;
+ $use_orig = 1 if (exists $caller[3] && defined $caller[3]
+ && ($caller[3] eq "IkiWiki::cgi_editpage" ||
+ $caller[3] eq "IkiWiki::Plugin::goto::cgi_goto")
+ );
inject(name => "IkiWiki::beautify_urlpath", call => $origsubs{'beautify_urlpath'})
- if $run_by_editpage;
+ if $use_orig;
my $res = $origsubs{'urlto'}->($to,$from,$absolute);
inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath)
- if $run_by_editpage;
+ if $use_orig;
return $res;
}
else {
@@ -631,6 +656,22 @@ sub mycgiurl (@) {
return $origsubs{'cgiurl'}->(%params);
}
+sub myrootpage (@) {
+ my %params=@_;
+
+ my $rootpage;
+ if (exists $params{rootpage}) {
+ $rootpage=$origsubs{'bestlink'}->($params{page}, $params{rootpage});
+ if (!length $rootpage) {
+ $rootpage=$params{rootpage};
+ }
+ }
+ else {
+ $rootpage=masterpage($params{page});
+ }
+ return $rootpage;
+}
+
# ,----
# | Blackboxes for private data
# `----
@@ -935,7 +976,7 @@ sub otherlanguagesloop ($) {
master => 1,
};
}
- else {
+ elsif (istranslation($otherpage)) {
push @ret, {
url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
code => $lang,
@@ -957,6 +998,14 @@ sub homepageurl (;$) {
return urlto('', $page);
}
+sub ishomepage ($) {
+ my $page = shift;
+
+ return 1 if $page eq 'index';
+ map { return 1 if $page eq 'index.'.$_ } keys %{$config{po_slave_languages}};
+ return undef;
+}
+
sub deletetranslations ($) {
my $deletedmasterfile=shift;
diff --git a/IkiWiki/Plugin/teximg.pm b/IkiWiki/Plugin/teximg.pm
index dba5372b5..f92ed0132 100644
--- a/IkiWiki/Plugin/teximg.pm
+++ b/IkiWiki/Plugin/teximg.pm
@@ -69,13 +69,7 @@ sub preprocess (@) {
if (! defined $code && ! length $code) {
error gettext("missing tex code");
}
-
- if (check($code)) {
- return create($code, check_height($height), \%params);
- }
- else {
- error gettext("code includes disallowed latex commands")
- }
+ return create($code, check_height($height), \%params);
}
sub check_height ($) {
@@ -155,7 +149,7 @@ sub gen_image ($$$$) {
my $tmp = eval { create_tmp_dir($digest) };
if (! $@ &&
writefile("$digest.tex", $tmp, $tex) &&
- system("cd $tmp; latex --interaction=nonstopmode $tmp/$digest.tex > /dev/null") == 0 &&
+ system("cd $tmp; shell_escape=f openout_any=p openin_any=p latex --interaction=nonstopmode $digest.tex < /dev/null > /dev/null") == 0 &&
# ensure destination directory exists
writefile("$imagedir/$digest.png", $config{destdir}, "") &&
(($config{teximg_dvipng} &&
@@ -191,34 +185,4 @@ sub create_tmp_dir ($) {
return $tmpdir;
}
-sub check ($) {
- # Check if the code is ok
- my $code = shift;
-
- my @badthings = (
- qr/\$\$/,
- qr/\\include/,
- qr/\\includegraphic/,
- qr/\\usepackage/,
- qr/\\newcommand/,
- qr/\\renewcommand/,
- qr/\\def/,
- qr/\\input/,
- qr/\\open/,
- qr/\\loop/,
- qr/\\errorstopmode/,
- qr/\\scrollmode/,
- qr/\\batchmode/,
- qr/\\read/,
- qr/\\write/,
- );
-
- foreach my $thing (@badthings) {
- if ($code =~ m/$thing/ ) {
- return 0;
- }
- }
- return 1;
-}
-
1
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 74033fa97..5953b3fee 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -8,26 +8,31 @@ use IkiWiki;
use Encode;
my %backlinks;
-my $backlinks_calculated=0;
+our %brokenlinks;
+my $links_calculated=0;
-sub calculate_backlinks () {
- return if $backlinks_calculated;
- %backlinks=();
+sub calculate_links () {
+ return if $links_calculated;
+ %backlinks=%brokenlinks=();
foreach my $page (keys %links) {
foreach my $link (@{$links{$page}}) {
my $bestlink=bestlink($page, $link);
- if (length $bestlink && $bestlink ne $page) {
- $backlinks{$bestlink}{$page}=1;
+ if (length $bestlink) {
+ $backlinks{$bestlink}{$page}=1
+ if $bestlink ne $page;
+ }
+ else {
+ push @{$brokenlinks{$link}}, $page;
}
}
}
- $backlinks_calculated=1;
+ $links_calculated=1;
}
sub backlink_pages ($) {
my $page=shift;
- calculate_backlinks();
+ calculate_links();
return keys %{$backlinks{$page}};
}
@@ -83,11 +88,10 @@ sub genpage ($$) {
$actions++;
}
if ($config{discussion}) {
- my $discussionlink=lc(gettext("Discussion"));
- if ($page !~ /.*\/\Q$discussionlink\E$/ &&
+ if ($page !~ /.*\/\Q$config{discussionpage}\E$/ &&
(length $config{cgiurl} ||
- exists $links{$page."/".$discussionlink})) {
- $template->param(discussionlink => htmllink($page, $page, gettext("Discussion"), noimageinline => 1, forcesubpage => 1));
+ exists $links{$page."/".$config{discussionpage}})) {
+ $template->param(discussionlink => htmllink($page, $page, $config{discussionpage}, noimageinline => 1, forcesubpage => 1));
$actions++;
}
}
@@ -153,7 +157,7 @@ sub scan ($) {
if ($config{discussion}) {
# Discussion links are a special case since they're
# not in the text of the page, but on its template.
- $links{$page}=[ $page."/".lc(gettext("Discussion")) ];
+ $links{$page}=[ $page."/".lc($config{discussionpage}) ];
}
else {
$links{$page}=[];
@@ -206,6 +210,7 @@ sub render ($) {
if (defined $type) {
my $page=pagename($file);
delete $depends{$page};
+ delete $depends_simple{$page};
will_render($page, htmlpage($page), 1);
return if $type=~/^_/;
@@ -220,6 +225,7 @@ sub render ($) {
}
else {
delete $depends{$file};
+ delete $depends_simple{$file};
will_render($file, $file, 1);
if ($config{hardlink}) {
@@ -417,7 +423,7 @@ sub refresh () {
debug(sprintf(gettext("scanning %s"), $file));
scan($file);
}
- calculate_backlinks();
+ calculate_links();
foreach my $file (@needsbuild) {
debug(sprintf(gettext("building %s"), $file));
render($file);
@@ -427,6 +433,7 @@ sub refresh () {
# internal pages are not rendered
my $page=pagename($file);
delete $depends{$page};
+ delete $depends_simple{$page};
foreach my $old (@{$renderedfiles{$page}}) {
delete $destsources{$old};
}
@@ -450,24 +457,47 @@ sub refresh () {
if (%rendered || @del || @internal) {
my @changed=(keys %rendered, @del);
+ my %lcchanged = map { lc(pagename($_)) => 1 } @changed;
+
# rebuild dependant pages
foreach my $f (@$files) {
next if $rendered{$f};
my $p=pagename($f);
- if (exists $depends{$p}) {
- # only consider internal files
- # if the page explicitly depends on such files
- foreach my $file (@changed, $depends{$p}=~/internal\(/ ? @internal : ()) {
- next if $f eq $file;
- my $page=pagename($file);
- if (pagespec_match($page, $depends{$p}, location => $p)) {
- debug(sprintf(gettext("building %s, which depends on %s"), $f, $page));
- render($f);
- $rendered{$f}=1;
+ my $reason = undef;
+
+ if (exists $depends_simple{$p}) {
+ foreach my $d (keys %{$depends_simple{$p}}) {
+ if (exists $lcchanged{$d}) {
+ $reason = $d;
last;
}
}
}
+
+ if (exists $depends{$p} && ! defined $reason) {
+ D: foreach my $d (keys %{$depends{$p}}) {
+ my $sub=pagespec_translate($d);
+ next if $@ || ! defined $sub;
+
+ # only consider internal files
+ # if the page explicitly depends
+ # on such files
+ foreach my $file (@changed, $d =~ /internal\(/ ? @internal : ()) {
+ next if $file eq $f;
+ my $page=pagename($file);
+ if ($sub->($page, location => $p)) {
+ $reason = $page;
+ last D;
+ }
+ }
+ }
+ }
+
+ if (defined $reason) {
+ debug(sprintf(gettext("building %s, which depends on %s"), $f, $reason));
+ render($f);
+ $rendered{$f}=1;
+ }
}
# handle backlinks; if a page has added/removed links,