add
parent
eecc8af979
commit
10b3a79168
|
@ -0,0 +1,155 @@
|
|||
From [[Faidon]]:
|
||||
|
||||
Joey,
|
||||
Attached is a patch that adds locale support to ikiwiki.
|
||||
A suitable locale is choosed in that order:
|
||||
1) $config{locale}
|
||||
2) $ENV{LC_ALL}
|
||||
3) en_US.UTF-8
|
||||
4) en_*.UTF-8
|
||||
5) *.UTF-8
|
||||
5) en_US
|
||||
6) en_*
|
||||
7) *
|
||||
8) POSIX
|
||||
(where * == the first item found)
|
||||
|
||||
The patch brings the following functionality:
|
||||
a) Proper local time, either using a UTF-8 locale or not (by the means
|
||||
of a new function decode_locale),
|
||||
b) Support for UTF-8 (or ISO-8859-X) filenames in SVN. Before this
|
||||
patch, commiting (or even rcs_updating) on repositories with UTF-8
|
||||
filenames is impossible.
|
||||
|
||||
This is RFC because it has some hard-coded parts: 'locale -a' and
|
||||
/usr/share/i18n/SUPPORTED. They obviously work on Debian, but I'm sure
|
||||
they won't work on other distros, let along on other operating systems.
|
||||
|
||||
Besides that, it's quite a big of a change and I could use some comments
|
||||
to make it better :)
|
||||
|
||||
Index: IkiWiki/Rcs/svn.pm
|
||||
===================================================================
|
||||
--- IkiWiki/Rcs/svn.pm (revision 904)
|
||||
+++ IkiWiki/Rcs/svn.pm (working copy)
|
||||
@@ -174,16 +236,16 @@
|
||||
}
|
||||
my $rev=int(possibly_foolish_untaint($ENV{REV}));
|
||||
|
||||
- my $user=`svnlook author $config{svnrepo} -r $rev`;
|
||||
+ my $user=decode_locale(`svnlook author $config{svnrepo} -r $rev`);
|
||||
chomp $user;
|
||||
- my $message=`svnlook log $config{svnrepo} -r $rev`;
|
||||
+ my $message=decode_locale(`svnlook log $config{svnrepo} -r $rev`);
|
||||
if ($message=~/$svn_webcommit/) {
|
||||
$user="$1";
|
||||
$message=$2;
|
||||
}
|
||||
|
||||
my @changed_pages;
|
||||
- foreach my $change (`svnlook changed $config{svnrepo} -r $rev`) {
|
||||
+ foreach my $change (decode_locale(`svnlook changed $config{svnrepo} -r $rev`)) {
|
||||
chomp $change;
|
||||
if ($change =~ /^[A-Z]+\s+\Q$config{svnpath}\E\/(.*)/) {
|
||||
push @changed_pages, $1;
|
||||
@@ -197,7 +259,7 @@
|
||||
# subscribers a diff that might contain pages they did not
|
||||
# sign up for. Should separate the diff per page and
|
||||
# reassemble into one mail with just the pages subscribed to.
|
||||
- my $diff=`svnlook diff $config{svnrepo} -r $rev --no-diff-deleted`;
|
||||
+ my $diff=decode_locale(`svnlook diff $config{svnrepo} -r $rev --no-diff-deleted`);
|
||||
|
||||
my $subject="$config{wikiname} update of ";
|
||||
if (@changed_pages > 2) {
|
||||
Index: IkiWiki/Render.pm
|
||||
===================================================================
|
||||
--- IkiWiki/Render.pm (revision 904)
|
||||
+++ IkiWiki/Render.pm (working copy)
|
||||
@@ -222,7 +222,7 @@
|
||||
eval q{use POSIX};
|
||||
# strftime doesn't know about encodings, so make sure
|
||||
# its output is properly treated as utf8
|
||||
- return decode_utf8(POSIX::strftime(
|
||||
+ return decode_locale(POSIX::strftime(
|
||||
$config{timeformat}, localtime($time)));
|
||||
} #}}}
|
||||
|
||||
Index: IkiWiki.pm
|
||||
===================================================================
|
||||
--- IkiWiki.pm (revision 904)
|
||||
+++ IkiWiki.pm (working copy)
|
||||
@@ -9,6 +9,7 @@
|
||||
# Optimisation.
|
||||
use Memoize;
|
||||
memoize("abs2rel");
|
||||
+memoize("get_charset_from_locale");
|
||||
|
||||
use vars qw{%config %links %oldlinks %oldpagemtime %pagectime
|
||||
%renderedfiles %pagesources %depends %hooks};
|
||||
@@ -49,9 +50,15 @@
|
||||
adminemail => undef,
|
||||
plugin => [qw{mdwn inline htmlscrubber}],
|
||||
timeformat => '%c',
|
||||
+ locale => get_preferred_locale(),
|
||||
} #}}}
|
||||
|
||||
sub checkconfig () { #{{{
|
||||
+ debug("setting LC_ALL to '$config{locale}'");
|
||||
+ eval q{use POSIX};
|
||||
+ $ENV{LC_ALL} = $config{locale};
|
||||
+ POSIX::setlocale(&POSIX::LC_ALL, $config{locale});
|
||||
+
|
||||
if ($config{w3mmode}) {
|
||||
eval q{use Cwd q{abs_path}};
|
||||
$config{srcdir}=possibly_foolish_untaint(abs_path($config{srcdir}));
|
||||
@@ -489,4 +496,50 @@
|
||||
$hooks{$param{type}}{$param{id}}=\%param;
|
||||
} # }}}
|
||||
|
||||
+sub get_preferred_locale() {
|
||||
+ if (my $env = $ENV{LC_ALL}) {
|
||||
+ return $env;
|
||||
+ }
|
||||
+
|
||||
+ my @avail=`locale -a`;
|
||||
+ chomp @avail;
|
||||
+
|
||||
+ return "POSIX" unless @avail;
|
||||
+
|
||||
+ my @ret;
|
||||
+ # prefer UTF-8 locales
|
||||
+ @avail = map { my $l = $_; $l =~ s/\.utf8/\.UTF-8/; $l; } @avail;
|
||||
+ @avail = @ret if @ret = grep(/\.UTF-8$/, @avail);
|
||||
+
|
||||
+ # prefer en_US or en_ locales
|
||||
+ return $ret[0] if @ret = grep(/^en_US/, @avail);
|
||||
+ return $ret[0] if @ret = grep(/^en_/, @avail);
|
||||
+ return $ret[0] if @ret = grep(/^[^.@]+$/, @avail);
|
||||
+
|
||||
+ # fallback to the first locale found
|
||||
+ return $avail[0];
|
||||
+} # }}}
|
||||
+
|
||||
+sub get_charset_from_locale($) {
|
||||
+ my $locale=shift;
|
||||
+ my ($l, $c);
|
||||
+
|
||||
+ my $supportedlist = "/usr/share/i18n/SUPPORTED";
|
||||
+ if (defined $locale and open(SUPPORTED, "< $supportedlist")) {
|
||||
+ while (<SUPPORTED>) {
|
||||
+ chomp;
|
||||
+ ($l, $c) = split(/\s+/);
|
||||
+ last if ($l eq $locale);
|
||||
+ }
|
||||
+ close(SUPPORTED);
|
||||
+
|
||||
+ return $c if ($l eq $locale);
|
||||
+ }
|
||||
+ return "ISO-8859-1";
|
||||
+} # }}}
|
||||
+
|
||||
+sub decode_locale($) {
|
||||
+ return decode(get_charset_from_locale($config{locale}), shift);
|
||||
+} # }}}
|
||||
+
|
||||
1
|
Loading…
Reference in New Issue