X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/137a87afd5dac7bb248be02d1277d6a007171aa2..b562eaebf0b70ed6503e5c387246f8e8bf758bfe:/IkiWiki.pm?ds=sidebyside

diff --git a/IkiWiki.pm b/IkiWiki.pm
index 8f7d8d20b..b605ac370 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -9,7 +9,7 @@ use open qw{:utf8 :std};
 
 use vars qw{%config %links %oldlinks %oldpagemtime %pagectime %pagecase
             %renderedfiles %oldrenderedfiles %pagesources %depends %hooks
-	    %forcerebuild};
+	    %forcerebuild $gettext_obj};
 
 use Exporter q{import};
 our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match
@@ -44,7 +44,6 @@ sub defaultconfig () { #{{{
 	cgiurl => '',
 	historyurl => '',
 	diffurl => '',
-	anonok => 0,
 	rss => 0,
 	atom => 0,
 	discussion => 1,
@@ -56,6 +55,8 @@ sub defaultconfig () { #{{{
 	wrappermode => undef,
 	svnrepo => undef,
 	svnpath => "trunk",
+	gitorigin_branch => "origin",
+	gitmaster_branch => "master",
 	srcdir => undef,
 	destdir => undef,
 	pingurl => [],
@@ -64,7 +65,8 @@ sub defaultconfig () { #{{{
 	setup => undef,
 	adminuser => undef,
 	adminemail => undef,
-	plugin => [qw{mdwn inline htmlscrubber passwordauth}],
+	plugin => [qw{mdwn inline htmlscrubber passwordauth signinedit
+	              lockedit conditional}],
 	timeformat => '%c',
 	locale => undef,
 	sslcookie => 0,
@@ -81,8 +83,10 @@ sub checkconfig () { #{{{
 	if (defined $config{locale}) {
 		eval q{use POSIX};
 		error($@) if $@;
-		$ENV{LANG} = $config{locale}
-			if POSIX::setlocale(&POSIX::LC_TIME, $config{locale});
+		if (POSIX::setlocale(&POSIX::LC_ALL, $config{locale})) {
+			$ENV{LANG}=$config{locale};
+			$gettext_obj=undef;
+		}
 	}
 
 	if ($config{w3mmode}) {
@@ -228,9 +232,10 @@ sub srcfile ($) { #{{{
 	error("internal error: $file cannot be found");
 } #}}}
 
-sub readfile ($;$) { #{{{
+sub readfile ($;$$) { #{{{
 	my $file=shift;
 	my $binary=shift;
+	my $wantfd=shift;
 
 	if (-l $file) {
 		error("cannot read a symlink ($file)");
@@ -239,16 +244,18 @@ sub readfile ($;$) { #{{{
 	local $/=undef;
 	open (IN, $file) || error("failed to read $file: $!");
 	binmode(IN) if ($binary);
+	return \*IN if $wantfd;
 	my $ret=<IN>;
 	close IN;
 	return $ret;
 } #}}}
 
-sub writefile ($$$;$) { #{{{
+sub writefile ($$$;$$) { #{{{
 	my $file=shift; # can include subdirs
 	my $destdir=shift; # directory to put file in
 	my $content=shift;
 	my $binary=shift;
+	my $wantfd=shift;
 	
 	my $test=$file;
 	while (length $test) {
@@ -271,6 +278,7 @@ sub writefile ($$$;$) { #{{{
 	
 	open (OUT, ">$destdir/$file") || error("failed to write $destdir/$file: $!");
 	binmode(OUT) if ($binary);
+	return \*OUT if $wantfd;
 	print OUT $content;
 	close OUT;
 } #}}}
@@ -517,6 +525,10 @@ sub preprocess ($$$;$) { #{{{
 			if ($preprocessing{$page}++ > 3) {
 				# Avoid loops of preprocessed pages preprocessing
 				# other pages that preprocess them, etc.
+				#translators: The first parameter is a
+				#translators: preprocessor directive name,
+				#translators: the second a page name, the
+				#translators: third a number.
 				return "[[".sprintf(gettext("%s preprocessing loop detected on %s at depth %i"),
 					$command, $page, $preprocessing{$page}).
 				"]]";
@@ -632,18 +644,35 @@ sub saveindex () { #{{{
 	close OUT;
 } #}}}
 
+sub template_file ($) { #{{{
+	my $template=shift;
+
+	foreach my $dir ($config{templatedir}, "$installdir/share/ikiwiki/templates") {
+		return "$dir/$template" if -e "$dir/$template";
+	}
+	return undef;
+} #}}}
+
 sub template_params (@) { #{{{
-	my $filename=shift;
-	
+	my $filename=template_file(shift);
+
+	if (! defined $filename) {
+		return if wantarray;
+		return "";
+	}
+
 	require HTML::Template;
-	return filter => sub {
+	my @ret=(
+		filter => sub {
 			my $text_ref = shift;
 			$$text_ref=&Encode::decode_utf8($$text_ref);
 		},
-		filename => "$config{templatedir}/$filename",
+		filename => $filename,
 		loop_context_vars => 1,
 		die_on_bad_params => 0,
-		@_;
+		@_
+	);
+	return wantarray ? @ret : {@ret};
 } #}}}
 
 sub template ($;@) { #{{{
@@ -739,6 +768,49 @@ sub safequote ($) { #{{{
 	return "q{$s}";
 } #}}}
 
+sub add_depends ($$) { #{{{
+	my $page=shift;
+	my $pagespec=shift;
+	
+	if (! exists $depends{$page}) {
+		$depends{$page}=$pagespec;
+	}
+	else {
+		$depends{$page}=pagespec_merge($depends{$page}, $pagespec);
+	}
+} # }}}
+
+sub file_pruned ($$) { #{{{
+	require File::Spec;
+	my $file=File::Spec->canonpath(shift);
+	my $base=File::Spec->canonpath(shift);
+	$file=~s#^\Q$base\E/*##;
+
+	my $regexp='('.join('|', @{$config{wiki_file_prune_regexps}}).')';
+	$file =~ m/$regexp/;
+} #}}}
+
+sub gettext { #{{{
+	# Only use gettext in the rare cases it's needed.
+	if (exists $ENV{LANG} || exists $ENV{LC_ALL} || exists $ENV{LC_MESSAGES}) {
+		if (! $gettext_obj) {
+			$gettext_obj=eval q{
+				use Locale::gettext q{textdomain};
+				Locale::gettext->domain('ikiwiki')
+			};
+			if ($@) {
+				print STDERR "$@";
+				$gettext_obj=undef;
+				return shift;
+			}
+		}
+		return $gettext_obj->get(shift);
+	}
+	else {
+		return shift;
+	}
+} #}}}
+
 sub pagespec_merge ($$) { #{{{
 	my $a=shift;
 	my $b=shift;
@@ -779,62 +851,46 @@ sub pagespec_translate ($) { #{{{
 		elsif ($word eq "(" || $word eq ")" || $word eq "!") {
 			$code.=" ".$word;
 		}
-		elsif ($word =~ /^(link|backlink|created_before|created_after|creation_month|creation_year|creation_day)\((.+)\)$/) {
-			$code.=" match_$1(\$page, ".safequote($2).")";
+		elsif ($word =~ /^(\w+)\((.*)\)$/) {
+			if (exists $IkiWiki::PageSpec::{"match_$1"}) {
+				$code.=" IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).")";
+			}
+			else {
+				$code.=" 0";
+			}
 		}
 		else {
-			$code.=" match_glob(\$page, ".safequote($word).")";
+			$code.=" IkiWiki::PageSpec::match_glob(\$page, ".safequote($word).", \$from)";
 		}
 	}
 
 	return $code;
 } #}}}
 
-sub add_depends ($$) { #{{{
-	my $page=shift;
-	my $pagespec=shift;
-	
-	if (! exists $depends{$page}) {
-		$depends{$page}=$pagespec;
-	}
-	else {
-		$depends{$page}=pagespec_merge($depends{$page}, $pagespec);
-	}
-} # }}}
-
-sub file_pruned ($$) { #{{{
-	require File::Spec;
-	my $file=File::Spec->canonpath(shift);
-	my $base=File::Spec->canonpath(shift);
-	$file=~s#^\Q$base\E/*##;
-
-	my $regexp='('.join('|', @{$config{wiki_file_prune_regexps}}).')';
-	$file =~ m/$regexp/;
-} #}}}
-
-sub gettext { #{{{
-	# Only use gettext in the rare cases it's needed.
-	# This overrides future calls of this function.
-	if (exists $ENV{LANG} || exists $ENV{LC_ALL} || exists $ENV{LC_MESSAGES}) {
-		eval q{use Locale::gettext};
-		textdomain('ikiwiki');
-		return Locale::gettext::gettext(shift);
-	}
-	else {
-		return shift;
-	}
-} #}}}
-
-sub pagespec_match ($$) { #{{{
+sub pagespec_match ($$;$) { #{{{
 	my $page=shift;
 	my $spec=shift;
+	my $from=shift;
 
 	return eval pagespec_translate($spec);
 } #}}}
 
-sub match_glob ($$) { #{{{
+package IkiWiki::PageSpec;
+
+sub match_glob ($$$) { #{{{
 	my $page=shift;
 	my $glob=shift;
+	my $from=shift;
+	if (! defined $from){
+		$from = "";
+	}
+
+	# relative matching
+	if ($glob =~ m!^\./!) {
+		$from=~s!/?[^/]+$!!;
+		$glob=~s!^\./!!;
+		$glob="$from/$glob" if length $from;
+	}
 
 	# turn glob into safe regexp
 	$glob=quotemeta($glob);
@@ -848,7 +904,7 @@ sub match_link ($$) { #{{{
 	my $page=shift;
 	my $link=lc(shift);
 
-	my $links = $links{$page} or return undef;
+	my $links = $IkiWiki::links{$page} or return undef;
 	foreach my $p (@$links) {
 		return 1 if lc $p eq $link;
 	}
@@ -863,8 +919,8 @@ sub match_created_before ($$) { #{{{
 	my $page=shift;
 	my $testpage=shift;
 
-	if (exists $pagectime{$testpage}) {
-		return $pagectime{$page} < $pagectime{$testpage};
+	if (exists $IkiWiki::pagectime{$testpage}) {
+		return $IkiWiki::pagectime{$page} < $IkiWiki::pagectime{$testpage};
 	}
 	else {
 		return 0;
@@ -875,8 +931,8 @@ sub match_created_after ($$) { #{{{
 	my $page=shift;
 	my $testpage=shift;
 
-	if (exists $pagectime{$testpage}) {
-		return $pagectime{$page} > $pagectime{$testpage};
+	if (exists $IkiWiki::pagectime{$testpage}) {
+		return $IkiWiki::pagectime{$page} > $IkiWiki::pagectime{$testpage};
 	}
 	else {
 		return 0;
@@ -884,15 +940,15 @@ sub match_created_after ($$) { #{{{
 } #}}}
 
 sub match_creation_day ($$) { #{{{
-	return ((gmtime($pagectime{shift()}))[3] == shift);
+	return ((gmtime($IkiWiki::pagectime{shift()}))[3] == shift);
 } #}}}
 
 sub match_creation_month ($$) { #{{{
-	return ((gmtime($pagectime{shift()}))[4] + 1 == shift);
+	return ((gmtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift);
 } #}}}
 
 sub match_creation_year ($$) { #{{{
-	return ((gmtime($pagectime{shift()}))[5] + 1900 == shift);
+	return ((gmtime($IkiWiki::pagectime{shift()}))[5] + 1900 == shift);
 } #}}}
 
 1