forked from github/kensanata.oddmuse
Compare commits
74 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4fc84fa623 | ||
|
|
33aa81d9c9 | ||
|
|
58690662df | ||
|
|
b2194ebdac | ||
|
|
d584c4dc68 | ||
|
|
105ccdf323 | ||
|
|
cb6d1cc17d | ||
|
|
be4bddab30 | ||
|
|
465b278303 | ||
|
|
a52bebdcd2 | ||
|
|
1caa4c55c0 | ||
|
|
9c77e56568 | ||
|
|
f5e86f4ddc | ||
|
|
f10dde33c8 | ||
|
|
ff64a0ed82 | ||
|
|
a046436a50 | ||
|
|
bcb9721499 | ||
|
|
609f037345 | ||
|
|
4ed8c4fb25 | ||
|
|
45ebd07cf4 | ||
|
|
51223c6297 | ||
|
|
08b7674ab4 | ||
|
|
a8780e75f5 | ||
|
|
dc43759ebd | ||
|
|
e8ba28bffe | ||
|
|
f3266288e1 | ||
|
|
8482c47383 | ||
|
|
1e4268597d | ||
|
|
dd05f824a8 | ||
|
|
6b2d119481 | ||
|
|
37bdb62db8 | ||
|
|
30c5c3798f | ||
|
|
0f55e3d59e | ||
|
|
60a5a8fcee | ||
|
|
598b5e06f6 | ||
|
|
f451e62d30 | ||
|
|
a41920a5fd | ||
|
|
e8683fdb02 | ||
|
|
f08a404bde | ||
|
|
e1f0d909c1 | ||
|
|
3ab606d96a | ||
|
|
93dc6b415f | ||
|
|
6d8314cb39 | ||
|
|
ce18377109 | ||
|
|
d4edb159ae | ||
|
|
16198f8784 | ||
|
|
03e08464bb | ||
|
|
7ca0f6172b | ||
|
|
276c1c2076 | ||
|
|
9c996cee04 | ||
|
|
6c813b8297 | ||
|
|
ec4cba6fb3 | ||
|
|
76c50674f5 | ||
|
|
a73a9e4a96 | ||
|
|
f27ec6c142 | ||
|
|
37c32783f3 | ||
|
|
f922c0ae9a | ||
|
|
b46fcb3c90 | ||
|
|
b885287ea2 | ||
|
|
67d68a370a | ||
|
|
ccef879ac1 | ||
|
|
e8b9708f40 | ||
|
|
d4f1e27cae | ||
|
|
b0a8e49975 | ||
|
|
9383adcba5 | ||
|
|
cde2d41dd1 | ||
|
|
6e5766f431 | ||
|
|
a2fe639a57 | ||
|
|
f452d99e2f | ||
|
|
49f0c6d200 | ||
|
|
f9efba3976 | ||
|
|
36ef964d0d | ||
|
|
eb4a4653a2 | ||
|
|
17dbca2353 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,4 +1,7 @@
|
||||
*~
|
||||
/current.pl
|
||||
/build/
|
||||
\#*\#
|
||||
/test-data
|
||||
/Mac/pkg/
|
||||
*.dmg
|
||||
*.pkg
|
||||
|
||||
54
Makefile
54
Makefile
@@ -2,28 +2,55 @@
|
||||
# Make sure the CVS keywords for the sed command on the next line are not expanded.
|
||||
|
||||
VERSION_NO=$(shell git describe --tags)
|
||||
VERSION=oddmuse-$(VERSION_NO)
|
||||
UPLOADVERSION=oddmuse-inkscape-$(VERSION_NO)
|
||||
TRANSLATIONS=$(wildcard modules/translations/[a-z]*-utf8.pl$)
|
||||
MODULES=$(wildcard modules/*.pl)
|
||||
BUILD=build/wiki.pl $(foreach file, $(notdir $(MODULES)) $(notdir $(TRANSLATIONS)), build/$(file))
|
||||
|
||||
# PREPARE/BUILD: this creates copies of wiki.pl and all the modules
|
||||
# and translations in the build subdirectory. These copies all contain
|
||||
# a reference to the revision they were created from (git describe
|
||||
# --tags).
|
||||
|
||||
prepare: build $(BUILD)
|
||||
|
||||
build:
|
||||
mkdir -p build
|
||||
|
||||
build/wiki.pl: wiki.pl
|
||||
sed "s/\\\$$q->a({-href=>'http:\/\/www.oddmuse.org\/'}, 'Oddmuse')/\\\$$q->a({-href=>'http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tag\/?id=$(VERSION_NO)'}, 'wiki.pl') . ' ($(VERSION_NO)), see ' . &/" < $< > $@
|
||||
|
||||
build/%-utf8.pl: modules/translations/%-utf8.pl
|
||||
sed "s/<a href=\"http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tree\/modules\/translations\/\\(.*\\).pl\">\\(.*\\).pl<\/a>/<a href=\"http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tree\/modules\/translations\/\\1.pl?id=$(VERSION_NO)\">\\1.pl<\/a> (for $(VERSION_NO))/" < $< > $@
|
||||
|
||||
# Currently oddtrans introduces encoding errors!
|
||||
|
||||
# %-utf8.pl: wiki.pl $(MODULES)
|
||||
# perl oddtrans -l $@ $^ > $@-new && mv $@-new $@
|
||||
|
||||
# from: http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl
|
||||
# to: http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl?id=2.1-11-gd4f1e27
|
||||
|
||||
build/%.pl: modules/%.pl
|
||||
sed "s/<a href=\"http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tree\/modules\/\\(.*\\).pl\">\\(.*\\).pl<\/a>/<a href=\"http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tree\/modules\/\\1.pl?id=$(VERSION_NO)\">\\1.pl<\/a> (for $(VERSION_NO))/" < $< > $@
|
||||
|
||||
|
||||
|
||||
|
||||
# UNTESTED/OBSOLETE: these targets have not been tested in a long time
|
||||
# and are potentially obsolete.
|
||||
VERSION=oddmuse-$(VERSION_NO)
|
||||
UPLOADVERSION=oddmuse-inkscape-$(VERSION_NO)
|
||||
INKSCAPE=GPL $(wildcard inkscape/*.py inkscape/*.inx inkscape/*.sh)
|
||||
PACKAGEMAKER=/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker
|
||||
PWD=$(shell pwd)
|
||||
DIST=$(VERSION).tar.gz $(VERSION).tar.gz.sig \
|
||||
contrib/simple-install/$(VERSION)-simple.tar.gz \
|
||||
contrib/simple-install/$(VERSION)-simple.tar.gz.sig
|
||||
|
||||
# These targets no longer work are have not been verified in a long time.
|
||||
OLDDIST=$(VERSION).dmg $(VERSION).dmg.sig \
|
||||
$(VERSION).tar.gz $(VERSION).tar.gz.sig \
|
||||
$(VERSION).tgz $(VERSION).tgz.sig \
|
||||
$(UPLOADVERSION).tar.gz $(UPLOADVERSION).tar.gz.sig
|
||||
$(VERSION).tgz $(VERSION).tgz.sig
|
||||
PWD=$(shell pwd)
|
||||
|
||||
dist: $(DIST)
|
||||
|
||||
current.pl: wiki.pl
|
||||
sed "s/\\\$$q->a({-href=>'http:\/\/www.oddmuse.org\/'}, 'Oddmuse')/\\\$$q->a({-href=>'http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tag\/?id=$(VERSION_NO)'}, 'wiki.pl') . ', see ' . &/" < $< > $@
|
||||
|
||||
upload: $(DIST)
|
||||
for f in $^; do \
|
||||
scp $$f as@dl.sv.nongnu.org:/releases/oddmuse/; \
|
||||
@@ -107,9 +134,6 @@ $(VERSION).tgz: wiki.pl modules/creole.pl Mac/config Mac/wiki
|
||||
sudo chmod 775 Slack/var/www/cgi-bin/wiki
|
||||
cd Slack && tar czf ../$@ var install
|
||||
|
||||
%-utf8.pl: wiki.pl $(MODULES)
|
||||
perl oddtrans -l $@ $^ > $@-new && mv $@-new $@
|
||||
|
||||
update-translations: $(TRANSLATIONS)
|
||||
|
||||
upload-translations: always
|
||||
@@ -119,8 +143,6 @@ upload-translations: always
|
||||
"http://www.oddmuse.org/cgi-bin/oddmuse/raw/$$f" < $$f; \
|
||||
done
|
||||
|
||||
.PHONY: always
|
||||
|
||||
deb:
|
||||
equivs-build control
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# Copyright (C) 2010 Alex Schroeder <alex@gnu.org>
|
||||
# Copyright (C) 2010, 2012 Alex Schroeder <alex@gnu.org>
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
@@ -17,6 +17,7 @@
|
||||
package OddMuse;
|
||||
use URI;
|
||||
use LWP::UserAgent;
|
||||
use utf8;
|
||||
|
||||
# load Oddmuse core
|
||||
$RunCGI = 0;
|
||||
@@ -61,16 +62,16 @@ sub parse_blogs {
|
||||
return %cached_blogs if %cached_blogs;
|
||||
my @data = split(/\n/, GetRaw($src));
|
||||
my $url;
|
||||
my $name;
|
||||
my $paramref;
|
||||
foreach $_ (@data) {
|
||||
if (/^\[(.+)\]/) {
|
||||
$url = $1;
|
||||
$name = undef;
|
||||
} elsif (/^name *= *(.+)/) {
|
||||
$name = $1;
|
||||
$paramref = {};
|
||||
} elsif (/^([a-z_]+) *= *(.+)/) {
|
||||
$paramref->{$1} = $2;
|
||||
}
|
||||
if ($url && $name) {
|
||||
$cached_blogs{$url} = $name;
|
||||
if ($url && $paramref->{name}) {
|
||||
$cached_blogs{$url} = $paramref;
|
||||
}
|
||||
}
|
||||
return %cached_blogs;
|
||||
@@ -84,8 +85,16 @@ sub host_exists {
|
||||
}
|
||||
}
|
||||
|
||||
sub debug_url {
|
||||
my $url = $q->url(-path_info=>1) . "?debug=1;";
|
||||
$url .= join(";", map { $_ . "=" . GetParam($_) }
|
||||
qw(username confirmed candidate url));
|
||||
return $url;
|
||||
}
|
||||
|
||||
sub check_url {
|
||||
my $url = shift;
|
||||
print $q->p("Debug: url=$url") if GetParam("debug");
|
||||
my $frown = $q->img({-src=>"http://emacswiki.org/pics/smiles/sad.png",
|
||||
-alt=>":("});
|
||||
my $smile = $q->img({-src=>"http://emacswiki.org/pics/smiles/smile.png",
|
||||
@@ -97,26 +106,24 @@ sub check_url {
|
||||
$u = URI->new($url);
|
||||
eval {$u->host };
|
||||
}
|
||||
|
||||
# - not an url
|
||||
# - it's campaign wiki site
|
||||
# - no username
|
||||
# or read Feeds page and
|
||||
# - it's a duplicate
|
||||
# - it's a partial match: continue with confirmed=1
|
||||
# or read the list of alternatives from the url
|
||||
# - one of the feeds listed is known: continue with confirmed=2
|
||||
# - no feeds were listed: url is a feed or report it
|
||||
# - one feed was listed: try it
|
||||
# - some feeds were listed: pick one
|
||||
|
||||
if ($@) {
|
||||
# the prefixing of http:// above should make it really hard to reach this code
|
||||
print $q->p($q->a({-href=>$url}, $url) . qq{
|
||||
seems to be <strong>invalid</strong>. $frown Make sure you use something
|
||||
like the following: <tt>http://grognardia.blogspot.com/</tt>});
|
||||
} elsif (not GetParam('username', '')) {
|
||||
print $q->p(qq{As an anti-spam measure I'd really like you to <strong>provide a name</strong> for the log file. Sorry about that. $frown});
|
||||
} else {
|
||||
my %blogs = parse_blogs();
|
||||
my $duplicate = host_exists($u->host, %blogs);
|
||||
if ($duplicate
|
||||
&& !$blogs{$url}
|
||||
&& !GetParam('confirmed')) {
|
||||
print $q->p("We have a partial match: ",
|
||||
$q->a({-href=>$duplicate}, $duplicate));
|
||||
print GetFormStart();
|
||||
print $q->hidden('confirmed', 1);
|
||||
print $q->hidden('url', $url);
|
||||
print $q->submit('go', 'Proceed anyway!');
|
||||
print $q->end_form();
|
||||
} elsif ($url =~ /campaignwiki\.org/i) {
|
||||
print $q->p(qq{
|
||||
This looks <strong>familiar</strong>!
|
||||
@@ -124,17 +131,35 @@ I do not think that adding any of the wikis on this site is the right
|
||||
thing to do, though.});
|
||||
print $q->p(qq{Thanks for testing it. }
|
||||
. $q->img({-src=>"http://www.emacswiki.org/pics/grin.png"}));
|
||||
} elsif (not GetParam('username', '')) {
|
||||
print $q->p(qq{As an anti-spam measure I'd really like you to
|
||||
<strong>provide a name</strong> for the log file. Sorry about that. $frown});
|
||||
} else {
|
||||
my %blogs = parse_blogs();
|
||||
my $duplicate = host_exists($u->host, %blogs);
|
||||
if ($blogs{$url}) {
|
||||
print $q->p("We already list ",
|
||||
$q->a({-href=>$duplicate}, $duplicate));
|
||||
} elsif ($duplicate && !GetParam('confirmed')) {
|
||||
print $q->p("We have a partial match: ",
|
||||
$q->a({-href=>$duplicate}, $duplicate));
|
||||
print GetFormStart();
|
||||
print $q->hidden('confirmed', 1);
|
||||
print $q->hidden('url', $url);
|
||||
print $q->submit('go', 'Proceed anyway!');
|
||||
print $q->end_form();
|
||||
} else {
|
||||
my @alternatives = get_feeds($url, keys %blogs);
|
||||
if ($#alternatives > 0 && !GetParam('candidate')) {
|
||||
my ($status, @alternatives) = get_feeds($url, %blogs);
|
||||
if ($status eq 'known' && GetParam('confirmed') < 2) {
|
||||
print $q->p($q->a({-href=>$url},
|
||||
"The page you submitted")
|
||||
. " lists "
|
||||
. $q->a({-href=>$alternatives[0]},
|
||||
"a known feed") . ".");
|
||||
print GetFormStart();
|
||||
print $q->hidden('confirmed', 1);
|
||||
print $q->hidden('confirmed', 2);
|
||||
print $q->hidden('url', $url);
|
||||
print $q->p("You need to pick one of the candidates:");
|
||||
print $q->p(join($q->br(), map {
|
||||
$q->input({-type=>"radio", -name=>"candidate", -value=>$_},
|
||||
$q->a({-href=>$_}, QuoteHtml($_))) } @alternatives));
|
||||
print $q->submit('go', 'Submit');
|
||||
print $q->submit('go', 'Proceed anyway!');
|
||||
print $q->end_form();
|
||||
} elsif ($#alternatives < 0) {
|
||||
if (is_feed($url)) {
|
||||
@@ -143,20 +168,31 @@ thing to do, though.});
|
||||
print $q->p("Apparently " . $q->a({-href=>$url}, QuoteHtml($url))
|
||||
. " is not a feed and doesn't link to any feed. "
|
||||
. "There is nothing for me to add. " . $frown);
|
||||
print $q->p("If you feel like it, you could try to "
|
||||
. $q->a({-href=>debug_url()}, "debug")
|
||||
. " this.");
|
||||
}
|
||||
} elsif ($#alternatives == 0) {
|
||||
print $q->p($q->a({-href=>$url}, "The page you submitted")
|
||||
. " lists "
|
||||
. $q->a({-href=>$alternatives[0]},
|
||||
"one new feed")
|
||||
. ".");
|
||||
print GetFormStart();
|
||||
print $q->hidden('url', $alternatives[0]);
|
||||
print $q->submit('go', 'Take it!');
|
||||
print $q->end_form();
|
||||
print $q->p("If you feel like it, you could try to "
|
||||
. $q->a({-href=>debug_url()}, "debug")
|
||||
. " this.");
|
||||
} else {
|
||||
my $candidate = GetParam('candidate');
|
||||
$candidate = $alternatives[0] unless $candidate;
|
||||
if (is_feed($candidate)) {
|
||||
post_addition($candidate);
|
||||
} else {
|
||||
print $q->p($q->a({-href=>$candidate}, "The page you submitted")
|
||||
. " listed "
|
||||
. $q->a({-href=>$candidate}, QuoteHtml($candidate))
|
||||
. " as one of its feeds. "
|
||||
. "But it turns out that this is not a valid feed! "
|
||||
. "I can't add an invalid feed. " . $frown);
|
||||
}
|
||||
print GetFormStart();
|
||||
print $q->p("You need to pick one of the candidates:");
|
||||
print $q->p(join($q->br(), map {
|
||||
$q->input({-type=>"radio", -name=>"url", -value=>$_},
|
||||
$q->a({-href=>$_}, QuoteHtml($_))) } @alternatives));
|
||||
print $q->submit('go', 'Submit');
|
||||
print $q->end_form();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -172,23 +208,73 @@ sub is_feed {
|
||||
|
||||
sub get_feeds {
|
||||
my $url = shift;
|
||||
my %others = map { $_ => 1 } @_;
|
||||
my @links = GetRaw($url) =~ /<link\b *(.*?)>/g;
|
||||
my %others = @_;
|
||||
my $html = GetRaw($url);
|
||||
my @links = $html =~ /<link\b *(.*?)>/g;
|
||||
print $q->p("Debug: " . scalar(@links) . " links found") if GetParam("debug");
|
||||
print $q->pre($html) unless scalar(@links);
|
||||
print $q->p("Debug: no content returned") if GetParam("debug") and not $html;
|
||||
my @feeds;
|
||||
foreach my $link (@links) {
|
||||
my %link;
|
||||
foreach (split(/ /, lc($link))) {
|
||||
my ($attr, $val) = split(/=/, $_, 2);
|
||||
# strip quotes and garbage: "foo"/ -> foo
|
||||
my $to = index($val, substr($val, 0, 1), 1);
|
||||
$val = substr($val, 1, $to -1) if $to >= 0;
|
||||
$link{$attr} = $val;
|
||||
|
||||
print $q->p("Debug: $link")
|
||||
if GetParam("debug");
|
||||
|
||||
if ($link !~ /\brel=(['"])alternate\1/i) {
|
||||
print $q->p("Debug: missing rel='alternate'")
|
||||
if GetParam("debug");
|
||||
next;
|
||||
}
|
||||
next unless $link{rel} eq 'alternate';
|
||||
next unless $valid_content_type{$link{type}};
|
||||
push(@feeds, $link{href}) unless $others{$link{href}};
|
||||
|
||||
$link =~ /\btype=(['"])(.*?)\1/i;
|
||||
my $type = $2;
|
||||
if (not $valid_content_type{$type}) {
|
||||
print $q->p("Debug: type parameter is invalid ($type)")
|
||||
if GetParam("debug");
|
||||
next;
|
||||
}
|
||||
|
||||
$link =~ /\bhref=(['"])(.*?)\1/i;
|
||||
my $href = $2;
|
||||
# clean up blogspot urls and prefer atom format
|
||||
$href =~ s/\?alt=rss$//i if $href =~ /blogspot/i;
|
||||
if (not $href) {
|
||||
print $q->p("Debug: href missing")
|
||||
if GetParam("debug");
|
||||
next;
|
||||
}
|
||||
if ($others{$href}) {
|
||||
print $q->p("Debug: feed already known ($href)")
|
||||
if GetParam("debug");
|
||||
if ($q->param('confirmed') >= 2) {
|
||||
next;
|
||||
} else {
|
||||
# don't look for other alternatives!
|
||||
return 'known', $href;
|
||||
}
|
||||
}
|
||||
|
||||
push(@feeds, $href);
|
||||
}
|
||||
return @feeds;
|
||||
print $q->p("Debug: returning " . scalar(@feeds) . " links found")
|
||||
if GetParam("debug");
|
||||
return 'ok', @feeds;
|
||||
}
|
||||
|
||||
sub config {
|
||||
my %blogs = @_;
|
||||
my $result = qq{#! config file for the RPG Planet
|
||||
# format:
|
||||
# Feed URL in square brackets, followed by name = and the name of the feed
|
||||
};
|
||||
foreach my $url (sort {lc($blogs{$a}->{name}) cmp lc($blogs{$b}->{name})} keys %blogs) {
|
||||
$result .= "[$url]\n";
|
||||
$paramref = $blogs{$url};
|
||||
foreach my $key (sort keys %{$paramref}) {
|
||||
$result .= $key . " = " . $paramref->{$key} . "\n";
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub post_addition {
|
||||
@@ -206,14 +292,9 @@ sub post_addition {
|
||||
$title = $final_url unless $title;
|
||||
print $q->p("Adding ",
|
||||
$q->a({-href=>$final_url}, $title));
|
||||
$blogs{$url} = $title;
|
||||
my $result = qq{#! config file for the RPG Planet
|
||||
# format:
|
||||
# Feed URL in square brackets, followed by name = and the name of the feed
|
||||
};
|
||||
foreach $url (sort {lc($blogs{$a}) cmp lc($blogs{$b})} keys %blogs) {
|
||||
$result .= "[$url]\nname = " . $blogs{$url} . "\n";
|
||||
}
|
||||
my %param = (name => $title);
|
||||
$blogs{$url} = \%param;
|
||||
my $result = config(%blogs);
|
||||
my $ua = LWP::UserAgent->new;
|
||||
my %params = (text => $result,
|
||||
title => $page,
|
||||
@@ -250,16 +331,18 @@ sub main {
|
||||
if ($q->path_info eq '/source') {
|
||||
seek DATA, 0, 0;
|
||||
print "Content-type: text/plain; charset=UTF-8\r\n\r\n", <DATA>;
|
||||
} elsif ($q->path_info eq '/test') {
|
||||
print "Content-type: text/plain; charset=UTF-8\r\n\r\n";
|
||||
print config(parse_blogs());
|
||||
} else {
|
||||
$UserGotoBar .= $q->a({-href=>$q->url . '/source'}, 'Source');
|
||||
print GetHeader('', 'Submit a new blog');
|
||||
print $q->start_div({-class=>'content index'});
|
||||
if (not GetParam('url')
|
||||
or not GetParam($HoneyPotOk)) {
|
||||
if (not GetParam('url')) {
|
||||
print $q->p("Debug: no url parameter provided.") if GetParam("debug");
|
||||
default();
|
||||
} else {
|
||||
SetParam('title', 'Feeds'); # required to trigger HoneyPotInspection()
|
||||
HoneyPotInspection();
|
||||
check_url(GetParam('url'));
|
||||
}
|
||||
print $q->p('Questions? Send mail to Alex Schröder <'
|
||||
|
||||
@@ -149,9 +149,6 @@ div.refer {
|
||||
line-height: 13pt;
|
||||
}
|
||||
|
||||
div.refer a:first-child:before { content: "" }
|
||||
div.refer a:before { content: "• " }
|
||||
|
||||
div.message {
|
||||
background-color:#fee;
|
||||
color:#000;
|
||||
@@ -336,6 +333,7 @@ div.image span.caption {
|
||||
|
||||
.left { float:left; margin-right: 1em; }
|
||||
.right { float:right; margin-left: 1em; }
|
||||
.half a img { height: 50%; width: 50%; }
|
||||
div.left .left, div.right .right {
|
||||
float:none;
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@ div.rc hr { display: none; }
|
||||
|
||||
/* Tables */
|
||||
table.user {
|
||||
margin: 1em 4em;
|
||||
margin: 1em 0;
|
||||
padding: 0 1em;
|
||||
border-top: 1px solid black;
|
||||
border-bottom: 1px solid black;
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/canonical.pl">canonical.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Canonical_Names">Canonical Names</a></p>';
|
||||
|
||||
use utf8;
|
||||
|
||||
*OldCanonicalResolveId = *ResolveId;
|
||||
*ResolveId = *NewCanonicalResolveId;
|
||||
|
||||
@@ -39,14 +41,9 @@ sub NewCanonicalResolveId {
|
||||
|
||||
# If the page AlexSchröder exists, [[alexschroder]] will link to it.
|
||||
|
||||
use utf8;
|
||||
use Encode;
|
||||
sub CanonicalName {
|
||||
my $str = shift;
|
||||
$DebugInfo .= ' ' . $str;
|
||||
$str = decode('utf-8', $str);
|
||||
$str =~ tr/äáàâëéèêïíìîöóòôüúùû/aaaaeeeeiiiioooouuuu/;
|
||||
$str = lc($str);
|
||||
$DebugInfo .= '->' . $str;
|
||||
return $str;
|
||||
}
|
||||
|
||||
@@ -156,7 +156,7 @@ sub CreoleInit {
|
||||
# $FullUrlPattern = "((?:$UrlProtocols:|/)$UrlChars+)";
|
||||
|
||||
# Permit page authors to link to other pages having semicolons in their names.
|
||||
# my $LinkCharsSansZero = "-;,.()' _1-9A-Za-z\x{0080}-\x{ffff}";
|
||||
# my $LinkCharsSansZero = "-;,.()' _1-9A-Za-z\x{0080}-\x{fffd}";
|
||||
# my $LinkChars = $LinkCharsSansZero.'0';
|
||||
# $FreeLinkPattern = "([$LinkCharsSansZero]|[$LinkChars][$LinkChars]+)";
|
||||
}
|
||||
@@ -623,8 +623,8 @@ sub CreoleRuleRecursive {
|
||||
elsif (m/\G\s+/cg) {
|
||||
$html .= ' ';
|
||||
}
|
||||
elsif ( m/\G([A-Za-z\x{0080}-\x{ffff}]+([ \t]+[a-z\x{0080}-\x{ffff}]+)*[ \t]+)/cg
|
||||
or m/\G([A-Za-z\x{0080}-\x{ffff}]+)/cg
|
||||
elsif ( m/\G([A-Za-z\x{0080}-\x{fffd}]+([ \t]+[a-z\x{0080}-\x{fffd}]+)*[ \t]+)/cg
|
||||
or m/\G([A-Za-z\x{0080}-\x{fffd}]+)/cg
|
||||
or m/\G(\S)/cg) {
|
||||
$html .= $1; # multiple words but do not match http://foo
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use File::Glob ':glob';
|
||||
use vars qw($DraftDir);
|
||||
|
||||
$DraftDir = $DataDir."/draft"; # directory for drafts
|
||||
@@ -32,7 +33,6 @@ $Action{draft} = \&DoDraft;
|
||||
sub DoDraft {
|
||||
my $id = shift;
|
||||
my $draft = $DraftDir . '/' . GetParam('username', GetRemoteHost());
|
||||
utf8::encode($draft);
|
||||
if ($id) {
|
||||
my $text = GetParam('text', '');
|
||||
ReportError(T('No text to save'), '400 BAD REQUEST') unless $text;
|
||||
@@ -72,7 +72,7 @@ sub DraftFiles {
|
||||
$_ = substr($_, length($DraftDir) + 1);
|
||||
utf8::decode($_);
|
||||
$_;
|
||||
} glob("$DraftDir/* $DraftDir/.*");
|
||||
} bsd_glob("$DraftDir/*"), bsd_glob("$DraftDir/.*");
|
||||
}
|
||||
|
||||
sub DraftCleanup {
|
||||
|
||||
40
modules/fix-encoding.pl
Normal file
40
modules/fix-encoding.pl
Normal file
@@ -0,0 +1,40 @@
|
||||
# Copyright (C) 2012 Alex Schroeder <alex@gnu.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/fix-encoding.pl">fix-encoding.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Fix_Encoding">Fix Encoding</a></p>';
|
||||
|
||||
$Action{'fix-encoding'} = \&FixEncoding;
|
||||
|
||||
sub FixEncoding {
|
||||
my $id = shift;
|
||||
ValidIdOrDie($id);
|
||||
RequestLockOrError();
|
||||
OpenPage($id);
|
||||
my $text = $Page{text};
|
||||
utf8::decode($text);
|
||||
Save($id, $text, 'fix encoding', 1) if $text ne $Page{text};
|
||||
ReleaseLock();
|
||||
ReBrowsePage($id);
|
||||
}
|
||||
|
||||
push(@MyAdminCode, \&FixEncodingMenu);
|
||||
|
||||
sub FixEncodingMenu {
|
||||
my ($id, $menuref, $restref) = @_;
|
||||
if ($id) {
|
||||
push(@$menuref,
|
||||
ScriptLink('action=fix-encoding;id=' . UrlEncode($id), T('Fix page encoding')));
|
||||
}
|
||||
}
|
||||
@@ -147,8 +147,11 @@ sub GitCleanup {
|
||||
OpenPage($id);
|
||||
WriteStringToFile("$GitRepo/$id", $Page{text});
|
||||
}
|
||||
# commit the new state
|
||||
# run git!
|
||||
chdir($GitRepo); # important for all the git commands that follow!
|
||||
# add any new files
|
||||
GitRun('add', '.');
|
||||
# commit the new state
|
||||
GitRun('commit', '--quiet', '-a', '-m', 'maintenance job',
|
||||
"--author=Oddmuse <$GitMail>");
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
# img.InlineMath
|
||||
# img.DisplayMath
|
||||
|
||||
use File::Glob ':glob';
|
||||
use vars qw($LatexDir $LatexLinkDir $LatexExtendPath $LatexSingleDollars);
|
||||
|
||||
# One of the following options must be set correctly to the full path of
|
||||
@@ -172,7 +173,7 @@ sub MakeLaTeX {
|
||||
#setup rendering directory
|
||||
my $dir = "$LatexDir/$hash";
|
||||
if (-d $dir) {
|
||||
unlink (glob('$dir/*'));
|
||||
unlink (bsd_glob('$dir/*'));
|
||||
} else {
|
||||
mkdir($dir) or return "[Unable to create $dir]";
|
||||
}
|
||||
@@ -220,5 +221,3 @@ sub MakeLaTeX {
|
||||
rmdir ($dir);
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ push(@MyRules, \&LinkAllRule);
|
||||
$RuleOrder{\&LinkAllRule} = 1000;
|
||||
|
||||
sub LinkAllRule {
|
||||
if (/\G([A-Za-z\x{0080}-\x{ffff}]+)/gc) {
|
||||
if (/\G([A-Za-z\x{0080}-\x{fffd}]+)/gc) {
|
||||
my $oldpos = pos;
|
||||
Dirty($1);
|
||||
# print the word, or the link to the word
|
||||
|
||||
@@ -40,6 +40,17 @@ sub NewMacAllPagesList {
|
||||
return @new;
|
||||
}
|
||||
|
||||
*OldMacGrepFiltered = *GrepFiltered;
|
||||
*GrepFiltered = *NewMacGrepFiltered;
|
||||
|
||||
sub NewMacGrepFiltered {
|
||||
my @pages = OldMacGrepFiltered(@_);
|
||||
foreach my $id (@pages) {
|
||||
$id = NFC($id);
|
||||
}
|
||||
return @pages;
|
||||
}
|
||||
|
||||
push(@MyInitVariables, \&MacFixEncoding);
|
||||
|
||||
sub MacFixEncoding {
|
||||
@@ -57,7 +68,7 @@ sub MacFixEncoding {
|
||||
# Why is grep not finding the upper case variant in the SCHRÖDER-UP
|
||||
# file?
|
||||
|
||||
$UseGrep = 0 if GetParam('search', '') =~ /[x{0080}-\x{ffff}]/;
|
||||
$UseGrep = 0 if GetParam('search', '') =~ /[x{0080}-\x{fffd}]/;
|
||||
|
||||
# the rest is only necessary if using namespaces.pl
|
||||
return unless defined %Namespaces;
|
||||
|
||||
@@ -152,7 +152,7 @@ sub MarkdownQuoteHtml {
|
||||
$html =~ s/&/&/g;
|
||||
$html =~ s/</</g;
|
||||
# $html =~ s/>/>/g;
|
||||
$html =~ s/[\x00-\x08\x0b\x0c\x0e-\x1f]/ /g; # legal xml: #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
|
||||
$html =~ s/[\x00-\x08\x0b\x0c\x0e-\x1f]/ /g; # legal xml: #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFD]
|
||||
|
||||
return $html;
|
||||
}
|
||||
@@ -198,8 +198,8 @@ sub MarkdownNearInit {
|
||||
sub DoWikiWords {
|
||||
|
||||
my $text = shift;
|
||||
my $WikiWord = '[A-Z]+[a-z\x{0080}-\x{ffff}]+[A-Z][A-Za-z\x{0080}-\x{ffff}]*';
|
||||
my $FreeLinkPattern = "([-,.()' _0-9A-Za-z\x{0080}-\x{ffff}]+)";
|
||||
my $WikiWord = '[A-Z]+[a-z\x{0080}-\x{fffd}]+[A-Z][A-Za-z\x{0080}-\x{fffd}]*';
|
||||
my $FreeLinkPattern = "([-,.()' _0-9A-Za-z\x{0080}-\x{fffd}]+)";
|
||||
|
||||
if ($FreeLinks) {
|
||||
# FreeLinks
|
||||
@@ -299,7 +299,7 @@ sub CreateWikiLink {
|
||||
|
||||
sub UnescapeWikiWords {
|
||||
my $text = shift;
|
||||
my $WikiWord = '[A-Z]+[a-z\x{0080}-\x{ffff}]+[A-Z][A-Za-z\x{0080}-\x{ffff}]*';
|
||||
my $WikiWord = '[A-Z]+[a-z\x{0080}-\x{fffd}]+[A-Z][A-Za-z\x{0080}-\x{fffd}]*';
|
||||
|
||||
# Unescape escaped WikiWords
|
||||
$text =~ s/\\($WikiWord)/$1/g;
|
||||
@@ -379,7 +379,7 @@ sub NewEncodeCode {
|
||||
$text = OldEncodeCode($text);
|
||||
|
||||
# Protect Wiki Words
|
||||
my $WikiWord = '[A-Z]+[a-z\x{0080}-\x{ffff}]+[A-Z][A-Za-z\x{0080}-\x{ffff}]*';
|
||||
my $WikiWord = '[A-Z]+[a-z\x{0080}-\x{fffd}]+[A-Z][A-Za-z\x{0080}-\x{fffd}]*';
|
||||
$text =~ s!($WikiWord)!\\$1!gx;
|
||||
|
||||
return $text;
|
||||
@@ -471,7 +471,7 @@ sub MarkdownAddComment {
|
||||
|
||||
sub NewDoAnchors {
|
||||
my $text = shift;
|
||||
my $WikiWord = '[A-Z]+[a-z\x{0080}-\x{ffff}]+[A-Z][A-Za-z\x{0080}-\x{ffff}]*';
|
||||
my $WikiWord = '[A-Z]+[a-z\x{0080}-\x{fffd}]+[A-Z][A-Za-z\x{0080}-\x{fffd}]*';
|
||||
|
||||
return Markdown::_DoAnchors($text);
|
||||
}
|
||||
|
||||
@@ -80,9 +80,9 @@ $RuleOrder{\&MarkupRule} = 150;
|
||||
%MarkupLines = ('>' => 'pre',
|
||||
);
|
||||
|
||||
my $words = '([A-Za-z\x{0080}-\x{ffff}][-%.,:;\'"!?0-9 A-Za-z\x{0080}-\x{ffff}]*?)';
|
||||
my $words = '([A-Za-z\x{0080}-\x{fffd}][-%.,:;\'"!?0-9 A-Za-z\x{0080}-\x{fffd}]*?)';
|
||||
# zero-width look-ahead assertion to prevent km/h from counting
|
||||
my $noword = '(?=[^-0-9A-Za-z\x{0080}-\x{ffff}]|$)';
|
||||
my $noword = '(?=[^-0-9A-Za-z\x{0080}-\x{fffd}]|$)';
|
||||
|
||||
my $markup_pairs_re = '';
|
||||
my $markup_forced_pairs_re = '';
|
||||
@@ -174,7 +174,7 @@ sub MarkupRule {
|
||||
return $MarkupSingles{UnquoteHtml($1)};
|
||||
} elsif ($MarkupPairs{'/'} and m|\G~/|gc) {
|
||||
return '~/'; # fix ~/elisp/ example
|
||||
} elsif ($MarkupPairs{'/'} and m|\G(/[-A-Za-z0-9\x{0080}-\x{ffff}/]+/$words/)|gc) {
|
||||
} elsif ($MarkupPairs{'/'} and m|\G(/[-A-Za-z0-9\x{0080}-\x{fffd}/]+/$words/)|gc) {
|
||||
return $1; # fix /usr/share/lib/! example
|
||||
}
|
||||
# "foo
|
||||
|
||||
@@ -37,6 +37,7 @@ be changed using the C<$NamespacesSelf> option.
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl">namespaces.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Namespaces_Extension">Namespaces Extension</a></p>';
|
||||
|
||||
use File::Glob ':glob';
|
||||
use vars qw($NamespacesMain $NamespacesSelf $NamespaceCurrent
|
||||
$NamespaceRoot $NamespaceSlashing @NamespaceParameters
|
||||
%Namespaces);
|
||||
@@ -79,7 +80,7 @@ sub NamespacesInitVariables {
|
||||
# Do this before changing the $DataDir and $ScriptName
|
||||
if (!$Monolithic and $UsePathInfo) {
|
||||
$Namespaces{$NamespacesMain} = $ScriptName . '/';
|
||||
foreach my $name (glob("$DataDir/*")) {
|
||||
foreach my $name (bsd_glob("$DataDir/*")) {
|
||||
utf8::decode($name);
|
||||
if (-d $name
|
||||
and $name =~ m|/($InterSitePattern)$|
|
||||
@@ -92,19 +93,21 @@ sub NamespacesInitVariables {
|
||||
$NamespaceRoot = $ScriptName; # $ScriptName may be changed below
|
||||
$NamespaceCurrent = '';
|
||||
my $ns = GetParam('ns', '');
|
||||
if (not $ns and $UsePathInfo) {
|
||||
my $path_info = $q->path_info();
|
||||
utf8::decode($path_info);
|
||||
# make sure ordinary page names are not matched!
|
||||
if ($path_info =~ m|^/($InterSitePattern)(/.*)?|
|
||||
and ($2 or $q->keywords or NamespaceRequiredByParameter())) {
|
||||
$ns = $1;
|
||||
}
|
||||
}
|
||||
ReportError(Ts('%s is not a legal name for a namespace', $ns))
|
||||
if $ns and $ns !~ m/^($InterSitePattern)$/;
|
||||
if (($UsePathInfo
|
||||
# make sure ordinary page names are not matched!
|
||||
and $q->path_info() =~ m|^/($InterSitePattern)(/.*)?|
|
||||
and ($1 ne $NamespacesMain)
|
||||
and ($1 ne $NamespacesSelf)
|
||||
and ($2 or $q->keywords or NamespaceRequiredByParameter()))
|
||||
or
|
||||
($ns =~ m/^($InterSitePattern)$/
|
||||
and ($1 ne $NamespacesMain)
|
||||
and ($1 ne $NamespacesSelf))) {
|
||||
$NamespaceCurrent = $1;
|
||||
if ($ns
|
||||
and $ns ne $NamespacesMain
|
||||
and $ns ne $NamespacesSelf) {
|
||||
$NamespaceCurrent = $ns;
|
||||
# Change some stuff from the original InitVariables call:
|
||||
$SiteName .= ' ' . $NamespaceCurrent;
|
||||
$InterWikiMoniker = $NamespaceCurrent;
|
||||
@@ -115,7 +118,7 @@ sub NamespacesInitVariables {
|
||||
$TempDir = "$DataDir/temp";
|
||||
$LockDir = "$TempDir/lock";
|
||||
$NoEditFile = "$DataDir/noedit";
|
||||
$RcFile = "$DataDir/rc.log";
|
||||
$RcFile = "$DataDir/rc.log";
|
||||
$RcOldFile = "$DataDir/oldrc.log";
|
||||
$IndexFile = "$DataDir/pageidx";
|
||||
$VisitorFile = "$DataDir/visitors.log";
|
||||
@@ -133,8 +136,8 @@ sub NamespacesInitVariables {
|
||||
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks)
|
||||
= stat($IndexFile);
|
||||
$LastUpdate = $mtime;
|
||||
CreateDir($DataDir); # Create directory if it doesn't exist
|
||||
ReportError(Ts('Could not create %s', $DataDir) . ": $!", '500 INTERNAL SERVER ERROR')
|
||||
CreateDir($DataDir); # Create directory if it doesn't exist
|
||||
ReportError(Ts('Cannot create %s', $DataDir) . ": $!", '500 INTERNAL SERVER ERROR')
|
||||
unless -d $DataDir;
|
||||
}
|
||||
$Namespaces{$NamespacesSelf} = $ScriptName . '?';
|
||||
@@ -203,8 +206,8 @@ sub NewNamespaceGetRcLines { # starttime, hash of seen pages to use as a second
|
||||
# directory. This reduces the chances of getting different
|
||||
# results.
|
||||
foreach my $site (keys %InterSite) {
|
||||
if ($InterSite{$site} =~ m|^$ScriptName/([^/]*)|) {
|
||||
my $ns = $1 or next;
|
||||
if (substr($InterSite{$site}, 0, length($ScriptName)) eq $ScriptName) {
|
||||
my $ns = $site;
|
||||
my $file = "$DataDir/$ns/rc.log";
|
||||
push(@rcfiles, $file);
|
||||
$namespaces{$file} = $ns;
|
||||
@@ -217,7 +220,7 @@ sub NewNamespaceGetRcLines { # starttime, hash of seen pages to use as a second
|
||||
# starttime. If any rcfile exists with no timestamp before the
|
||||
# starttime, we need to open its rcoldfile.
|
||||
foreach my $file (@rcfiles) {
|
||||
open(F, $file);
|
||||
open(F, '<:encoding(UTF-8)', $file);
|
||||
my $line = <F>;
|
||||
my ($ts) = split(/$FS/o, $line); # the first timestamp in the regular rc file
|
||||
my @new;
|
||||
@@ -373,7 +376,7 @@ sub NewNamespaceBrowsePage {
|
||||
#REDIRECT into different namespaces
|
||||
my ($id, $raw, $comment, $status) = @_;
|
||||
OpenPage($id);
|
||||
my ($text, $revision) = GetTextRevision(GetParam('revision', ''));
|
||||
my ($text, $revision) = GetTextRevision(GetParam('revision', ''), 1);
|
||||
my $oldId = GetParam('oldid', '');
|
||||
if (not $oldId and not $revision and (substr($text, 0, 10) eq '#REDIRECT ')
|
||||
and (($WikiLinks and $text =~ /^\#REDIRECT\s+(($InterSitePattern:)?$InterLinkPattern)/)
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
# If you are running a multilingual site, then you should explicitly
|
||||
# load this file from your language-specific config file.
|
||||
|
||||
use utf8;
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/national-days-de.pl">national-days-de.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Special_Days">Special Days</a></p>';
|
||||
|
||||
%SpecialDays = (
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
# 59 Temple Place, Suite 330
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use utf8;
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/national-days.pl">national-days.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Special_Days">Special Days</a></p>';
|
||||
|
||||
%SpecialDays = (
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/not-found-handler.pl">not-found-handler.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/404_Handler_Extension">404 Handler Extension</a></p>';
|
||||
|
||||
use File::Glob ':glob';
|
||||
use vars qw($NotFoundHandlerDir, $LinkFile, %LinkDb, $LinkDbInit);
|
||||
|
||||
$NotFoundHandlerDir = '/tmp/oddmuse/cache';
|
||||
@@ -29,7 +30,7 @@ $Action{clearcache} = \&DoClearCache;
|
||||
|
||||
sub DoClearCache {
|
||||
print GetHeader('', QuoteHtml(T('Clearing Cache')), '');
|
||||
unlink(glob("$NotFoundHandlerDir/*"));
|
||||
unlink(bsd_glob("$NotFoundHandlerDir/*"));
|
||||
print $q->p(T('Done.'));
|
||||
PrintFooter();
|
||||
}
|
||||
@@ -103,7 +104,7 @@ sub NewNotFoundHandlerSave {
|
||||
NotFoundHandlerCacheUpdate($id);
|
||||
} else {
|
||||
# unlink PageName, PageName.en, PageName.de, etc.
|
||||
unlink("$NotFoundHandlerDir/$id", glob("$NotFoundHandlerDir/$id.[a-z][a-z]"));
|
||||
unlink("$NotFoundHandlerDir/$id", bsd_glob("$NotFoundHandlerDir/$id.[a-z][a-z]"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +129,7 @@ sub NotFoundHandlerCacheUpdate {
|
||||
foreach my $source (keys %LinkDb) {
|
||||
warn "Examining $source\n";
|
||||
if (grep(/$target/, @{$LinkDb{$source}})) {
|
||||
unlink("$NotFoundHandlerDir/$source", glob("$NotFoundHandlerDir/$source.[a-z][a-z]"));
|
||||
unlink("$NotFoundHandlerDir/$source", bsd_glob("$NotFoundHandlerDir/$source.[a-z][a-z]"));
|
||||
warn "Unlinking $source\n";
|
||||
}
|
||||
}
|
||||
|
||||
139
modules/private-pages.pl
Normal file
139
modules/private-pages.pl
Normal file
@@ -0,0 +1,139 @@
|
||||
# Copyright (C) 2012 Alex Schroeder <alex@gnu.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation; either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
=head1 Private Pages Extension
|
||||
|
||||
This module allows you to hide the content of particular pages in Oddmuse.
|
||||
Unlike the I<Hidden Pages Extension>, this is not based on the user's role of
|
||||
editor or administrator. Instead, every page can have a different password by
|
||||
beginning it with #PASSWORD XYZZY where XYZZY is the password required to read
|
||||
it. Multiple passwords can be supplied, separated by spaces.
|
||||
|
||||
Note that all the meta information of the private page remains public: The
|
||||
I<name> of the page, the fact that is has been edited, the author, the
|
||||
revision, the content of past revisions that have not been protected by a
|
||||
password all remain visible to other users.
|
||||
|
||||
Notes:
|
||||
|
||||
=over
|
||||
|
||||
=item * This extension might not work in a mod_perl environment because it
|
||||
sets C<$NewText> without ever resetting it.
|
||||
|
||||
=item * If you're protecting a comment page, people can still leave comments
|
||||
-- they just can't read the resulting page.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/private-pages.pl">private-pages.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Private_Pages_Extension">Private Pages Extension</a></p>';
|
||||
|
||||
sub PrivatePageLocked {
|
||||
my $text = shift;
|
||||
my ($line) = split(/\n/, $text, 1);
|
||||
my @token = split(/\s+/, $line);
|
||||
my $lock = 0;
|
||||
if (shift(@token) eq '#PASSWORD') {
|
||||
my $pwd = GetParam('pwd', '');
|
||||
$lock = 1;
|
||||
foreach (@token) {
|
||||
if ($pwd eq $_) {
|
||||
$lock = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $lock;
|
||||
}
|
||||
|
||||
*OldPrivatePagesUserCanEdit = *UserCanEdit;
|
||||
*UserCanEdit = *NewPrivatePagesUserCanEdit;
|
||||
|
||||
sub NewPrivatePagesUserCanEdit {
|
||||
my ($id, $editing, @rest) = @_;
|
||||
my $result = OldPrivatePagesUserCanEdit($id, $editing, @rest);
|
||||
# bypass OpenPage and GetPageContent (these are redefined below)
|
||||
if ($result > 0 and $editing and $IndexHash{$id}) {
|
||||
my %data = ParseData(ReadFileOrDie(GetPageFile($id)));
|
||||
if (PrivatePageLocked($data{text})) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub PrivatePageMessage {
|
||||
return Ts('This page is password protected. If you know the password, you can %s. Once you have done that, return and reload this page.',
|
||||
'[' . ScriptUrl('action=password') . ' '
|
||||
. T('supply the password now') . ']');
|
||||
}
|
||||
|
||||
*OldPrivatePagesOpenPage = *OpenPage;
|
||||
*OpenPage = *NewPrivatePagesOpenPage;
|
||||
|
||||
sub NewPrivatePagesOpenPage {
|
||||
OldPrivatePagesOpenPage(@_);
|
||||
if (PrivatePageLocked($Page{text})) {
|
||||
%Page = (); # reset everything
|
||||
$NewText = PrivatePageMessage();
|
||||
}
|
||||
return $OpenPageName;
|
||||
}
|
||||
|
||||
*OldPrivatePagesGetPageContent = *GetPageContent;
|
||||
*GetPageContent = *NewPrivatePagesGetPageContent;
|
||||
|
||||
sub NewPrivatePagesGetPageContent {
|
||||
my $text = OldPrivatePagesGetPageContent(@_);
|
||||
if (PrivatePageLocked($text)) {
|
||||
return PrivatePageMessage();
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
*OldPrivatePagesGetTextRevision = *GetTextRevision;
|
||||
*GetTextRevision = *NewPrivatePagesGetTextRevision;
|
||||
|
||||
sub NewPrivatePagesGetTextRevision {
|
||||
my ($text, $revision) = OldPrivatePagesGetTextRevision(@_);
|
||||
if (PrivatePageLocked($text)) {
|
||||
return (PrivatePageMessage(), $revision);
|
||||
}
|
||||
return ($text, $revision);
|
||||
}
|
||||
|
||||
push(@MyRules, \&PrivatePageRule);
|
||||
|
||||
sub PrivatePageRule {
|
||||
if (pos == 0 && m/\G#PASSWORD.*\n/gc) {
|
||||
return '';
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
*OldPrivatePagesGetSummary = *GetSummary;
|
||||
*GetSummary = *NewPrivatePagesGetSummary;
|
||||
|
||||
sub NewPrivatePagesGetSummary {
|
||||
my $text = GetParam('text', '');
|
||||
if ($text and $text =~ /^#PASSWORD\b/
|
||||
# no text means aftertext is set (leaving a comment)
|
||||
or $Page{text} =~ /^#PASSWORD\b/) {
|
||||
# if no summary was set, set something in order to avoid the default
|
||||
return '';
|
||||
}
|
||||
return OldPrivatePagesGetSummary();
|
||||
}
|
||||
@@ -178,8 +178,8 @@ sub UpdateReferers {
|
||||
}
|
||||
my $ua = LWP::UserAgent->new;
|
||||
my $response = $ua->get($referer);
|
||||
return unless $response->is_success and $response->content =~ /$self/;
|
||||
my $title = PageContentToTitle($response->content);
|
||||
return unless $response->is_success and $response->decoded_content =~ /$self/;
|
||||
my $title = PageContentToTitle($response->decoded_content);
|
||||
# starting with a timestamp makes sure that numerical comparisons still work!
|
||||
$Referers{$referer} = "$Now $title";
|
||||
return 1;
|
||||
|
||||
@@ -33,7 +33,7 @@ package OddMuse::Tokenize;
|
||||
|
||||
use vars qw($regexp);
|
||||
|
||||
$regexp = qr'[A-Za-z0-9_\x{0080}-\x{ffff}]+';
|
||||
$regexp = qr'[A-Za-z0-9_\x{0080}-\x{fffd}]+';
|
||||
|
||||
sub new {
|
||||
my ($classname, @args) = @_;
|
||||
|
||||
@@ -33,7 +33,7 @@ push(@MyRules, \&SeTextRule);
|
||||
# If the length does not match, pos is reset and zero is returned so
|
||||
# that the remaining rules will be tested instead.
|
||||
|
||||
my $word = '([-A-Za-z\x{0080}-\x{ffff}]+)';
|
||||
my $word = '([-A-Za-z\x{0080}-\x{fffd}]+)';
|
||||
sub SeTextRule {
|
||||
my $oldpos = pos;
|
||||
if ($bol && ((m/\G((.+?)[ \t]*\n(-+|=+)[ \t]*\n)/gc
|
||||
|
||||
@@ -5,7 +5,7 @@ use vars qw($FS $FreeLinkPattern $UrlProtocols $UrlChars $EndChars
|
||||
$UrlPattern $q);
|
||||
|
||||
$FS = "\x1e";
|
||||
$FreeLinkPattern = "([-,.()' _0-9A-Za-z\x{0080}-\x{ffff}]+)";
|
||||
$FreeLinkPattern = "([-,.()' _0-9A-Za-z\x{0080}-\x{fffd}]+)";
|
||||
$UrlProtocols = 'http|https|ftp|afs|news|nntp|mid|cid|mailto|wais|prospero|telnet|gopher|irc';
|
||||
$UrlChars = '[-a-zA-Z0-9/@=+$_~*.,;:?!\'"()&#%]'; # see RFC 2396
|
||||
$EndChars = '[-a-zA-Z0-9/@=+$_~*]'; # no punctuation at the end of the url.
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# 59 Temple Place, Suite 330
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/smiles.pl">smiles.pl</a></p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/smiles.pl">smiles.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Logo_And_Icons#Smilies">Logo And Icons</a></p>';
|
||||
|
||||
%Smilies = (
|
||||
':-?D' => 'http://www.emacswiki.org/pics/grin.png',
|
||||
|
||||
@@ -33,7 +33,7 @@ sub TablesLongRule {
|
||||
# a new row is started when a cell is repeated
|
||||
# if cells are missing, column spans are created (the first row
|
||||
# could use row spans...)
|
||||
if ($bol && m|\G\s*\n*\<table(/[A-Za-z\x{0080}-\x{ffff}/]+)? +([A-Za-z\x{0080}-\x{ffff},;\/ ]+)\> *\n|cg) {
|
||||
if ($bol && m|\G\s*\n*\<table(/[A-Za-z\x{0080}-\x{fffd}/]+)? +([A-Za-z\x{0080}-\x{fffd},;\/ ]+)\> *\n|cg) {
|
||||
my $class = join(' ', split(m|/|, $1)); # leading / in $1 will make sure we have leading space
|
||||
Clean(CloseHtmlEnvironments() . "<table class=\"user long$class\">");
|
||||
# labels and their default class
|
||||
@@ -60,7 +60,7 @@ sub TablesLongRule {
|
||||
my $rowspan = '';
|
||||
my $first = 1;
|
||||
for my $line (@lines) {
|
||||
if ($line =~ m|^($regexp)/?([0-9]+)?/?([A-Za-z\x{0080}-\x{ffff}/]+)?[:=] *(.*)|) { # regexp changes for other tables
|
||||
if ($line =~ m|^($regexp)/?([0-9]+)?/?([A-Za-z\x{0080}-\x{fffd}/]+)?[:=] *(.*)|) { # regexp changes for other tables
|
||||
$label = $1;
|
||||
$rowspan = $2;
|
||||
$class = join(' ', split(m|/|, $3)); # no leading / therefore no leading space
|
||||
|
||||
@@ -218,6 +218,7 @@ sub TagFind {
|
||||
my %page;
|
||||
foreach my $tag (@tags) {
|
||||
foreach my $id (split(/$FS/, $h{lc($tag)})) {
|
||||
utf8::decode($id);
|
||||
$page{$id} = 1;
|
||||
}
|
||||
}
|
||||
@@ -248,9 +249,7 @@ sub NewTagGrepFiltered { # called within a lock!
|
||||
}
|
||||
# filter out the tags from the search string
|
||||
$string = join(' ', grep(!/^-?tag:/, $string =~ /\"([^\"]+)\"|(\S+)/g));
|
||||
# if no query terms remain, just return the pages we found
|
||||
# return sort keys %page if $string eq '';
|
||||
# otherwise run grep
|
||||
# run the old code for any remaining search terms
|
||||
return OldTagGrepFiltered($string, sort keys %page);
|
||||
}
|
||||
|
||||
@@ -353,6 +352,12 @@ sub DoTagsReindex {
|
||||
$Page{text} =~ m/\[\[tag:$FreeLinkPattern\|([^]|]+)\]\]/g);
|
||||
next unless %tag;
|
||||
|
||||
# utf8::encode($id);
|
||||
# back to bytes for the following installation:
|
||||
# This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi
|
||||
# (with 56 registered patches, see perl -V for more detail)
|
||||
# (FIXME: get rid of this call, or explain why no UTF-8 can be stored in %h)
|
||||
|
||||
# For each tag we list the files tagged. Add the current file for
|
||||
# all tags.
|
||||
foreach my $tag (keys %tag) {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Copyright (C) 2006 Alex Schroeder <alex@emacswiki.org>
|
||||
# Copyright (C) 2006, 2012 Alex Schroeder <alex@gnu.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
@@ -11,17 +11,14 @@
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the
|
||||
# Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330
|
||||
# Boston, MA 02111-1307 USA
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/tex.pl">tex.pl</a></p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/tex.pl">tex.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/TeX_Extension">TeX Extension</a></p>';
|
||||
|
||||
use vars qw($TeXInit);
|
||||
use vars qw($TeXInit %Tex);
|
||||
use utf8;
|
||||
|
||||
my %h = qw( !` ¡ {\pounds} £ \pounds £ {\S} § \S § \"{} ¨ {\copyright} ©
|
||||
%Tex = qw( !` ¡ {\pounds} £ \pounds £ {\S} § \S § \"{} ¨ {\copyright} ©
|
||||
\copyright © $^a$ ª \={} ¯ $\pm$ ± \pm ± $^2$ ² $^3$ ³ \'{} ´ {\P} ¶
|
||||
\P ¶ $\cdot$ · \cdot · \c{} ¸ $^1$ ¹ $^o$ º ?` ¿ \`{A} À \`A À \'{A} Á
|
||||
\'A Á \^{A} Â \^A Â \~{A} Ã \~A Ã \"{A} Ä \"A Ä \k{A} Ą {\AA} Å \AA Å
|
||||
@@ -155,17 +152,27 @@ _0 ₀ _1 ₁ _2 ₂ _3 ₃ _4 ₄ _5 ₅ _6 ₆ _7 ₇ _8 ₈ _9 ₉ _= ₌ \~
|
||||
′ \varpropto ∝ \varrho ϱ \varsigma ς \vartheta ϑ \vartriangleleft ⊲
|
||||
\vartriangleright ⊳ \vdash ⊢ \vdots ⋮ \vee ∨ \veebar ⊻ \vert | \wedge
|
||||
∧ \wp ℘ \wr ≀ \xi ξ \zeta ζ \Bbb{N} ℕ \Bbb{P} ℙ \Bbb{R} ℝ \Bbb{Z} ℤ --
|
||||
– --- — ~ \mu μ \rho ρ \mathscr{I} ℐ \Smiley ☺ \blacksmiley ☻
|
||||
– --- — \mu μ \rho ρ \mathscr{I} ℐ \Smiley ☺ \blacksmiley ☻
|
||||
\Frowny ☹ \Letter ✉ \permil ‰ \registered ® \currency ¤ \dh ð \DH Ð
|
||||
\th þ \TH Þ \micro µ \lnot ¬ \ordfeminine ª \ordmasculine º \lambdabar
|
||||
ƛ \celsius ℃ \ldq “ \rdq ” \minus − \defs ≙ \llbracket 〚 \rrbracket 〛
|
||||
\ldata 《\rdata 》\glq ‚ \grq ‘ \glqq „ \"` „ \grqq “ \"' “ \flq ‹
|
||||
\ldata 《 \rdata 》 \glq ‚ \grq ‘ \glqq „ \"` „ \grqq “ \"' “ \flq ‹
|
||||
\frq › \flqq « \"< « \frqq » \"> » \- \textmu µ \textfractionsolidus
|
||||
⁄ \textbigcircle ⃝ \textmusicalnote ♪ \textdied ✝ \textcolonmonetary ₡
|
||||
\textwon ₩ \textnaira ₦ \textpeso ₱ \textlira ₤ \textrecipe ℞
|
||||
\textinterrobang ‽ \textpertenthousand ‱ \textbaht ฿ \textnumero №
|
||||
\textdiscount ⁒ \textestimated ℮ \textopenbullet ◦ \textlquill ⁅
|
||||
\textrquill ⁆ \textcircledP ℗ \textreferencemark ※ );
|
||||
$Tex{'~'} = ' ';
|
||||
|
||||
my $re = '(' . join('|', map {quotemeta} keys %h) . ')(\s|\b)';
|
||||
push(@MyMacros, sub {s/$re/$h{$1}/go});
|
||||
my $TexRe = '(' . join('|', map {quotemeta} sort { $b cmp $a } keys %Tex) . ')';
|
||||
$TexRe = qr{$TexRe};
|
||||
|
||||
push(@MyRules, \&TexRule);
|
||||
|
||||
sub TexRule {
|
||||
if (m/\G$TexRe/goc) {
|
||||
return $Tex{$1};
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/throttle.pl">throttle.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Limit_Number_Of_Instances_Running">Limit Number Of Instances Running</a></p>';
|
||||
|
||||
use File::Glob ':glob';
|
||||
use vars qw($InstanceThrottleDir $InstanceThrottleLimit);
|
||||
|
||||
$InstanceThrottleDir = $DataDir."/pids"; # directory for pid files
|
||||
@@ -47,7 +48,7 @@ sub NewDoBrowseRequest {
|
||||
|
||||
# limit the script to a maximum of $InstanceThrottleLimit instances
|
||||
sub DoInstanceThrottle {
|
||||
my @pids = glob($InstanceThrottleDir."/*");
|
||||
my @pids = bsd_glob($InstanceThrottleDir."/*");
|
||||
# Go over all pids: validate each pid by sending signal 0, unlink
|
||||
# pidfile if pid does not exist and return 0. Count the number of
|
||||
# zeros (= removed files = zombies) with grep.
|
||||
|
||||
@@ -25,7 +25,6 @@ use vars qw($TocHeaderText
|
||||
$TocClass
|
||||
$TocAutomatic
|
||||
$TocAnchorPrefix
|
||||
|
||||
$TocIsApplyingAutomaticRules);
|
||||
|
||||
=head2 $TocHeaderText
|
||||
@@ -140,7 +139,7 @@ that table. This is optional. If not specified, it defaults to "toc".
|
||||
sub TocRule {
|
||||
# <toc...> markup. This explicitly displays a table of contents at this point.
|
||||
if ($bol and
|
||||
m~\G<toc(/([A-Za-z\x{0080}-\x{ffff}/]+))? # $1
|
||||
m~\G<toc(/([A-Za-z\x{0080}-\x{fffd}/]+))? # $1
|
||||
(\s+(?:header_text\s*=\s*)?"(.+?)")? # $3
|
||||
(\s+(?:class\s*=\s*)?"(.+?)")? # $5
|
||||
>[ \t]*(\n|$)~cgx) { # $7
|
||||
@@ -229,8 +228,10 @@ sub NewTocApplyRules {
|
||||
{
|
||||
local *STDOUT;
|
||||
open( STDOUT, '>', \$html) or die "Can't open memory file: $!";
|
||||
binmode STDOUT, ":utf8";
|
||||
($blocks, $flags) = OldTocApplyRules(@_);
|
||||
close STDOUT;
|
||||
utf8::decode($blocks);
|
||||
utf8::decode($html);
|
||||
}
|
||||
# If there are at least two HTML headers on this page, insert a table of
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
# Copyright (C) 2008 Alex Schroeder <alex@gnu.org>
|
||||
# Copyright (C) 2008, 2012 Alex Schroeder <alex@gnu.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
# This program is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation; either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translation-links.pl">translation-links.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Translation_Links">Translation Links</a></p>';
|
||||
|
||||
=head1 Translation Links
|
||||
|
||||
@@ -76,7 +78,6 @@ sub TranslationLinkInit {
|
||||
$TranslationLinkPattern .= '|' if $FreeLinks or $WikiLinks;
|
||||
$TranslationLinkPattern .= $LinkPattern if $WikiLinks;
|
||||
$TranslationLinkPattern .= ')\]\]';
|
||||
my $text = GetPageContent(FreeToNormal(GetId()));
|
||||
%TranslationLinkData = ();
|
||||
}
|
||||
|
||||
@@ -199,9 +200,13 @@ sub DoTranslationLink {
|
||||
}
|
||||
print $q->p($q->label({-for=>'target'}, T('Translated page: ')),
|
||||
$q->textfield('target', '', 40),
|
||||
$q->hidden('action', 'translate'),
|
||||
$q->hidden('id', $source),
|
||||
$q->hidden('missing', GetParam('missing', '')),
|
||||
# don't use $q->hidden or you'll get encoding errors
|
||||
$q->input({-type=>'hidden', -name=>'id',
|
||||
-value=>$source}),
|
||||
$q->input({-type=>'hidden', -name=>'action',
|
||||
-value=>'translate'}),
|
||||
$q->input({-type=>'hidden', -name=>'missing',
|
||||
-value=>GetParam('missing', '')}),
|
||||
$q->submit('dotranslate', T('Go!')));
|
||||
print $q->endform, $q->end_div();
|
||||
PrintFooter();
|
||||
|
||||
@@ -1,25 +1,3 @@
|
||||
# UTF-8 encoded Brazilian Portuguese language file for use with Oddmuse
|
||||
#
|
||||
# Copyright (c) 2003 Marcelo Toledo <rw@locked.org>.
|
||||
# Copyright (c) 2006, 2007 Hélio Nunes <dedalu@dedalu.art.br>.
|
||||
#
|
||||
# Permission is granted to copy, distribute and/or modify this
|
||||
# document under the terms of the GNU Free Documentation License,
|
||||
# Version 1.2 or any later version published by the Free Software
|
||||
# Foundation; with no Invariant Sections, no Front-Cover Texts, and no
|
||||
# Back-Cover Texts. A copy of the license could be found at:
|
||||
# http://www.gnu.org/licenses/fdl.txt.
|
||||
#
|
||||
# Installation:
|
||||
# =============
|
||||
#
|
||||
# Create a modules subdirectory in your data directory, and put the
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
# This translation was last checked for Oddmuse version 1.753.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: brazilian-portuguese-utf8.pl,v 1.14 2009/06/07 19:30:37 as Exp $</p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Incluir páginas normais
|
||||
@@ -93,6 +71,8 @@ Please go on to %s.
|
||||
Por favor, vá para %s.
|
||||
Updates since %s
|
||||
Atualizações desde %s
|
||||
up to %s
|
||||
|
||||
Updates in the last %s days
|
||||
Atualizações nos últimos %s dias
|
||||
Updates in the last %s day
|
||||
@@ -177,6 +157,8 @@ The two revisions are the same.
|
||||
As duas versões são idênticas.
|
||||
Editing not allowed for %s.
|
||||
Edição não permitida para %s.
|
||||
Rollback of %s would restore banned content.
|
||||
|
||||
Rollback to %s
|
||||
Desfazer para %s
|
||||
%s rolled back
|
||||
@@ -197,8 +179,6 @@ Unlock site
|
||||
Desbloquear site
|
||||
Lock site
|
||||
Bloquear site
|
||||
Install CSS
|
||||
Instalar CSS
|
||||
Unlock %s
|
||||
Desbloquear %s
|
||||
Lock %s
|
||||
@@ -321,6 +301,8 @@ Could not get %s lock
|
||||
Não foi possível conseguir o bloqueio %s
|
||||
The lock was created %s.
|
||||
O bloqueio foi criado %s.
|
||||
Maybe the user running this script is no longer allowed to remove the lock directory?
|
||||
|
||||
This operation may take several seconds...
|
||||
Essa operação pode demorar vários segundos...
|
||||
Forced unlock of %s lock.
|
||||
@@ -411,6 +393,8 @@ Filtro:
|
||||
(para %s)
|
||||
%s pages found.
|
||||
%s páginas encontradas.
|
||||
Malformed regular expression in %s
|
||||
|
||||
Replaced: %s
|
||||
Substituído: %s
|
||||
Search for: %s
|
||||
@@ -493,16 +477,12 @@ Displaying Wiki Version
|
||||
Mostrando a versão do Wiki
|
||||
Debugging Information
|
||||
|
||||
Inter links:
|
||||
Links inter-:
|
||||
Too many connections by %s
|
||||
Muitas conexões de %s
|
||||
Please do not fetch more than %1 pages in %2 seconds.
|
||||
Por favor, abra mais do que %1 páginas em %2 segundos.
|
||||
Check whether the web server can create the directory %s and whether it can create files in it.
|
||||
Verifique se o servidor web pode criar o diretório %s e se pode criar arquivos nele.
|
||||
Copy one of the following stylesheets to %s:
|
||||
Copie uma das seguintes folhas de estilo para %s:
|
||||
Deleting %s
|
||||
Excluindo %s
|
||||
Deleted %s
|
||||
@@ -619,6 +599,20 @@ Compilation for %s
|
||||
Compilação para %s
|
||||
Compilation tag is missing a regular expression.
|
||||
Falta expressão regular na etiqueta de compilação.
|
||||
Install CSS
|
||||
Instalar CSS
|
||||
Copy one of the following stylesheets to %s:
|
||||
Copie uma das seguintes folhas de estilo para %s:
|
||||
Reset
|
||||
|
||||
Extract all dates from the database
|
||||
|
||||
Dates
|
||||
|
||||
No dates found.
|
||||
|
||||
Inter links:
|
||||
Links inter-:
|
||||
List spammed pages
|
||||
Listar páginas com spam
|
||||
Despamming pages
|
||||
@@ -659,6 +653,14 @@ ordinary changes
|
||||
alterações normais
|
||||
Matching page names:
|
||||
Coincidindo com os nomes de página:
|
||||
no summary available
|
||||
|
||||
page was marked for deletion
|
||||
|
||||
Oddmuse
|
||||
|
||||
Email:
|
||||
|
||||
Could not find %1.html template in %2
|
||||
Não foi possível encontrar o modelo %1.html em %2
|
||||
Only Editors are allowed to see this hidden page.
|
||||
@@ -687,6 +689,14 @@ O modelo %s ou está vazio ou não existe.
|
||||
-- definido em %s
|
||||
Local names defined on %1: %2
|
||||
Nomes locais definidos em %1: %2
|
||||
Name:
|
||||
|
||||
URL:
|
||||
|
||||
Define Local Names
|
||||
|
||||
Define external redirect:
|
||||
|
||||
Locked Pages
|
||||
|
||||
Register for %s
|
||||
@@ -789,8 +799,6 @@ unsubscribe
|
||||
|
||||
subscribe
|
||||
|
||||
Email:
|
||||
|
||||
%s appears to be an invalid mail address
|
||||
|
||||
Your mail subscriptions
|
||||
@@ -827,6 +835,8 @@ You linked more than %s times to the same domain. It would seem that only a spam
|
||||
%s não é um nome legal para um espaço de nomes
|
||||
Namespaces
|
||||
|
||||
(create locally)
|
||||
(criar localmente)
|
||||
Getting page index file for %s.
|
||||
Obtendo arquivo de índice de página para %s.
|
||||
Near links:
|
||||
@@ -843,8 +853,6 @@ EditNearLinks
|
||||
EditarLinksPróximos
|
||||
The same page on other sites:
|
||||
A mesma página em outros sites:
|
||||
(create locally)
|
||||
(criar localmente)
|
||||
image
|
||||
imagem
|
||||
download
|
||||
@@ -859,6 +867,12 @@ Generating Link Database
|
||||
Gerando Banco de Dados de Link
|
||||
The 404 handler extension requires the link data extension (links.pl).
|
||||
A extensão 404 handler requer a extensão link data (links.pl)
|
||||
Make available offline
|
||||
|
||||
Offline
|
||||
|
||||
You are currently offline and what you requested is not part of the offline application. You need to be online to do this.
|
||||
|
||||
LocalMap
|
||||
MapaLocal
|
||||
No page id for action localmap
|
||||
@@ -873,20 +887,6 @@ Self-ban by %s
|
||||
Auto-banimento por %s
|
||||
You have banned your own IP.
|
||||
Você baniu seu próprio IP.
|
||||
OpenID Login
|
||||
|
||||
Your identity is saved in a cookie, if you have cookies enabled. Cookies may get lost if you connect from another machine, from another account, or using another software.
|
||||
|
||||
Your homepage is set to %s.
|
||||
|
||||
You have no homepage set.
|
||||
|
||||
Homepage:
|
||||
|
||||
Homepage is missing
|
||||
|
||||
OpenID error %s
|
||||
|
||||
Orphan List
|
||||
Lista de Órfãs
|
||||
Trail:
|
||||
@@ -919,6 +919,8 @@ No target wiki was specified in the config file.
|
||||
Não foi especificado um wiki alvo no arquivo de configuração.
|
||||
The target wiki was misconfigured.
|
||||
O wiki alvo está mal configurado.
|
||||
Upload is limited to %s bytes
|
||||
|
||||
You did not answer correctly.
|
||||
Você não respondeu corretamente à pergunta.
|
||||
To save this page you must answer this question:
|
||||
@@ -971,6 +973,10 @@ Static Copy
|
||||
Cópia Estática
|
||||
Back to %s
|
||||
Voltar para %s
|
||||
Edit image in the browser
|
||||
|
||||
Summary of your changes:
|
||||
|
||||
Copy to %1 succeeded: %2.
|
||||
Sucesso na cópia de %1: %2.
|
||||
Copy to %1 failed: %2.
|
||||
@@ -1009,12 +1015,40 @@ Too many instances. Only %s allowed.
|
||||
Muitas instâncias. Apenas %s permitidas.
|
||||
Please try again later. Perhaps somebody is running maintenance or doing a long search. Unfortunately the site has limited resources, and so we must ask you for a bit of patience.
|
||||
Por favor, tente novamente mais tarde. Talvez alguém esteja executando manutenção ou uma longa busca. Infelizmente o site tem recursos limitados e, por isso, pedimos um pouco de paciência.
|
||||
thumb
|
||||
|
||||
Error creating thumbnail from non existant page %s.
|
||||
|
||||
Can not create thumbnail for file type %s.
|
||||
|
||||
Can not create thumbnail for a text document
|
||||
|
||||
Could not open %s for writing whilst trying to save image before creating thumbnail. Check write permissions.
|
||||
|
||||
Can not create path for thumbnail - %s
|
||||
|
||||
Failed to run %1 to create thumbnail: %2
|
||||
|
||||
%s ran into an error
|
||||
|
||||
%s produced no output
|
||||
|
||||
Failed to parse %s.
|
||||
|
||||
Timezone
|
||||
|
||||
Pick your timezone:
|
||||
|
||||
Set
|
||||
|
||||
Contents
|
||||
Conteúdo
|
||||
Create a new page for today
|
||||
|
||||
Add Translation
|
||||
|
||||
Please provide a different page name for the translation.
|
||||
|
||||
Added translation: %1 (%2)
|
||||
|
||||
Translate %s
|
||||
@@ -1057,6 +1091,8 @@ Páginas Procuradas
|
||||
%s páginas
|
||||
%s, referenced from:
|
||||
%s, referenciada por:
|
||||
Web application for offline browsing
|
||||
|
||||
Upload of %s file
|
||||
Envio de arquivos %s
|
||||
Blog
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
# This translation was updated for Oddmuse 1.354.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: bulgarian-utf8.pl,v 1.11 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/bulgarian-utf8.pl">bulgarian-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Bulgarian">Bulgarian</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
|
||||
@@ -93,6 +93,8 @@ Please go on to %s.
|
||||
Моля продължи на %s.
|
||||
Updates since %s
|
||||
Промени от %s насам
|
||||
up to %s
|
||||
|
||||
Updates in the last %s days
|
||||
Промени през последните %s дни
|
||||
Updates in the last %s day
|
||||
@@ -177,6 +179,8 @@ The two revisions are the same.
|
||||
|
||||
Editing not allowed for %s.
|
||||
Редакция на %s не е разрешена.
|
||||
Rollback of %s would restore banned content.
|
||||
|
||||
Rollback to %s
|
||||
Връщане до %s
|
||||
%s rolled back
|
||||
@@ -197,8 +201,6 @@ Unlock site
|
||||
|
||||
Lock site
|
||||
|
||||
Install CSS
|
||||
|
||||
Unlock %s
|
||||
|
||||
Lock %s
|
||||
@@ -321,6 +323,8 @@ Could not get %s lock
|
||||
Не може да се резервират изключителни права върху %s.
|
||||
The lock was created %s.
|
||||
|
||||
Maybe the user running this script is no longer allowed to remove the lock directory?
|
||||
|
||||
This operation may take several seconds...
|
||||
Тази операция може да потрае малко...
|
||||
Forced unlock of %s lock.
|
||||
@@ -411,6 +415,8 @@ Filter:
|
||||
(за %s)
|
||||
%s pages found.
|
||||
%s намерени страници.
|
||||
Malformed regular expression in %s
|
||||
|
||||
Replaced: %s
|
||||
Заместено: %s
|
||||
Search for: %s
|
||||
@@ -493,16 +499,12 @@ Displaying Wiki Version
|
||||
|
||||
Debugging Information
|
||||
|
||||
Inter links:
|
||||
Интер-линкове:
|
||||
Too many connections by %s
|
||||
Прекалено много връзки с %s
|
||||
Please do not fetch more than %1 pages in %2 seconds.
|
||||
|
||||
Check whether the web server can create the directory %s and whether it can create files in it.
|
||||
|
||||
Copy one of the following stylesheets to %s:
|
||||
|
||||
Deleting %s
|
||||
|
||||
Deleted %s
|
||||
@@ -619,6 +621,20 @@ Compilation for %s
|
||||
|
||||
Compilation tag is missing a regular expression.
|
||||
|
||||
Install CSS
|
||||
|
||||
Copy one of the following stylesheets to %s:
|
||||
|
||||
Reset
|
||||
|
||||
Extract all dates from the database
|
||||
|
||||
Dates
|
||||
|
||||
No dates found.
|
||||
|
||||
Inter links:
|
||||
Интер-линкове:
|
||||
List spammed pages
|
||||
|
||||
Despamming pages
|
||||
@@ -659,6 +675,14 @@ ordinary changes
|
||||
|
||||
Matching page names:
|
||||
|
||||
no summary available
|
||||
|
||||
page was marked for deletion
|
||||
|
||||
Oddmuse
|
||||
|
||||
Email:
|
||||
|
||||
Could not find %1.html template in %2
|
||||
|
||||
Only Editors are allowed to see this hidden page.
|
||||
@@ -687,6 +711,14 @@ The template %s is either empty or does not exist.
|
||||
|
||||
Local names defined on %1: %2
|
||||
|
||||
Name:
|
||||
|
||||
URL:
|
||||
|
||||
Define Local Names
|
||||
|
||||
Define external redirect:
|
||||
|
||||
Locked Pages
|
||||
|
||||
Register for %s
|
||||
@@ -789,8 +821,6 @@ unsubscribe
|
||||
|
||||
subscribe
|
||||
|
||||
Email:
|
||||
|
||||
%s appears to be an invalid mail address
|
||||
|
||||
Your mail subscriptions
|
||||
@@ -827,6 +857,8 @@ You linked more than %s times to the same domain. It would seem that only a spam
|
||||
|
||||
Namespaces
|
||||
|
||||
(create locally)
|
||||
|
||||
Getting page index file for %s.
|
||||
Получаване на индекс за %s.
|
||||
Near links:
|
||||
@@ -843,8 +875,6 @@ EditNearLinks
|
||||
Редакция на близки линкове
|
||||
The same page on other sites:
|
||||
Същата страница на други места:
|
||||
(create locally)
|
||||
|
||||
image
|
||||
|
||||
download
|
||||
@@ -859,6 +889,12 @@ Generating Link Database
|
||||
|
||||
The 404 handler extension requires the link data extension (links.pl).
|
||||
|
||||
Make available offline
|
||||
|
||||
Offline
|
||||
|
||||
You are currently offline and what you requested is not part of the offline application. You need to be online to do this.
|
||||
|
||||
LocalMap
|
||||
|
||||
No page id for action localmap
|
||||
@@ -873,20 +909,6 @@ Self-ban by %s
|
||||
|
||||
You have banned your own IP.
|
||||
|
||||
OpenID Login
|
||||
|
||||
Your identity is saved in a cookie, if you have cookies enabled. Cookies may get lost if you connect from another machine, from another account, or using another software.
|
||||
|
||||
Your homepage is set to %s.
|
||||
|
||||
You have no homepage set.
|
||||
|
||||
Homepage:
|
||||
|
||||
Homepage is missing
|
||||
|
||||
OpenID error %s
|
||||
|
||||
Orphan List
|
||||
|
||||
Trail:
|
||||
@@ -919,6 +941,8 @@ No target wiki was specified in the config file.
|
||||
|
||||
The target wiki was misconfigured.
|
||||
|
||||
Upload is limited to %s bytes
|
||||
|
||||
You did not answer correctly.
|
||||
|
||||
To save this page you must answer this question:
|
||||
@@ -971,6 +995,10 @@ Static Copy
|
||||
|
||||
Back to %s
|
||||
Обратно към %s
|
||||
Edit image in the browser
|
||||
|
||||
Summary of your changes:
|
||||
|
||||
Copy to %1 succeeded: %2.
|
||||
|
||||
Copy to %1 failed: %2.
|
||||
@@ -1009,12 +1037,40 @@ Too many instances. Only %s allowed.
|
||||
|
||||
Please try again later. Perhaps somebody is running maintenance or doing a long search. Unfortunately the site has limited resources, and so we must ask you for a bit of patience.
|
||||
|
||||
thumb
|
||||
|
||||
Error creating thumbnail from non existant page %s.
|
||||
|
||||
Can not create thumbnail for file type %s.
|
||||
|
||||
Can not create thumbnail for a text document
|
||||
|
||||
Could not open %s for writing whilst trying to save image before creating thumbnail. Check write permissions.
|
||||
|
||||
Can not create path for thumbnail - %s
|
||||
|
||||
Failed to run %1 to create thumbnail: %2
|
||||
|
||||
%s ran into an error
|
||||
|
||||
%s produced no output
|
||||
|
||||
Failed to parse %s.
|
||||
|
||||
Timezone
|
||||
|
||||
Pick your timezone:
|
||||
|
||||
Set
|
||||
|
||||
Contents
|
||||
|
||||
Create a new page for today
|
||||
|
||||
Add Translation
|
||||
|
||||
Please provide a different page name for the translation.
|
||||
|
||||
Added translation: %1 (%2)
|
||||
|
||||
Translate %s
|
||||
@@ -1057,6 +1113,8 @@ Wanted Pages
|
||||
|
||||
%s, referenced from:
|
||||
|
||||
Web application for offline browsing
|
||||
|
||||
Upload of %s file
|
||||
|
||||
Blog
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
# This translation was last checked for Oddmuse version 1.504.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: chinese-utf8.pl,v 1.12 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/chinese-utf8.pl">chinese-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Chinese">Chinese</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
包含正常頁面
|
||||
@@ -93,6 +93,8 @@ Please go on to %s.
|
||||
請繼續前住 %s 。
|
||||
Updates since %s
|
||||
自 %s 以來的修改
|
||||
up to %s
|
||||
|
||||
Updates in the last %s days
|
||||
在 %s 天之內的更動
|
||||
Updates in the last %s day
|
||||
@@ -177,6 +179,8 @@ The two revisions are the same.
|
||||
二個版本相同
|
||||
Editing not allowed for %s.
|
||||
不允許編輯 %s 。
|
||||
Rollback of %s would restore banned content.
|
||||
|
||||
Rollback to %s
|
||||
回復至 %s
|
||||
%s rolled back
|
||||
@@ -197,8 +201,6 @@ Unlock site
|
||||
網站解鎖
|
||||
Lock site
|
||||
網站鎖定
|
||||
Install CSS
|
||||
安裝 CSS
|
||||
Unlock %s
|
||||
解鎖 %s
|
||||
Lock %s
|
||||
@@ -321,6 +323,8 @@ Could not get %s lock
|
||||
無法取得 %s 鎖定
|
||||
The lock was created %s.
|
||||
建立鎖定 %s
|
||||
Maybe the user running this script is no longer allowed to remove the lock directory?
|
||||
|
||||
This operation may take several seconds...
|
||||
這個動作可能要花幾秒…
|
||||
Forced unlock of %s lock.
|
||||
@@ -411,6 +415,8 @@ Filter:
|
||||
(列出 %s )
|
||||
%s pages found.
|
||||
找到 %s 個頁面。
|
||||
Malformed regular expression in %s
|
||||
|
||||
Replaced: %s
|
||||
取代:%s
|
||||
Search for: %s
|
||||
@@ -493,16 +499,12 @@ Displaying Wiki Version
|
||||
顯示 Wiki 主機相關套件版本
|
||||
Debugging Information
|
||||
|
||||
Inter links:
|
||||
內部連結:
|
||||
Too many connections by %s
|
||||
太多來自 %s 的連線
|
||||
Please do not fetch more than %1 pages in %2 seconds.
|
||||
請不要在 %2 秒內抓取超過 %1 頁的資料。
|
||||
Check whether the web server can create the directory %s and whether it can create files in it.
|
||||
請確認網站伺服器是否可建立 %s 目錄,並且在其中建立檔案。
|
||||
Copy one of the following stylesheets to %s:
|
||||
複製以下 CSS 模版至 %s
|
||||
Deleting %s
|
||||
正在刪除 %s
|
||||
Deleted %s
|
||||
@@ -619,6 +621,20 @@ Compilation for %s
|
||||
%s 的彙整
|
||||
Compilation tag is missing a regular expression.
|
||||
匯編的標記缺少一個正規表示式
|
||||
Install CSS
|
||||
安裝 CSS
|
||||
Copy one of the following stylesheets to %s:
|
||||
複製以下 CSS 模版至 %s
|
||||
Reset
|
||||
|
||||
Extract all dates from the database
|
||||
|
||||
Dates
|
||||
|
||||
No dates found.
|
||||
|
||||
Inter links:
|
||||
內部連結:
|
||||
List spammed pages
|
||||
列出 SPAM 頁面
|
||||
Despamming pages
|
||||
@@ -659,6 +675,14 @@ ordinary changes
|
||||
普通變更
|
||||
Matching page names:
|
||||
匹配頁面的名稱:
|
||||
no summary available
|
||||
|
||||
page was marked for deletion
|
||||
|
||||
Oddmuse
|
||||
|
||||
Email:
|
||||
|
||||
Could not find %1.html template in %2
|
||||
無法在 %2 找到 %1.html 的範本
|
||||
Only Editors are allowed to see this hidden page.
|
||||
@@ -687,6 +711,14 @@ The template %s is either empty or does not exist.
|
||||
-- 在 %s 中定義
|
||||
Local names defined on %1: %2
|
||||
定義本地名稱在 %1: %2
|
||||
Name:
|
||||
|
||||
URL:
|
||||
|
||||
Define Local Names
|
||||
|
||||
Define external redirect:
|
||||
|
||||
Locked Pages
|
||||
|
||||
Register for %s
|
||||
@@ -789,8 +821,6 @@ unsubscribe
|
||||
|
||||
subscribe
|
||||
|
||||
Email:
|
||||
|
||||
%s appears to be an invalid mail address
|
||||
|
||||
Your mail subscriptions
|
||||
@@ -827,6 +857,8 @@ You linked more than %s times to the same domain. It would seem that only a spam
|
||||
%s 不是一個正常的命名空間
|
||||
Namespaces
|
||||
|
||||
(create locally)
|
||||
(本地建立)
|
||||
Getting page index file for %s.
|
||||
自 %s 取得頁面索引資料。
|
||||
Near links:
|
||||
@@ -843,8 +875,6 @@ EditNearLinks
|
||||
編輯接近連結
|
||||
The same page on other sites:
|
||||
其他網站的相同頁面
|
||||
(create locally)
|
||||
(本地建立)
|
||||
image
|
||||
圖像
|
||||
download
|
||||
@@ -859,6 +889,12 @@ Generating Link Database
|
||||
產生連結資料庫
|
||||
The 404 handler extension requires the link data extension (links.pl).
|
||||
404 訊息,您需要安裝 (links.pl) 擴充模組
|
||||
Make available offline
|
||||
|
||||
Offline
|
||||
|
||||
You are currently offline and what you requested is not part of the offline application. You need to be online to do this.
|
||||
|
||||
LocalMap
|
||||
本地地圖
|
||||
No page id for action localmap
|
||||
@@ -873,20 +909,6 @@ Self-ban by %s
|
||||
被 %s 禁止
|
||||
You have banned your own IP.
|
||||
您禁止了自已的 IP Address
|
||||
OpenID Login
|
||||
|
||||
Your identity is saved in a cookie, if you have cookies enabled. Cookies may get lost if you connect from another machine, from another account, or using another software.
|
||||
|
||||
Your homepage is set to %s.
|
||||
|
||||
You have no homepage set.
|
||||
|
||||
Homepage:
|
||||
|
||||
Homepage is missing
|
||||
|
||||
OpenID error %s
|
||||
|
||||
Orphan List
|
||||
孤立頁面列表
|
||||
Trail:
|
||||
@@ -919,6 +941,8 @@ No target wiki was specified in the config file.
|
||||
設定檔案中沒有設定目標(Target) Wiki
|
||||
The target wiki was misconfigured.
|
||||
目標(Target) Wiki 設定錯誤
|
||||
Upload is limited to %s bytes
|
||||
|
||||
You did not answer correctly.
|
||||
您沒有回答正確的答案
|
||||
To save this page you must answer this question:
|
||||
@@ -971,6 +995,10 @@ Static Copy
|
||||
靜態頁面備份
|
||||
Back to %s
|
||||
返回 %s
|
||||
Edit image in the browser
|
||||
|
||||
Summary of your changes:
|
||||
|
||||
Copy to %1 succeeded: %2.
|
||||
從 %2 複製到 %1 成功
|
||||
Copy to %1 failed: %2.
|
||||
@@ -1009,12 +1037,40 @@ Too many instances. Only %s allowed.
|
||||
太多請求,只允許 %s
|
||||
Please try again later. Perhaps somebody is running maintenance or doing a long search. Unfortunately the site has limited resources, and so we must ask you for a bit of patience.
|
||||
系統忙碌中請稍後在試一次,可能有人正在執行維護動作或長期搜尋
|
||||
thumb
|
||||
|
||||
Error creating thumbnail from non existant page %s.
|
||||
|
||||
Can not create thumbnail for file type %s.
|
||||
|
||||
Can not create thumbnail for a text document
|
||||
|
||||
Could not open %s for writing whilst trying to save image before creating thumbnail. Check write permissions.
|
||||
|
||||
Can not create path for thumbnail - %s
|
||||
|
||||
Failed to run %1 to create thumbnail: %2
|
||||
|
||||
%s ran into an error
|
||||
|
||||
%s produced no output
|
||||
|
||||
Failed to parse %s.
|
||||
|
||||
Timezone
|
||||
|
||||
Pick your timezone:
|
||||
|
||||
Set
|
||||
|
||||
Contents
|
||||
內容
|
||||
Create a new page for today
|
||||
建立今日頁面
|
||||
Add Translation
|
||||
|
||||
Please provide a different page name for the translation.
|
||||
|
||||
Added translation: %1 (%2)
|
||||
|
||||
Translate %s
|
||||
@@ -1057,6 +1113,8 @@ Wanted Pages
|
||||
%s 頁面
|
||||
%s, referenced from:
|
||||
%s 引用自:
|
||||
Web application for offline browsing
|
||||
|
||||
Upload of %s file
|
||||
上傳 %s 檔案
|
||||
Blog
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#(http://search.cpan.org/~qjzhou/Encode-CNMap-0.32/bin/cnmap) by Qing-Jie Zhou <qjzhou@hotmail.com>.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: chinese_cn-utf8.pl,v 1.11 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/chinese_cn-utf8.pl">chinese_cn-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Chinese">Chinese</a></p>';
|
||||
##############################################################
|
||||
# for those who want to use Chinese even for special pages
|
||||
# please uncomment the corresponding lines to use translated
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
# This translation was last checked for Oddmuse version 1.215.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: dutch-utf8.pl,v 1.12 2011/05/17 13:24:13 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/dutch-utf8.pl">dutch-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Dutch">Dutch</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: finnish-utf8.pl,v 1.11 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/finnish-utf8.pl">finnish-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Finnish">Finnish</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
# Copyright (c) 2003, 2005 Pierre Gaston
|
||||
# Copyright (c) 2004, 2005 Christophe Ducamp
|
||||
# Copyright (c) 2010 Alex Schroeder
|
||||
# Copyright (c) 2012 Aurélien Desbrières
|
||||
# Copyright (c) 2012 Hervé Robin
|
||||
#
|
||||
# Permission is granted to copy, distribute and/or modify this
|
||||
# document under the terms of the GNU Free Documentation License,
|
||||
@@ -17,10 +19,12 @@
|
||||
# Create a modules subdirectory in your data directory, and put the
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
# This translation was last checked for Oddmuse version 1.296.
|
||||
#
|
||||
# This translation was last checked for Oddmuse 2.2.
|
||||
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: french-utf8.pl,v 1.20 2011/02/05 12:29:07 as Exp $</p>';
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/french-utf8.pl">french-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/French">French</a></p>';
|
||||
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Comprend les pages normales
|
||||
@@ -31,9 +35,9 @@ Se connecter
|
||||
Error
|
||||
Erreur
|
||||
%s calls
|
||||
|
||||
%s appel
|
||||
Could not create %s
|
||||
Création impossible de %s
|
||||
Création de %s impossible
|
||||
Invalid UserName %s: not saved.
|
||||
Nom d’utilisateur non valide %s : non sauvegardé.
|
||||
UserName must be 50 characters or less: not saved
|
||||
@@ -87,13 +91,13 @@ Page non valide %s
|
||||
Too many redirections
|
||||
Trop de redirections
|
||||
No redirection for old revisions
|
||||
Pas de redirection pour les versions ancienne
|
||||
Pas de redirection pour les versions anciennes
|
||||
Invalid link pattern for #REDIRECT
|
||||
Mise en forme invalide pour le lien de redirection (#REDIRECT)
|
||||
Syntaxe invalide pour le lien de redirection (#REDIRECT)
|
||||
Please go on to %s.
|
||||
SVP aller a %s.
|
||||
SVP allez à %s.
|
||||
Updates since %s
|
||||
Mises à hour depuis %s
|
||||
Mises à jour depuis %s
|
||||
up to %s
|
||||
jusqu’à
|
||||
Updates in the last %s days
|
||||
@@ -109,7 +113,7 @@ Lister toutes les modifications
|
||||
Skip rollbacks
|
||||
Sans les retours en arrière
|
||||
Include rollbacks
|
||||
Incluant les retours en arrière
|
||||
Inclure les retours en arrière
|
||||
List only major changes
|
||||
Lister seulement les modifications majeures
|
||||
Include minor changes
|
||||
@@ -117,7 +121,7 @@ Inclure les modifications mineures
|
||||
%s days
|
||||
%s jours
|
||||
List later changes
|
||||
Lister les modifications les plus récentes
|
||||
Lister les modifications plus récentes
|
||||
RSS
|
||||
RSS
|
||||
RSS with pages
|
||||
@@ -151,15 +155,15 @@ Tous les changements pour %s
|
||||
from %s
|
||||
depuis %s
|
||||
This page is too big to send over RSS.
|
||||
Cette page est trop grosse pour être envoyée sur RSS
|
||||
Cette page est trop grande pour être envoyée sur RSS
|
||||
History of %s
|
||||
Historique de %s
|
||||
Compare
|
||||
Comparer
|
||||
Deleted
|
||||
Suprimé
|
||||
Supprimé(e)
|
||||
Mark this page for deletion
|
||||
Marquer cette page à suprimer
|
||||
Marquer cette page comme étant à supprimer
|
||||
No other revisions available
|
||||
Il n’y a pas d’autre version
|
||||
current
|
||||
@@ -173,15 +177,15 @@ Cible manquante pour le retour en arrière.
|
||||
Target for rollback is too far back.
|
||||
La cible du retour en arrière est trop ancienne.
|
||||
A username is required for ordinary users.
|
||||
Un nom d’utilisateur est nécessaire pour les utilisateurs communs
|
||||
Un nom d’utilisateur est nécessaire pour les utilisateurs normaux
|
||||
Rolling back changes
|
||||
Réinitialisation en cours
|
||||
The two revisions are the same.
|
||||
Les deux révisions sont les mêmes.
|
||||
Les deux versions sont identiques.
|
||||
Editing not allowed for %s.
|
||||
Edition non autorisée pour %s.
|
||||
Modification non autorisée pour %s.
|
||||
Rollback of %s would restore banned content.
|
||||
Un retour à %s restaurara du texte interdit.
|
||||
Un retour à %s restaurera du contenu interdit.
|
||||
Rollback to %s
|
||||
Retour à %s
|
||||
%s rolled back
|
||||
@@ -193,13 +197,13 @@ Index de toutes les pages
|
||||
Wiki Version
|
||||
Affiche la version du wiki
|
||||
Unlock Wiki
|
||||
Supression du verrou
|
||||
Suppression du verrou
|
||||
Password
|
||||
Mot de passe
|
||||
Run maintenance
|
||||
Lancer la maintenance
|
||||
Unlock site
|
||||
Déverouiller le site
|
||||
Déverrouiller le site
|
||||
Lock site
|
||||
Verouiller le site
|
||||
Install CSS
|
||||
@@ -215,11 +219,11 @@ Actions :
|
||||
Important pages:
|
||||
Pages importantes :
|
||||
To mark a page for deletion, put <strong>%s</strong> on the first line.
|
||||
Pour marquer une page devant être supprimée, ajoutez <strong>%s</strong> à la première ligne
|
||||
Pour marquer une page comme étant à supprimer, ajoutez <strong>%s</strong> à la première ligne
|
||||
[Home]
|
||||
[Accueil]
|
||||
redirected from %s
|
||||
redirigée à partir de %s
|
||||
redirigé(e) à partir de %s
|
||||
%s:
|
||||
%s :
|
||||
Click to search for references to this page
|
||||
@@ -241,7 +245,7 @@ La base de données est stockée dans le répertoire temporaire %s
|
||||
Last edited
|
||||
Dernière modification
|
||||
Edited
|
||||
Modifié
|
||||
Modifié(e)
|
||||
by %s
|
||||
par %s
|
||||
(diff)
|
||||
@@ -259,9 +263,9 @@ Voir la version actuelle
|
||||
View all changes
|
||||
Voir toutes les modifications
|
||||
View contributors
|
||||
Vour les contributeurs
|
||||
Voir les contributeurs
|
||||
Homepage URL:
|
||||
Adresse(URL) du site perso
|
||||
Adresse(URL) du site personnel
|
||||
s
|
||||
s
|
||||
Save
|
||||
@@ -277,7 +281,7 @@ f
|
||||
Replace:
|
||||
Remplacer :
|
||||
Delete
|
||||
Suprimer
|
||||
Supprimer
|
||||
Validate HTML
|
||||
Valider HTML
|
||||
Validate CSS
|
||||
@@ -285,11 +289,11 @@ Valider CSS
|
||||
Last edit
|
||||
Dernière modification
|
||||
Difference between revision %1 and %2
|
||||
Différence (de la révision %1 à %2)
|
||||
Différence entre les versions %1 et %2
|
||||
revision %s
|
||||
révision %s
|
||||
version %s
|
||||
current revision
|
||||
révision actuelle
|
||||
version actuelle
|
||||
Last major edit (%s)
|
||||
Dernière modification majeure (%s)
|
||||
later minor edits
|
||||
@@ -299,17 +303,17 @@ Pas de diff disponible.
|
||||
Old revision:
|
||||
Ancienne révision :
|
||||
Changed:
|
||||
Modifiée :
|
||||
Modifié(e) :
|
||||
Deleted:
|
||||
Suprimé :
|
||||
Supprimé(e) :
|
||||
Added:
|
||||
Ajoutée :
|
||||
Ajouté(e) :
|
||||
to
|
||||
à
|
||||
Revision %s not available
|
||||
La version %s n’est pas disponible
|
||||
showing current revision instead
|
||||
présentation à la place de la version en cours.
|
||||
présentation à la place de la version en cours
|
||||
Showing revision %s
|
||||
Présentation de la version %s
|
||||
Cannot save a nameless page.
|
||||
@@ -327,11 +331,11 @@ Ne peut obtenir un verrouillage %s
|
||||
The lock was created %s.
|
||||
Le verrouillage a été créé %s.
|
||||
Maybe the user running this script is no longer allowed to remove the lock directory?
|
||||
Peut-être l’utilisateur éxecutant le logiciel n’est plus autorisé à effacer le répertoire utilisé pour le verrouillage ?
|
||||
Peut-être l’utilisateur exécutant le logiciel n’est-il plus autorisé à effacer le répertoire utilisé pour le verrouillage ?
|
||||
This operation may take several seconds...
|
||||
Cette opération peut prendre quelques secondes...
|
||||
Forced unlock of %s lock.
|
||||
Supression forcée du verrou %s.
|
||||
Suppression forcée du verrou %s.
|
||||
No unlock required.
|
||||
La suppression du verrou n’est pas nécessaire.
|
||||
%s hours ago
|
||||
@@ -351,11 +355,11 @@ just now
|
||||
Edit Denied
|
||||
Modification interdite
|
||||
Editing not allowed: user, ip, or network is blocked.
|
||||
Modification interdite : l’utilisateur, l’adresse ip, ou le reseau est bloqué.
|
||||
Modification interdite : l’utilisateur, l’adresse ip, ou le réseau est bloqué.
|
||||
Contact the wiki administrator for more information.
|
||||
Contactez l’administrateur du wiki pour plus d’information.
|
||||
The rule %s matched for you.
|
||||
La règle %s a fonctionné pour vous.
|
||||
La règle %s a été appliquée pour vous.
|
||||
See %s for more information.
|
||||
Voir %s pour plus d’information.
|
||||
Editing not allowed: %s is read-only.
|
||||
@@ -375,7 +379,7 @@ Résumé :
|
||||
This change is a minor edit.
|
||||
Cette modification est une édition mineure.
|
||||
Cancel
|
||||
Anuler
|
||||
Annuler
|
||||
Replace this file with text
|
||||
Remplacer ce fichier par un texte
|
||||
Replace this text with a file
|
||||
@@ -393,7 +397,7 @@ Vous êtes actuellement éditeur de ce site.
|
||||
You are a normal user on this site.
|
||||
Vous êtes un utilisateur normal de ce site.
|
||||
Your password does not match any of the administrator or editor passwords.
|
||||
Vote mot de passe ne corespond à aucun de ceux des mots de passe administrateurs ou éditeurs.
|
||||
Vote mot de passe ne correspond ni au mot de passe administrateur ni au mot de passe éditeur.
|
||||
Password:
|
||||
Mot de passe :
|
||||
This site does not use admin or editor passwords.
|
||||
@@ -411,7 +415,7 @@ La règle "%1" correspondait à "%2" sur cette page.
|
||||
Reason: %s.
|
||||
Raison : %s.
|
||||
Reason unknown.
|
||||
Raison inconnu.
|
||||
Raison inconnue.
|
||||
Filter:
|
||||
Filtre :
|
||||
(for %s)
|
||||
@@ -419,9 +423,9 @@ Filtre :
|
||||
%s pages found.
|
||||
%s pages trouvées.
|
||||
Malformed regular expression in %s
|
||||
Expression régulière malformé dans %s
|
||||
Expression rationnelle mal formulée dans %s
|
||||
Replaced: %s
|
||||
Remplacé : %s
|
||||
Remplacé(e) : %s
|
||||
Search for: %s
|
||||
Rechercher : %s
|
||||
View changes for these pages
|
||||
@@ -433,9 +437,9 @@ par
|
||||
Transfer Error: %s
|
||||
Erreur de Transfert : %s
|
||||
Browser reports no file info.
|
||||
Le navigateur signale pas d’information sur le fichier.
|
||||
Le navigateur ne signale pas d’information sur le fichier.
|
||||
Browser reports no file type.
|
||||
Le navigateur signale pas de format de fichier.
|
||||
Le navigateur ne signale pas de type de fichier.
|
||||
The page contains banned text.
|
||||
Cette page contient un texte interdit.
|
||||
No changes to be saved.
|
||||
@@ -449,7 +453,7 @@ SVP vérifiez si vous avez écrasé ces modifications.
|
||||
Anonymous
|
||||
Anonyme
|
||||
Cannot delete the index file %s.
|
||||
Impossible de supprimer le fichier index %s.
|
||||
Impossible de supprimer le fichier index %s.
|
||||
Please check the directory permissions.
|
||||
Veuillez vérifier les permissions des répertoires.
|
||||
Your changes were not saved.
|
||||
@@ -473,11 +477,11 @@ Enlevez le fichier "maintain" ou patientez.
|
||||
Expiring keep files and deleting pages marked for deletion
|
||||
Expiration des fichiers de cache et suppression des pages marquées pour la suppression
|
||||
not deleted:
|
||||
non supprimée :
|
||||
non supprimé(e) :
|
||||
deleted
|
||||
supprimé
|
||||
supprimé(e)
|
||||
Moving part of the %s log file.
|
||||
Deplace une partie du fichier de log %s.
|
||||
Déplace une partie du fichier de log %s.
|
||||
Could not open %s log file
|
||||
Impossible d’ouvrir le fichier de log %
|
||||
Error was
|
||||
@@ -507,15 +511,15 @@ Trop de connexions par %s
|
||||
Please do not fetch more than %1 pages in %2 seconds.
|
||||
Veuillez ne pas télécharger plus de %1 pages toutes les %2 secondes
|
||||
Check whether the web server can create the directory %s and whether it can create files in it.
|
||||
Verifiez si le serveur web peut créer le répertoire %s et s’il peut créer des fichiers dedans.
|
||||
Vérifiez si le serveur web peut créer le répertoire %s et s’il peut créer des fichiers dedans.
|
||||
Copy one of the following stylesheets to %s:
|
||||
Copier une des feuilles de style suivantes sur %s.
|
||||
Deleting %s
|
||||
Supression de %s
|
||||
Suppression de %s
|
||||
Deleted %s
|
||||
%s supprimée
|
||||
%s supprimé(e)
|
||||
Renaming %1 to %2.
|
||||
Change %1 en %2.
|
||||
Renomme %1 en %2.
|
||||
The page %s does not exist
|
||||
La page %s n'existe pas
|
||||
The page %s already exists
|
||||
@@ -523,15 +527,15 @@ La page %s existe déjà
|
||||
Cannot rename %1 to %2
|
||||
Impossible de renommer %1 en %2
|
||||
Renamed to %s
|
||||
Renommé en %s
|
||||
Renommé(e) en %s
|
||||
Renamed from %s
|
||||
Renommé à partir de %s
|
||||
Renommé(e) à partir de %s
|
||||
Renamed %1 to %2.
|
||||
%1 a été renommée en %2.
|
||||
%1 a été renommé(e) en %2.
|
||||
Immediately delete %s
|
||||
Supprimer immédiatement %s
|
||||
Rename %s to:
|
||||
Renommer %s en :
|
||||
Renommer %s en :
|
||||
Learn more...
|
||||
En savoir plus...
|
||||
Complete Content
|
||||
@@ -539,17 +543,17 @@ Contenu Complet
|
||||
The main page is %s.
|
||||
La page principale est %s.
|
||||
Archive:
|
||||
|
||||
Archive :
|
||||
Rebuild BackLink database
|
||||
|
||||
Rebâtir les liens de la base de données
|
||||
Internal Page:
|
||||
|
||||
Page Interne :
|
||||
Pages that link to this page
|
||||
|
||||
Pages liées à cette page
|
||||
The search parameter is missing.
|
||||
|
||||
Le paramètre de recherche est manquant
|
||||
Pages link to %s
|
||||
|
||||
Pages liées à %s
|
||||
Cannot highlight the language %s.
|
||||
Impossible de surligner la langue %s.
|
||||
Recent Visitors
|
||||
@@ -587,33 +591,33 @@ Ve
|
||||
Sa
|
||||
Sa
|
||||
January
|
||||
Janvier
|
||||
janvier
|
||||
February
|
||||
Février
|
||||
février
|
||||
March
|
||||
Mars
|
||||
mars
|
||||
April
|
||||
Avril
|
||||
avril
|
||||
May
|
||||
Mai
|
||||
mai
|
||||
June
|
||||
Juin
|
||||
juin
|
||||
July
|
||||
Juillet
|
||||
juillet
|
||||
August
|
||||
Août
|
||||
août
|
||||
September
|
||||
Septembre
|
||||
septembre
|
||||
October
|
||||
Octobre
|
||||
octobre
|
||||
November
|
||||
Novembre
|
||||
novembre
|
||||
December
|
||||
Décembre
|
||||
décembre
|
||||
set %s
|
||||
|
||||
paramétrer %s
|
||||
unset %s
|
||||
|
||||
dé-paramétrer %s
|
||||
Clustermap
|
||||
Carte du Faisceau
|
||||
Pages without a Cluster
|
||||
@@ -627,85 +631,85 @@ Compilation pour %s
|
||||
Compilation tag is missing a regular expression.
|
||||
Une expression régulière manque au tag de compilation.
|
||||
Extract all dates from the database
|
||||
|
||||
Extraire toutes les dates depuis la base de données
|
||||
Dates
|
||||
Dates
|
||||
|
||||
No dates found.
|
||||
|
||||
Aucune date trouvée
|
||||
Inter links:
|
||||
InterLiens :
|
||||
InterLiens :
|
||||
List spammed pages
|
||||
|
||||
Lister les pages spammées
|
||||
Despamming pages
|
||||
Suppression des textes indésirables sur les pages.
|
||||
Spammed pages
|
||||
|
||||
Pages spammées
|
||||
Cannot find revision %s.
|
||||
Impossible de trouver la version %s.
|
||||
Revert to revision %1: %2
|
||||
Retour à la version %1 : %2
|
||||
Retour à la version %1 : %2
|
||||
Marked as %s.
|
||||
Marqué comme %s.
|
||||
Marqué(e) comme %s.
|
||||
Cannot find unspammed revision.
|
||||
Impossible de trouver une version sans texte indésirable.
|
||||
Recover Draft
|
||||
|
||||
Récupérer le brouillon
|
||||
No text to save
|
||||
|
||||
Aucun texte à sauvegarder
|
||||
Draft saved
|
||||
|
||||
Brouillon sauvegardé
|
||||
Draft recovered
|
||||
|
||||
Brouillon récupéré
|
||||
No draft available to recover
|
||||
|
||||
Aucun brouillon à récupérer
|
||||
Save Draft
|
||||
|
||||
Sauvegarder le Brouillon
|
||||
Draft Cleanup
|
||||
|
||||
Nettoyer le Brouillon
|
||||
%1 was last modified %2 and was kept
|
||||
|
||||
%1 a été modifié(e) en dernier et %2 a été conservé(e)
|
||||
%1 was last modified %2 and was deleted
|
||||
|
||||
%1 a été modifié(e) en dernier et %2 a été effacé(e)
|
||||
Unable to delete draft %s
|
||||
|
||||
Impossible d'effacer le brouillon %s
|
||||
Add Comment
|
||||
Ajouter Commentaire
|
||||
Ajouter un commentaire
|
||||
ordinary changes
|
||||
modifications ordinaires
|
||||
Matching page names:
|
||||
|
||||
Pages correspondant aux noms :
|
||||
Email:
|
||||
Email :
|
||||
E-mail :
|
||||
Could not find %1.html template in %2
|
||||
Impossible de trouver le modèle %1.html dans %2
|
||||
Only Editors are allowed to see this hidden page.
|
||||
Seuls les Editeurs ont l'autorisation de voir cette page cachée.
|
||||
Seuls les Éditeurs ont l'autorisation de voir cette page cachée.
|
||||
Only Admins are allowed to see this hidden page.
|
||||
Seuls les Administrateurs ont l'autorisation de voir cette page cachée.
|
||||
Index
|
||||
Index
|
||||
Languages:
|
||||
Langues :
|
||||
Langues :
|
||||
Show!
|
||||
Voir !
|
||||
Voir !
|
||||
Define
|
||||
Définir
|
||||
Full Link List
|
||||
Liste Complète des Liens
|
||||
List of locked pages
|
||||
|
||||
Liste des pages verrouillées
|
||||
Pages tagged with %s
|
||||
|
||||
Pages taguées avec %s
|
||||
Template without parameters
|
||||
Gabarit sans paramètres
|
||||
Modèle sans paramètres
|
||||
The template %s is either empty or does not exist.
|
||||
Le gabarit %s est soit vide soit n'existe pas.
|
||||
Le modèle %s est soit vide soit n'existe pas.
|
||||
-- defined on %s
|
||||
-- défini sur %s
|
||||
-- défini(e) sur %s
|
||||
Local names defined on %1: %2
|
||||
Noms locaux définis sur %1 : %2
|
||||
Locked Pages
|
||||
|
||||
Pages Verrouillées
|
||||
Register for %s
|
||||
Enregistrer pour %s
|
||||
Please choose a username of the form "FirstLast" using your real name.
|
||||
@@ -723,7 +727,7 @@ Votre enregistrement pour %s a été soumis.
|
||||
Please allow time for the webmaster to approve your request.
|
||||
SVP accordez un peu de temps au webmestre pour valider votre demande.
|
||||
An email has been sent to "%s" with further instructions.
|
||||
Un email a été envoyé à "%s" pour de plus amples instructions.
|
||||
Un e-mail a été envoyé à "%s" pour de plus amples instructions.
|
||||
There was an error saving your registration.
|
||||
Il y a eu une erreur au moment de sauvegarder votre enregistrement.
|
||||
An account was created for %s.
|
||||
@@ -733,23 +737,23 @@ Se connecter sur %s
|
||||
Username and/or password are incorrect.
|
||||
Le nom d'utilisateur et/ou le mot de passe sont incorrects.
|
||||
Logged in as %s.
|
||||
Connecté sous %s.
|
||||
Connecté(e) sous %s.
|
||||
Logout of %s
|
||||
Déconnexion de %s
|
||||
Logout of %s?
|
||||
Déconnexion de %s ?
|
||||
Déconnexion de %s ?
|
||||
Logged out of %s
|
||||
Déconnecté de %s
|
||||
Déconnecté(e) de %s
|
||||
You are now logged out.
|
||||
Vous êtes maintenant déconnecté.
|
||||
Vous êtes maintenant déconnecté(e).
|
||||
Register a new account
|
||||
Enregistrer un nouveau compte.
|
||||
Logout
|
||||
Se déconnecter
|
||||
Who am I?
|
||||
Qui suis-je ?
|
||||
Qui suis-je ?
|
||||
Forgot your password?
|
||||
Mot de passe oublié ?
|
||||
Mot de passe oublié ?
|
||||
Change your password
|
||||
Changer votre mot de passe
|
||||
Approve pending registrations
|
||||
@@ -759,17 +763,17 @@ Confirmation d'Enregistrement pour %s
|
||||
%s, your registration has been approved. You can now use your password to login and edit this wiki.
|
||||
%s, votre enregistrement a été accepté. Vous pouvez désormais utiliser votre mot de passe pour vous connecter et éditer ce wiki.
|
||||
Confirmation failed. Please email %s for help.
|
||||
Echec sur la confirmation. SVP envoyez un email à %s pour de l'aide.
|
||||
Échec sur la confirmation. SVP envoyez un e-mail à %s pour obtenir de l'aide.
|
||||
Who Am I?
|
||||
Qui suis-je ?
|
||||
Qui suis-je ?
|
||||
You are logged in as %s.
|
||||
Vous êtes connecté en tant que %s.
|
||||
Vous êtes connecté(e) en tant que %s.
|
||||
You are not logged in.
|
||||
Vous n'êtes pas connecté.
|
||||
Vous n'êtes pas connecté(e).
|
||||
Reset Password
|
||||
Réinitialiser le mot de passe.
|
||||
The password for %s was reset. It has been emailed to the address on file.
|
||||
Le mot de passe pour %s a été réinitialisé. Il a été envoyé à l'adresse sur le fichier.
|
||||
Le mot de passe pour %s a été réinitialisé. Il a été envoyé à l'adresse spécifiée sur le fichier.
|
||||
There was an error resetting the password for %s.
|
||||
Il y a eu une erreur de réinitialisation du mot de passe pour %s.
|
||||
The username "%s" does not exist.
|
||||
@@ -777,11 +781,11 @@ Le nom d'utilisateur "%s" n'existe pas.
|
||||
Reset Password for %s
|
||||
Réinitialiser le mot de passe pour %s
|
||||
Reset Password?
|
||||
Réinitialisation Mot de Passe ?
|
||||
Réinitialisation du Mot de Passe ?
|
||||
Change Password for %s
|
||||
Modification Mot de Passe pour %s
|
||||
Modification du Mot de Passe pour %s
|
||||
Change Password?
|
||||
Modification Mot de Passe ?
|
||||
Modification du Mot de Passe ?
|
||||
Your current password is incorrect.
|
||||
Votre Mot de Passe est incorrect.
|
||||
Your password has been changed.
|
||||
@@ -789,9 +793,9 @@ Votre mot de passe a été modifié.
|
||||
Approve Pending Registrations for %s
|
||||
Accepter les Enregistrements en Attente pour %s
|
||||
%s has been approved.
|
||||
%s a été accepté.
|
||||
%s a été accepté(e).
|
||||
There was an error approving %s.
|
||||
Il y a eu une erreur à accepter %s.
|
||||
Il y a eu une erreur en acceptant %s.
|
||||
<ul>
|
||||
<ul>
|
||||
<li>%1 - %2</li>
|
||||
@@ -803,15 +807,15 @@ Il n'y a pas d'enregistrements en attente.
|
||||
Invalid Mail %s: not saved.
|
||||
L’adresse e-mail %s n’est pas valide
|
||||
unsubscribe
|
||||
désabonner
|
||||
se désabonner
|
||||
subscribe
|
||||
abonner
|
||||
s'abonner
|
||||
%s appears to be an invalid mail address
|
||||
L’adresse e-mail %s n’est pas valide
|
||||
Your mail subscriptions
|
||||
Vôtre abonnements
|
||||
Votre abonnements
|
||||
All mail subscriptions
|
||||
Tous les abonnements
|
||||
Tous les abonnements e-mail
|
||||
Subscriptions
|
||||
Abonnements
|
||||
Show
|
||||
@@ -819,7 +823,7 @@ Voir
|
||||
Subscriptions for %s:
|
||||
Abonnements pour %s :
|
||||
Unsubscribe
|
||||
Désabonner
|
||||
Se désabonner
|
||||
There are no subscriptions for %s.
|
||||
Il n’y a pas d’abonnements pour %s.
|
||||
Change email address
|
||||
@@ -827,45 +831,45 @@ Changer l’adresse e-mail
|
||||
Mail addresses are linked to unsubscription links.
|
||||
Les adresses e-mail sont liées au désabonnement.
|
||||
Subscribe to %s.
|
||||
Abonner %s.
|
||||
S'abonner %s.
|
||||
Subscribe
|
||||
Abonner
|
||||
S'abonner
|
||||
Subscribed %s to the following pages:
|
||||
%s est abonné aux pages suivantes :
|
||||
The remaining pages do not exist.
|
||||
Les pages restantes n’existent pas (ou plus).
|
||||
Unsubscribed %s from the following pages:
|
||||
%s a désabonné les pages suivantes :
|
||||
%s est désabonné aux pages suivantes :
|
||||
You linked more than %s times to the same domain. It would seem that only a spammer would do this. Your edit is refused.
|
||||
|
||||
Vous avez créé plus de %s liens vers le même domaine. Il semble que seuls les spammeurs font cela. Votre édition est donc refusée.
|
||||
%s is not a legal name for a namespace
|
||||
%s n’est pas un nom valide pour un espace de noms
|
||||
Namespaces
|
||||
Espace de noms
|
||||
Espaces de noms
|
||||
Getting page index file for %s.
|
||||
Récupération du fichier d'index de %s.
|
||||
Near links:
|
||||
Liens de proximité :
|
||||
Liens de proximité :
|
||||
Search sites on the %s as well
|
||||
Rechercher aussi les sites présents sur %s
|
||||
Fetching results from %s:
|
||||
Récupération des résultats à partir de %s :
|
||||
Récupération des résultats à partir de %s :
|
||||
Near pages:
|
||||
Pages à proximité :
|
||||
Pages à proximité :
|
||||
Include near pages
|
||||
Inclure les pages de proximité
|
||||
EditNearLinks
|
||||
EditerLiensDeProximité
|
||||
ÉditerLiensDeProximité
|
||||
The same page on other sites:
|
||||
La même page sur d'autres sites :
|
||||
La même page sur d'autres sites :
|
||||
(create locally)
|
||||
|
||||
(créer localement)
|
||||
image
|
||||
image
|
||||
download
|
||||
télécharger
|
||||
Backlinks
|
||||
|
||||
Liens en retour
|
||||
Clearing Cache
|
||||
Nettoyage du cache.
|
||||
Done.
|
||||
@@ -881,7 +885,7 @@ Aucune page id pour actionner la carte locale
|
||||
Requested page %s does not exist
|
||||
La page demandée %s n'existe pas
|
||||
Local Map for %s
|
||||
CarteLocale pour %s
|
||||
Carte Locale pour %s
|
||||
view
|
||||
voir
|
||||
Self-ban by %s
|
||||
@@ -889,23 +893,23 @@ Auto-bannissement par %s
|
||||
You have banned your own IP.
|
||||
Vous avez banni votre propre IP.
|
||||
OpenID Login
|
||||
|
||||
Identification OpenID
|
||||
Your identity is saved in a cookie, if you have cookies enabled. Cookies may get lost if you connect from another machine, from another account, or using another software.
|
||||
|
||||
Votre identité est sauvegardée dans un cookie, si vous avez activé les cookies. Vos cookies seront perdus si vous vous connectez depuis une autre machine, sur un autre compte ou si vous utilisez un autre navigateur.
|
||||
Your homepage is set to %s.
|
||||
|
||||
Votre page d'accueil est établie sur %s.
|
||||
You have no homepage set.
|
||||
|
||||
Votre page d'acceuil n'est pas établie.
|
||||
Homepage:
|
||||
|
||||
Page d'accueil :
|
||||
Homepage is missing
|
||||
|
||||
La page d'accueil est manquante
|
||||
OpenID error %s
|
||||
|
||||
Erreur OpenID %s
|
||||
Orphan List
|
||||
Liste Orpheline
|
||||
Trail:
|
||||
Trace :
|
||||
Trace :
|
||||
None
|
||||
Aucune
|
||||
Type
|
||||
@@ -915,9 +919,9 @@ Lien permanent vers "%s"
|
||||
anchor first defined here: %s
|
||||
première ancre définie ici : %s
|
||||
the page %s also exists
|
||||
la page %s existe aussi
|
||||
la page %s existe également
|
||||
There was an error generating the pdf for %s. Please report this to webmaster, but do not try to download again as it will not work.
|
||||
Il y a eu une erreur en générant le pdf pour %s. SVP, rendez-compte de cela au webmestre, mais n'essayez pas de télécharger à nouveau, car cela ne fonctionnera pas.
|
||||
Il y a eu une erreur en générant le pdf pour %s. SVP, rendez compte de cela au webmestre, mais n'essayez pas de télécharger à nouveau, car cela ne fonctionnera pas.
|
||||
Someone else is generating a pdf for %s. Please wait a minute and then try again.
|
||||
Quelqu'un d'autre est en train de générer un pdf pour %S. SVP, attendez une minute puis essayez de nouveau.
|
||||
Download this page as PDF
|
||||
@@ -931,23 +935,23 @@ Portrait
|
||||
Publish %s
|
||||
Publier %s
|
||||
No target wiki was specified in the config file.
|
||||
|
||||
La cible du wiki n'est pas spécifiée dans le fichier de configuration.
|
||||
The target wiki was misconfigured.
|
||||
|
||||
La cible du wiki a été mal configurée.
|
||||
Upload is limited to %s bytes
|
||||
|
||||
Le téléversement est limité à %s bytes
|
||||
You did not answer correctly.
|
||||
Vous n’avez pas répondu correctement.
|
||||
To save this page you must answer this question:
|
||||
Il faut réponder a cette question pour sauvegarder la page :
|
||||
Vous devez répondre à cette question pour sauvegarder la page :
|
||||
Please type the following two words:
|
||||
|
||||
Tapez s'il vous plaît les deux mots suivants :
|
||||
Please answer this captcha:
|
||||
|
||||
Répondez à ce captcha s'il vous plaît :
|
||||
Referrers
|
||||
Introducteurs
|
||||
Référants
|
||||
All Referrers
|
||||
Tous les Introducteurs
|
||||
Tous les Référants
|
||||
Tag
|
||||
Tag
|
||||
Rebuild index for searching
|
||||
@@ -957,55 +961,55 @@ Nuage de Tags
|
||||
Search::FreeText is not available on this system.
|
||||
Search::FreeText n'est pas disponible sur ce système.
|
||||
Rebuilding index not done.
|
||||
Reconstruction index non effectuée.
|
||||
Reconstruction de l'index non effectuée.
|
||||
(Rebuilding the index can only be done once every 12 hours.)
|
||||
(La reconstruction de l'index ne peut être faite qu'une fois toutes les 12 heures.)
|
||||
(La reconstruction de l'index ne peut être effectuée qu'une fois toutes les 12 heures.)
|
||||
New Pages for Indexed Search
|
||||
|
||||
Nouvelle pages pour indexer la recherche
|
||||
List changes since %s
|
||||
Changement depuis %s
|
||||
Changements dans la liste depuis %s
|
||||
...
|
||||
...
|
||||
Search term missing.
|
||||
Terme de la recherche manquant.
|
||||
Result pages:
|
||||
Pages de résultats :
|
||||
Pages de résultats :
|
||||
(%s results)
|
||||
(%s résultats)
|
||||
Tags:
|
||||
|
||||
Tags :
|
||||
Tags: %s.
|
||||
|
||||
Tags : %s
|
||||
No tags
|
||||
|
||||
Pas de tags
|
||||
Page list for %s
|
||||
|
||||
Liste des pages pour %s
|
||||
Slideshow:%s
|
||||
Diaporama : %s
|
||||
Diaporama : %s
|
||||
Index of all small pages
|
||||
|
||||
Index de toutes les pages de petite taille
|
||||
Static Copy
|
||||
Copie Statique
|
||||
Back to %s
|
||||
Retour à %s
|
||||
Edit image in the browser
|
||||
|
||||
Éditer l'image dans le navigateur
|
||||
Summary of your changes:
|
||||
|
||||
Résumé de tous vos changements :
|
||||
Copy to %1 succeeded: %2.
|
||||
Copie vers %1 réussie : %2.
|
||||
Copie vers %1 réussie : %2.
|
||||
Copy to %1 failed: %2.
|
||||
Copie vers %1 échouée : %2.
|
||||
Copie vers %1 échouée : %2.
|
||||
Feed for this tag
|
||||
|
||||
Flux pour ce tag
|
||||
Rebuild tag index
|
||||
|
||||
Rebâtir votre index de tags
|
||||
list tags
|
||||
|
||||
liste de tags
|
||||
tag cloud
|
||||
|
||||
nuage de tags
|
||||
Alternatively, use one of the following templates:
|
||||
Alternativement, utilisez un des modèles suivants :
|
||||
Alternativement, utilisez un des modèles suivants :
|
||||
Thread: %s
|
||||
Fil: %s
|
||||
ID parameter is missing.
|
||||
@@ -1013,7 +1017,7 @@ Le paramètre ID est manquant.
|
||||
Thread %s does not exist.
|
||||
Le fil %s n'existe pas.
|
||||
Page %s does not contain a thread.
|
||||
La page %s ne contient pas de fil.
|
||||
La page %s ne contient aucun fil.
|
||||
Add
|
||||
Ajouter
|
||||
URL parameter is missing.
|
||||
@@ -1021,53 +1025,53 @@ Le paramètre URL est manquant.
|
||||
Add to %s thread
|
||||
Ajouter %s au fil
|
||||
Below:
|
||||
En-dessous :
|
||||
En-dessous :
|
||||
URL:
|
||||
URL :
|
||||
URL :
|
||||
Name:
|
||||
Nom :
|
||||
Nom :
|
||||
Too many instances. Only %s allowed.
|
||||
|
||||
Trop d'instances. %s seulement est autorisée
|
||||
Please try again later. Perhaps somebody is running maintenance or doing a long search. Unfortunately the site has limited resources, and so we must ask you for a bit of patience.
|
||||
|
||||
Essayez plus tard s'il vous plaît. Peut-être que quelqu'un effectue une maintenance ou une recherche volumineuse. Malheureusement le site a des ressources limitées, nous vous demandons de faire preuve d'un peu de patience.
|
||||
Timezone
|
||||
|
||||
Fuseau horaire
|
||||
Pick your timezone:
|
||||
|
||||
Sélectionnez votre fuseau horaire
|
||||
Set
|
||||
|
||||
Ajusté
|
||||
Contents
|
||||
Contenus
|
||||
Create a new page for today
|
||||
Ajouter une page nouvelle pour aujourd’hui
|
||||
Add Translation
|
||||
Àjouter une traduction
|
||||
Ajouter une traduction
|
||||
Please provide a different page name for the translation.
|
||||
|
||||
Donnez s'il vous plait un nom différent à votre traduction
|
||||
Added translation: %1 (%2)
|
||||
|
||||
Traduction ajoutée : %1 (%2)
|
||||
Translate %s
|
||||
Traduire %s
|
||||
Thank you for writing a translation of %s.
|
||||
Merci pour traduir %s.
|
||||
Merci pour la traduction de %s.
|
||||
Please indicate what language you will be using.
|
||||
|
||||
Merci d'indiquer quelle langue vous allez utiliser.
|
||||
Language is missing
|
||||
|
||||
La langue est manquante
|
||||
Suggested languages:
|
||||
|
||||
Langues suggérées
|
||||
Please indicate a page name for the translation of %s.
|
||||
|
||||
Indiquez s'il vous plaît un nom de page pour la traduction de %s.
|
||||
More help may be available here: %s.
|
||||
|
||||
Plus d'aide disponible ici : %s.
|
||||
Translated page:
|
||||
|
||||
Page traduite :
|
||||
This page is a translation of %s.
|
||||
Cette page est une traduction de %s.
|
||||
The translation is up to date.
|
||||
La traduction est à jour.
|
||||
The translation is outdated.
|
||||
La traduction n'est pas à jour.
|
||||
La traduction n'est plus à jour.
|
||||
The page does not exist.
|
||||
La page n'existe pas.
|
||||
http://search.barnesandnoble.com/booksearch/isbninquiry.asp?ISBN=%s
|
||||
@@ -1081,23 +1085,23 @@ http://www.pricescan.com/books/BookDetail.asp?isbn=%s
|
||||
search
|
||||
chercher
|
||||
Wanted Pages
|
||||
|
||||
Pages recherchées
|
||||
%s pages
|
||||
%s pages
|
||||
|
||||
%s, referenced from:
|
||||
|
||||
%s, référencé(e) depuis :
|
||||
Upload of %s file
|
||||
Téléversement du fichier %s
|
||||
Blog
|
||||
Blog
|
||||
Matching pages:
|
||||
Pages correspondantes :
|
||||
Pages correspondantes :
|
||||
New
|
||||
Nouveau
|
||||
Nouveau
|
||||
Edit %s.
|
||||
Editer %s.
|
||||
Éditer %s.
|
||||
Title:
|
||||
|
||||
Titre :
|
||||
Tags:
|
||||
|
||||
Tags :
|
||||
END_OF_TRANSLATION
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# UTF-8 encoded German translation file for use with Oddmuse
|
||||
#
|
||||
# Copyright (c) 2003 Karl Loncarek <karl@loncarek.de>
|
||||
# Copyright (c) 2003, 2004, 2005, 2006, 2007, 2009, 2010 Alex Schröder <alex@gnu.org>
|
||||
# Copyright (c) 2003-2012 Alex Schröder <alex@gnu.org>
|
||||
#
|
||||
# Permission is granted to copy, distribute and/or modify this document under
|
||||
# the terms of the GNU Free Documentation License, Version 1.2 or any later
|
||||
@@ -16,8 +16,9 @@
|
||||
# there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: german-utf8.pl,v 1.30 2011/02/05 12:40:38 as Exp $</p>';
|
||||
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/german-utf8.pl">german-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/German">German</a></p>';
|
||||
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Mit normalen Seiten
|
||||
@@ -29,8 +30,8 @@ Error
|
||||
Fehler
|
||||
%s calls
|
||||
%s Aufrufe
|
||||
Could not create %s
|
||||
Konnte %s nicht erzeugen
|
||||
Cannot create %s
|
||||
%s kann nicht erstellt werden
|
||||
Invalid UserName %s: not saved.
|
||||
Ungültiger Benutzername %s: nicht gespeichert.
|
||||
UserName must be 50 characters or less: not saved
|
||||
@@ -199,8 +200,6 @@ Unlock site
|
||||
Wiki entsperren
|
||||
Lock site
|
||||
Wiki sperren
|
||||
Install CSS
|
||||
CSS installieren
|
||||
Unlock %s
|
||||
%s entsperren
|
||||
Lock %s
|
||||
@@ -317,8 +316,6 @@ Cannot open %s
|
||||
%s kann nicht geöffnet werden
|
||||
Cannot write %s
|
||||
%s kann nicht geschrieben werden
|
||||
Cannot create %s
|
||||
%s kann nicht erstellt werden
|
||||
Could not get %s lock
|
||||
Die %s Sperre konnte nicht gesetzt werden
|
||||
The lock was created %s.
|
||||
@@ -505,8 +502,6 @@ Please do not fetch more than %1 pages in %2 seconds.
|
||||
Bitte rufen sie nicht mehr als %1 Seiten in %2 Sekunden auf.
|
||||
Check whether the web server can create the directory %s and whether it can create files in it.
|
||||
Vielleicht kann der Webserver das Verzeichnis %s nicht anlegen oder es wurde schon angelegt, aber der Webserver kann darin keine neuen Dateien anlegen.
|
||||
Copy one of the following stylesheets to %s:
|
||||
Eines der folgenden Style Sheets kann auf die %s Seite kopiert werden:
|
||||
Deleting %s
|
||||
%s löschen
|
||||
Deleted %s
|
||||
@@ -623,6 +618,12 @@ Compilation for %s
|
||||
Zusammenstellung für %s
|
||||
Compilation tag is missing a regular expression.
|
||||
Der tag für die Zusammenstellung benötigt noch ein Suchmuster.
|
||||
Install CSS
|
||||
CSS installieren
|
||||
Copy one of the following stylesheets to %s:
|
||||
Eines der folgenden Style Sheets kann auf die %s Seite kopiert werden:
|
||||
Reset
|
||||
Zurück setzen
|
||||
Extract all dates from the database
|
||||
Alle Daten aus der Datenbank extrahieren
|
||||
Dates
|
||||
@@ -671,6 +672,14 @@ ordinary changes
|
||||
normale Änderungen
|
||||
Matching page names:
|
||||
Übereinstimmende Seitennamen:
|
||||
Fix page encoding
|
||||
Zeichenkodierung korrigieren
|
||||
no summary available
|
||||
keine Zusammenfassug vorhanden
|
||||
page was marked for deletion
|
||||
die Seite war zum Löschen freigegeben
|
||||
Oddmuse
|
||||
Oddmuse
|
||||
Email:
|
||||
Email:
|
||||
Could not find %1.html template in %2
|
||||
@@ -685,6 +694,22 @@ Languages:
|
||||
Sprachen:
|
||||
Show!
|
||||
Zeigen!
|
||||
LaTeX export
|
||||
LaTeX Export
|
||||
An uploaded file cannot be rendered as LaTeX.
|
||||
Ein hochgeladene Datei kann nicht mit LaTeX dargestellt werden.
|
||||
Exporting of journal pages to LaTeX is not supported.
|
||||
Journalseiten können nicht für LaTeX exportiert werden.
|
||||
Exporting of RSS feeds to LaTeX is not supported.
|
||||
RSS Feeds können nicht für LaTeX exportiert werden.
|
||||
Exporting of search results to LaTeX is not supported.
|
||||
Suchresultate können nicht für LaTeX exportiert werden.
|
||||
Exporting of redirections to LaTeX is not supported.
|
||||
Umleitungen können nicht für LaTeX exportiert werden.
|
||||
Exporting of named entity reference to LaTeX is not supported.
|
||||
Benannte Zeichen können nicht für LaTeX exportiert werden.
|
||||
Exporting of images to LaTeX is not supported.
|
||||
Bilder können nicht für LaTeX exportiert werden.
|
||||
Define
|
||||
Definieren
|
||||
Full Link List
|
||||
@@ -701,6 +726,14 @@ Die %s Vorlage ist entweder leer oder existiert gar nicht.
|
||||
-- definiert auf der Seite %s
|
||||
Local names defined on %1: %2
|
||||
Der lokale Namen %2 wurde auf der Seite %1 definiert
|
||||
Name:
|
||||
Name:
|
||||
URL:
|
||||
URL:
|
||||
Define Local Names
|
||||
Lokalen Namen definieren
|
||||
Define external redirect:
|
||||
Umleitung auf eine externe Seite definieren:
|
||||
Locked Pages
|
||||
Gesperrte Seiten
|
||||
Register for %s
|
||||
@@ -871,6 +904,12 @@ Generating Link Database
|
||||
Verweis Datenbank wird angelegt
|
||||
The 404 handler extension requires the link data extension (links.pl).
|
||||
Die 404 handler Erweiterung benötigt die Link Data Erweiterung (links.pl).
|
||||
Make available offline
|
||||
Offline zur Verfügung stellen
|
||||
Offline
|
||||
Offline
|
||||
You are currently offline and what you requested is not part of the offline application. You need to be online to do this.
|
||||
Sie sind im Moment offline und was sie verlangt haben, ist nicht Teil der Offline Applikation. Hierfür müssen sie online sein.
|
||||
LocalMap
|
||||
LocalMap
|
||||
No page id for action localmap
|
||||
@@ -885,20 +924,6 @@ Self-ban by %s
|
||||
%s hat sich selber verbannt.
|
||||
You have banned your own IP.
|
||||
Sie haben ihre eigene IP Nummer verbannt.
|
||||
OpenID Login
|
||||
OpenID Login
|
||||
Your identity is saved in a cookie, if you have cookies enabled. Cookies may get lost if you connect from another machine, from another account, or using another software.
|
||||
Die Identität wird in einem Cookie gespeichert, falls diese erlaubt sind. Cookies gehen verloren, wenn ein anderer Rechner, eine anderes Konto, oder ein anderer Browser verwendet wird.
|
||||
Your homepage is set to %s.
|
||||
Homepage wurde auf %s gesetzt.
|
||||
You have no homepage set.
|
||||
Keine Homepage gesetzt.
|
||||
Homepage:
|
||||
Homepage:
|
||||
Homepage is missing
|
||||
Homepage fehlt
|
||||
OpenID error %s
|
||||
OpenID Fehler %s
|
||||
Orphan List
|
||||
Liste der Waisen
|
||||
Trail:
|
||||
@@ -1027,6 +1052,26 @@ Too many instances. Only %s allowed.
|
||||
Es laufen schon %s Wiki Prozesse gleichzeitig auf diesem Server. Mehr sind leider nicht erlaubt.
|
||||
Please try again later. Perhaps somebody is running maintenance or doing a long search. Unfortunately the site has limited resources, and so we must ask you for a bit of patience.
|
||||
Versuchen Sie es später nocheinmal. Vielleicht werden gerade Wartungsarbeiten durchgeführt, oder ein Suchbefehl nimmt gerade viel Zeit in Anspruch. Leider sind die Resourcen des Rechners limitiert; wir bitten Sie deshalb um etwas Geduld.
|
||||
thumb
|
||||
|
||||
Error creating thumbnail from non existant page %s.
|
||||
|
||||
Can not create thumbnail for file type %s.
|
||||
|
||||
Can not create thumbnail for a text document
|
||||
|
||||
Could not open %s for writing whilst trying to save image before creating thumbnail. Check write permissions.
|
||||
|
||||
Can not create path for thumbnail - %s
|
||||
|
||||
Failed to run %1 to create thumbnail: %2
|
||||
|
||||
%s ran into an error
|
||||
%s hat einen Fehler festgestellt
|
||||
%s produced no output
|
||||
%s hat nichts ausgegeben
|
||||
Failed to parse %s.
|
||||
Die Ausgabe von %s wurde nicht verstanden
|
||||
Timezone
|
||||
Zeitzone
|
||||
Pick your timezone:
|
||||
@@ -1083,6 +1128,8 @@ Gewünschte Seiten
|
||||
%s Seiten
|
||||
%s, referenced from:
|
||||
%s, referenziert von:
|
||||
Web application for offline browsing
|
||||
Offline Webapplikation
|
||||
Upload of %s file
|
||||
Hochladen der %s Datei
|
||||
Blog
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: greek-utf8.pl,v 1.2 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/greek-utf8.pl">greek-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Greek">Greek</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Με τις κανονικές σελίδες.
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
# This translation was last checked for Oddmuse version 1.195.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: hebrew-utf8.pl,v 1.11 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/hebrew-utf8.pl">hebrew-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Hebrew">Hebrew</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: italian-utf8.pl,v 1.11 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/italian-utf8.pl">italian-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Italian">Italian</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Includi le pagine normali
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
# This translation was last checked for Oddmuse version 1.215.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: japanese-utf8.pl,v 1.11 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/japanese-utf8.pl">japanese-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Japanese">Japanese</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: korean-utf8.pl,v 1.5 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/korean-utf8.pl">korean-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Korean">Korean</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
정상 페이지를 포함하여
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: new-utf8.pl,v 1.12 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/fixme-utf8.pl">fixme-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Fixme">Fixme</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: polish-utf8.pl,v 1.7 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/polish-utf8.pl">polish-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Polish">Polish</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Ze zwykłymi stronami
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
# This translation was last checked for Oddmuse version 1.195.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: portuguese-utf8.pl,v 1.15 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/portuguese-utf8.pl">portuguese-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Portuguese">Portuguese</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Incluir páginas normais
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: romanian-utf8.pl,v 1.9 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/romanian-utf8.pl">romanian-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Romanian">Romanian</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
# This script was last checked for Oddmuse version 1.658.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: russian-utf8.pl,v 1.13 2007/08/19 11:42:08 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/russian-utf8.pl">russian-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Russian">Russian</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Reading not allowed: user, ip, or network is blocked.
|
||||
Просмотр недоступен: имя пользователя, IP-адрес или сеть заблокированы.
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
# This translation was last checked for Oddmuse version 1.195.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: serbian-utf8.pl,v 1.11 2009/06/07 19:30:37 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/serbian-utf8.pl">serbian-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Serbian">Serbian</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
# This translation was last checked for Oddmuse version 1.195.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: spanish-utf8.pl,v 1.13 2011/07/05 00:30:18 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/spanish-utf8.pl">spanish-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Spanish">Spanish</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Incluir páginas normales
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: swedish-utf8.pl,v 1.18 2009/06/07 19:30:38 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/swedish-utf8.pl">swedish-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Swedish">Swedish</a></p><p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Med vanliga sidor
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# file in there. It will be loaded automatically.
|
||||
#
|
||||
use utf8;
|
||||
$ModulesDescription .= '<p>$Id: ukrainian-utf8.pl,v 1.6 2009/06/07 19:30:38 as Exp $</p>';
|
||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/translations/ukrainian-utf8.pl">ukrainian-utf8.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Ukrainian">Ukrainian</a></p>';
|
||||
%Translate = split(/\n/,<<END_OF_TRANSLATION);
|
||||
Include normal pages
|
||||
Включати звичайні сторінки
|
||||
|
||||
3
oddtrans
3
oddtrans
@@ -2,6 +2,9 @@
|
||||
# Based on umtrans.pl version 1.0 (April 8, 2001) by Clifford Adams.
|
||||
# Extracts translation strings from wiki script and extensions.
|
||||
|
||||
binmode(STDIN, ':utf8');
|
||||
binmode(STDOUT, ':utf8');
|
||||
|
||||
$help = q{
|
||||
NAME
|
||||
oddtrans - complement translation tables for Oddmuse
|
||||
|
||||
@@ -119,7 +119,6 @@ sub get_rss {
|
||||
my $rss = new XML::RSS;
|
||||
$rss->parse($response->content);
|
||||
print "Found " . @{$rss->{items}} . " items.\n" if $debug;
|
||||
update_timestamp();
|
||||
return $rss;
|
||||
}
|
||||
|
||||
@@ -145,6 +144,7 @@ sub send_file {
|
||||
my ($id, $title, $item, @subscribers) = @_;
|
||||
return unless @subscribers;
|
||||
my $fh = File::Temp->new(SUFFIX => '.html');
|
||||
binmode($fh, ":utf8");
|
||||
warn "No content for $title\n" unless $item->{description};
|
||||
my $link = $item->{link};
|
||||
my $sub = "$root?action=subscriptions";
|
||||
@@ -207,6 +207,7 @@ sub main {
|
||||
my $subscribers = get_subscribers();
|
||||
return unless %{$subscribers};
|
||||
send_files($rss, $subscribers);
|
||||
update_timestamp();
|
||||
}
|
||||
|
||||
main ();
|
||||
|
||||
18
t/conflict.t
18
t/conflict.t
@@ -18,7 +18,7 @@
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 16;
|
||||
use Test::More tests => 19;
|
||||
|
||||
clear_pages();
|
||||
|
||||
@@ -49,6 +49,7 @@ The two are the same,
|
||||
But after they are produced,
|
||||
they have different names.
|
||||
};
|
||||
|
||||
my $lao_file_2 = q{The Way that can be told of is not the eternal Way;
|
||||
The name that can be named is not the eternal name.
|
||||
The Nameless is the origin of Heaven and Earth;
|
||||
@@ -118,9 +119,8 @@ sleep(2);
|
||||
|
||||
update_page('ConflictTest', $lao_file);
|
||||
|
||||
$_ = `perl wiki.pl action=edit id=ConflictTest`;
|
||||
/name="oldtime" value="([0-9]+)"/;
|
||||
my $oldtime = $1;
|
||||
my $oldtime = xpath_test(get_page('action=edit id=ConflictTest'),
|
||||
'//input[@name="oldtime"]/attribute::value');
|
||||
|
||||
sleep(2);
|
||||
|
||||
@@ -143,9 +143,8 @@ sleep(2);
|
||||
|
||||
update_page('ConflictTest', $tzu_file);
|
||||
|
||||
$_ = `perl wiki.pl action=edit id=ConflictTest`;
|
||||
/name="oldtime" value="([0-9]+)"/;
|
||||
$oldtime = $1;
|
||||
$oldtime = xpath_test(get_page('action=edit id=ConflictTest'),
|
||||
'//input[@name="oldtime"]/attribute::value');
|
||||
|
||||
sleep(2);
|
||||
|
||||
@@ -192,9 +191,8 @@ sleep(2);
|
||||
|
||||
update_page('ConflictTest', $lao_file);
|
||||
|
||||
$_ = `perl wiki.pl action=edit id=ConflictTest`;
|
||||
/name="oldtime" value="([0-9]+)"/;
|
||||
$oldtime = $1;
|
||||
$oldtime = xpath_test(get_page('action=edit id=ConflictTest'),
|
||||
'//input[@name="oldtime"]/attribute::value');
|
||||
|
||||
sleep(2);
|
||||
|
||||
|
||||
11
t/cookie.t
11
t/cookie.t
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2009 Alex Schroeder <alex@gnu.org>
|
||||
# Copyright (C) 2009, 2012 Alex Schroeder <alex@gnu.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -15,7 +15,8 @@
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 16;
|
||||
use Test::More tests => 18;
|
||||
use utf8;
|
||||
|
||||
clear_pages();
|
||||
|
||||
@@ -78,4 +79,10 @@ SKIP: {
|
||||
$response = $ua->get("$wiki?action=debug;pwd=");
|
||||
test_page($ua->cookie_jar->as_string, 'Set-Cookie.*: Wiki=""');
|
||||
|
||||
# Encoding issues
|
||||
$response = $ua->get("$wiki?action=rc;username=Alex\%20Schr\%C3\%B6der");
|
||||
test_page($ua->cookie_jar->as_string,
|
||||
'Set-Cookie.*: Wiki=username%251eAlex%20Schr%C3%B6der');
|
||||
test_page($response->decoded_content,
|
||||
'Cookie: Wiki, username=Alex Schröder');
|
||||
};
|
||||
|
||||
@@ -29,7 +29,10 @@ test_page_negative($page, 'mu');
|
||||
AppendStringToFile($ConfigFile, "\$UploadAllowed = 1;\n");
|
||||
test_page(update_page('Alex', "#FILE image/png\niVBORw0KGgoAAAA"),
|
||||
'This page contains an uploaded file:');
|
||||
$page = get_page('action=download id=Alex');
|
||||
{
|
||||
local $raw = 1;
|
||||
$page = get_page('action=download id=Alex');
|
||||
}
|
||||
$page =~ s/^.*\r\n\r\n//s; # strip headers
|
||||
require MIME::Base64;
|
||||
test_page(MIME::Base64::encode($page), '^iVBORw0KGgoAAAA');
|
||||
|
||||
24
t/dotfiles.t
Normal file
24
t/dotfiles.t
Normal file
@@ -0,0 +1,24 @@
|
||||
# Copyright (C) 2012 Alex Schroeder <alex@gnu.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation; either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 4;
|
||||
|
||||
clear_pages();
|
||||
|
||||
test_page(update_page('Test', 'some text'), 'some text');
|
||||
test_page(update_page('.emacs', 'some code'), 'some code');
|
||||
unlink $IndexFile;
|
||||
test_page(get_page('action=index raw=1'), 'Test', '\.emacs');
|
||||
15
t/download.t
15
t/download.t
@@ -14,7 +14,7 @@
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 12;
|
||||
use Test::More tests => 13;
|
||||
|
||||
clear_pages();
|
||||
|
||||
@@ -25,7 +25,15 @@ AppendStringToFile($ConfigFile, "\$LogoUrl = '/pic/logo.png';\n");
|
||||
xpath_test(get_page('HomePage'), '//a[@class="logo"]/img[@class="logo"][@src="/pic/logo.png"][@alt="[Home]"]');
|
||||
AppendStringToFile($ConfigFile, "\$LogoUrl = 'Logo';\n");
|
||||
xpath_test(get_page('HomePage'), '//a[@class="logo"]/img[@class="logo"][@src="Logo"][@alt="[Home]"]');
|
||||
|
||||
update_page('Logo', "#FILE image/png\niVBORw0KGgoAAAA");
|
||||
|
||||
# make sure we don't supply "content-type: image/png; charset=utf-8"
|
||||
{
|
||||
local $raw = 1;
|
||||
test_page_negative(get_page('action=download id=Logo'), 'charset');
|
||||
}
|
||||
|
||||
xpath_test(get_page('HomePage'), '//a[@class="logo"]/img[@class="logo"][@src="http://localhost/wiki.pl/download/Logo"][@alt="[Home]"]');
|
||||
AppendStringToFile($ConfigFile, "\$UsePathInfo = 0;\n");
|
||||
xpath_test(get_page('HomePage'), '//a[@class="logo"]/img[@class="logo"][@src="http://localhost/wiki.pl?action=download;id=Logo"][@alt="[Home]"]');
|
||||
@@ -46,7 +54,10 @@ test_page(update_page('Trogs', $page), 'contains an uploaded file');
|
||||
|
||||
xpath_test(get_page('Trogs'),
|
||||
'//p/img[@class="upload"][@src="http://localhost/wiki.pl?action=download;id=Trogs"][@alt="Trogs"]');
|
||||
$page = get_page('action=download id=Trogs');
|
||||
{
|
||||
local $raw = 1;
|
||||
$page = get_page('action=download id=Trogs');
|
||||
}
|
||||
test_page($page,
|
||||
'Content-Type: image/svg\+xml',
|
||||
'Content-encoding: gzip');
|
||||
|
||||
24
t/encoding.t
24
t/encoding.t
@@ -14,7 +14,7 @@
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 35;
|
||||
use Test::More tests => 41;
|
||||
use utf8; # tests contain UTF-8 characters and it matters
|
||||
|
||||
clear_pages();
|
||||
@@ -88,7 +88,29 @@ test_page(get_page('action=browse id=Test %C3%A4rger=hallo'),
|
||||
test_page(update_page("Russian", "Русский Hello"),
|
||||
"Русский");
|
||||
|
||||
# checking for errors in the rss feed
|
||||
test_page(get_page("action=rss match=Russian full=1"),
|
||||
"Русский");
|
||||
|
||||
# with toc.pl, however, a problem: Русский is corrupted
|
||||
add_module('toc.pl');
|
||||
test_page(update_page("Russian", "Русский Hello again"),
|
||||
"Русский");
|
||||
|
||||
# and with inclusion, too:
|
||||
test_page(update_page("All", qq{<include "Russian">}),
|
||||
"Русский");
|
||||
|
||||
# and checking the cache
|
||||
test_page(get_page("All"), "Русский");
|
||||
|
||||
# and checking without the cache
|
||||
test_page(get_page("action=browse id=All cache=0"), "Русский");
|
||||
|
||||
# testing search
|
||||
test_page(get_page('search=Русский raw=1'),
|
||||
qw(Russian));
|
||||
|
||||
# testing page editing
|
||||
test_page(update_page("Русский", "друзья"),
|
||||
"друзья");
|
||||
|
||||
47
t/fix-encoding.t
Normal file
47
t/fix-encoding.t
Normal file
@@ -0,0 +1,47 @@
|
||||
# Copyright (C) 2012 Alex Schroeder <alex@gnu.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation; either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 8;
|
||||
use utf8; # tests contain UTF-8 characters and it matters
|
||||
|
||||
clear_pages();
|
||||
add_module('fix-encoding.pl');
|
||||
|
||||
# make sure the menu only shows up if it applies to a page
|
||||
|
||||
test_page_negative(get_page('action=admin'), 'action=fix-encoding');
|
||||
test_page(get_page('action=admin id=foo'), 'action=fix-encoding;id=foo');
|
||||
|
||||
# make sure nothing is saved if there is no change
|
||||
|
||||
test_page(update_page('Example', 'Pilgerstätte für die Göttin'),
|
||||
'Pilgerstätte für die Göttin');
|
||||
|
||||
test_page(get_page('action=fix-encoding id=Example'),
|
||||
'Location: http://localhost/wiki.pl/Example');
|
||||
|
||||
test_page_negative(get_page('action=rc showedit=1'), 'fix encoding');
|
||||
|
||||
# here is an actual page you need to fix
|
||||
|
||||
test_page(update_page('Example', 'Pilgerstätte für die Göttin', 'borked encoding'),
|
||||
'Pilgerstätte für die Göttin');
|
||||
|
||||
test_page(get_page('action=fix-encoding id=Example'),
|
||||
'Location: http://localhost/wiki.pl/Example');
|
||||
|
||||
test_page(get_page('Example'),
|
||||
'Pilgerstätte für die Göttin');
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 71;
|
||||
use Test::More tests => 73;
|
||||
use utf8; # tests contain UTF-8 characters and it matters
|
||||
|
||||
clear_pages();
|
||||
@@ -113,13 +113,21 @@ test_page(get_page('action=rss'),
|
||||
'<link>http://localhost/wiki.pl/Muu/Mu</link>',
|
||||
'<wiki:history>http://localhost/wiki.pl/Muu\?action=history;id=Mu</wiki:history>',
|
||||
'<wiki:diff>http://localhost/wiki.pl/Muu\?action=browse;diff=1;id=Mu</wiki:diff>');
|
||||
# Test non-ASCII characters in namespaces
|
||||
# Test Unicode characters in namespaces (BLACK HEART SUIT)
|
||||
test_page(update_page('Umlaute', 'namespace mit herz',
|
||||
'wo steckt das ü', undef, undef,
|
||||
'ns=Zürich♥'), 'namespace mit herz');
|
||||
xpath_test(get_page('action=rc'),
|
||||
# the exact result depends on filesystem encoding!
|
||||
'//a[@class="local"][@href="http://localhost/wiki.pl/Z%c3%bcrich%e2%99%a5/Umlaute"]');
|
||||
# Test potential Latin-1 characters in namespaces (LATIN SMALL LETTER U DIAERESIS)
|
||||
test_page(update_page('Umlaute', 'namespace mit umlaut',
|
||||
'wo steckt das ü', undef, undef,
|
||||
'ns=Zürich'), 'namespace mit umlaut');
|
||||
xpath_test(get_page('action=rc'),
|
||||
# the exact result depends on filesystem encoding!
|
||||
'//a[@class="local"][@href="http://localhost/wiki.pl/Z%c3%bcrich/Umlaute"]');
|
||||
|
||||
# Test rollbacks
|
||||
test_page(get_page('action=browse ns=Muu id=Test'),
|
||||
'Another Mooo!');
|
||||
|
||||
97
t/private-pages.t
Normal file
97
t/private-pages.t
Normal file
@@ -0,0 +1,97 @@
|
||||
# Copyright (C) 2012 Alex Schroeder <alex@gnu.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation; either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 28;
|
||||
|
||||
clear_pages();
|
||||
add_module('private-pages.pl');
|
||||
|
||||
# create password protected page: can't read it without password!
|
||||
test_page(update_page('Privat', "#PASSWORD foo\nSo many secrets remain untold.\n"),
|
||||
'This page is password protected');
|
||||
|
||||
# can't update password protected page
|
||||
update_page('Privat', "#PASSWORD foo\nCats have secrets.\n");
|
||||
test_page($redirect, 'Status: 403');
|
||||
|
||||
# use password foo to update protected page: can't read it without password!
|
||||
test_page_negative(update_page('Privat', "#PASSWORD foo\nCats have secrets.\n", undef, undef, 1),
|
||||
'Cats have secrets');
|
||||
test_page($redirect, 'Status: 302');
|
||||
|
||||
# read it with password
|
||||
my $page = get_page('action=browse id=Privat pwd=foo');
|
||||
test_page_negative($page, 'This page is password protected');
|
||||
test_page($page, 'Cats have secrets');
|
||||
|
||||
# a keep file was created as well
|
||||
ok(-f GetKeepFile('Privat', 1), 'Keep file exists');
|
||||
|
||||
# can't read old revisions without a password
|
||||
test_page_negative(get_page('action=browse id=Privat revision=1'),
|
||||
'Cats have secrets');
|
||||
|
||||
# read old revisions with password
|
||||
test_page(get_page('action=browse id=Privat revision=1 pwd=foo'),
|
||||
'So many secrets remain untold');
|
||||
|
||||
# can't read old revisions without password
|
||||
test_page(get_page('action=browse id=Privat revision=1'),
|
||||
'This page is password protected');
|
||||
|
||||
# can't see secrets when printing raw pages
|
||||
my $page = get_page('action=browse raw=1 id=Privat pwd=foo');
|
||||
test_page_negative($page, 'This page is password protected');
|
||||
test_page($page, 'Cats have secrets');
|
||||
|
||||
# can't see summaries with secrets
|
||||
my $page = get_page('action=rc raw=1 all=1');
|
||||
test_page($page, 'Privat');
|
||||
test_page_negative($page, 'secret');
|
||||
|
||||
# can't search for secrets without a password
|
||||
my $page = get_page('search=cats');
|
||||
test_page($page, '0 pages found');
|
||||
test_page_negative($page, "Privat");
|
||||
|
||||
# search finds secrets with password
|
||||
my $page = get_page('search=cats pwd=foo');
|
||||
test_page($page, '1 pages? found',
|
||||
'Privat', '<strong>Cats</strong> have secrets');
|
||||
|
||||
# can't edit a private page without a password
|
||||
my $page = get_page('action=edit id=Privat');
|
||||
test_page($page, 'Editing not allowed');
|
||||
test_page_negative($page, 'Cats have secrets');
|
||||
|
||||
# can edit a private page with a password
|
||||
my $page = get_page('action=edit id=Privat pwd=foo');
|
||||
test_page_negative($page, 'This page is password protected');
|
||||
test_page($page, 'Cats have secrets');
|
||||
|
||||
# can't edit an old revision of a private page without a password
|
||||
my $page = get_page('action=edit id=Privat revision=1');
|
||||
test_page($page, 'Editing not allowed');
|
||||
test_page_negative($page, 'secret');
|
||||
|
||||
# can't just post changes to a private page without a password
|
||||
my $page = get_page('title=Privat text=YaddaYadda revision=1');
|
||||
test_page($page, 'Editing not allowed');
|
||||
test_page_negative($page, 'secret');
|
||||
|
||||
# can't include them
|
||||
test_page_negative(update_page('Publik', '<include "Privat">'),
|
||||
'Cats have secrets');
|
||||
34
t/tags.t
34
t/tags.t
@@ -16,6 +16,8 @@
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 70;
|
||||
use utf8;
|
||||
|
||||
clear_pages();
|
||||
|
||||
add_module('tags.pl');
|
||||
@@ -43,7 +45,7 @@ xpath_run_tests(split('\n',<<'EOT'));
|
||||
EOT
|
||||
|
||||
update_page('Brilliant', 'Gameologists [[tag:podcast]] [[tag:mag]]');
|
||||
update_page('Podgecast', 'Another [[tag:podcast]]');
|
||||
update_page('Pödgecäst', 'Another [[tag:podcast]]');
|
||||
update_page('Alex', 'Me! [[tag:Old School]]');
|
||||
|
||||
# open the DB file
|
||||
@@ -53,11 +55,11 @@ tie %h, "DB_File", $TagFile;
|
||||
%tag = map {$_=>1} split($FS, $h{"_Brilliant"});
|
||||
ok($tag{podcast}, 'Brilliant page tagged podcast');
|
||||
ok($tag{mag}, 'Brilliant page tagged mag');
|
||||
%tag = map {$_=>1} split($FS, $h{"_Podgecast"});
|
||||
ok($tag{podcast}, 'Podgecast page tagged podcast');
|
||||
%tag = map {$_=>1} split($FS, $h{"_Pödgecäst"});
|
||||
ok($tag{podcast}, 'Pödgecäst page tagged podcast');
|
||||
%file = map {$_=>1} split($FS, $h{"podcast"});
|
||||
ok($file{Brilliant}, 'Tag podcast applies to page Brilliant');
|
||||
ok($file{Podgecast}, 'Tag podcast applies to page Podgecast');
|
||||
ok($file{Pödgecäst}, 'Tag podcast applies to page Pödgecäst');
|
||||
%file = map {$_=>1} split($FS, $h{"mag"});
|
||||
ok($file{Brilliant}, 'Tag mag applies to page Brilliant');
|
||||
%file = map {$_=>1} split($FS, $h{"old_school"});
|
||||
@@ -76,7 +78,7 @@ ok(!$tag{podcast}, 'Brilliant page no longer tagged podcast');
|
||||
ok($tag{mag}, 'Brilliant page still tagged mag');
|
||||
%file = map {$_=>1} split($FS, $h{"podcast"});
|
||||
ok(!$file{Brilliant}, 'Tag podcast no longer applies to page Brilliant');
|
||||
ok($file{Podgecast}, 'Tag podcast still applies to page Podgecast');
|
||||
ok($file{Pödgecäst}, 'Tag podcast still applies to page Pödgecäst');
|
||||
|
||||
# close the DB file before making changes via the wiki!
|
||||
untie %h;
|
||||
@@ -99,46 +101,46 @@ update_page('Jeff', 'a blog [[tag:Old School]]');
|
||||
|
||||
# ordinary search finds Alex
|
||||
$page = get_page('search=podcast raw=1');
|
||||
test_page($page, qw(Podgecast Brilliant Sons Alex));
|
||||
test_page($page, qw(Pödgecäst Brilliant Sons Alex));
|
||||
|
||||
# tag search skips Alex
|
||||
$page = get_page('search=tag:podcast raw=1');
|
||||
test_page($page, qw(Podgecast Brilliant Sons));
|
||||
test_page($page, qw(Pödgecäst Brilliant Sons));
|
||||
test_page_negative($page, qw(Alex));
|
||||
|
||||
# tag search is case insensitive
|
||||
$page = get_page('search=tag:PODCAST raw=1');
|
||||
test_page($page, qw(Podgecast Brilliant Sons));
|
||||
test_page($page, qw(Pödgecäst Brilliant Sons));
|
||||
test_page_negative($page, qw(Alex));
|
||||
|
||||
# exclude tag search skips Brilliant
|
||||
$page = get_page('search=-tag:mag raw=1');
|
||||
test_page($page, qw(Podgecast Sons Alex));
|
||||
test_page($page, qw(Pödgecäst Sons Alex));
|
||||
test_page_negative($page, qw(Brilliant));
|
||||
|
||||
# combine include and exclude tag search to exclude both Alex and
|
||||
# Brilliant
|
||||
$page = get_page('search=tag:podcast%20-tag:mag raw=1');
|
||||
test_page($page, qw(Podgecast Sons));
|
||||
test_page($page, qw(Pödgecäst Sons));
|
||||
test_page_negative($page, qw(Brilliant Alex));
|
||||
|
||||
# combine ordinary search with include and exclude tag search to
|
||||
# exclude both Alex and Brilliant
|
||||
$page = get_page('search=kryos%20tag:podcast%20-tag:mag raw=1');
|
||||
test_page($page, qw(Sons));
|
||||
test_page_negative($page, qw(Podgecast Brilliant Alex));
|
||||
test_page_negative($page, qw(Pödgecäst Brilliant Alex));
|
||||
|
||||
# search for a tag containing spaces
|
||||
$page = get_page('search=tag:old_school raw=1');
|
||||
test_page($page, qw(Jeff));
|
||||
test_page_negative($page, qw(Sons Podgecast Brilliant Alex));
|
||||
test_page_negative($page, qw(Sons Pödgecäst Brilliant Alex));
|
||||
|
||||
test_page(get_page('action=reindex pwd=foo'),
|
||||
qw(Podgecast Brilliant Sons Alex));
|
||||
qw(Pödgecäst Brilliant Sons Alex));
|
||||
|
||||
# tag search skips Alex -- repeat test after reindexing
|
||||
$page = get_page('search=tag:podcast raw=1');
|
||||
test_page($page, qw(Podgecast Brilliant Sons));
|
||||
test_page($page, qw(Pödgecäst Brilliant Sons));
|
||||
test_page_negative($page, qw(Alex));
|
||||
|
||||
add_module('near-links.pl');
|
||||
@@ -158,7 +160,7 @@ test_page_negative($page, qw(AlexSchroeder Foo));
|
||||
|
||||
# check journal pages
|
||||
$page = update_page('Podcasts', '<journal "." search tag:podcast>');
|
||||
test_page($page, qw(Podgecast Brilliant Sons));
|
||||
test_page($page, qw(Pödgecäst Brilliant Sons));
|
||||
test_page_negative($page, qw(Alex Foo));
|
||||
|
||||
# check the tag cloud
|
||||
@@ -175,4 +177,4 @@ AppendStringToFile($ConfigFile, "\$LocalNamesCollect = 1;\n");
|
||||
update_page('LocalNames', 'test');
|
||||
update_page('Alex', 'is a [[tag:podcast]] after all');
|
||||
$page = get_page('search=tag:podcast raw=1');
|
||||
test_page($page, qw(Podgecast Brilliant Sons Alex));
|
||||
test_page($page, qw(Pödgecäst Brilliant Sons Alex));
|
||||
|
||||
18
t/test.pl
18
t/test.pl
@@ -16,9 +16,11 @@ package OddMuse;
|
||||
use lib '.';
|
||||
use XML::LibXML;
|
||||
use utf8;
|
||||
use vars qw($raw);
|
||||
|
||||
# Import the functions
|
||||
|
||||
$raw = 0; # capture utf8 is the default
|
||||
$RunCGI = 0; # don't print HTML on stdout
|
||||
$UseConfig = 0; # don't read module files
|
||||
$DataDir = 'test-data';
|
||||
@@ -46,10 +48,20 @@ sub url_encode {
|
||||
return join('', @letters);
|
||||
}
|
||||
|
||||
# run perl in a subprocess and make sure it prints UTF-8 and not Latin-1
|
||||
# Run perl in a subprocess and make sure it prints UTF-8 and not Latin-1
|
||||
# If you use the download action, the output will be raw bytes. Use
|
||||
# something like the following:
|
||||
# {
|
||||
# local $raw = 1;
|
||||
# $page = get_page('action=download id=Trogs');
|
||||
# }
|
||||
sub capture {
|
||||
my $command = shift;
|
||||
open (CL, '-|:encoding(utf-8)', $command) or die "Can't run $command: $!";
|
||||
if ($raw) {
|
||||
open (CL, '-|', $command) or die "Can't run $command: $!";
|
||||
} else {
|
||||
open (CL, '-|:encoding(utf-8)', $command) or die "Can't run $command: $!";
|
||||
}
|
||||
my $result = <CL>;
|
||||
close CL;
|
||||
return $result;
|
||||
@@ -82,6 +94,7 @@ sub name {
|
||||
$_ = shift;
|
||||
s/\n/\\n/g;
|
||||
$_ = '...' . substr($_, -60) if length > 63;
|
||||
utf8::encode($_);
|
||||
return $_;
|
||||
}
|
||||
|
||||
@@ -258,6 +271,7 @@ sub clear_pages {
|
||||
$ScriptName = 'http://localhost/test.pl'; # different!
|
||||
$IndexInit = 0;
|
||||
%IndexHash = ();
|
||||
@IndexList = ();
|
||||
$InterSiteInit = 0;
|
||||
%InterSite = ();
|
||||
$NearSiteInit = 0;
|
||||
|
||||
34
t/tex.t
34
t/tex.t
@@ -1,8 +1,8 @@
|
||||
# Copyright (C) 2006 Alex Schroeder <alex@emacswiki.org>
|
||||
# Copyright (C) 2012 Alex Schroeder <alex@gnu.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
@@ -11,24 +11,28 @@
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the
|
||||
# Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330
|
||||
# Boston, MA 02111-1307 USA
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 3;
|
||||
use Test::More tests => 4;
|
||||
use utf8; # tests contain UTF-8 characters and it matters
|
||||
|
||||
clear_pages();
|
||||
add_module('tex.pl');
|
||||
|
||||
run_macro_tests(split('\n',<<'EOT'));
|
||||
4\times 7
|
||||
4×7
|
||||
right\copyright
|
||||
right©
|
||||
a\infty b
|
||||
a∞b
|
||||
EOT
|
||||
test_page(update_page('Example', '4\times7 right\copyright a\inftyb'),
|
||||
qw(4×7 right© a∞b));
|
||||
|
||||
ok($Tex{'\textreferencemark'}, "TeX patterns ok");
|
||||
|
||||
# Create the table of documentation:
|
||||
# binmode(STDOUT, ':utf8');
|
||||
# my $i = 1;
|
||||
# foreach (sort keys %Tex) {
|
||||
# printf "||%s || %s ", $_, $Tex{$_};
|
||||
# if ($i % 5 == 0) {
|
||||
# print "||\n";
|
||||
# }
|
||||
# $i++;
|
||||
# }
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
require 't/test.pl';
|
||||
package OddMuse;
|
||||
use Test::More tests => 20;
|
||||
use Test::More tests => 33;
|
||||
use utf8; # tests contain UTF-8 characters and it matters
|
||||
|
||||
clear_pages();
|
||||
@@ -76,3 +76,43 @@ test_page(get_page('action=translate id=HomePage target=abc'),
|
||||
|
||||
test_page(get_page('action=translate id=HomePage target=abc translation=fr'),
|
||||
'Editing abc');
|
||||
|
||||
# encoding issues
|
||||
|
||||
# first check the from ASCII to something that can be encoded in Latin-1
|
||||
test_page(update_page('SiteMap', 'Hello'), 'Hello');
|
||||
test_page(get_page('action=translate id=SiteMap target=Übersicht translation=de'),
|
||||
'Editing Übersicht');
|
||||
xpath_test(get_page('SiteMap'),
|
||||
'//a[@class="translation de"][text()="Deutsch"]');
|
||||
xpath_test(get_page('action=rc showedit=1'),
|
||||
'//li/a[@class="local"][text()="SiteMap"]/following-sibling::strong[text()="Added translation: Übersicht (Deutsch)"]');
|
||||
|
||||
# now check the other way around
|
||||
test_page(get_page('action=translate id=Übersicht target=SiteMap translation=en'),
|
||||
'Editing SiteMap');
|
||||
xpath_test(get_page('Übersicht'),
|
||||
'//a[@class="translation en"][text()="English"]');
|
||||
xpath_test(get_page('action=rc showedit=1'),
|
||||
'//li/a[@class="local"][text()="Übersicht"]/following-sibling::strong[text()="Added translation: SiteMap (English)"]');
|
||||
|
||||
AppendStringToFile($ConfigFile, q{
|
||||
$Languages{ja} = '(ま|す|ん|し|ょ|う|の|は)';
|
||||
$Translate{ja} = '日本語';
|
||||
});
|
||||
|
||||
# Repeat it with Unicode!
|
||||
test_page(get_page('action=translate id=SiteMap target=サイトマップ translation=ja'),
|
||||
'Editing サイトマップ');
|
||||
xpath_test(get_page('SiteMap'),
|
||||
'//a[@class="translation ja"][text()="日本語"]');
|
||||
xpath_test(get_page('action=rc showedit=1'),
|
||||
'//li/a[@class="local"][text()="SiteMap"]/following-sibling::strong[text()="Added translation: サイトマップ (日本語)"]');
|
||||
|
||||
# and again, check the other way around
|
||||
test_page(get_page('action=translate id=サイトマップ target=SiteMap translation=en'),
|
||||
'Editing SiteMap');
|
||||
xpath_test(get_page('サイトマップ'),
|
||||
'//a[@class="translation en"][text()="English"]');
|
||||
xpath_test(get_page('action=rc showedit=1'),
|
||||
'//li/a[@class="local"][text()="サイトマップ"]/following-sibling::strong[text()="Added translation: SiteMap (English)"]');
|
||||
|
||||
81
wiki.pl
81
wiki.pl
@@ -1,8 +1,7 @@
|
||||
#! /usr/bin/perl
|
||||
# Version $Id: wiki.pl,v 1.960 2012/03/08 15:28:18 as Exp $
|
||||
# Copyleft 2008 Brian Curry <http://www.raiazome.com>
|
||||
# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
||||
# Copyright (C) 2001-2012
|
||||
# Alex Schroeder <alex@gnu.org>
|
||||
# Copyleft 2008 Brian Curry <http://www.raiazome.com>
|
||||
# ... including lots of patches from the UseModWiki site
|
||||
# Copyright (C) 2001, 2002 various authors
|
||||
# ... which was based on UseModWiki version 0.92 (April 21, 2001)
|
||||
@@ -29,15 +28,12 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package OddMuse;
|
||||
|
||||
use strict;
|
||||
use CGI;
|
||||
use CGI::Carp qw(fatalsToBrowser);
|
||||
use vars qw($VERSION);
|
||||
use File::Glob ':glob';
|
||||
local $| = 1; # Do not buffer output (localized for mod_perl)
|
||||
|
||||
$VERSION=(split(/ +/, q{$Revision: 1.960 $}))[1]; # for MakeMaker
|
||||
|
||||
# Options:
|
||||
use vars qw($RssLicense $RssCacheHours @RcDays $TempDir $LockDir $DataDir
|
||||
$KeepDir $PageDir $RcOldFile $IndexFile $BannedContent $NoEditFile $BannedHosts
|
||||
@@ -229,7 +225,7 @@ sub Init {
|
||||
|
||||
sub InitModules {
|
||||
if ($UseConfig and $ModuleDir and -d $ModuleDir) {
|
||||
foreach my $lib (glob("$ModuleDir/*.pm $ModuleDir/*.pl")) {
|
||||
foreach my $lib (bsd_glob("$ModuleDir/*.p[ml]")) {
|
||||
do $lib unless $MyInc{$lib};
|
||||
$MyInc{$lib} = 1; # Cannot use %INC in mod_perl settings
|
||||
$Message .= CGI::p("$lib: $@") if $@; # no $q exists, yet
|
||||
@@ -251,6 +247,7 @@ sub InitConfig {
|
||||
}
|
||||
|
||||
sub InitDirConfig {
|
||||
utf8::decode($DataDir); # just in case, eg. "WikiDataDir=/tmp/Zürich♥ perl wiki.pl"
|
||||
$PageDir = "$DataDir/page"; # Stores page data
|
||||
$KeepDir = "$DataDir/keep"; # Stores kept (old) page data
|
||||
$TempDir = "$DataDir/temp"; # Temporary files and locks
|
||||
@@ -271,7 +268,6 @@ sub InitDirConfig {
|
||||
sub InitRequest { # set up $q
|
||||
$CGI::POST_MAX = $MaxPost;
|
||||
$q = new CGI unless $q;
|
||||
$q->charset('UTF-8');
|
||||
}
|
||||
|
||||
sub InitVariables { # Init global session variables for mod_perl!
|
||||
@@ -308,7 +304,7 @@ sub InitVariables { # Init global session variables for mod_perl!
|
||||
$LastUpdate = $ts;
|
||||
unshift(@MyRules, \&MyRules) if defined(&MyRules) && (not @MyRules or $MyRules[0] != \&MyRules);
|
||||
@MyRules = sort {$RuleOrder{$a} <=> $RuleOrder{$b}} @MyRules; # default is 0
|
||||
ReportError(Ts('Could not create %s', $DataDir) . ": $!", '500 INTERNAL SERVER ERROR')
|
||||
ReportError(Ts('Cannot create %s', $DataDir) . ": $!", '500 INTERNAL SERVER ERROR')
|
||||
unless -d $DataDir;
|
||||
foreach my $sub (@MyInitVariables) {
|
||||
my $result = &$sub;
|
||||
@@ -379,20 +375,20 @@ sub SetParam {
|
||||
sub InitLinkPatterns {
|
||||
my ($WikiWord, $QDelim);
|
||||
$QDelim = '(?:"")?'; # Optional quote delimiter (removed from the output)
|
||||
$WikiWord = '[A-Z]+[a-z\x{0080}-\x{ffff}]+[A-Z][A-Za-z\x{0080}-\x{ffff}]*';
|
||||
$WikiWord = '[A-Z]+[a-z\x{0080}-\x{fffd}]+[A-Z][A-Za-z\x{0080}-\x{fffd}]*'; # exclude noncharacters FFFE and FFFF
|
||||
$LinkPattern = "($WikiWord)$QDelim";
|
||||
$FreeLinkPattern = "([-,.()'%&?;<> _1-9A-Za-z\x{0080}-\x{ffff}]|[-,.()'%&?;<> _0-9A-Za-z\x{0080}-\x{ffff}][-,.()'%&?;<> _0-9A-Za-z\x{0080}-\x{ffff}]+)"; # disallow "0" and must match HTML and plain text (ie. > and >)
|
||||
$FreeLinkPattern = "([-,.()'%&?;<> _1-9A-Za-z\x{0080}-\x{fffd}]|[-,.()'%&?;<> _0-9A-Za-z\x{0080}-\x{fffd}][-,.()'%&?;<> _0-9A-Za-z\x{0080}-\x{fffd}]+)"; # disallow "0" and must match HTML and plain text (ie. > and >)
|
||||
# Intersites must start with uppercase letter to avoid confusion with URLs.
|
||||
$InterSitePattern = '[A-Z\x{0080}-\x{ffff}]+[A-Za-z\x{0080}-\x{ffff}]+';
|
||||
$InterLinkPattern = "($InterSitePattern:[-a-zA-Z0-9\x{0080}-\x{ffff}_=!?#\$\@~`\%&*+\\/:;.,]*[-a-zA-Z0-9\x{0080}-\x{ffff}_=#\$\@~`\%&*+\\/])$QDelim";
|
||||
$FreeInterLinkPattern = "($InterSitePattern:[-a-zA-Z0-9\x{0080}-\x{ffff}_=!?#\$\@~`\%&*+\\/:;.,()' ]+)"; # plus space and other characters, and no restrictions on the end of the pattern
|
||||
$InterSitePattern = '[A-Z\x{0080}-\x{fffd}]+[A-Za-z\x{0080}-\x{fffd}]+';
|
||||
$InterLinkPattern = "($InterSitePattern:[-a-zA-Z0-9\x{0080}-\x{fffd}_=!?#\$\@~`\%&*+\\/:;.,]*[-a-zA-Z0-9\x{0080}-\x{fffd}_=#\$\@~`\%&*+\\/])$QDelim";
|
||||
$FreeInterLinkPattern = "($InterSitePattern:[-a-zA-Z0-9\x{0080}-\x{fffd}_=!?#\$\@~`\%&*+\\/:;.,()' ]+)"; # plus space and other characters, and no restrictions on the end of the pattern
|
||||
$UrlProtocols = 'http|https|ftp|afs|news|nntp|mid|cid|mailto|wais|prospero|telnet|gopher|irc|feed';
|
||||
$UrlProtocols .= '|file' if $NetworkFile;
|
||||
my $UrlChars = '[-a-zA-Z0-9/@=+$_~*.,;:?!\'"()&#%]'; # see RFC 2396
|
||||
my $EndChars = '[-a-zA-Z0-9/@=+$_~*]'; # no punctuation at the end of the url.
|
||||
$UrlPattern = "((?:$UrlProtocols):$UrlChars+$EndChars)";
|
||||
$FullUrlPattern="((?:$UrlProtocols):$UrlChars+)"; # when used in square brackets
|
||||
$ImageExtensions = '(gif|jpg|png|bmp|jpeg)';
|
||||
$ImageExtensions = '(gif|jpg|png|bmp|jpeg|svg)';
|
||||
}
|
||||
|
||||
sub Clean {
|
||||
@@ -516,8 +512,8 @@ sub ApplyRules {
|
||||
Clean("&$1;");
|
||||
} elsif (m/\G\s+/cg) {
|
||||
Clean(' ');
|
||||
} elsif (m/\G([A-Za-z\x{0080}-\x{ffff}]+([ \t]+[a-z\x{0080}-\x{ffff}]+)*[ \t]+)/cg
|
||||
or m/\G([A-Za-z\x{0080}-\x{ffff}]+)/cg or m/\G(\S)/cg) {
|
||||
} elsif (m/\G([A-Za-z\x{0080}-\x{fffd}]+([ \t]+[a-z\x{0080}-\x{fffd}]+)*[ \t]+)/cg
|
||||
or m/\G([A-Za-z\x{0080}-\x{fffd}]+)/cg or m/\G(\S)/cg) {
|
||||
Clean($1); # multiple words but do not match http://foo
|
||||
} else {
|
||||
last;
|
||||
@@ -664,13 +660,14 @@ sub OpenHtmlEnvironment { # close the previous $html_tag and open a new one
|
||||
@HtmlStack = @stack if $found; # if not starting a new list
|
||||
$depth = $IndentLimit if $depth > $IndentLimit; # requested depth 0 makes no sense
|
||||
$html_tag_attr = qq/class="$html_tag_attr"/ # backwards-compatibility hack: classically, the third argument to this function was a single CSS class, rather than string of HTML tag attributes as in the second argument to the "AddHtmlEnvironment" function. To allow both sorts, we conditionally change this string to 'class="$html_tag_attr"' when this string is a single CSS class.
|
||||
if $html_tag_attr && $html_tag_attr !~ m/^\s*[:alpha:]+\s*=\s*('|").+\1/;
|
||||
if $html_tag_attr && $html_tag_attr !~ m/^\s*[[:alpha:]]@@+\s*=\s*('|").+\1/;
|
||||
splice(@HtmlAttrStack, 0, @HtmlAttrStack - @HtmlStack); # truncate to size of @HtmlStack
|
||||
foreach ($found..$depth-1) {
|
||||
unshift(@HtmlStack, $html_tag);
|
||||
unshift(@HtmlAttrStack, $html_tag_attr);
|
||||
$html .= $html_tag_attr ? "<$html_tag $html_tag_attr>" : "<$html_tag>";
|
||||
} return $html;
|
||||
}
|
||||
return $html;
|
||||
}
|
||||
|
||||
sub CloseHtmlEnvironments { # close all -- remember to use AddHtmlEnvironment('p') if required!
|
||||
@@ -1268,18 +1265,22 @@ sub PrintPageDiff { # print diff for open page
|
||||
}
|
||||
}
|
||||
|
||||
sub PageHtml { #FIXME: A bit buggy, this. STDOUT should be explicitly closed before returning.
|
||||
sub PageHtml {
|
||||
my ($id, $limit, $error) = @_;
|
||||
my $result = '';
|
||||
my ($diff, $page);
|
||||
local *STDOUT;
|
||||
OpenPage($id);
|
||||
open(STDOUT, '>', \$result) or die "Can't open memory file: $!";
|
||||
open(STDOUT, '>', \$diff) or die "Can't open memory file: $!";
|
||||
binmode(STDOUT, ":utf8");
|
||||
PrintPageDiff();
|
||||
return $error if $limit and length($result) > $limit;
|
||||
my $diff = $result;
|
||||
utf8::decode($diff);
|
||||
return $error if $limit and length($diff) > $limit;
|
||||
open(STDOUT, '>', \$page) or die "Can't open memory file: $!";
|
||||
binmode(STDOUT, ":utf8");
|
||||
PrintPageHtml();
|
||||
return $diff . $q->p($error) if $limit and length($result) > $limit;
|
||||
return $result;
|
||||
utf8::decode($page);
|
||||
return $diff . $q->p($error) if $limit and length($diff . $page) > $limit;
|
||||
return $diff . $page;
|
||||
}
|
||||
|
||||
sub T {
|
||||
@@ -2243,10 +2244,10 @@ sub GetHttpHeader {
|
||||
return if $PrintedHeader;
|
||||
$PrintedHeader = 1;
|
||||
my ($type, $ts, $status, $encoding) = @_; # $ts is undef, a ts, or 'nocache'
|
||||
$q->charset($type =~ m!^(text/|application/xml)! ? 'utf-8' : ''); # text/plain, text/html, application/xml: UTF-8
|
||||
my %headers = (-cache_control=>($UseCache < 0 ? 'no-cache' : 'max-age=10'));
|
||||
$headers{-etag} = $ts || PageEtag() if GetParam('cache', $UseCache) >= 2;
|
||||
$headers{'-last-modified'} = TimeToRFC822($ts) if $ts and $ts ne 'nocache'; # RFC 2616 section 13.3.4
|
||||
$headers{-charset} = 'UTF-8';
|
||||
$headers{-type} = GetParam('mime-type', $type);
|
||||
$headers{-status} = $status if $status;
|
||||
$headers{-Content_Encoding} = $encoding if $encoding;
|
||||
@@ -2300,7 +2301,7 @@ sub GetHtmlHeader { # always HTML!
|
||||
return $DocumentHeader
|
||||
. $q->head($q->title($title) . $base
|
||||
. GetCss() . GetRobots() . GetFeeds() . $HtmlHeaders
|
||||
. '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>')
|
||||
. '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />')
|
||||
. '<body class="' . GetParam('theme', $ScriptName) . '">';
|
||||
}
|
||||
|
||||
@@ -2454,7 +2455,7 @@ sub GetFormStart {
|
||||
$method ||= 'post';
|
||||
$class ||= 'form';
|
||||
return $q->start_multipart_form(-method=>$method, -action=>$FullUrl,
|
||||
-accept_charset=>'UTF-8', -class=>$class);
|
||||
-accept_charset=>'utf-8', -class=>$class);
|
||||
}
|
||||
|
||||
sub GetSearchForm {
|
||||
@@ -2494,7 +2495,7 @@ sub PrintHtmlDiff {
|
||||
if ($type == 1) {
|
||||
$old = $Page{lastmajor} - 1;
|
||||
($text, $new) = GetTextRevision($Page{lastmajor}, 1)
|
||||
unless $new or $Page{lastmajor} == $Page{revision};
|
||||
unless $new or $Page{lastmajor} == $Page{revision};
|
||||
} elsif ($new) {
|
||||
$old = $new - 1;
|
||||
} else {
|
||||
@@ -2727,7 +2728,7 @@ sub GetPageFile {
|
||||
}
|
||||
|
||||
sub GetKeepFile {
|
||||
my ($id, $revision) = @_; die 'No revision' unless $revision; #FIXME
|
||||
my ($id, $revision) = @_; die "No revision for $id" unless $revision; #FIXME
|
||||
return $KeepDir . '/' . GetPageDirectory($id) . "/$id/$revision.kp";
|
||||
}
|
||||
|
||||
@@ -2737,7 +2738,7 @@ sub GetKeepDir {
|
||||
}
|
||||
|
||||
sub GetKeepFiles {
|
||||
return glob(GetKeepDir(shift) . '/*.kp'); # files such as 1.kp, 2.kp, etc.
|
||||
return bsd_glob(GetKeepDir(shift) . '/*.kp'); # files such as 1.kp, 2.kp, etc.
|
||||
}
|
||||
|
||||
sub GetKeepRevisions {
|
||||
@@ -2796,6 +2797,7 @@ sub ExpireKeepFiles { # call with opened page
|
||||
|
||||
sub ReadFile {
|
||||
my $file = shift;
|
||||
utf8::encode($file); # filenames are bytes!
|
||||
if (open(IN, '<:encoding(UTF-8)', $file)) {
|
||||
local $/ = undef; # Read complete files
|
||||
my $data=<IN>;
|
||||
@@ -2817,6 +2819,7 @@ sub ReadFileOrDie {
|
||||
|
||||
sub WriteStringToFile {
|
||||
my ($file, $string) = @_;
|
||||
utf8::encode($file);
|
||||
open(OUT, '>:encoding(UTF-8)', $file)
|
||||
or ReportError(Ts('Cannot write %s', $file) . ": $!", '500 INTERNAL SERVER ERROR');
|
||||
print OUT $string;
|
||||
@@ -2825,6 +2828,7 @@ sub WriteStringToFile {
|
||||
|
||||
sub AppendStringToFile {
|
||||
my ($file, $string) = @_;
|
||||
utf8::encode($file);
|
||||
open(OUT, '>>:encoding(UTF-8)', $file)
|
||||
or ReportError(Ts('Cannot write %s', $file) . ": $!", '500 INTERNAL SERVER ERROR');
|
||||
print OUT $string;
|
||||
@@ -2833,6 +2837,7 @@ sub AppendStringToFile {
|
||||
|
||||
sub CreateDir {
|
||||
my ($newdir) = @_;
|
||||
utf8::encode($newdir);
|
||||
return if -d $newdir;
|
||||
mkdir($newdir, 0775)
|
||||
or ReportError(Ts('Cannot create %s', $newdir) . ": $!", '500 INTERNAL SERVER ERROR');
|
||||
@@ -2900,7 +2905,7 @@ sub ReleaseLock {
|
||||
sub ForceReleaseLock {
|
||||
my $pattern = shift;
|
||||
my $forced;
|
||||
foreach my $name (glob $pattern) {
|
||||
foreach my $name (bsd_glob $pattern) {
|
||||
# First try to obtain lock (in case of normal edit lock)
|
||||
$forced = 1 if !RequestLockDir($name, 5, 3, 0);
|
||||
ReleaseLockDir($name); # Release the lock, even if we didn't get it.
|
||||
@@ -2973,7 +2978,7 @@ sub TimeToRFC822 {
|
||||
sub GetHiddenValue {
|
||||
my ($name, $value) = @_;
|
||||
$q->param($name, $value);
|
||||
return $q->hidden($name);
|
||||
return $q->input({-type=>"hidden", -name=>$name, -value=>$value});
|
||||
}
|
||||
|
||||
sub GetRemoteHost { # when testing, these variables are undefined.
|
||||
@@ -3127,6 +3132,7 @@ sub DoDownload {
|
||||
if @UploadTypes and not $allowed{$type};
|
||||
print GetHttpHeader($type, $ts, undef, $encoding);
|
||||
require MIME::Base64;
|
||||
binmode(STDOUT, ":pop:raw"); # need to pop utf8 for Windows users!?
|
||||
print MIME::Base64::decode($data);
|
||||
} else {
|
||||
print GetHttpHeader('text/plain', $ts);
|
||||
@@ -3306,9 +3312,9 @@ sub AllPagesList {
|
||||
}
|
||||
@IndexList = ();
|
||||
%IndexHash = ();
|
||||
# Try to write out the list for future runs. If file exists and cannot be changed, error!
|
||||
# If file exists and cannot be changed, error!
|
||||
my $locked = RequestLockDir('index', undef, undef, -f $IndexFile);
|
||||
foreach (glob("$PageDir/*/*.pg $PageDir/*/.*.pg")) { # find .dotfiles, too
|
||||
foreach (bsd_glob("$PageDir/*/*.pg"), bsd_glob("$PageDir/*/.*.pg")) {
|
||||
next unless m|/.*/(.+)\.pg$|;
|
||||
my $id = $1;
|
||||
utf8::decode($id);
|
||||
@@ -3365,6 +3371,7 @@ sub PageIsUploadedFile {
|
||||
return undef if $OpenPageName eq $id;
|
||||
if ($IndexHash{$id}) {
|
||||
my $file = GetPageFile($id);
|
||||
utf8::encode($file); # filenames are bytes!
|
||||
open(FILE, '<:encoding(UTF-8)', $file)
|
||||
or ReportError(Ts('Cannot open %s', $file) . ": $!", '500 INTERNAL SERVER ERROR');
|
||||
while (defined($_ = <FILE>) and $_ !~ /^text: /) {
|
||||
|
||||
Reference in New Issue
Block a user