Merge commit 'origin/master' into aggregateinternal

master
Simon McVittie 2008-07-14 23:34:07 +01:00
commit 18b3e970ff
49 changed files with 370 additions and 128 deletions

View File

@ -189,11 +189,6 @@ sub loadplugin ($) { #{{{
sub error ($;$) { #{{{
my $message=shift;
my $cleaner=shift;
if ($config{cgi}) {
print "Content-type: text/html\n\n";
print misctemplate(gettext("Error"),
"<p>".gettext("Error").": $message</p>");
}
log_message('err' => $message) if $config{syslog};
if (defined $cleaner) {
$cleaner->();
@ -773,21 +768,30 @@ sub preprocess ($$$;$$) { #{{{
}
my $ret;
if (! $scan) {
$ret=$hooks{preprocess}{$command}{call}->(
@params,
page => $page,
destpage => $destpage,
preview => $preprocess_preview,
);
$ret=eval {
$hooks{preprocess}{$command}{call}->(
@params,
page => $page,
destpage => $destpage,
preview => $preprocess_preview,
);
};
if ($@) {
chomp $@;
$ret="[[!$command <span class=\"error\">".
gettext("Error").": $@"."</span>]]";
}
}
else {
# use void context during scan pass
$hooks{preprocess}{$command}{call}->(
@params,
page => $page,
destpage => $destpage,
preview => $preprocess_preview,
);
eval {
$hooks{preprocess}{$command}{call}->(
@params,
page => $page,
destpage => $destpage,
preview => $preprocess_preview,
);
};
$ret="";
}
$preprocessing{$page}--;

View File

@ -750,4 +750,14 @@ sub cgi (;$$) { #{{{
}
} #}}}
# Does not need tobe called directly; all errors will go through here.
sub cgierror ($) { #{{{
my $message=shift;
print "Content-type: text/html\n\n";
print misctemplate(gettext("Error"),
"<p class=\"error\">".gettext("Error").": $message</p>");
die $@;
} #}}}
1

View File

@ -134,7 +134,7 @@ sub preprocess (@) { #{{{
foreach my $required (qw{name url}) {
if (! exists $params{$required}) {
return "[[aggregate ".sprintf(gettext("missing %s parameter"), $required)."]]";
error sprintf(gettext("missing %s parameter"), $required)
}
}

View File

@ -15,7 +15,7 @@ sub preprocess_if (@) { #{{{
foreach my $param (qw{test then}) {
if (! exists $params{$param}) {
return "[[if ".sprintf(gettext('%s parameter is required'), $param)."]]";
error sprintf(gettext('%s parameter is required'), $param);
}
}

View File

@ -38,10 +38,10 @@ sub preprocess (@) { #{{{
return "" if $params{page} ne $params{destpage};
if (! exists $params{template} || ! length($params{template})) {
return "[[meta ".gettext("template not specified")."]]";
error gettext("template not specified")
}
if (! exists $params{match} || ! length($params{match})) {
return "[[meta ".gettext("match not specified")."]]";
error gettext("match not specified")
}
$pagestate{$params{page}}{edittemplate}{$params{match}}=$params{template};
@ -108,7 +108,9 @@ sub filltemplate ($$) { #{{{
);
};
if ($@) {
return "[[pagetemplate ".gettext("failed to process")." $@]]";
# Indicate that the earlier preprocessor directive set
# up a template that doesn't work.
return "[[!pagetemplate ".gettext("failed to process")." $@]]";
}
$template->param(name => $page);

View File

@ -15,7 +15,7 @@ sub preprocess (@) { #{{{
my $f = `fortune 2>/dev/null`;
if ($?) {
return "[[".gettext("fortune failed")."]]";
error gettext("fortune failed");
}
else {
return "<pre>$f</pre>\n";

View File

@ -19,7 +19,7 @@ sub preprocess (@) { #{{{
# Avoid XSS attacks..
my ($url)=$params{html}=~m#iframe\s+src="http://www\.google\.com/calendar/embed\?([^"<>]+)"#;
if (! defined $url || ! length $url) {
return "[[googlecalendar ".gettext("failed to find url in html")."]]";
error gettext("failed to find url in html")
}
my ($height)=$params{html}=~m#height="(\d+)"#;
my ($width)=$params{html}=~m#width="(\d+)"#;

View File

@ -55,7 +55,7 @@ sub render_graph (\%) { #{{{
waitpid $pid, 0;
$SIG{PIPE}="DEFAULT";
return "[[graph ".gettext("failed to run graphviz")."]]" if ($sigpipe);
error gettext("failed to run graphviz") if $sigpipe;
if (! $params{preview}) {
writefile($dest, $config{destdir}, $png, 1);
@ -82,7 +82,7 @@ sub graph (@) { #{{{
$params{src} = "" unless defined $params{src};
$params{type} = "digraph" unless defined $params{type};
$params{prog} = "dot" unless defined $params{prog};
return "[[graph ".gettext("prog not a valid graphviz program")."]]" unless $graphviz_programs{$params{prog}};
error gettext("prog not a valid graphviz program") unless $graphviz_programs{$params{prog}};
return render_graph(%params);
} # }}}

View File

@ -46,14 +46,14 @@ sub preprocess (@) { #{{{
my $base = IkiWiki::basename($file);
eval q{use Image::Magick};
error($@) if $@;
error gettext("Image::Magick is not installed") if $@;
my $im = Image::Magick->new;
my $imglink;
my $r;
if ($params{size} ne 'full') {
my ($w, $h) = ($params{size} =~ /^(\d+)x(\d+)$/);
return "[[img ".sprintf(gettext('bad size "%s"'), $params{size})."]]"
error sprintf(gettext('bad size "%s"'), $params{size})
unless (defined $w && defined $h);
my $outfile = "$config{destdir}/$dir/${w}x${h}-$base";
@ -63,14 +63,14 @@ sub preprocess (@) { #{{{
if (-e $outfile && (-M srcfile($file) >= -M $outfile)) {
$r = $im->Read($outfile);
return "[[img ".sprintf(gettext("failed to read %s: %s"), $outfile, $r)."]]" if $r;
error sprintf(gettext("failed to read %s: %s"), $outfile, $r) if $r;
}
else {
$r = $im->Read(srcfile($file));
return "[[img ".sprintf(gettext("failed to read %s: %s"), $file, $r)."]]" if $r;
error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r;
$r = $im->Resize(geometry => "${w}x${h}");
return "[[img ".sprintf(gettext("failed to resize: %s"), $r)."]]" if $r;
error sprintf(gettext("failed to resize: %s"), $r) if $r;
# don't actually write file in preview mode
if (! $params{preview}) {
@ -84,7 +84,7 @@ sub preprocess (@) { #{{{
}
else {
$r = $im->Read(srcfile($file));
return "[[img ".sprintf(gettext("failed to read %s: %s"), $file, $r)."]]" if $r;
error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r;
$imglink = $file;
}
@ -101,7 +101,7 @@ sub preprocess (@) { #{{{
}
if (! defined($im->Get("width")) || ! defined($im->Get("height"))) {
return "[[img ".sprintf(gettext("failed to determine size of image %s"), $file)."]]";
error sprintf(gettext("failed to determine size of image %s"), $file)
}
my $imgtag='<img src="'.$imgurl.

View File

@ -98,7 +98,7 @@ sub preprocess_inline (@) { #{{{
my %params=@_;
if (! exists $params{pages}) {
return "[[inline ".gettext("missing pages parameter")."]]";
error gettext("missing pages parameter");
}
my $raw=yesno($params{raw});
my $archive=yesno($params{archive});

View File

@ -94,9 +94,7 @@ sub genmap ($) { #{{{
waitpid $pid, 0;
$SIG{PIPE}="DEFAULT";
if ($sigpipe) {
return "[[linkmap ".gettext("failed to run dot")."]]";
}
error gettext("failed to run dot") if $sigpipe;
return $ret;
} #}}}

View File

@ -138,7 +138,7 @@ sub preprocess (@) { #{{{
# editable page as a stylesheet
my $stylesheet=bestlink($page, $value.".css");
if (! length $stylesheet) {
return "[[meta ".gettext("stylesheet not found")."]]";
error gettext("stylesheet not found")
}
push @{$metaheaders{$page}}, '<link href="'.urlto($stylesheet, $page).
'" rel="'.encode_entities($rel).
@ -172,7 +172,7 @@ sub preprocess (@) { #{{{
add_depends($page, $redir_page);
my $link=bestlink($page, $redir_page);
if (! length $link) {
return "[[meta ".gettext("redir page not found")."]]";
error gettext("redir page not found")
}
$value=urlto($link, $page);
@ -185,7 +185,7 @@ sub preprocess (@) { #{{{
my %seen;
while (exists $pagestate{$at}{meta}{redir}) {
if ($seen{$at}) {
return "[[meta ".gettext("redir cycle is not allowed")."]]";
error gettext("redir cycle is not allowed")
}
$seen{$at}=1;
$at=$pagestate{$at}{meta}{redir};

View File

@ -18,7 +18,7 @@ sub preprocess (@) { #{{{
if (! exists $params{template} ||
$params{template} !~ /^[-A-Za-z0-9._+]+$/ ||
! defined IkiWiki::template_file($params{template})) {
return "[[pagetemplate ".gettext("bad or missing template")."]]";
error gettext("bad or missing template")
}
if ($params{page} eq $params{destpage}) {

View File

@ -34,7 +34,7 @@ sub needsbuild (@) { #{{{
sub preprocess (@) { #{{{
my %params=@_;
if (! exists $params{from} || ! exists $params{to}) {
return "[[ping ".gettext("requires 'from' and 'to' parameters")."]]";
error gettext("requires 'from' and 'to' parameters");
}
if ($params{from} eq $config{url}) {
$pagestate{$params{destpage}}{pinger}{$params{to}}=1;

View File

@ -29,7 +29,7 @@ sub preprocess (@) { #{{{
my $grmfile = '/usr/share/polygen/ita/polygen.grm';
if (! -d '/usr/share/polygen') {
return "[[".gettext("polygen not installed")."]]";
error gettext("polygen not installed");
}
find({wanted => sub {
if (substr($File::Find::name, -length($grammar)) eq $grammar) {
@ -48,7 +48,7 @@ sub preprocess (@) { #{{{
}
if ($?) {
$res="[[".gettext("polygen failed")."]]";
error gettext("command failed");
}
# Strip trailing spaces and newlines so that we flow well with the

View File

@ -29,14 +29,14 @@ sub preprocess (@) { #{{{
}
if (! exists $params{formula}) {
return "[[postsparkline ".gettext("missing formula")."]]";
error gettext("missing formula")
}
my $formula=$params{formula};
$formula=~s/[^a-zA-Z0-9]*//g;
$formula=IkiWiki::possibly_foolish_untaint($formula);
if (! length $formula ||
! IkiWiki::Plugin::postsparkline::formula->can($formula)) {
return "[[postsparkline ".gettext("unknown formula")."]]";
error gettext("unknown formula");
}
add_depends($params{page}, $params{pages});
@ -53,7 +53,7 @@ sub preprocess (@) { #{{{
my @data=eval qq{IkiWiki::Plugin::postsparkline::formula::$formula(\\\%params, \@list)};
if ($@) {
return "[[postsparkline error $@]]";
error $@;
}
if (! @data) {

View File

@ -24,7 +24,7 @@ sub preprocess_shortcut (@) { #{{{
my %params=@_;
if (! defined $params{name} || ! defined $params{url}) {
return "[[shortcut ".gettext("missing name or url parameter")."]]";
error gettext("missing name or url parameter");
}
hook(type => "preprocess", no_override => 1, id => $params{name},

View File

@ -60,13 +60,13 @@ sub preprocess (@) { #{{{
}
}
elsif (! length $value) {
return "[[sparkline ".gettext("parse error")." \"$key\"]]";
error gettext("parse error")." \"$key\"";
}
elsif ($key eq 'featurepoint') {
my ($x, $y, $color, $diameter, $text, $location)=
split(/\s*,\s*/, $value);
if (! defined $diameter || $diameter < 0) {
return "[[sparkline ".gettext("bad featurepoint diameter")."]]";
error gettext("bad featurepoint diameter");
}
$x=int($x);
$y=int($y);
@ -76,7 +76,7 @@ sub preprocess (@) { #{{{
if (defined $location) {
$location=$locmap{$location};
if (! defined $location) {
return "[[sparkline ".gettext("bad featurepoint location")."]]";
error gettext("bad featurepoint location");
}
}
$php.=qq{\$sparkline->SetFeaturePoint($x, $y, '$color', $diameter};
@ -87,23 +87,23 @@ sub preprocess (@) { #{{{
}
if ($c eq 0) {
return "[[sparkline ".gettext("missing values")."]]";
error gettext("missing values");
}
my $height=int($params{height} || 20);
if ($height < 2 || $height > 100) {
return "[[sparkline ".gettext("bad height value")."]]";
error gettext("bad height value");
}
if ($style eq "Bar") {
$php.=qq{\$sparkline->Render($height);\n};
}
else {
if (! exists $params{width}) {
return "[[sparkline ".gettext("missing width parameter")."]]";
error gettext("missing width parameter");
}
my $width=int($params{width});
if ($width < 2 || $width > 1024) {
return "[[sparkline ".gettext("bad width value")."]]";
error gettext("bad width value");
}
$php.=qq{\$sparkline->RenderResampled($width, $height);\n};
}
@ -141,7 +141,7 @@ sub preprocess (@) { #{{{
waitpid $pid, 0;
$SIG{PIPE}="DEFAULT";
if ($sigpipe) {
return "[[sparkline ".gettext("failed to run php")."]]";
error gettext("failed to run php");
}
if (! $params{preview}) {

View File

@ -19,7 +19,7 @@ sub preprocess (@) { #{{{
if (exists $params{file}) {
if (! $pagesources{$params{file}}) {
return "[[table ".gettext("cannot find file")."]]";
error gettext("cannot find file");
}
$params{data} = readfile(srcfile($params{file}));
add_depends($params{page}, $params{file});
@ -61,7 +61,7 @@ sub preprocess (@) { #{{{
defined $params{delimiter} ? $params{delimiter} : "|",);
}
else {
return "[[table ".gettext("unknown data format")."]]";
error gettext("unknown data format");
}
my $header;
@ -69,7 +69,7 @@ sub preprocess (@) { #{{{
$header=shift @data;
}
if (! @data) {
return "[[table ".gettext("empty data")."]]";
error gettext("empty data");
}
my @lines;

View File

@ -16,7 +16,7 @@ sub preprocess (@) { #{{{
my %params=@_;
if (! exists $params{id}) {
return "[[template ".gettext("missing id parameter")."]]";
error gettext("missing id parameter")
}
my $template_page="templates/$params{id}";
@ -42,7 +42,7 @@ sub preprocess (@) { #{{{
);
};
if ($@) {
return "[[template ".gettext("failed to process:")." $@]]";
error gettext("failed to process:")." $@"
}
$params{basename}=IkiWiki::basename($params{page});

View File

@ -14,7 +14,7 @@ sub preprocess (@) { #{{{
foreach my $param (qw{match pagespec}) {
if (! exists $params{$param}) {
return "[[testpagespec $param parameter is required]]";
error sprintf(gettext("%s parameter is required"), $param);
}
}

View File

@ -27,14 +27,14 @@ sub preprocess (@) { #{{{
my $code = $params{code};
if (! defined $code && ! length $code) {
return "[[teximg ".gettext("missing tex code"). "]]";
error gettext("missing tex code");
}
if (check($code)) {
return create($code, check_height($height), \%params);
}
else {
return "[[teximg ".gettext("code includes disallowed latex commands"). "]]";
error gettext("code includes disallowed latex commands")
}
} #}}}
@ -85,7 +85,7 @@ sub create ($$$) { #{{{
.qq{" class="teximg" />};
}
else {
return qq{[[teximg <a href="$logurl">}.gettext("failed to generate image from code")."</a>]]";
error qq{<a href="$logurl">}.gettext("failed to generate image from code")."</a>";
}
} #}}}

View File

@ -229,10 +229,14 @@ sub render ($) { #{{{
will_render($file, $file, 1);
if ($config{hardlink}) {
prep_writefile($file, $config{destdir});
unlink($config{destdir}."/".$file);
if (link($srcfile, $config{destdir}."/".$file)) {
return;
# only hardlink if owned by same user
my @stat=stat($srcfile);
if ($stat[4] == $>) {
prep_writefile($file, $config{destdir});
unlink($config{destdir}."/".$file);
if (link($srcfile, $config{destdir}."/".$file)) {
return;
}
}
# if hardlink fails, fall back to copying
}

View File

@ -97,6 +97,8 @@ sub setup () { #{{{
loadplugins();
checkconfig();
require IkiWiki::Render;
if ($config{render}) {
commandline_render();
}

6
debian/changelog vendored
View File

@ -19,6 +19,12 @@ ikiwiki (2.54) UNRELEASED; urgency=low
uuid in feeds. (smcv)
* Move yesno function out of inline and into IkiWiki core, not exported.
* meta: fix title() PageSpec (smcv)
* Some footer style changes. (smcv)
* Error handling improvement for preprocess hooks. It's now safe to call
error() from such hooks; it will cause a nicely formatted error message
to be inserted into the page.
* Cut the size of the binary package in half by excluding pages for bugs
and todo items from the html shipped in it.
-- Josh Triplett <josh@freedesktop.org> Wed, 09 Jul 2008 21:30:33 -0700

2
debian/control vendored
View File

@ -2,7 +2,7 @@ Source: ikiwiki
Section: web
Priority: optional
Build-Depends: perl, debhelper (>= 5)
Build-Depends-Indep: dpkg-dev (>= 1.9.0), libxml-simple-perl, libtext-markdown-perl | markdown, libtimedate-perl, libhtml-template-perl, libhtml-scrubber-perl, wdg-html-validator, libhtml-parser-perl, liburi-perl
Build-Depends-Indep: dpkg-dev (>= 1.9.0), libxml-simple-perl, libtext-markdown-perl | markdown, libtimedate-perl, libhtml-template-perl, libhtml-scrubber-perl, wdg-html-validator, libhtml-parser-perl, liburi-perl, perlmagick
Maintainer: Joey Hess <joeyh@debian.org>
Uploaders: Joey Hess <joeyh@debian.org>, Josh Triplett <josh@freedesktop.org>
Standards-Version: 3.8.0

View File

@ -0,0 +1,10 @@
Joey, I would like to see your blog script I've found
at [[Tips|tips/blog_script]] page, but it seems that the URL
(http://git.kitenet.net/?p=joey/home;a=blob_plain;f=bin/blog)
to its Git repo is broken:
403 Forbidden - No such project
--[[Paweł|ptecza]]
> [[fixed|done]] --[[Joey]]

View File

@ -0,0 +1,14 @@
Trying to build current Git master in a (two weeks old - no DSL here) sid chroot triggers :
rendering news.mdwn
Can't locate Image/Magick.pm in @INC (@INC contains: . blib/lib /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at (eval 175) line 2.
BEGIN failed--compilation aborted at (eval 175) line 2.
make[1]: *** [extra_build] Error 2
make[1]: Leaving directory `/tmp/buildd/ikiwiki-2.54'
make: *** [build-stamp] Error 2
Adding perlmagick to the build-deps fixes it. I read somewhere in debian/changelog that this build-deb was not needed, but...
> It's not needed by the test suite, but once I added a img to the source
> wiki, it became needed. [[done]] --[[Joey]]

View File

@ -0,0 +1,7 @@
After building a fresh deb from current Git master (9b62dac4bcf62f3a1f76ec5a7ed5a90db16ea1c8) :
$ ikiwiki --setup ~/ikiwiki.setup --rebuild
Undefined subroutine &IkiWiki::refresh called at /usr/share/perl5/IkiWiki/Setup.pm line 113.
> [[done]], it just needed "require IkiWiki::Render" before it started
> rendering. --[[smcv]]

View File

@ -15,3 +15,21 @@ adding this `clear: both`?
> before the modification date. So all of them have to clear both above and
> below. I'm sure there are better ways for the CSS to handle that.
> --[[Joey]]
>> There is indeed a better way - all the optional things below the
>> content are wrapped in `<div id="footer">`, so to have the browser wait
>> until all floating boxes have finished before rendering the footer, it
>> would be sufficient to have `#footer { clear: both; }` and remove all
>> the other footer-related `clear` attributes. I'm not sure what you mean
>> by "clear above and below" - the clear attribute takes values none, left,
>> right or both, and its purpose is to stop floating boxes (sidebars,
>> mainly) from overlapping with footers.
>>
>> ... oh, I see what you mean - this affects inlines too. In inlinepage.tmpl
>> we could wrap the "pseudo-footer" in `<div class="inlinefooter">` too?
>> Then sites could choose whether to set clear:both on the inlinefooter
>> or not, and this would be separate from the same styling on whole pages.
>>
>> [[done]] --[[smcv]]
[[patch]]

View File

@ -1,2 +1,5 @@
ikiwiki will generate html formatted error messages to the command
line if --cgi is set, even if it's not yet running as a cgi
> [[done]], at last. Oldest open bug.. just thought of an elegant fix!
> --[[Joey]]

View File

@ -0,0 +1,11 @@
basewiki_brokenlinks.t fails when running dpkg-buildpackage in non-English environment : it greps for an (non-)error message that is i18n'd. This of course does not happen when building in a proper chroot environment... which happens to fail as well, for other reasons, but this will be for another bug.
The `LANG=` on line 9 does not seem to do what it's supposed to, go figure.
I've never had to understand the Unix locales, so I randomly tried to replace `LANG=` in basewiki_brokenlinks.t with :
- `LANG=C` : fails
- `LANGUAGE=` : fails
- `LANGUAGE=C` : works!
> For maximum precedence it should have been LC_ALL=C. [[done]], I think... --[[smcv]]

View File

@ -412,12 +412,13 @@ Aborts with an error message. If the second parameter is passed, it is a
function that is called after the error message is printed, to do any final
cleanup.
Note that while any plugin can use this for a fatal error, plugins should
try to avoid dying on bad input when building a page, as that will halt
the entire wiki build and make the wiki unusable. So for example, if a
[[ikiwiki/PreProcessorDirective]] is passed bad parameters, it's better to
return an error message, which can appear on the wiki page, rather than
calling error().
If called inside a preprocess hook, error() does not abort the entire
wiki build, but instead replaces the [[ikiwiki/PreProcessorDirective]] with
a version containing the error message.
In other hooks, error() is a fatal error, so use with care. Try to avoid
dying on bad input when building a page, as that will halt
the entire wiki build and make the wiki unusable.
#### `template($;@)`

View File

@ -169,7 +169,7 @@ be a guard on how high it will go.
}
my $num=$last{$page}++;
if ($num > 25) {
return "[[fib will only calculate the first 25 numbers in the sequence]]";
error "can only calculate the first 25 numbers in the sequence";
}
return fib($num);
}
@ -182,7 +182,7 @@ does for numbers less than 1. Or for any number that's not an integer. In
either case, it will run forever. Here's one way to fix that:
if (int($num) != $num || $num < 1) {
return "[[fib positive integers only, please]]";
error "positive integers only, please";
}
As these security problems have demonstrated, even a simple input from the

View File

@ -2,7 +2,17 @@
system developed by Matt Mackall. Ikiwiki supports storing a wiki in a
mercurial repository.
Ikiwiki can run as a post-update hook to update a wiki whenever commits
Ikiwiki can run as a `post-commit` and/or `incoming` hook to update a wiki whenever commits or remote pushes
come in. When running as a [[cgi]] with Mercurial, ikiwiki automatically
commits edited pages, and uses the Mercurial history to generate the
[[RecentChanges]] page.
Example for a `.hg/hgrc` file in `$SRCDIR`:
[hooks]
post-commit = /home/abe/bin/rebuildwiki
incoming = /home/abe/bin/rebuildwiki
Do not use `commit` or `precommit` hooks or ikiwiki will run into a dead lock when committing in `$SRCDIR`
See also [[todo/mercurial|todo/mercurial]]

View File

@ -35,12 +35,14 @@
padding: .2em .4em;
}
.tags {
.pagefooter {
clear: both;
}
.tags {
}
#pageinfo {
clear: both;
margin: 1em 0;
border-top: 1px solid #000;
}
@ -140,12 +142,15 @@ div.recentchanges {
.pagedate,
.pagelicense,
.pagecopyright {
clear: both;
font-style: italic;
display: block;
margin-top: 1em;
}
.error {
color: #C00;
}
/* Used for invalid form fields. */
.fb_invalid {
color: red;

View File

@ -1,4 +1,4 @@
I have a [blog](http://git.kitenet.net/?p=joey/home;a=blob_plain;f=bin/blog)
I have a [blog](http://git.kitenet.net/?p=joey/home.git;a=blob_plain;f=bin/blog)
program that I use to write blog posts in a text editor. The first line I
enter is used as the title, and it automatically comes up with a unique page
name based on the title and handles all the details of posting to my blog.

View File

@ -72,3 +72,8 @@ a dedicated plugin, called `genealogictitle` or whatever, and :
-- intrigeri
> Plugin sounds reasonable. --[[Joey]]
>> Well, it seems I once more designed a solution before clearly
>> defining my problem... What I really need is more generic, can be
>> done as a plugin, and deserves its own [[todo|pedigree_plugin]], so
>> I'm tagging this one wontfix^W [[done]]. I'm sorry. -- intrigeri

View File

@ -0,0 +1,28 @@
Recently I've wanted to colour some piece of text on my Ikiwiki page.
It seems that Markdown can do it only using HTML tags, so I used
&lt;span class="color"&gt;foo bar baz&lt;/span&gt;.
However, in my opinion mixing Markdown syntax and HTML tags is rather ugly,
so maybe we should create a new color plugin to add more color to Ikiwiki ;)
I know that another Wikis have similar plugin, for example
[WikiDot](http://www.wikidot.com/).
I've noticed that htmlscrubber plugin strips `style` attribute, because of
security, so probably we need to use `class` attribute of HTML. But then
we have to customize our `local.css` file to add all color we want to use.
It's not as easy in usage like color name or definition as plugin argument,
but I don't have a better idea right now.
What do you think about it? --[[Paweł|ptecza]]
> Making a plugin preserve style attributes can be done, it just has to add
> them after the sanitize step, which strips them. The general method is
> adding placeholders first, and replacing them with the real html later.
>
> The hard thing to me seems to be finding a syntax that is better than a
> `<span>`. A preprocessor directive is not really any less ugly than html
> tags, though at least it could play nicely with nested markdown: --[[Joey]]
>
> \[[color red,green """
> Xmas-colored markdown here
> """]]

View File

@ -480,4 +480,8 @@ It is in a [darcs repository](http://joyful.com/darcsweb/darcsweb.cgi?r=ikiwiki-
> conflicts and return a page with conflict markers for the user to fix
> the conflict.
I have addressed the recentchanges bit, you can find my hacked up darcs.pm at <http://web.mornfall.net/stuff/web-root/IkiWiki/Rcs/darcs.pm>.
It's got couple of FIXMEs, and a very site-specific filter for recentchanges. Not sure how to do that better though. I will eventually add web commits, probably of my own (and mention it here).
[[tag patch]]

View File

@ -1,5 +1,3 @@
* Need to get post commit hook working (or an example of how to use it.)
* See below. --[[bma]]
* rcs_notify is not implemented (not needed in this branch --[[Joey]])
* Is the code sufficiently robust? It just warns when mercurial fails.
* When rcs_commit is called with a $user that is an openid, it will be

View File

@ -0,0 +1,76 @@
After realizing (thanks to
[[Allow_TITLE_to_include_part_of_the_path_in_addition_to_the_basename]])
that I needed some kind of "parentlinks on steroids", I wrote a new
plugin, called pedigree.
This plugin provides a bunch of loops that one can use in his/her
`HTML::Template`'s to iterate over all or a subset of a page's
parents. Inside these loops, half a dozen variables are made
available, in addition to `PAGE` and `URL` that are already provided
by parentlinks.
Amongst many possibilities, one can e.g. simply use this plugin to
give every parent link a different `class=` attribute, depending
either on its depth in the path leading to the current page, or on its
distance to it.
The code and documentation (including simple and complex usage
examples) are in the 'pedigree' Git branch in this repo:
git://repo.or.cz/ikiwiki/intrigeri.git
Seems there is also a [gitweb](http://repo.or.cz/w/ikiwiki/intrigeri.git).
> Ok, I'll take a look. BTW, could you allow user joey on repo.or.cz
> push access to the main ikiwiki repo you set up there? --[[Joey]]
>> I did not. The main ikiwiki repo on repo.or.cz seems to have been
>> been setup by johannes.schindelin@gmx.de ; mine is what they call
>> a "fork" (but it's not, obviously).
Any opinions on the idea/design/implementation?
> Seems that there should be a more generic way to do `PEDIGREE_BUT_ROOT`
> and `PEDIGREE_BUT_TWO_OLDEST` (also `is_second_ancestor`,
> `is_grand_mother` etc). One way would be to include in `PEDIGREE`
> a set of values like `depth_1`, `depth_2`, etc. The one corresponding
> to the `absdepth` would be true. This would allow a template like this:
<TMPL_LOOP NAME="PEDIGREE">
<TMPL_IF NAME="depth_1">
</TMPL_ELSE>
<TMPL_IF NAME="depth_2">
</TMPL_ELSE>
<TMPL_VAR PAGE> /* only showing pages 2 levels deep */
</TMPL_IF>
</TMPL_IF>
</TMPL_LOOP>
> The only missing information would be `reldepth`, but in the above
> example the author of that template knows that it's `absdepth - 1`
> (Things would be a lot nicer if `HTML::Template` had equality tests!)
>
> Since this would make it more generic and also fix your one documented
> bug, I can see no reason not to do it. ;-) --[[Joey]]
>> Thanks for your comments. I'll answer soon. (Grrr, I really
>> need to find a way to edit this wiki offline, every minute
>> online costs bucks to me, my old modem gently weeps,
>> and I hate webbrowsers.) -- intrigeri
(I'll try never to rebase this branch, but writing this plugin has
been a pretext for me to start learning Git, so...)
To finish with, it seems no plugin bundled with ikiwiki uses the current
parentlinks implementation, so one could event think of moving it from the
core to this plugin (which should then be enabled by default, since the
default templates do use parentlinks ;).
> I think that moving parentlinks out to a plugin is a good idea.
> However, if it's done, I think the plugin should be named parentlinks,
> and should continue to use the same template variables as are used now,
> to avoid needing to change custom templates. Pedigree is a quite nice
> name, but renaming it to parentlinks seems to be the way to go to me.
> --[[Joey]]
>> Agreed. -- intrigeri

View File

@ -0,0 +1 @@
I'm trying to add enough features/fix enough bugs to convert [smcv.pseudorandom.co.uk](http://smcv.pseudorandom.co.uk/) from Django + Python + misc hacks to ikiwiki.

View File

@ -9,7 +9,7 @@ use IkiWiki::Setup::Standard {
underlaydir => "underlays/basewiki",
wrappers => [],
discussion => 0,
exclude => qr/\/discussion/,
exclude => qr/\/discussion|bugs\/*|todo\/*/,
locale => '',
verbose => 1,
syslog => 0,

View File

@ -123,7 +123,10 @@ sub main () { #{{{
}
elsif ($config{cgi}) {
require IkiWiki::CGI;
cgi();
eval {cgi()};
if ($@) {
cgierror($@);
}
}
elsif ($config{render}) {
require IkiWiki::Render;

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-07-11 06:04-0400\n"
"POT-Creation-Date: 2008-07-13 15:04-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -50,7 +50,7 @@ msgid "%s is not an editable page"
msgstr ""
#: ../IkiWiki/CGI.pm:438 ../IkiWiki/Plugin/brokenlinks.pm:24
#: ../IkiWiki/Plugin/inline.pm:266 ../IkiWiki/Plugin/opendiscussion.pm:17
#: ../IkiWiki/Plugin/inline.pm:261 ../IkiWiki/Plugin/opendiscussion.pm:17
#: ../IkiWiki/Plugin/orphans.pm:28 ../IkiWiki/Render.pm:95
#: ../IkiWiki/Render.pm:162
msgid "discussion"
@ -71,6 +71,10 @@ msgstr ""
msgid "You are banned."
msgstr ""
#: ../IkiWiki/CGI.pm:758 ../IkiWiki/CGI.pm:759 ../IkiWiki.pm:782
msgid "Error"
msgstr ""
#: ../IkiWiki/Plugin/aggregate.pm:53
msgid "Aggregation triggered via web."
msgstr ""
@ -148,7 +152,7 @@ msgstr ""
msgid "deleting bucket.."
msgstr ""
#: ../IkiWiki/Plugin/amazon_s3.pm:37 ../IkiWiki/Setup.pm:115
#: ../IkiWiki/Plugin/amazon_s3.pm:37 ../IkiWiki/Setup.pm:117
msgid "done"
msgstr ""
@ -190,7 +194,7 @@ msgstr ""
msgid "There are no broken links!"
msgstr ""
#: ../IkiWiki/Plugin/conditional.pm:18
#: ../IkiWiki/Plugin/conditional.pm:18 ../IkiWiki/Plugin/testpagespec.pm:17
#, perl-format
msgid "%s parameter is required"
msgstr ""
@ -208,7 +212,7 @@ msgstr ""
msgid "edittemplate %s registered for %s"
msgstr ""
#: ../IkiWiki/Plugin/edittemplate.pm:111
#: ../IkiWiki/Plugin/edittemplate.pm:113
msgid "failed to process"
msgstr ""
@ -228,6 +232,10 @@ msgstr ""
msgid "prog not a valid graphviz program"
msgstr ""
#: ../IkiWiki/Plugin/img.pm:49
msgid "Image::Magick is not installed"
msgstr ""
#: ../IkiWiki/Plugin/img.pm:56
#, perl-format
msgid "bad size \"%s\""
@ -253,33 +261,33 @@ msgstr ""
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr ""
#: ../IkiWiki/Plugin/inline.pm:106
#: ../IkiWiki/Plugin/inline.pm:101
msgid "missing pages parameter"
msgstr ""
#: ../IkiWiki/Plugin/inline.pm:154
#: ../IkiWiki/Plugin/inline.pm:149
#, perl-format
msgid "unknown sort type %s"
msgstr ""
#: ../IkiWiki/Plugin/inline.pm:225
#: ../IkiWiki/Plugin/inline.pm:220
msgid "Add a new post titled:"
msgstr ""
#: ../IkiWiki/Plugin/inline.pm:241
#: ../IkiWiki/Plugin/inline.pm:236
#, perl-format
msgid "nonexistant template %s"
msgstr ""
#: ../IkiWiki/Plugin/inline.pm:274 ../IkiWiki/Render.pm:99
#: ../IkiWiki/Plugin/inline.pm:269 ../IkiWiki/Render.pm:99
msgid "Discussion"
msgstr ""
#: ../IkiWiki/Plugin/inline.pm:504
#: ../IkiWiki/Plugin/inline.pm:506
msgid "RPC::XML::Client not found, not pinging"
msgstr ""
#: ../IkiWiki/Plugin/linkmap.pm:98
#: ../IkiWiki/Plugin/linkmap.pm:97
msgid "failed to run dot"
msgstr ""
@ -297,15 +305,15 @@ msgstr ""
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
#: ../IkiWiki/Plugin/meta.pm:137
#: ../IkiWiki/Plugin/meta.pm:141
msgid "stylesheet not found"
msgstr ""
#: ../IkiWiki/Plugin/meta.pm:171
#: ../IkiWiki/Plugin/meta.pm:175
msgid "redir page not found"
msgstr ""
#: ../IkiWiki/Plugin/meta.pm:184
#: ../IkiWiki/Plugin/meta.pm:188
msgid "redir cycle is not allowed"
msgstr ""
@ -387,11 +395,11 @@ msgstr ""
msgid "LWP not found, not pinging"
msgstr ""
#: ../IkiWiki/Plugin/poll.pm:65
#: ../IkiWiki/Plugin/poll.pm:60
msgid "vote"
msgstr ""
#: ../IkiWiki/Plugin/poll.pm:73
#: ../IkiWiki/Plugin/poll.pm:68
msgid "Total votes:"
msgstr ""
@ -400,7 +408,7 @@ msgid "polygen not installed"
msgstr ""
#: ../IkiWiki/Plugin/polygen.pm:51
msgid "polygen failed"
msgid "command failed"
msgstr ""
#: ../IkiWiki/Plugin/postsparkline.pm:32
@ -604,47 +612,47 @@ msgstr ""
msgid "getctime not implemented"
msgstr ""
#: ../IkiWiki/Render.pm:286 ../IkiWiki/Render.pm:307
#: ../IkiWiki/Render.pm:290 ../IkiWiki/Render.pm:311
#, perl-format
msgid "skipping bad filename %s"
msgstr ""
#: ../IkiWiki/Render.pm:361
#: ../IkiWiki/Render.pm:365
#, perl-format
msgid "removing old page %s"
msgstr ""
#: ../IkiWiki/Render.pm:401
#: ../IkiWiki/Render.pm:405
#, perl-format
msgid "scanning %s"
msgstr ""
#: ../IkiWiki/Render.pm:406
#: ../IkiWiki/Render.pm:410
#, perl-format
msgid "rendering %s"
msgstr ""
#: ../IkiWiki/Render.pm:427
#: ../IkiWiki/Render.pm:431
#, perl-format
msgid "rendering %s, which links to %s"
msgstr ""
#: ../IkiWiki/Render.pm:448
#: ../IkiWiki/Render.pm:452
#, perl-format
msgid "rendering %s, which depends on %s"
msgstr ""
#: ../IkiWiki/Render.pm:487
#: ../IkiWiki/Render.pm:491
#, perl-format
msgid "rendering %s, to update its backlinks"
msgstr ""
#: ../IkiWiki/Render.pm:499
#: ../IkiWiki/Render.pm:503
#, perl-format
msgid "removing %s, no longer rendered by %s"
msgstr ""
#: ../IkiWiki/Render.pm:523
#: ../IkiWiki/Render.pm:527
#, perl-format
msgid "ikiwiki: cannot render %s"
msgstr ""
@ -660,11 +668,11 @@ msgstr ""
msgid "generating wrappers.."
msgstr ""
#: ../IkiWiki/Setup.pm:105
#: ../IkiWiki/Setup.pm:107
msgid "rebuilding wiki.."
msgstr ""
#: ../IkiWiki/Setup.pm:108
#: ../IkiWiki/Setup.pm:110
msgid "refreshing wiki.."
msgstr ""
@ -712,15 +720,15 @@ msgstr ""
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
#: ../IkiWiki.pm:194 ../IkiWiki.pm:195
msgid "Error"
msgstr ""
#. translators: The first parameter is a
#. translators: preprocessor directive name,
#. translators: the second a page name, the
#. translators: third a number.
#: ../IkiWiki.pm:770
#: ../IkiWiki.pm:765
#, perl-format
msgid "%s preprocessing loop detected on %s at depth %i"
msgstr ""
#: ../IkiWiki.pm:1212
msgid "yes"
msgstr ""

View File

@ -6,7 +6,7 @@ use Test::More 'no_plan';
ok(! system("mkdir t/tmp"));
ok(! system("make -q ikiwiki.out"));
ok(! system("make extra_install DESTDIR=`pwd`/t/tmp/install PREFIX=/usr >/dev/null"));
ok(! system("LANG= perl -T -I. ./ikiwiki.out -plugin smiley -plugin brokenlinks -rebuild -underlaydir=t/tmp/install/usr/share/ikiwiki/basewiki -templatedir=templates t/basewiki_brokenlinks t/tmp/out"));
ok(! system("LC_ALL=C perl -T -I. ./ikiwiki.out -plugin smiley -plugin brokenlinks -rebuild -underlaydir=t/tmp/install/usr/share/ikiwiki/basewiki -templatedir=templates t/basewiki_brokenlinks t/tmp/out"));
ok(`grep 'no broken links' t/tmp/out/index.html`);
ok(-e "t/tmp/out/style.css");
ok(! system("rm -rf t/tmp t/basewiki_brokenlinks/.ikiwiki"));

View File

@ -1,4 +1,7 @@
<div class="inlinepage">
<div class="inlineheader">
<TMPL_IF NAME="AUTHOR">
<span class="author">
<TMPL_IF NAME="AUTHORURL">
@ -15,7 +18,14 @@
<a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a>
</TMPL_IF>
</span>
</div><!--.inlineheader-->
<div class="inlinecontent">
<TMPL_VAR CONTENT>
</div><!--.inlinecontent-->
<div class="inlinefooter">
<span class="pagedate">
Posted <TMPL_VAR CTIME>
@ -52,7 +62,9 @@ License: <TMPL_VAR LICENSE>
<li><TMPL_VAR DISCUSSIONLINK></li>
</TMPL_IF>
</ul>
</div>
</div><!--.actions-->
</TMPL_IF>
</div>
</div><!--.inlinefooter-->
</div><!--.inlinepage-->

View File

@ -17,6 +17,7 @@
</head>
<body>
<div class="pageheader">
<div class="header">
<span>
<TMPL_LOOP NAME="PARENTLINKS">
@ -50,6 +51,7 @@
</ul>
</div>
</TMPL_IF>
</div> <!-- .pageheader -->
<TMPL_IF SIDEBAR>
<div id="sidebar">
@ -61,7 +63,7 @@
<TMPL_VAR CONTENT>
</div>
<div id="footer">
<div id="footer" class="pagefooter">
<div id="pageinfo">
<TMPL_IF NAME="TAGS">
@ -88,7 +90,7 @@ Links:
</span>
</span>
</TMPL_IF>
</div>
</div><!-- #backlinks -->
</TMPL_IF>
<TMPL_IF COPYRIGHT>
@ -110,10 +112,10 @@ Last edited <TMPL_VAR NAME=MTIME>
<!-- Created <TMPL_VAR NAME=CTIME> -->
</div>
</div>
</div><!-- #pageinfo -->
<TMPL_IF EXTRAFOOTER><TMPL_VAR EXTRAFOOTER></TMPL_IF>
<!-- from <TMPL_VAR NAME=WIKINAME> -->
</div>
</div><!-- .pagefooter #footer -->
</body>
</html>