Compare commits
1 Commits
namespaces
...
unicodeico
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac69cc6612 |
1
.gitattributes
vendored
@@ -1 +0,0 @@
|
|||||||
*.pl linguist-language=Perl
|
|
||||||
1
.gitignore
vendored
@@ -8,4 +8,3 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
wiki.log
|
wiki.log
|
||||||
.prove
|
.prove
|
||||||
TAGS
|
|
||||||
|
|||||||
32
Makefile
@@ -3,8 +3,8 @@
|
|||||||
# subdirectory.
|
# subdirectory.
|
||||||
|
|
||||||
VERSION_NO=$(shell git describe --tags)
|
VERSION_NO=$(shell git describe --tags)
|
||||||
TRANSLATIONS=$(wildcard modules/translations/*-utf8.pl)
|
TRANSLATIONS=$(wildcard modules/translations/[a-z]*-utf8.pl$)
|
||||||
MODULES=$(sort $(wildcard modules/*.pl))
|
MODULES=$(wildcard modules/*.pl)
|
||||||
BUILD=build/wiki.pl $(foreach file, $(notdir $(MODULES)) $(notdir $(TRANSLATIONS)), build/$(file))
|
BUILD=build/wiki.pl $(foreach file, $(notdir $(MODULES)) $(notdir $(TRANSLATIONS)), build/$(file))
|
||||||
|
|
||||||
# PREPARE/BUILD: this creates copies of wiki.pl and all the modules
|
# PREPARE/BUILD: this creates copies of wiki.pl and all the modules
|
||||||
@@ -19,13 +19,9 @@ build:
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf build
|
rm -rf build
|
||||||
prove t/setup.pl
|
|
||||||
|
|
||||||
release:
|
|
||||||
perl stuff/release ~/oddmuse.org/releases 2.3.3
|
|
||||||
|
|
||||||
build/wiki.pl: wiki.pl
|
build/wiki.pl: wiki.pl
|
||||||
perl -lne "s/(\\\$$q->a\(\{-href=>'https:\/\/www.oddmuse.org\/'\}, 'Oddmuse'\))/\\\$$q->a({-href=>'https:\/\/alexschroeder.ch\/cgit\/oddmuse\/tag\/?id=$(VERSION_NO)'}, 'wiki.pl') . ' ($(VERSION_NO)), see ' . \$$1/; print" < $< > $@
|
perl -lne "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 ' . \$$1/; print" < $< > $@
|
||||||
|
|
||||||
build/%-utf8.pl: modules/translations/%-utf8.pl
|
build/%-utf8.pl: modules/translations/%-utf8.pl
|
||||||
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, 'translations\/', '$(VERSION_NO)')/; print" < $< > $@
|
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, 'translations\/', '$(VERSION_NO)')/; print" < $< > $@
|
||||||
@@ -36,8 +32,8 @@ build/national-%.pl: modules/translations/national-%.pl
|
|||||||
build/month-names-%.pl: modules/translations/month-names-%.pl
|
build/month-names-%.pl: modules/translations/month-names-%.pl
|
||||||
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, 'translations\/', '$(VERSION_NO)')/; print" < $< > $@
|
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, 'translations\/', '$(VERSION_NO)')/; print" < $< > $@
|
||||||
|
|
||||||
# from: https://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl
|
# from: http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl
|
||||||
# to: https://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl?id=2.1-11-gd4f1e27
|
# to: http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl?id=2.1-11-gd4f1e27
|
||||||
|
|
||||||
build/%.pl: modules/%.pl
|
build/%.pl: modules/%.pl
|
||||||
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, undef, '$(VERSION_NO)')/; print" < $< > $@
|
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, undef, '$(VERSION_NO)')/; print" < $< > $@
|
||||||
@@ -60,21 +56,3 @@ jobs ?= 4
|
|||||||
test:
|
test:
|
||||||
prove t/setup.pl
|
prove t/setup.pl
|
||||||
prove --jobs=$(jobs) --state=slow,save t
|
prove --jobs=$(jobs) --state=slow,save t
|
||||||
|
|
||||||
# Spin up a quick test
|
|
||||||
|
|
||||||
development:
|
|
||||||
@if grep --quiet 'ScriptName = "http://127.0.0.1:8080";' test-data/config; then \
|
|
||||||
echo Not overwriting \$$ScriptName in test-data/config; \
|
|
||||||
else \
|
|
||||||
echo '$ScriptName = "http://127.0.0.1:8080";' >> test-data/config; \
|
|
||||||
fi
|
|
||||||
morbo --listen http://*:8080 \
|
|
||||||
--watch wiki.pl --watch test-data/config --watch test-data/modules/ \
|
|
||||||
stuff/mojolicious-app.pl
|
|
||||||
|
|
||||||
%.pem:
|
|
||||||
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem
|
|
||||||
|
|
||||||
gemini: cert.pem key.pem
|
|
||||||
perl stuff/gemini-server.pl --wiki_cert_file=cert.pem --wiki_key_file=key.pem
|
|
||||||
|
|||||||
@@ -23,21 +23,12 @@ usermod -a -G sudo alex
|
|||||||
Now you can login as {{{alex}}} and do everything else using {{{sudo}}}.
|
Now you can login as {{{alex}}} and do everything else using {{{sudo}}}.
|
||||||
|
|
||||||
You need to copy wiki.pl into your cgi-bin directory, and you need to
|
You need to copy wiki.pl into your cgi-bin directory, and you need to
|
||||||
make the script executable. You might also have to change its owner to
|
make the script executable.
|
||||||
an appropriate user on your system.
|
|
||||||
|
|
||||||
{{{
|
{{{
|
||||||
sudo wget -O /usr/lib/cgi-bin/wiki.pl \
|
sudo wget -O /usr/lib/cgi-bin/wiki.pl \
|
||||||
http://git.savannah.gnu.org/cgit/oddmuse.git/plain/wiki.pl
|
http://git.savannah.gnu.org/cgit/oddmuse.git/plain/wiki.pl
|
||||||
sudo chmod +x /usr/lib/cgi-bin/wiki.pl
|
sudo chmod +x /usr/lib/cgi-bin/wiki.pl
|
||||||
sudo chown www-data.www-data /usr/lib/cgi-bin/wiki.pl
|
|
||||||
}}}
|
|
||||||
|
|
||||||
If you're on SUSE, the user might not be {{{www-data}}} but
|
|
||||||
{{{wwwrun}}} without appropriate group:
|
|
||||||
|
|
||||||
{{{
|
|
||||||
sudo chown wwwrun.root /usr/lib/cgi-bin/wiki.pl
|
|
||||||
}}}
|
}}}
|
||||||
|
|
||||||
You should be able to test it right now! Visit
|
You should be able to test it right now! Visit
|
||||||
@@ -94,7 +85,7 @@ Enjoy your wiki experience.
|
|||||||
Visit https://www.oddmuse.org/ to learn more about the translation
|
Visit https://www.oddmuse.org/ to learn more about the translation
|
||||||
files and modules that are part of this package.
|
files and modules that are part of this package.
|
||||||
|
|
||||||
== Checking the Apache Setup
|
== Apache
|
||||||
|
|
||||||
If you think this information doesn't work for you, here are some things
|
If you think this information doesn't work for you, here are some things
|
||||||
to check.
|
to check.
|
||||||
@@ -128,7 +119,7 @@ The default site is configured in
|
|||||||
sudo a2ensite default
|
sudo a2ensite default
|
||||||
}}}
|
}}}
|
||||||
|
|
||||||
This file also lists the directories we've used in our instructions
|
This file also lists the directories we've used in out instructions
|
||||||
above.
|
above.
|
||||||
|
|
||||||
{{{
|
{{{
|
||||||
@@ -145,35 +136,6 @@ simply restart it all:
|
|||||||
sudo service apache2 graceful
|
sudo service apache2 graceful
|
||||||
}}}
|
}}}
|
||||||
|
|
||||||
== Using just Perl
|
|
||||||
|
|
||||||
You can use Mojolicious as your web server. There is a simple
|
|
||||||
##server.pl## which you can use. Here's how you might start it:
|
|
||||||
|
|
||||||
{{{
|
|
||||||
mkdir ~/oddmuse
|
|
||||||
WikiDataDir=$HOME/oddmuse perl server.pl daemon
|
|
||||||
}}}
|
|
||||||
|
|
||||||
This makes the server available on {{{http://localhost:3000/wiki}}}.
|
|
||||||
Make sure you create the directory before starting the server!
|
|
||||||
If you don't, you'll get a strange error:
|
|
||||||
`STDERR: : No such file or directory at ... perl5/Mojolicious/Plugin/CGI.pm`.
|
|
||||||
|
|
||||||
If it works, feel free to upgrade to Hypnotoad.
|
|
||||||
|
|
||||||
{{{
|
|
||||||
WikiDataDir=$HOME/oddmuse hypnotoad server.pl
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Note: Hypnotoad uses a different default port. The above makes the
|
|
||||||
server available on {{{http://localhost:8080/wiki}}}. Hypnotoad will
|
|
||||||
keep forking new processes. To stop it, use the {{{-s}}} flag.
|
|
||||||
|
|
||||||
{{{
|
|
||||||
hypnotoad -s server.pl
|
|
||||||
}}}
|
|
||||||
|
|
||||||
== License
|
== License
|
||||||
|
|
||||||
Permission is granted to copy, distribute and/or modify this document
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#! /usr/bin/perl
|
#! /usr/bin/perl
|
||||||
|
|
||||||
# Copyright (C) 2011–2018 Alex Schroeder <alex@gnu.org>
|
# Copyright (C) 2011–2015 Alex Schroeder <alex@gnu.org>
|
||||||
|
|
||||||
# This program is free software: you can redistribute it and/or modify it under
|
# 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
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
@@ -23,8 +23,7 @@ use utf8;
|
|||||||
|
|
||||||
# load Oddmuse core
|
# load Oddmuse core
|
||||||
$RunCGI = 0;
|
$RunCGI = 0;
|
||||||
$DataDir = '/home/alex/campaignwiki';
|
do "wiki.pl";
|
||||||
do "/home/alex/farm/wiki.pl";
|
|
||||||
|
|
||||||
# globals depending on the name of the script
|
# globals depending on the name of the script
|
||||||
my ($self, $name, $wiki);
|
my ($self, $name, $wiki);
|
||||||
@@ -36,9 +35,6 @@ if ($0 eq '/home/alex/campaignwiki.org/add-link.pl') {
|
|||||||
$self = "https://campaignwiki.org/add-adventure";
|
$self = "https://campaignwiki.org/add-adventure";
|
||||||
$name = "OSR Links to Adventures";
|
$name = "OSR Links to Adventures";
|
||||||
$wiki = 'Adventures';
|
$wiki = 'Adventures';
|
||||||
} elsif ($0 eq '/home/alex/campaignwiki.org/add-sf-link.pl') {
|
|
||||||
$name = "OSRSF House Rules Wiki: Uplinked Intelligence";
|
|
||||||
$wiki = 'UplinkedIntelligence';
|
|
||||||
} else {
|
} else {
|
||||||
ReportError('Cannot determine wiki!', '500 INTERNAL SERVER ERROR');
|
ReportError('Cannot determine wiki!', '500 INTERNAL SERVER ERROR');
|
||||||
}
|
}
|
||||||
@@ -168,7 +164,7 @@ sub is_duplicate {
|
|||||||
" already links to the URL you submitted:",
|
" already links to the URL you submitted:",
|
||||||
GetUrl($link->[0], $link->[1]));
|
GetUrl($link->[0], $link->[1]));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -292,13 +288,11 @@ sub print_end_of_page {
|
|||||||
|
|
||||||
sub main {
|
sub main {
|
||||||
$ConfigFile = "$DataDir/config"; # read the global config file
|
$ConfigFile = "$DataDir/config"; # read the global config file
|
||||||
$ModuleDir = "$DataDir/modules"; # global modules
|
|
||||||
$DataDir = "$DataDir/$wiki"; # but link to the local pages
|
$DataDir = "$DataDir/$wiki"; # but link to the local pages
|
||||||
Init(); # read config file
|
Init(); # read config file (no modules!)
|
||||||
$ScriptName = $site; # undo setting in the config file
|
$ScriptName = $site; # undo setting in the config file
|
||||||
$FullUrl = $site; #
|
$FullUrl = $site; #
|
||||||
InitPageVariables(); # call again: $ScriptName was wrong
|
InitPageVariables(); # call again: $ScriptName was wrong
|
||||||
$HomePage = 'HomePage'; # $HomePage must not be translated
|
|
||||||
binmode(STDOUT,':utf8');
|
binmode(STDOUT,':utf8');
|
||||||
$q->charset('utf8');
|
$q->charset('utf8');
|
||||||
if ($q->path_info eq '/source') {
|
if ($q->path_info eq '/source') {
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
if test -z "$2" -o ! -z "$3"; then
|
|
||||||
echo "Usage: delete.sh USERNAME WIKI"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
username=$1
|
|
||||||
wiki=$2
|
|
||||||
|
|
||||||
for p in $(curl --silent "https://campaignwiki.org/wiki/$wiki?action=index;raw=1"); do
|
|
||||||
echo "Deleting: $p"
|
|
||||||
curl -F frodo=1 -F "title=$p" -F text=DeletedPage -F summary=Deleted -F username="$username" "https://campaignwiki.org/wiki/$wiki"
|
|
||||||
sleep 5
|
|
||||||
done
|
|
||||||
93
contrib/emacswiki/bootstrap.js
vendored
@@ -1,93 +0,0 @@
|
|||||||
// Public Domain
|
|
||||||
// initial version by Alex Schroeder <alex@gnu.org>
|
|
||||||
// with many improvements by Evgkeni Sampelnikof
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
|
|
||||||
// add fancy classes
|
|
||||||
$('div.header' ).addClass('container');
|
|
||||||
$('div.wrapper').addClass('container');
|
|
||||||
$('div.footer' ).addClass('container');
|
|
||||||
$('div.footer > .navbar' ).remove();
|
|
||||||
$('.message > p' ).addClass('alert');
|
|
||||||
$('img.portrait').addClass('img-polaroid');
|
|
||||||
|
|
||||||
$('input:text').addClass('input-medium search-query');
|
|
||||||
$('textarea').addClass('span12');
|
|
||||||
$('input:submit').addClass('btn');
|
|
||||||
$('.download a').addClass('btn btn-success');
|
|
||||||
|
|
||||||
$('.footer .gotobar').remove();
|
|
||||||
$('.footer br').first().remove();
|
|
||||||
var $gotobar = $('.gotobar')
|
|
||||||
.after($('<div>').attr('class','navbar')
|
|
||||||
.append($('<div>').attr('class','navbar-inner')
|
|
||||||
.append($('<ul>').attr('class', 'nav'))));
|
|
||||||
var $id = $('h1 a').first().text();
|
|
||||||
var $list = $('.nav')
|
|
||||||
.append($('<li>')
|
|
||||||
.append($('<a>').attr('class', 'brand').attr('href', 'http://www.emacswiki.org/')
|
|
||||||
.append('Emacs Wiki')));
|
|
||||||
$('.gotobar a').each(function() {
|
|
||||||
var $item = $('<li>');
|
|
||||||
$(this).appendTo($item);
|
|
||||||
$item.appendTo($list);
|
|
||||||
if ($(this).text() == $id) {
|
|
||||||
$item.addClass('active');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$gotobar.remove();
|
|
||||||
|
|
||||||
// search without labels, without button, without language field
|
|
||||||
$('form.search input[type=submit]').remove();
|
|
||||||
$('form.search label').remove();
|
|
||||||
$('form.search input#searchlang').remove();
|
|
||||||
$('form.search')
|
|
||||||
.css({'float': 'right',
|
|
||||||
'margin-top': '10px'});
|
|
||||||
$('.navbar').append($('form.search'));
|
|
||||||
|
|
||||||
// add button style to some links
|
|
||||||
$('.edit.bar a').addClass('btn');
|
|
||||||
|
|
||||||
// add color to Talk button for a non-existing page
|
|
||||||
$('a.btn.comment.edit').addClass('btn-warning');
|
|
||||||
|
|
||||||
// move article link and talk link below title
|
|
||||||
var $link = $('a.original').add('a.comment');
|
|
||||||
if ($link) {
|
|
||||||
$('.header h1').after($('<p>').append($link));
|
|
||||||
}
|
|
||||||
|
|
||||||
// toc
|
|
||||||
if ($('title').text() == "EmacsWiki: Wikified Emacs Lisp List") {
|
|
||||||
$('.content').addClass('ell');
|
|
||||||
}
|
|
||||||
|
|
||||||
// tables
|
|
||||||
$('table').addClass('table');
|
|
||||||
|
|
||||||
// minor edit checkbox
|
|
||||||
$('input[type=checkbox]').addClass('checkbox');
|
|
||||||
$('input[type=checkbox]').parent().addClass('checkbox');
|
|
||||||
|
|
||||||
// clean up admin page
|
|
||||||
$('li a.clear').parent().remove();
|
|
||||||
$('li a.index').parent().remove();
|
|
||||||
|
|
||||||
$('a[href="http://creativecommons.org/licenses/GPL/2.0/"]')
|
|
||||||
.parent()
|
|
||||||
.css({'margin-right': '120px',
|
|
||||||
'opacity': 0.3,
|
|
||||||
'padding-top': '1em'});
|
|
||||||
$('.footer .bar')
|
|
||||||
.after('<hr />');
|
|
||||||
var footer_wrapper = $('<div/>')
|
|
||||||
.addClass('footer_wrapper');
|
|
||||||
var footer = $('.footer.container');
|
|
||||||
footer.after(footer_wrapper);
|
|
||||||
footer_wrapper.append(footer);
|
|
||||||
var logo_image = $('<img />')
|
|
||||||
.attr('src', 'http://emacswiki.org/ew_logo.png');
|
|
||||||
$('.header .navbar .brand').html(logo_image);
|
|
||||||
});
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -12,7 +12,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use CGI;
|
use CGI;
|
||||||
use CGI::Carp qw(fatalsToBrowser);
|
use CGI::Carp qw(fatalsToBrowser);
|
||||||
|
|||||||
@@ -1,131 +0,0 @@
|
|||||||
#! /usr/bin/perl -w
|
|
||||||
|
|
||||||
# Copyright (C) 2005-2016 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/>.
|
|
||||||
|
|
||||||
use Modern::Perl;
|
|
||||||
use LWP::UserAgent;
|
|
||||||
use utf8;
|
|
||||||
binmode(STDOUT, ":utf8");
|
|
||||||
|
|
||||||
my $ua = LWP::UserAgent->new;
|
|
||||||
|
|
||||||
sub url_encode {
|
|
||||||
my $str = shift;
|
|
||||||
return '' unless $str;
|
|
||||||
utf8::encode($str); # turn to byte string
|
|
||||||
my @letters = split(//, $str);
|
|
||||||
my %safe = map {$_ => 1} ('a' .. 'z', 'A' .. 'Z', '0' .. '9', '-', '_', '.', '!', '~', '*', "'", '(', ')', '#');
|
|
||||||
foreach my $letter (@letters) {
|
|
||||||
$letter = sprintf("%%%02x", ord($letter)) unless $safe{$letter};
|
|
||||||
}
|
|
||||||
return join('', @letters);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_raw {
|
|
||||||
my $uri = shift;
|
|
||||||
my $response = $ua->get($uri);
|
|
||||||
return $response->content if $response->is_success;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_wiki_page {
|
|
||||||
my ($wiki, $id, $password) = @_;
|
|
||||||
my $parameters = [
|
|
||||||
pwd => $password,
|
|
||||||
action => 'browse',
|
|
||||||
id => $id,
|
|
||||||
raw => 1,
|
|
||||||
];
|
|
||||||
my $response = $ua->post($wiki, $parameters);
|
|
||||||
return $response->decoded_content if $response->is_success;
|
|
||||||
die "Getting $id returned " . $response->status_line;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_wiki_index {
|
|
||||||
my $wiki = shift;
|
|
||||||
my $parameters = [
|
|
||||||
search => "flickr.com",
|
|
||||||
context => 0,
|
|
||||||
raw => 1,
|
|
||||||
];
|
|
||||||
my $response = $ua->post($wiki, $parameters);
|
|
||||||
return $response->decoded_content if $response->is_success;
|
|
||||||
die "Getting the index returned " . $response->status_line;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub post_wiki_page {
|
|
||||||
my ($wiki, $id, $username, $password, $text) = @_;
|
|
||||||
my $parameters = [
|
|
||||||
username => $username,
|
|
||||||
pwd => $password,
|
|
||||||
recent_edit => 'on',
|
|
||||||
text => $text,
|
|
||||||
title => $id,
|
|
||||||
];
|
|
||||||
my $response = $ua->post($wiki, $parameters);
|
|
||||||
die "Posting to $id returned " . $response->status_line unless $response->code == 302;
|
|
||||||
}
|
|
||||||
|
|
||||||
my %seen = ();
|
|
||||||
|
|
||||||
sub write_flickr {
|
|
||||||
my ($id, $flickr, $dir, $file) = @_;
|
|
||||||
say "Found $flickr";
|
|
||||||
warn "$file was seen before: " . $seen{$file} if $seen{$file};
|
|
||||||
die "$file contains unknown characters" if $file =~ /[^a-z0-9_.]/;
|
|
||||||
$seen{$file} = "$id used $flickr";
|
|
||||||
my $bytes = get_raw($flickr) or die("No data for $id");
|
|
||||||
open(my $fh, '>', "$dir/$file") or die "Cannot write $dir/$file";
|
|
||||||
binmode($fh);
|
|
||||||
print $fh $bytes;
|
|
||||||
close($fh);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub convert_page {
|
|
||||||
my ($wiki, $pics, $dir, $username, $password, $id) = @_;
|
|
||||||
say $id;
|
|
||||||
my $text = get_wiki_page($wiki, $id, $password);
|
|
||||||
my $is_changed = 0;
|
|
||||||
while ($text =~ m!(https://[a-z0-9.]+.flickr.com/(?:[a-z0-9.]+/)?([a-z0-9_]+\.(?:jpg|png)))!) {
|
|
||||||
my $flickr = $1;
|
|
||||||
my $file = $2;
|
|
||||||
write_flickr($id, $flickr, $dir, $file);
|
|
||||||
$is_changed = 1;
|
|
||||||
my $re = quotemeta($flickr);
|
|
||||||
$text =~ s!$flickr!$pics/$file!g;
|
|
||||||
}
|
|
||||||
if ($is_changed) {
|
|
||||||
post_wiki_page($wiki, $id, $username, $password, $text);
|
|
||||||
} else {
|
|
||||||
# die "$id has no flickr matches?\n$text";
|
|
||||||
}
|
|
||||||
sleep(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub convert_site {
|
|
||||||
my ($wiki, $pics, $dir, $username, $password) = @_;
|
|
||||||
my @ids = split(/\n/, get_wiki_index($wiki));
|
|
||||||
for my $id (@ids) {
|
|
||||||
convert_page($wiki, $pics, $dir, $username, $password, $id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
our $AdminPass;
|
|
||||||
do "/home/alex/password.pl";
|
|
||||||
convert_site('https://alexschroeder.ch/wiki',
|
|
||||||
'https://alexschroeder.ch/pics',
|
|
||||||
'/home/alex/alexschroeder.ch/pics',
|
|
||||||
'Alex Schroeder',
|
|
||||||
$AdminPass);
|
|
||||||
1111
contrib/oddmuse-curl.el
Normal file
168
contrib/vc-oddmuse.el
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
;;; vc-oddmuse.el -- add VC support to oddmuse-curl
|
||||||
|
;;
|
||||||
|
;; Copyright (C) 2014 Alex Schroeder <alex@gnu.org>
|
||||||
|
;;
|
||||||
|
;; Latest version:
|
||||||
|
;; http://git.savannah.gnu.org/cgit/oddmuse.git/plain/contrib/vc-oddmuse.el
|
||||||
|
;; Discussion, feedback:
|
||||||
|
;; http://www.emacswiki.org/cgi-bin/wiki/OddmuseCurl
|
||||||
|
;;
|
||||||
|
;; 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
;;
|
||||||
|
;; Add the following to your init file:
|
||||||
|
;;
|
||||||
|
;; (add-to-list 'vc-handled-backends 'oddmuse)
|
||||||
|
|
||||||
|
(add-to-list 'vc-handled-backends 'oddmuse)
|
||||||
|
|
||||||
|
(require 'oddmuse-curl)
|
||||||
|
(require 'diff)
|
||||||
|
|
||||||
|
(defun vc-oddmuse-revision-granularity () 'file)
|
||||||
|
|
||||||
|
(defun vc-oddmuse-registered (file)
|
||||||
|
"Handle files in `oddmuse-directory'."
|
||||||
|
(string-match (concat "^" (expand-file-name oddmuse-directory))
|
||||||
|
(file-name-directory file)))
|
||||||
|
|
||||||
|
(defun vc-oddmuse-state (file)
|
||||||
|
"Return the current version control state of FILE.
|
||||||
|
For a list of possible values, see `vc-state'."
|
||||||
|
;; Avoid downloading the current version from the wiki and comparing
|
||||||
|
;; the text: Too much traffic!
|
||||||
|
'edited)
|
||||||
|
|
||||||
|
(defun vc-oddmuse-working-revision (file)
|
||||||
|
"The current revision based on `oddmuse-revisions'."
|
||||||
|
(oddmuse-revision-get oddmuse-wiki oddmuse-page-name))
|
||||||
|
|
||||||
|
(defun vc-oddmuse-checkout-model (files)
|
||||||
|
"No locking."
|
||||||
|
'implicit)
|
||||||
|
|
||||||
|
(defun vc-oddmuse-create-repo (file)
|
||||||
|
(error "You cannot create Oddmuse wikis using Emacs."))
|
||||||
|
|
||||||
|
(defun vc-oddmuse-register (files &optional rev comment)
|
||||||
|
"This always works.")
|
||||||
|
|
||||||
|
(defun vc-oddmuse-revert (file &optional contents-done)
|
||||||
|
"No idea"
|
||||||
|
nil)
|
||||||
|
|
||||||
|
(defvar vc-oddmuse-log-command
|
||||||
|
(concat "curl --silent %w"
|
||||||
|
" --form action=rc"
|
||||||
|
" --form showedit=1"
|
||||||
|
" --form all=1"
|
||||||
|
" --form from=1"
|
||||||
|
" --form raw=1"
|
||||||
|
" --form match='%r'")
|
||||||
|
"Command to use for publishing index pages.
|
||||||
|
It must print the page to stdout.
|
||||||
|
|
||||||
|
See `oddmuse-format-command' for the formatting options.")
|
||||||
|
|
||||||
|
(defun vc-oddmuse-print-log (files buffer &optional shortlog start-revision limit)
|
||||||
|
"Load complete recent changes for the files."
|
||||||
|
;; Derive `oddmuse-wiki' from the first file
|
||||||
|
(with-oddmuse-file (car files)
|
||||||
|
;; The wiki expects a Perl regular expression!
|
||||||
|
(let ((regexp (concat "^(" (mapconcat 'file-name-nondirectory files "|") ")$")))
|
||||||
|
(oddmuse-run "Getting recent changes" vc-oddmuse-log-command nil nil buffer)))
|
||||||
|
(with-current-buffer buffer
|
||||||
|
(oddmuse-render-rss3))
|
||||||
|
'limit-unsupported)
|
||||||
|
|
||||||
|
(defun vc-oddmuse-log-outgoing ()
|
||||||
|
(error "This is not supported."))
|
||||||
|
|
||||||
|
(defun vc-oddmuse-log-incoming ()
|
||||||
|
(error "This is not supported."))
|
||||||
|
|
||||||
|
(defvar vc-oddmuse-get-revision-command
|
||||||
|
(concat "curl --silent"
|
||||||
|
" --form action=browse"
|
||||||
|
" --form id=%t"
|
||||||
|
" --form revision=%v"
|
||||||
|
" --form raw=1"
|
||||||
|
" '%w'")
|
||||||
|
"Command to use to get older revisions of a page.
|
||||||
|
It must print the page to stdout.
|
||||||
|
|
||||||
|
%? '?' character
|
||||||
|
%w URL of the wiki as provided by `oddmuse-wikis'
|
||||||
|
%t Page title as provided by `oddmuse-page-name'
|
||||||
|
%v Revision to retrieve as provided by `oddmuse-revision'")
|
||||||
|
|
||||||
|
(defun oddmuse-revision-filename (rev)
|
||||||
|
"Return filename for revision REV.
|
||||||
|
This uses `oddmuse-directory', `wiki' and `pagename' as bound by
|
||||||
|
`with-oddmuse-file'."
|
||||||
|
(concat oddmuse-directory
|
||||||
|
"/" wiki
|
||||||
|
"/" pagename
|
||||||
|
".~" rev "~"))
|
||||||
|
|
||||||
|
(defun vc-oddmuse-diff (files &optional rev1 rev2 buffer)
|
||||||
|
"Report the differences for FILES."
|
||||||
|
(setq buffer (or buffer (get-buffer-create "*vc-diff*")))
|
||||||
|
(dolist (file files)
|
||||||
|
(with-oddmuse-file file
|
||||||
|
(setq rev1 (or rev1 (oddmuse-get-latest-revision wiki pagename)))
|
||||||
|
(dolist (rev (list rev1 rev2))
|
||||||
|
(when (and rev (not (file-readable-p (oddmuse-revision-filename rev))))
|
||||||
|
(let* ((oddmuse-revision rev)
|
||||||
|
(command vc-oddmuse-get-revision-command)
|
||||||
|
(filename (oddmuse-revision-filename rev)))
|
||||||
|
(with-temp-buffer
|
||||||
|
(oddmuse-run
|
||||||
|
(concat "Downloading revision " rev)
|
||||||
|
command wiki pagename)
|
||||||
|
(write-file filename)))))
|
||||||
|
(diff-no-select
|
||||||
|
(if rev1 (oddmuse-revision-filename rev1) file)
|
||||||
|
(if rev2 (oddmuse-revision-filename rev2) file)
|
||||||
|
nil
|
||||||
|
(vc-switches 'oddmuse 'diff)
|
||||||
|
buffer))))
|
||||||
|
|
||||||
|
(defun vc-oddmuse-revert (file &optional contents-done)
|
||||||
|
"Revert FILE back to the wiki revision.
|
||||||
|
If optional arg CONTENTS-DONE is non-nil, then nothing needs to
|
||||||
|
be done, as the contents of FILE have already been reverted from
|
||||||
|
a version backup."
|
||||||
|
(unless contents-done
|
||||||
|
(with-oddmuse-file file
|
||||||
|
(let ((command (oddmuse-format-command vc-oddmuse-get-revision-command)))
|
||||||
|
(with-temp-buffer
|
||||||
|
(oddmuse-run "Loading" command)
|
||||||
|
(write-file file))))))
|
||||||
|
|
||||||
|
(defun vc-oddmuse-checkin (files rev comment)
|
||||||
|
"Commit changes in FILES to this backend.
|
||||||
|
REV is a historical artifact and should be ignored. COMMENT is
|
||||||
|
used as a check-in comment."
|
||||||
|
(dolist (file files)
|
||||||
|
(with-oddmuse-file file
|
||||||
|
(let* ((summary comment)
|
||||||
|
(command (oddmuse-format-command oddmuse-post-command))
|
||||||
|
(buf (get-buffer-create " *oddmuse-response*")))
|
||||||
|
(with-temp-buffer
|
||||||
|
(insert-file-contents file)
|
||||||
|
(oddmuse-run "Posting" command wiki pagename buf t 302))))))
|
||||||
|
|
||||||
|
(provide 'vc-oddmuse)
|
||||||
@@ -1,536 +0,0 @@
|
|||||||
/* This file is in the public domain. */
|
|
||||||
html{ text-align: center; }
|
|
||||||
|
|
||||||
body, rss {
|
|
||||||
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 14pt;
|
|
||||||
padding: 1em 3em;
|
|
||||||
max-width: 72ex;
|
|
||||||
display: inline-block;
|
|
||||||
text-align: left;
|
|
||||||
color: #000;
|
|
||||||
background-color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
body {
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* hide all the crap */
|
|
||||||
div.diff, div.diff+hr, div.refer, div.near, div.definition, div.sister,
|
|
||||||
div.cal, div.footer, span.specialdays, span.gotobar, a.edit, a.number span,
|
|
||||||
div.rc form, form.tiny, p.comment, p#plus1, div.g-plusone, div.content a.feed {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
div.content a.book,
|
|
||||||
div.content a.movie {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
a cite {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
img[alt="RSS"] { display: none }
|
|
||||||
a.rss { font-size: 8pt }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* headings: we can use larger sizes if we use a lighter color.
|
|
||||||
we cannot inherit the font-family because header and footer use a narrow font. */
|
|
||||||
|
|
||||||
h1, h2, h3, title {
|
|
||||||
font-family: inherit;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
h1, channel title {
|
|
||||||
font-size: 32pt;
|
|
||||||
margin: 1em 0 0.5em 0;
|
|
||||||
padding: 0.4em 0;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 18pt;
|
|
||||||
margin: 2em 0 0 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
h3 {
|
|
||||||
font-size: inherit;
|
|
||||||
font-weight: bold;
|
|
||||||
padding: 0;
|
|
||||||
margin: 1em 0 0 0;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* headers in the journal are smaller */
|
|
||||||
|
|
||||||
div.journal h1, item title {
|
|
||||||
font-size: inherit;
|
|
||||||
padding: 0;
|
|
||||||
clear: both;
|
|
||||||
border-bottom: 1px solid #000;
|
|
||||||
}
|
|
||||||
div.journal h2 {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
}
|
|
||||||
div.journal h3 {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
font-weight: inherit;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
div.journal hr {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
p.more {
|
|
||||||
margin-top: 3em;
|
|
||||||
}
|
|
||||||
/* Links in headings appear on journal pages. */
|
|
||||||
|
|
||||||
h1 a, h2 a, h3 a {
|
|
||||||
color:inherit;
|
|
||||||
text-decoration:none;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
h1 a:visited, h2 a:visited, h3 a:visited {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* for download buttons and the like */
|
|
||||||
|
|
||||||
.button {
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 120%;
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 0.4em 0.6em;
|
|
||||||
text-shadow: 0px -1px 0px #ccc;
|
|
||||||
background-color: #cfa;
|
|
||||||
border: 1px solid #9d8;
|
|
||||||
border-radius: 5px;
|
|
||||||
box-shadow: 0px 1px 3px white inset, 0px 1px 3px black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button .icon {
|
|
||||||
color: #363;
|
|
||||||
text-shadow: 0px -1px 1px white, 0px 1px 3px #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button a {
|
|
||||||
text-decoration: none;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* links */
|
|
||||||
|
|
||||||
a.pencil {
|
|
||||||
padding-left: 1ex;
|
|
||||||
text-decoration: none;
|
|
||||||
color: inherit;
|
|
||||||
visibility: hidden;
|
|
||||||
transition: visibility 0s 1s, opacity 1s linear;
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
*:hover > a.pencil {
|
|
||||||
visibility: visible;
|
|
||||||
transition: opacity .5s linear;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
a.pencil {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a.number {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* stop floating content from flowing over the footer */
|
|
||||||
|
|
||||||
hr {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the distance between links in the navigation bars */
|
|
||||||
|
|
||||||
span.bar a {
|
|
||||||
margin-right: 1ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
a img {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* search box in the top bar */
|
|
||||||
|
|
||||||
.header form, .header p {
|
|
||||||
display: inline;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
label[for="searchlang"], #searchlang, .header input[type="submit"] {
|
|
||||||
/* don't use display: none! http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form */
|
|
||||||
visibility: hidden; position: absolute;
|
|
||||||
}
|
|
||||||
/* wrap on the iphone */
|
|
||||||
@media only screen and (max-device-width: 480px) {
|
|
||||||
}
|
|
||||||
|
|
||||||
.header input {
|
|
||||||
width: 10ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* other form fields */
|
|
||||||
|
|
||||||
input[type="text"] {
|
|
||||||
padding: 0;
|
|
||||||
font-size: 80%;
|
|
||||||
line-height: 125%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* code */
|
|
||||||
|
|
||||||
textarea, pre, code, tt {
|
|
||||||
font-family: "Andale Mono", Monaco, "Courier New", Courier, monospace, "Symbola";
|
|
||||||
font-size: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
overflow:hidden;
|
|
||||||
white-space: pre-wrap; /* CSS 3 */
|
|
||||||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
|
||||||
white-space: -pre-wrap; /* Opera 4-6 */
|
|
||||||
white-space: -o-pre-wrap; /* Opera 7 */
|
|
||||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* styling for divs that will be invisible when printing
|
|
||||||
when printing. */
|
|
||||||
|
|
||||||
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
|
||||||
|
|
||||||
font-size: 14pt;
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
|
||||||
font-size: 8pt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
div.footer form.search {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
div.rc li + li {
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
div.rc li strong, table.history strong, strong.description {
|
|
||||||
font-family: inherit;
|
|
||||||
font-weight: inherit;
|
|
||||||
}
|
|
||||||
div.diff {
|
|
||||||
padding-left: 5%;
|
|
||||||
padding-right: 5%;
|
|
||||||
font-size: 12pt;
|
|
||||||
color: #000;
|
|
||||||
|
|
||||||
}
|
|
||||||
div.old {
|
|
||||||
background-color: #ffffaf;
|
|
||||||
}
|
|
||||||
div.new {
|
|
||||||
background-color: #cfffcf;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.refer {
|
|
||||||
padding-left: 5%;
|
|
||||||
padding-right: 5%;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.message {
|
|
||||||
background-color:#fee;
|
|
||||||
color:#000;
|
|
||||||
}
|
|
||||||
|
|
||||||
img.xml {
|
|
||||||
border:none;
|
|
||||||
padding:1px;
|
|
||||||
}
|
|
||||||
a.small img {
|
|
||||||
max-width:300px;
|
|
||||||
}
|
|
||||||
a.large img {
|
|
||||||
max-width:600px;
|
|
||||||
}
|
|
||||||
div.sister {
|
|
||||||
margin-right:1ex;
|
|
||||||
background-color:inherit;
|
|
||||||
}
|
|
||||||
div.sister p {
|
|
||||||
margin-top:0;
|
|
||||||
}
|
|
||||||
div.sister hr {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
div.sister img {
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.near, div.definition {
|
|
||||||
background-color:#efe;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.sidebar {
|
|
||||||
float:right;
|
|
||||||
border:1px dotted #000;
|
|
||||||
padding:0 1em;
|
|
||||||
}
|
|
||||||
div.sidebar ul {
|
|
||||||
padding-left:1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* replacements, features */
|
|
||||||
|
|
||||||
ins {
|
|
||||||
font-style: italic;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
acronym, abbr {
|
|
||||||
letter-spacing:0.1em;
|
|
||||||
font-variant:small-caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Interlink prefix not shown */
|
|
||||||
a .site, a .separator {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
a cite { font:inherit; }
|
|
||||||
/* browser borkage */
|
|
||||||
textarea[name="text"] { width:97%; height:80%; }
|
|
||||||
textarea[name="summary"] { width:97%; height:3em; }
|
|
||||||
/* comments */
|
|
||||||
textarea[name="aftertext"] { width:97%; height:10em; }
|
|
||||||
div.commentshown {
|
|
||||||
font-size: 12pt;
|
|
||||||
padding: 2em 0;
|
|
||||||
}
|
|
||||||
div.commenthidden {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
div.commentshown {
|
|
||||||
display:block;
|
|
||||||
}
|
|
||||||
p.comment {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
div.comment {
|
|
||||||
font-size: 14pt;
|
|
||||||
}
|
|
||||||
div.comment h2 {
|
|
||||||
margin-top: 5em;
|
|
||||||
}
|
|
||||||
/* comment pages with username, homepage, and email subscription */
|
|
||||||
.comment form span { display: block; }
|
|
||||||
.comment form span label { display: inline-block; width: 10em; }
|
|
||||||
/* IE sucks */
|
|
||||||
.comment input#username,
|
|
||||||
.comment input#homepage,
|
|
||||||
.comment input#mail { width: 20em; }
|
|
||||||
|
|
||||||
/* cal */
|
|
||||||
div.month { padding:0; margin:0 2ex; }
|
|
||||||
body > div.month {
|
|
||||||
float:right;
|
|
||||||
background-color: inherit;
|
|
||||||
border:solid thin;
|
|
||||||
padding:0 1ex;
|
|
||||||
}
|
|
||||||
.year > .month {
|
|
||||||
float:left;
|
|
||||||
}
|
|
||||||
.footer {
|
|
||||||
clear:both;
|
|
||||||
}
|
|
||||||
.month .title a.local {
|
|
||||||
background-color: inherit;
|
|
||||||
}
|
|
||||||
.month a.local {
|
|
||||||
background-color: #ddf;
|
|
||||||
}
|
|
||||||
.month a.today {
|
|
||||||
background-color: #fdd;
|
|
||||||
}
|
|
||||||
.month a {
|
|
||||||
color:inherit;
|
|
||||||
font-weight:inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
/* history tables and other tables */
|
|
||||||
table.history {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
td.history {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.user {
|
|
||||||
border: none;
|
|
||||||
border-top: 1px solid #ccc;
|
|
||||||
border-bottom: 1px solid #ccc;
|
|
||||||
padding: 1em;
|
|
||||||
margin: 1em 2em;
|
|
||||||
}
|
|
||||||
table.user tr td, table.user tr th {
|
|
||||||
border: none;
|
|
||||||
padding: 0.2em 0.5em;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
table.arab tr th {
|
|
||||||
font-weight:normal;
|
|
||||||
text-align:left;
|
|
||||||
vertical-align:top;
|
|
||||||
}
|
|
||||||
table.arab, table.arab tr th, table.arab tr td {
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
th.nobreak {
|
|
||||||
white-space:nowrap;
|
|
||||||
}
|
|
||||||
table.full { width:99%; margin-left:1px; }
|
|
||||||
table.j td, table.j th, table tr td.j, table tr th.j, .j { text-align:justify; }
|
|
||||||
table.l td, table.l th, table tr td.l, table tr th.l, .l { text-align:left; }
|
|
||||||
table.r td, table.r th, table tr td.r, table tr th.r, .r { text-align:right; }
|
|
||||||
table.c td, table.c th, table tr td.c, table tr th.c, .c { text-align:center; }
|
|
||||||
table.t td { vertical-align: top; }
|
|
||||||
td.half { width:50%; }
|
|
||||||
td.third { width:33%; }
|
|
||||||
|
|
||||||
form table td { padding:5px; }
|
|
||||||
|
|
||||||
/* lists */
|
|
||||||
dd { padding-bottom:0.5ex; }
|
|
||||||
dl.inside dt { float:left; }
|
|
||||||
/* search */
|
|
||||||
div.search span.result { font-size:larger; }
|
|
||||||
div.search span.info { font-size:smaller; font-style:italic; }
|
|
||||||
div.search p.result { display:none; }
|
|
||||||
|
|
||||||
img.logo {
|
|
||||||
float: right;
|
|
||||||
margin: 0 0 0 1ex;
|
|
||||||
padding: 0;
|
|
||||||
border: 1px solid #000;
|
|
||||||
opacity: 0.3;
|
|
||||||
background-color:#ffe;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* images */
|
|
||||||
|
|
||||||
div.content a.feed img, div.journal a.feed img,
|
|
||||||
div.content a img.smiley, div.journal a img.smiley, img.smiley,
|
|
||||||
div.content a.inline img, div.journal a.inline img,
|
|
||||||
div.content li a.image img, div.journal li a.image img {
|
|
||||||
margin: 0; padding: 0; border: none;
|
|
||||||
}
|
|
||||||
div.image a img {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
div.image span.caption {
|
|
||||||
margin: 0 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.left { float:left; margin-right: 1em; }
|
|
||||||
.right { float:right; margin-left: 1em; }
|
|
||||||
.half img { height: 50%; width: 50%; }
|
|
||||||
.face img { width: 200px; }
|
|
||||||
div.left .left, div.right .right {
|
|
||||||
float:none;
|
|
||||||
}
|
|
||||||
.center { text-align:center; }
|
|
||||||
table.aside {
|
|
||||||
float:right;
|
|
||||||
width:40%;
|
|
||||||
margin-left: 1em;
|
|
||||||
padding: 1ex;
|
|
||||||
border: 1px dotted #666;
|
|
||||||
}
|
|
||||||
table.aside td {
|
|
||||||
text-align:left;
|
|
||||||
}
|
|
||||||
div.sidebar {
|
|
||||||
float:right; width: 250px;
|
|
||||||
text-align: right;
|
|
||||||
border: none;
|
|
||||||
margin: 1ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bigsidebar {
|
|
||||||
float:right;
|
|
||||||
width: 500px;
|
|
||||||
border: none;
|
|
||||||
margin-left: 1ex;
|
|
||||||
font-size: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.irc dt { width:20ex; float:left; text-align:right; clear:left; }
|
|
||||||
dl.irc dt span.time { float:left; }
|
|
||||||
dl.irc dd { margin-left:22ex; }
|
|
||||||
|
|
||||||
/* portrait */
|
|
||||||
|
|
||||||
div.footer, div.comment, hr { clear: both; }
|
|
||||||
.portrait { float: left; font-size: small; margin-right: 1em; }
|
|
||||||
.portrait a { color: #999; }
|
|
||||||
|
|
||||||
div.left { float:left; margin:1em; padding: 0.5em; }
|
|
||||||
div.left p { display:table-cell; }
|
|
||||||
div.left p + p { display:table-caption; caption-side:bottom; }
|
|
||||||
|
|
||||||
p.table a { float:left; width:20ex; }
|
|
||||||
p.table + p { clear:both; }
|
|
||||||
|
|
||||||
/* rss */
|
|
||||||
|
|
||||||
channel * { display: block; }
|
|
||||||
|
|
||||||
channel title {
|
|
||||||
margin-top: 30pt;
|
|
||||||
}
|
|
||||||
copyright {
|
|
||||||
font-size: 14pt;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
channel > link:before {
|
|
||||||
font-size: 18pt;
|
|
||||||
display: block;
|
|
||||||
margin: 1em;
|
|
||||||
padding: 0.5em;
|
|
||||||
content: "This is an RSS feed, designed to be read in a feed reader.";
|
|
||||||
color: red;
|
|
||||||
border: 1px solid red;
|
|
||||||
}
|
|
||||||
link, license {
|
|
||||||
font-size: 11pt;
|
|
||||||
margin-bottom: 9pt;
|
|
||||||
}
|
|
||||||
username:before { content: "Last edited by "; }
|
|
||||||
username:after { content: "."; }
|
|
||||||
generator:before { content: "Feed generated by "; }
|
|
||||||
generator:after { content: "."; }
|
|
||||||
channel description {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
item description {
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: normal;
|
|
||||||
margin-bottom: 1em;
|
|
||||||
}
|
|
||||||
docs, language,
|
|
||||||
pubDate, lastBuildDate, ttl, guid, category, comments,
|
|
||||||
docs, image title, image link,
|
|
||||||
status, version, diff, history, importance {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
@@ -1,544 +0,0 @@
|
|||||||
/* This file is in the public domain. */
|
|
||||||
html{ text-align: center; }
|
|
||||||
|
|
||||||
body, rss {
|
|
||||||
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 14pt;
|
|
||||||
padding: 1em 3em;
|
|
||||||
max-width: 72ex;
|
|
||||||
display: inline-block;
|
|
||||||
text-align: left;
|
|
||||||
color: #000;
|
|
||||||
background-color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
@import url(file:///home/alex/alexschroeder.ch/css/alex-2017.css) print;
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
body {
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* hide all the crap */
|
|
||||||
div.diff, div.diff+hr, div.refer, div.near, div.definition, div.sister,
|
|
||||||
div.cal, div.footer, span.specialdays, span.gotobar, a.edit, a.number span,
|
|
||||||
div.rc form, form.tiny, p.comment, p#plus1, div.g-plusone, div.content a.feed {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
div.content a.book,
|
|
||||||
div.content a.movie {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
a cite {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
img[alt="RSS"] { display: none }
|
|
||||||
a.rss { font-size: 8pt }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* headings: we can use larger sizes if we use a lighter color.
|
|
||||||
we cannot inherit the font-family because header and footer use a narrow font. */
|
|
||||||
|
|
||||||
h1, h2, h3, title {
|
|
||||||
font-family: inherit;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
h1, channel title {
|
|
||||||
font-size: 32pt;
|
|
||||||
margin: 1em 0 0.5em 0;
|
|
||||||
padding: 0.4em 0;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 18pt;
|
|
||||||
margin: 2em 0 0 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
h3 {
|
|
||||||
font-size: inherit;
|
|
||||||
font-weight: bold;
|
|
||||||
padding: 0;
|
|
||||||
margin: 1em 0 0 0;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* headers in the journal are smaller */
|
|
||||||
|
|
||||||
div.journal h1, item title {
|
|
||||||
font-size: inherit;
|
|
||||||
padding: 0;
|
|
||||||
clear: both;
|
|
||||||
border-bottom: 1px solid #000;
|
|
||||||
}
|
|
||||||
div.journal h2 {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
}
|
|
||||||
div.journal h3 {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
font-weight: inherit;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
div.journal hr {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
p.more {
|
|
||||||
margin-top: 3em;
|
|
||||||
}
|
|
||||||
/* Links in headings appear on journal pages. */
|
|
||||||
|
|
||||||
h1 a, h2 a, h3 a {
|
|
||||||
color:inherit;
|
|
||||||
text-decoration:none;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
h1 a:visited, h2 a:visited, h3 a:visited {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* for download buttons and the like */
|
|
||||||
|
|
||||||
.button {
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 120%;
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 0.4em 0.6em;
|
|
||||||
text-shadow: 0px -1px 0px #ccc;
|
|
||||||
background-color: #cfa;
|
|
||||||
border: 1px solid #9d8;
|
|
||||||
border-radius: 5px;
|
|
||||||
box-shadow: 0px 1px 3px white inset, 0px 1px 3px black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button .icon {
|
|
||||||
color: #363;
|
|
||||||
text-shadow: 0px -1px 1px white, 0px 1px 3px #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button a {
|
|
||||||
text-decoration: none;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* links */
|
|
||||||
|
|
||||||
a.pencil {
|
|
||||||
padding-left: 1ex;
|
|
||||||
text-decoration: none;
|
|
||||||
color: inherit;
|
|
||||||
visibility: hidden;
|
|
||||||
transition: visibility 0s 1s, opacity 1s linear;
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
*:hover > a.pencil {
|
|
||||||
visibility: visible;
|
|
||||||
transition: opacity .5s linear;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
a.pencil {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a.number {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* stop floating content from flowing over the footer */
|
|
||||||
|
|
||||||
hr {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the distance between links in the navigation bars */
|
|
||||||
|
|
||||||
span.bar a {
|
|
||||||
margin-right: 1ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
a img {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* search box in the top bar */
|
|
||||||
|
|
||||||
.header form, .header p {
|
|
||||||
display: inline;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
label[for="searchlang"], #searchlang, .header input[type="submit"] {
|
|
||||||
/* don't use display: none! http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form */
|
|
||||||
visibility: hidden; position: absolute;
|
|
||||||
}
|
|
||||||
/* wrap on the iphone */
|
|
||||||
@media only screen and (max-device-width: 480px) {
|
|
||||||
}
|
|
||||||
|
|
||||||
.header input {
|
|
||||||
width: 10ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* other form fields */
|
|
||||||
|
|
||||||
input[type="text"] {
|
|
||||||
padding: 0;
|
|
||||||
font-size: 80%;
|
|
||||||
line-height: 125%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* code */
|
|
||||||
|
|
||||||
textarea, pre, code, tt {
|
|
||||||
font-family: "Andale Mono", Monaco, "Courier New", Courier, monospace, "Symbola";
|
|
||||||
font-size: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
overflow:hidden;
|
|
||||||
white-space: pre-wrap; /* CSS 3 */
|
|
||||||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
|
||||||
white-space: -pre-wrap; /* Opera 4-6 */
|
|
||||||
white-space: -o-pre-wrap; /* Opera 7 */
|
|
||||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* styling for divs that will be invisible when printing
|
|
||||||
when printing. */
|
|
||||||
|
|
||||||
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
|
||||||
|
|
||||||
font-size: 14pt;
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
|
||||||
font-size: 8pt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
div.footer form.search {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
div.rc li + li {
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
div.rc li strong, table.history strong, strong.description {
|
|
||||||
font-family: inherit;
|
|
||||||
font-weight: inherit;
|
|
||||||
}
|
|
||||||
div.diff {
|
|
||||||
padding-left: 5%;
|
|
||||||
padding-right: 5%;
|
|
||||||
font-size: 12pt;
|
|
||||||
color: #000;
|
|
||||||
|
|
||||||
}
|
|
||||||
div.old {
|
|
||||||
background-color: #ffffaf;
|
|
||||||
}
|
|
||||||
div.new {
|
|
||||||
background-color: #cfffcf;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.refer {
|
|
||||||
padding-left: 5%;
|
|
||||||
padding-right: 5%;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.message {
|
|
||||||
background-color:#fee;
|
|
||||||
color:#000;
|
|
||||||
}
|
|
||||||
|
|
||||||
img.xml {
|
|
||||||
border:none;
|
|
||||||
padding:1px;
|
|
||||||
}
|
|
||||||
a.small img {
|
|
||||||
max-width:300px;
|
|
||||||
}
|
|
||||||
a.large img {
|
|
||||||
max-width:600px;
|
|
||||||
}
|
|
||||||
div.sister {
|
|
||||||
margin-right:1ex;
|
|
||||||
background-color:inherit;
|
|
||||||
}
|
|
||||||
div.sister p {
|
|
||||||
margin-top:0;
|
|
||||||
}
|
|
||||||
div.sister hr {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
div.sister img {
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.near, div.definition {
|
|
||||||
background-color:#efe;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.sidebar {
|
|
||||||
float:right;
|
|
||||||
border:1px dotted #000;
|
|
||||||
padding:0 1em;
|
|
||||||
}
|
|
||||||
div.sidebar ul {
|
|
||||||
padding-left:1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* replacements, features */
|
|
||||||
|
|
||||||
ins {
|
|
||||||
font-style: italic;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
acronym, abbr {
|
|
||||||
letter-spacing:0.1em;
|
|
||||||
font-variant:small-caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Interlink prefix not shown */
|
|
||||||
a .site, a .separator {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
a cite { font:inherit; }
|
|
||||||
/* browser borkage */
|
|
||||||
textarea[name="text"] { width:97%; height:80%; }
|
|
||||||
textarea[name="summary"] { width:97%; height:3em; }
|
|
||||||
/* comments */
|
|
||||||
textarea[name="aftertext"] { width:97%; height:10em; }
|
|
||||||
div.commentshown {
|
|
||||||
font-size: 12pt;
|
|
||||||
padding: 2em 0;
|
|
||||||
}
|
|
||||||
div.commenthidden {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
div.commentshown {
|
|
||||||
display:block;
|
|
||||||
}
|
|
||||||
p.comment {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
div.comment {
|
|
||||||
font-size: 14pt;
|
|
||||||
}
|
|
||||||
div.comment h2 {
|
|
||||||
margin-top: 5em;
|
|
||||||
}
|
|
||||||
/* comment pages with username, homepage, and email subscription */
|
|
||||||
.comment form span { display: block; }
|
|
||||||
.comment form span label { display: inline-block; width: 10em; }
|
|
||||||
/* IE sucks */
|
|
||||||
.comment input#username,
|
|
||||||
.comment input#homepage,
|
|
||||||
.comment input#mail { width: 20em; }
|
|
||||||
|
|
||||||
/* cal */
|
|
||||||
div.month { padding:0; margin:0 2ex; }
|
|
||||||
body > div.month {
|
|
||||||
float:right;
|
|
||||||
background-color: inherit;
|
|
||||||
border:solid thin;
|
|
||||||
padding:0 1ex;
|
|
||||||
}
|
|
||||||
.year > .month {
|
|
||||||
float:left;
|
|
||||||
}
|
|
||||||
.footer {
|
|
||||||
clear:both;
|
|
||||||
}
|
|
||||||
.month .title a.local {
|
|
||||||
background-color: inherit;
|
|
||||||
}
|
|
||||||
.month a.local {
|
|
||||||
background-color: #ddf;
|
|
||||||
}
|
|
||||||
.month a.today {
|
|
||||||
background-color: #fdd;
|
|
||||||
}
|
|
||||||
.month a {
|
|
||||||
color:inherit;
|
|
||||||
font-weight:inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
/* history tables and other tables */
|
|
||||||
table.history {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
td.history {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
border: none;
|
|
||||||
border-top: 1px solid #ccc;
|
|
||||||
border-bottom: 1px solid #ccc;
|
|
||||||
padding: 1em;
|
|
||||||
margin: 1em 2em;
|
|
||||||
}
|
|
||||||
table tr td, table tr th {
|
|
||||||
border: none;
|
|
||||||
padding: 0.2em 0.5em;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
table.arab tr th {
|
|
||||||
font-weight:normal;
|
|
||||||
text-align:left;
|
|
||||||
vertical-align:top;
|
|
||||||
}
|
|
||||||
table.arab, table.arab tr th, table.arab tr td {
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
th.nobreak {
|
|
||||||
white-space:nowrap;
|
|
||||||
}
|
|
||||||
table.full { width:99%; margin-left:1px; }
|
|
||||||
table.j td, table.j th, table tr td.j, table tr th.j, .j { text-align:justify; }
|
|
||||||
table.l td, table.l th, table tr td.l, table tr th.l, .l { text-align:left; }
|
|
||||||
table.r td, table.r th, table tr td.r, table tr th.r, .r { text-align:right; }
|
|
||||||
table.c td, table.c th, table tr td.c, table tr th.c, .c { text-align:center; }
|
|
||||||
table.t td { vertical-align: top; }
|
|
||||||
td.half { width:50%; }
|
|
||||||
td.third { width:33%; }
|
|
||||||
|
|
||||||
form table td { padding:5px; }
|
|
||||||
|
|
||||||
/* lists */
|
|
||||||
dd { padding-bottom:0.5ex; }
|
|
||||||
dl.inside dt { float:left; }
|
|
||||||
/* search */
|
|
||||||
div.search span.result { font-size:larger; }
|
|
||||||
div.search span.info { font-size:smaller; font-style:italic; }
|
|
||||||
div.search p.result { display:none; }
|
|
||||||
|
|
||||||
img.logo {
|
|
||||||
float: right;
|
|
||||||
margin: 0 0 0 1ex;
|
|
||||||
padding: 0;
|
|
||||||
border: 1px solid #000;
|
|
||||||
opacity: 0.3;
|
|
||||||
background-color:#ffe;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* images */
|
|
||||||
|
|
||||||
div.content a.feed img, div.journal a.feed img,
|
|
||||||
div.content a img.smiley, div.journal a img.smiley, img.smiley,
|
|
||||||
div.content a.inline img, div.journal a.inline img,
|
|
||||||
div.content li a.image img, div.journal li a.image img {
|
|
||||||
margin: 0; padding: 0; border: none;
|
|
||||||
}
|
|
||||||
div.image a img {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
div.image span.caption {
|
|
||||||
margin: 0 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.left { float:left; margin-right: 1em; }
|
|
||||||
.right { float:right; margin-left: 1em; }
|
|
||||||
.half img { height: 50%; width: 50%; }
|
|
||||||
.face img { width: 200px; }
|
|
||||||
div.left .left, div.right .right {
|
|
||||||
float:none;
|
|
||||||
}
|
|
||||||
.center { text-align:center; }
|
|
||||||
table.aside {
|
|
||||||
float:right;
|
|
||||||
width:40%;
|
|
||||||
margin-left: 1em;
|
|
||||||
padding: 1ex;
|
|
||||||
border: 1px dotted #666;
|
|
||||||
}
|
|
||||||
table.aside td {
|
|
||||||
text-align:left;
|
|
||||||
}
|
|
||||||
div.sidebar {
|
|
||||||
float:right; width: 250px;
|
|
||||||
text-align: right;
|
|
||||||
border: none;
|
|
||||||
margin: 1ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bigsidebar {
|
|
||||||
float:right;
|
|
||||||
width: 500px;
|
|
||||||
border: none;
|
|
||||||
margin-left: 1ex;
|
|
||||||
font-size: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.irc dt { width:20ex; float:left; text-align:right; clear:left; }
|
|
||||||
dl.irc dt span.time { float:left; }
|
|
||||||
dl.irc dd { margin-left:22ex; }
|
|
||||||
|
|
||||||
/* portrait */
|
|
||||||
|
|
||||||
div.footer, div.comment, hr { clear: both; }
|
|
||||||
.portrait { float: left; font-size: small; margin-right: 1em; }
|
|
||||||
.portrait a { color: #999; }
|
|
||||||
|
|
||||||
div.left { float:left; margin:1em; padding: 0.5em; }
|
|
||||||
div.left p { display:table-cell; }
|
|
||||||
div.left p + p { display:table-caption; caption-side:bottom; }
|
|
||||||
|
|
||||||
p.table a { float:left; width:20ex; }
|
|
||||||
p.table + p { clear:both; }
|
|
||||||
|
|
||||||
/* mastodon */
|
|
||||||
|
|
||||||
div.mastodon { padding: 0 2em }
|
|
||||||
div.mastodon .status {padding-top: 1ex; border-bottom: 1px solid grey;}
|
|
||||||
div.mastodon .status:first-child {border-top: 1px solid grey;}
|
|
||||||
|
|
||||||
/* rss */
|
|
||||||
|
|
||||||
channel * { display: block; }
|
|
||||||
|
|
||||||
channel title {
|
|
||||||
margin-top: 30pt;
|
|
||||||
}
|
|
||||||
copyright {
|
|
||||||
font-size: 14pt;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
channel:before {
|
|
||||||
font-size: 14pt;
|
|
||||||
display: block;
|
|
||||||
margin: 1em;
|
|
||||||
padding: 0.5em;
|
|
||||||
content: "This document is to be read in a feed reader. The item content is escaped HTML, which makes it hard to read for humans. Sorry!";
|
|
||||||
color: red;
|
|
||||||
border: 1px solid red;
|
|
||||||
}
|
|
||||||
license {
|
|
||||||
font-size: 11pt;
|
|
||||||
margin-bottom: 9pt;
|
|
||||||
}
|
|
||||||
contributor:before { content: "Last edited by "; }
|
|
||||||
contributor:after { content: "."; }
|
|
||||||
generator:before { content: "Feed generated by "; }
|
|
||||||
generator:after { content: "."; }
|
|
||||||
channel description {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
item description {
|
|
||||||
font-weight: normal;
|
|
||||||
margin-bottom: 1em;
|
|
||||||
}
|
|
||||||
link, managingEditor, webMaster, license, url,
|
|
||||||
docs, language,
|
|
||||||
pubDate, lastBuildDate, ttl, guid, category, comments,
|
|
||||||
docs, image title, image link,
|
|
||||||
status, version, diff, history, importance {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
@@ -1,615 +0,0 @@
|
|||||||
/* This file is in the public domain. */
|
|
||||||
html{ text-align: center; }
|
|
||||||
|
|
||||||
body, rss {
|
|
||||||
font-family: "DejaVu Serif", Palatino, serif;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 16pt;
|
|
||||||
padding: 1em 3em;
|
|
||||||
max-width: 72ex;
|
|
||||||
display: inline-block;
|
|
||||||
text-align: left;
|
|
||||||
color: #000;
|
|
||||||
background-color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (max-device-width: 600px) {
|
|
||||||
body {
|
|
||||||
padding: 1ex;
|
|
||||||
}
|
|
||||||
textarea {
|
|
||||||
font-size: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* code */
|
|
||||||
|
|
||||||
textarea, pre, code, tt {
|
|
||||||
font-family: "DejaVu Mono", "Andale Mono", Monaco, "Courier New", Courier, monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre, code, tt {
|
|
||||||
font-size: 12pt; /* fits 80ex */
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
overflow:hidden;
|
|
||||||
white-space: pre-wrap; /* CSS 3 */
|
|
||||||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
|
||||||
white-space: -pre-wrap; /* Opera 4-6 */
|
|
||||||
white-space: -o-pre-wrap; /* Opera 7 */
|
|
||||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
|
||||||
}
|
|
||||||
|
|
||||||
@import url(file:///home/alex/alexschroeder.ch/css/alex-2017.css) print;
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
body {
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* hide all the crap */
|
|
||||||
div.diff, div.diff+hr, div.refer, div.near, div.definition, div.sister,
|
|
||||||
div.cal, div.footer, span.specialdays, span.gotobar, a.edit, a.number span,
|
|
||||||
div.rc form, form.tiny, p.comment, p#plus1, div.g-plusone, div.content a.feed {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
div.content a.book,
|
|
||||||
div.content a.movie {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
a cite {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
img[alt="RSS"] { display: none }
|
|
||||||
a.rss { font-size: 8pt }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* headings: we can use larger sizes if we use a lighter color.
|
|
||||||
we cannot inherit the font-family because header and footer use a narrow font. */
|
|
||||||
|
|
||||||
h1, h2, h3, title {
|
|
||||||
font-family: inherit;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
h1, channel title {
|
|
||||||
font-size: 32pt;
|
|
||||||
margin: 1em 0 0.5em 0;
|
|
||||||
padding: 0.4em 0;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 18pt;
|
|
||||||
margin: 2em 0 0 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
h3 {
|
|
||||||
font-size: inherit;
|
|
||||||
font-weight: bold;
|
|
||||||
padding: 0;
|
|
||||||
margin: 1em 0 0 0;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* headers in the journal are smaller */
|
|
||||||
|
|
||||||
div.journal h1, item title {
|
|
||||||
font-size: inherit;
|
|
||||||
padding: 0;
|
|
||||||
clear: both;
|
|
||||||
border-bottom: 1px solid #000;
|
|
||||||
}
|
|
||||||
div.journal h2 {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
}
|
|
||||||
div.journal h3 {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
font-weight: inherit;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
div.journal hr {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
p.more {
|
|
||||||
margin-top: 3em;
|
|
||||||
}
|
|
||||||
/* Links in headings appear on journal pages. */
|
|
||||||
|
|
||||||
h1 a, h2 a, h3 a {
|
|
||||||
color:inherit;
|
|
||||||
text-decoration:none;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
h1 a:visited, h2 a:visited, h3 a:visited {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* for download buttons and the like */
|
|
||||||
|
|
||||||
.button {
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 120%;
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 0.4em 0.6em;
|
|
||||||
text-shadow: 0px -1px 0px #ccc;
|
|
||||||
background-color: #cfa;
|
|
||||||
border: 1px solid #9d8;
|
|
||||||
border-radius: 5px;
|
|
||||||
box-shadow: 0px 1px 3px white inset, 0px 1px 3px black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button .icon {
|
|
||||||
color: #363;
|
|
||||||
text-shadow: 0px -1px 1px white, 0px 1px 3px #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button a {
|
|
||||||
text-decoration: none;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* links */
|
|
||||||
|
|
||||||
a.pencil {
|
|
||||||
padding-left: 1ex;
|
|
||||||
text-decoration: none;
|
|
||||||
color: inherit;
|
|
||||||
visibility: hidden;
|
|
||||||
transition: visibility 0s 1s, opacity 1s linear;
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
*:hover > a.pencil {
|
|
||||||
visibility: visible;
|
|
||||||
transition: opacity .5s linear;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
a.pencil {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a.number {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* stop floating content from flowing over the footer */
|
|
||||||
|
|
||||||
hr {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the distance between links in the navigation bars */
|
|
||||||
|
|
||||||
span.bar a {
|
|
||||||
margin-right: 1ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
a img {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* search box in the top bar */
|
|
||||||
|
|
||||||
.header form, .header p {
|
|
||||||
display: inline;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
label[for="searchlang"], #searchlang, .header input[type="submit"] {
|
|
||||||
/* don't use display: none! http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form */
|
|
||||||
visibility: hidden; position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header input {
|
|
||||||
width: 10ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* other form fields */
|
|
||||||
|
|
||||||
input[type="text"] {
|
|
||||||
padding: 0;
|
|
||||||
font-size: 80%;
|
|
||||||
line-height: 125%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* styling for divs that will be invisible when printing
|
|
||||||
when printing. */
|
|
||||||
|
|
||||||
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
|
||||||
|
|
||||||
font-size: 14pt;
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
|
||||||
font-size: 8pt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
div.footer form.search {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Recent Changes */
|
|
||||||
|
|
||||||
div.rc {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
div.rc li + li {
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
div.rc li strong, table.history strong, strong.description {
|
|
||||||
font-family: inherit;
|
|
||||||
font-weight: inherit;
|
|
||||||
}
|
|
||||||
.red {
|
|
||||||
background: red;
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
|
|
||||||
.orange {
|
|
||||||
background: orange;
|
|
||||||
color: orange;
|
|
||||||
}
|
|
||||||
|
|
||||||
.yellow {
|
|
||||||
background: yellow;
|
|
||||||
color: yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.green {
|
|
||||||
background: green;
|
|
||||||
color: green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.blue {
|
|
||||||
background: blue;
|
|
||||||
color: blue;
|
|
||||||
}
|
|
||||||
|
|
||||||
.indigo {
|
|
||||||
background: indigo;
|
|
||||||
color: indigo;
|
|
||||||
}
|
|
||||||
|
|
||||||
.violet {
|
|
||||||
background: violet;
|
|
||||||
color: violet;
|
|
||||||
}
|
|
||||||
|
|
||||||
.white {
|
|
||||||
background: white;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ip-code {
|
|
||||||
border: 1px solid #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Diff */
|
|
||||||
|
|
||||||
div.diff {
|
|
||||||
padding-left: 5%;
|
|
||||||
padding-right: 5%;
|
|
||||||
font-size: 12pt;
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
div.old {
|
|
||||||
background-color: #ffffaf;
|
|
||||||
}
|
|
||||||
div.new {
|
|
||||||
background-color: #cfffcf;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.refer {
|
|
||||||
padding-left: 5%;
|
|
||||||
padding-right: 5%;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.message {
|
|
||||||
background-color:#fee;
|
|
||||||
color:#000;
|
|
||||||
}
|
|
||||||
|
|
||||||
img.xml {
|
|
||||||
border:none;
|
|
||||||
padding:1px;
|
|
||||||
}
|
|
||||||
a.small img {
|
|
||||||
max-width:300px;
|
|
||||||
}
|
|
||||||
a.large img {
|
|
||||||
max-width:600px;
|
|
||||||
}
|
|
||||||
div.sister {
|
|
||||||
margin-right:1ex;
|
|
||||||
background-color:inherit;
|
|
||||||
}
|
|
||||||
div.sister p {
|
|
||||||
margin-top:0;
|
|
||||||
}
|
|
||||||
div.sister hr {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
div.sister img {
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.near, div.definition {
|
|
||||||
background-color:#efe;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.sidebar {
|
|
||||||
float:right;
|
|
||||||
border:1px dotted #000;
|
|
||||||
padding:0 1em;
|
|
||||||
}
|
|
||||||
div.sidebar ul {
|
|
||||||
padding-left:1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* replacements, features */
|
|
||||||
|
|
||||||
ins {
|
|
||||||
font-style: italic;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
acronym, abbr {
|
|
||||||
letter-spacing:0.1em;
|
|
||||||
font-variant:small-caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Interlink prefix not shown */
|
|
||||||
a .site, a .separator {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
a cite { font:inherit; }
|
|
||||||
/* browser borkage */
|
|
||||||
textarea[name="text"] { width:97%; height:80%; }
|
|
||||||
textarea[name="summary"] { width:97%; height:3em; }
|
|
||||||
/* comments */
|
|
||||||
textarea[name="aftertext"] { width:97%; height:10em; }
|
|
||||||
div.commentshown {
|
|
||||||
font-size: 12pt;
|
|
||||||
padding: 2em 0;
|
|
||||||
}
|
|
||||||
div.commenthidden {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
div.commentshown {
|
|
||||||
display:block;
|
|
||||||
}
|
|
||||||
p.comment {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
div.comment {
|
|
||||||
font-size: 14pt;
|
|
||||||
}
|
|
||||||
div.comment h2 {
|
|
||||||
margin-top: 5em;
|
|
||||||
}
|
|
||||||
/* comment pages with username, homepage, and email subscription */
|
|
||||||
.comment form span { display: block; }
|
|
||||||
.comment form span label { display: inline-block; width: 10em; }
|
|
||||||
/* IE sucks */
|
|
||||||
.comment input#username,
|
|
||||||
.comment input#homepage,
|
|
||||||
.comment input#mail { width: 20em; }
|
|
||||||
|
|
||||||
/* cal */
|
|
||||||
div.month { padding:0; margin:0 2ex; }
|
|
||||||
body > div.month {
|
|
||||||
float:right;
|
|
||||||
background-color: inherit;
|
|
||||||
border:solid thin;
|
|
||||||
padding:0 1ex;
|
|
||||||
}
|
|
||||||
.year > .month {
|
|
||||||
float:left;
|
|
||||||
}
|
|
||||||
.footer {
|
|
||||||
clear:both;
|
|
||||||
}
|
|
||||||
.month .title a.local {
|
|
||||||
background-color: inherit;
|
|
||||||
}
|
|
||||||
.month a.local {
|
|
||||||
background-color: #ddf;
|
|
||||||
}
|
|
||||||
.month a.today {
|
|
||||||
background-color: #fdd;
|
|
||||||
}
|
|
||||||
.month a {
|
|
||||||
color:inherit;
|
|
||||||
font-weight:inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
/* history tables and other tables */
|
|
||||||
table.history {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
td.history {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
border: none;
|
|
||||||
border-top: 1px solid #ccc;
|
|
||||||
border-bottom: 1px solid #ccc;
|
|
||||||
padding: 1em;
|
|
||||||
margin: 1em 2em;
|
|
||||||
}
|
|
||||||
table tr td, table tr th {
|
|
||||||
border: none;
|
|
||||||
padding: 0.2em 0.5em;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
table.arab tr th {
|
|
||||||
font-weight:normal;
|
|
||||||
text-align:left;
|
|
||||||
vertical-align:top;
|
|
||||||
}
|
|
||||||
table.arab, table.arab tr th, table.arab tr td {
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
th.nobreak {
|
|
||||||
white-space:nowrap;
|
|
||||||
}
|
|
||||||
table.full { width:99%; margin-left:1px; }
|
|
||||||
table.j td, table.j th, table tr td.j, table tr th.j, .j { text-align:justify; }
|
|
||||||
table.l td, table.l th, table tr td.l, table tr th.l, .l { text-align:left; }
|
|
||||||
table.r td, table.r th, table tr td.r, table tr th.r, .r { text-align:right; }
|
|
||||||
table.c td, table.c th, table tr td.c, table tr th.c, .c { text-align:center; }
|
|
||||||
table.t td { vertical-align: top; }
|
|
||||||
td.half { width:50%; }
|
|
||||||
td.third { width:33%; }
|
|
||||||
|
|
||||||
form table td { padding:5px; }
|
|
||||||
|
|
||||||
/* lists */
|
|
||||||
dd { padding-bottom:0.5ex; }
|
|
||||||
dl.inside dt { float:left; }
|
|
||||||
/* search */
|
|
||||||
div.search span.result { font-size:larger; }
|
|
||||||
div.search span.info { font-size:smaller; font-style:italic; }
|
|
||||||
div.search p.result { display:none; }
|
|
||||||
|
|
||||||
img.logo {
|
|
||||||
float: right;
|
|
||||||
margin: 0 0 0 1ex;
|
|
||||||
padding: 0;
|
|
||||||
border: 1px solid #000;
|
|
||||||
opacity: 0.3;
|
|
||||||
background-color:#ffe;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* images */
|
|
||||||
|
|
||||||
div.content a.feed img, div.journal a.feed img,
|
|
||||||
div.content a img.smiley, div.journal a img.smiley, img.smiley,
|
|
||||||
div.content a.inline img, div.journal a.inline img,
|
|
||||||
div.content li a.image img, div.journal li a.image img {
|
|
||||||
margin: 0; padding: 0; border: none;
|
|
||||||
}
|
|
||||||
div.image a img {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
div.image span.caption {
|
|
||||||
margin: 0 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.left { float:left; margin-right: 1em; }
|
|
||||||
.right { float:right; margin-left: 1em; }
|
|
||||||
.half img { height: 50%; width: 50%; }
|
|
||||||
.face img { width: 200px; }
|
|
||||||
div.left .left, div.right .right {
|
|
||||||
float:none;
|
|
||||||
}
|
|
||||||
.center { text-align:center; }
|
|
||||||
table.aside {
|
|
||||||
float:right;
|
|
||||||
width:40%;
|
|
||||||
margin-left: 1em;
|
|
||||||
padding: 1ex;
|
|
||||||
border: 1px dotted #666;
|
|
||||||
}
|
|
||||||
table.aside td {
|
|
||||||
text-align:left;
|
|
||||||
}
|
|
||||||
div.sidebar {
|
|
||||||
float:right; width: 250px;
|
|
||||||
text-align: right;
|
|
||||||
border: none;
|
|
||||||
margin: 1ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bigsidebar {
|
|
||||||
float:right;
|
|
||||||
width: 500px;
|
|
||||||
border: none;
|
|
||||||
margin-left: 1ex;
|
|
||||||
font-size: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.irc dt { width:20ex; float:left; text-align:right; clear:left; }
|
|
||||||
dl.irc dt span.time { float:left; }
|
|
||||||
dl.irc dd { margin-left:22ex; }
|
|
||||||
|
|
||||||
/* portrait */
|
|
||||||
|
|
||||||
div.footer, div.comment, hr { clear: both; }
|
|
||||||
.portrait { float: left; font-size: small; margin-right: 1em; }
|
|
||||||
.portrait a { color: #999; }
|
|
||||||
|
|
||||||
div.left { float:left; margin:1em; padding: 0.5em; }
|
|
||||||
div.left p { display:table-cell; }
|
|
||||||
div.left p + p { display:table-caption; caption-side:bottom; }
|
|
||||||
|
|
||||||
p.table a { float:left; width:20ex; }
|
|
||||||
p.table + p { clear:both; }
|
|
||||||
|
|
||||||
/* mastodon */
|
|
||||||
|
|
||||||
div.mastodon { padding: 0 2em }
|
|
||||||
div.mastodon .status {padding-top: 1ex; border-bottom: 1px solid grey;}
|
|
||||||
div.mastodon .status:first-child {border-top: 1px solid grey;}
|
|
||||||
|
|
||||||
/* terminal "screenshots" */
|
|
||||||
|
|
||||||
.terminal {
|
|
||||||
width: 80%;
|
|
||||||
margin: 50px auto 100px auto;
|
|
||||||
padding: 5px;
|
|
||||||
font-size: 62%; /* fits 80ex */
|
|
||||||
border: 1px solid #999;
|
|
||||||
border-radius: 5px;
|
|
||||||
box-shadow: 0px 25px 50px #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* rss */
|
|
||||||
|
|
||||||
channel * { display: block; }
|
|
||||||
|
|
||||||
channel title {
|
|
||||||
margin-top: 30pt;
|
|
||||||
}
|
|
||||||
copyright {
|
|
||||||
font-size: 14pt;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
channel:before {
|
|
||||||
font-size: 14pt;
|
|
||||||
display: block;
|
|
||||||
margin: 1em;
|
|
||||||
padding: 0.5em;
|
|
||||||
content: "This document is to be read in a feed reader. The item content is escaped HTML, which makes it hard to read for humans. Sorry!";
|
|
||||||
color: red;
|
|
||||||
border: 1px solid red;
|
|
||||||
}
|
|
||||||
license {
|
|
||||||
font-size: 11pt;
|
|
||||||
margin-bottom: 9pt;
|
|
||||||
}
|
|
||||||
contributor:before { content: "Last edited by "; }
|
|
||||||
contributor:after { content: "."; }
|
|
||||||
generator:before { content: "Feed generated by "; }
|
|
||||||
generator:after { content: "."; }
|
|
||||||
channel description {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
item description {
|
|
||||||
font-weight: normal;
|
|
||||||
margin-bottom: 1em;
|
|
||||||
}
|
|
||||||
link, managingEditor, webMaster, license, url,
|
|
||||||
docs, language,
|
|
||||||
pubDate, lastBuildDate, ttl, guid, category, comments,
|
|
||||||
docs, image title, image link,
|
|
||||||
status, version, diff, history, importance {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
@@ -321,6 +321,7 @@ div.sister {
|
|||||||
float:left;
|
float:left;
|
||||||
margin-right:1ex;
|
margin-right:1ex;
|
||||||
padding-right:1ex;
|
padding-right:1ex;
|
||||||
|
border-right:1px dashed;
|
||||||
}
|
}
|
||||||
div.sister p { padding:1ex; margin:0; }
|
div.sister p { padding:1ex; margin:0; }
|
||||||
div.sister hr { display:none; }
|
div.sister hr { display:none; }
|
||||||
|
|||||||
425
css/latex.css
@@ -1,425 +0,0 @@
|
|||||||
/*!
|
|
||||||
* LaTeX.css (https://latex.now.sh/)
|
|
||||||
*
|
|
||||||
* Source: https://github.com/vincentdoerig/latex-css
|
|
||||||
* Licensed under MIT (https://github.com/vincentdoerig/latex-css/blob/master/LICENSE)
|
|
||||||
*/
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Latin Modern';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: normal;
|
|
||||||
font-display: swap;
|
|
||||||
src: url('/style/fonts/LM-regular.woff2') format('woff2'),
|
|
||||||
url('/style/fonts/LM-regular.woff') format('woff'),
|
|
||||||
url('/style/fonts/LM-regular.ttf') format('truetype');
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Latin Modern';
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: normal;
|
|
||||||
font-display: swap;
|
|
||||||
src: url('/style/fonts/LM-italic.woff2') format('woff2'),
|
|
||||||
url('/style/fonts/LM-italic.woff') format('woff'),
|
|
||||||
url('/style/fonts/LM-italic.ttf') format('truetype');
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Latin Modern';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: bold;
|
|
||||||
font-display: swap;
|
|
||||||
src: url('/style/fonts/LM-bold.woff2') format('woff2'),
|
|
||||||
url('/style/fonts/LM-bold.woff') format('woff'),
|
|
||||||
url('/style/fonts/LM-bold.ttf') format('truetype');
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Latin Modern';
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: bold;
|
|
||||||
font-display: swap;
|
|
||||||
src: url('/style/fonts/LM-bold-italic.woff2') format('woff2'),
|
|
||||||
url('/style/fonts/LM-bold-italic.woff') format('woff'),
|
|
||||||
url('/style/fonts/LM-bold-italic.ttf') format('truetype');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Box sizing rules */
|
|
||||||
*,
|
|
||||||
*::before,
|
|
||||||
*::after {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remove default margin */
|
|
||||||
body,
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
p,
|
|
||||||
ul[class],
|
|
||||||
ol[class],
|
|
||||||
li,
|
|
||||||
figure,
|
|
||||||
figcaption,
|
|
||||||
dl,
|
|
||||||
dd {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make default font-size 1rem and add smooth scrolling to anchors */
|
|
||||||
html {
|
|
||||||
font-size: 1.4rem;
|
|
||||||
scroll-behavior: smooth;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: 'Latin Modern', Georgia, Cambria, 'DejaVu Serif', 'Times New Roman', Times, serif;
|
|
||||||
line-height: 1.4;
|
|
||||||
max-width: 80ch;
|
|
||||||
min-height: 100vh;
|
|
||||||
overflow-x: hidden;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 1.25rem;
|
|
||||||
|
|
||||||
counter-reset: theorem;
|
|
||||||
counter-reset: definition;
|
|
||||||
|
|
||||||
color: hsl(0, 5%, 10%);
|
|
||||||
background-color: hsl(210, 20%, 98%);
|
|
||||||
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Justify and hyphenate all paragraphs */
|
|
||||||
p {
|
|
||||||
text-align: justify;
|
|
||||||
hyphens: auto;
|
|
||||||
-webkit-hyphens: auto;
|
|
||||||
-moz-hyphens: auto;
|
|
||||||
margin-top: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A elements that don't have a class get default styles */
|
|
||||||
a:not([class]) {
|
|
||||||
text-decoration-skip-ink: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make links red */
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #a00;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #800;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:focus {
|
|
||||||
outline-offset: 2px;
|
|
||||||
outline: 2px solid hsl(220, 90%, 52%);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Ueberschriften mit Links nur dezent einfärben */
|
|
||||||
h1 a, h1 a:visited,
|
|
||||||
h2 a, h2 a:visited,
|
|
||||||
h3 a, h3 a:visited,
|
|
||||||
h4 a, h4 a:visited,
|
|
||||||
h5 a, h5 a:visited,
|
|
||||||
h6 a, h6 a:visited {
|
|
||||||
color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* goto bar */
|
|
||||||
div.menu form.search {
|
|
||||||
font-size:75%;
|
|
||||||
margin-top:2em;
|
|
||||||
margin-bottom:3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.menu span.gotobar a.local,
|
|
||||||
div.menu span.gotobar a.local:visited {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1e133c87;
|
|
||||||
margin-right:1.1em;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make images easier to work with */
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Inherit fonts for inputs and buttons */
|
|
||||||
input,
|
|
||||||
button,
|
|
||||||
textarea,
|
|
||||||
select {
|
|
||||||
font: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prevent textarea from overflowing */
|
|
||||||
textarea {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Natural flow and rhythm in articles by default */
|
|
||||||
article > * + * {
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Styles for inline code or code snippets */
|
|
||||||
code,
|
|
||||||
pre,
|
|
||||||
kbd {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
|
|
||||||
monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
padding: 1rem 1.4rem;
|
|
||||||
max-width: 100%;
|
|
||||||
overflow: auto;
|
|
||||||
border-radius: 4px;
|
|
||||||
background: hsl(210, 28%, 93%);
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
font-size: 95%;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
kbd {
|
|
||||||
background: hsl(210, 5%, 100%);
|
|
||||||
border: 1px solid hsl(210, 5%, 70%);
|
|
||||||
border-radius: 2px;
|
|
||||||
padding: 2px 4px;
|
|
||||||
font-size: 75%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make table 100% width, add borders between rows */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
border-spacing: 0;
|
|
||||||
width: 100%;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
th,
|
|
||||||
td {
|
|
||||||
text-align: left;
|
|
||||||
padding: 0.5rem;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
border-bottom: 1px solid hsl(0, 0%, 85%);
|
|
||||||
}
|
|
||||||
thead th {
|
|
||||||
border-bottom: 2px solid hsl(0, 0%, 70%);
|
|
||||||
}
|
|
||||||
tfoot th {
|
|
||||||
border-top: 2px solid hsl(0, 0%, 70%);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Center align the title */
|
|
||||||
h1:first-child {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Nested ordered list for ToC */
|
|
||||||
nav ol {
|
|
||||||
counter-reset: item;
|
|
||||||
padding-left: 2rem;
|
|
||||||
}
|
|
||||||
nav li {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
nav li:before {
|
|
||||||
content: counters(item, '.') ' ';
|
|
||||||
counter-increment: item;
|
|
||||||
padding-right: 0.85rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Center definitions (most useful for display equations) */
|
|
||||||
dl dd {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Theorem */
|
|
||||||
.theorem {
|
|
||||||
counter-increment: theorem;
|
|
||||||
display: block;
|
|
||||||
margin: 12px 0;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
.theorem::before {
|
|
||||||
content: 'Satz ' counter(theorem) '. ';
|
|
||||||
font-weight: bold;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Lemma */
|
|
||||||
.lemma {
|
|
||||||
counter-increment: theorem;
|
|
||||||
display: block;
|
|
||||||
margin: 12px 0;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
.lemma::before {
|
|
||||||
content: 'Lemma ' counter(theorem) '. ';
|
|
||||||
font-weight: bold;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Proof */
|
|
||||||
.proof {
|
|
||||||
display: block;
|
|
||||||
margin: 12px 0;
|
|
||||||
font-style: normal;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.proof::before {
|
|
||||||
content: 'Beweis. ' attr(title);
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
.proof:after {
|
|
||||||
content: '◾️';
|
|
||||||
position: absolute;
|
|
||||||
right: -12px;
|
|
||||||
bottom: -2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Definition */
|
|
||||||
.definition {
|
|
||||||
counter-increment: definition;
|
|
||||||
display: block;
|
|
||||||
margin: 12px 0;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
.definition::before {
|
|
||||||
content: 'Definition ' counter(definition) '. ';
|
|
||||||
font-weight: bold;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Center align author name, use small caps and add vertical spacing */
|
|
||||||
.author {
|
|
||||||
margin: 0.85rem 0;
|
|
||||||
font-variant-caps: small-caps;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make footnote text smaller and left align it (looks bad with long URLs) */
|
|
||||||
.footnotes p {
|
|
||||||
text-align: left;
|
|
||||||
line-height: 1.5;
|
|
||||||
font-size: 85%;
|
|
||||||
margin-bottom: 0.4rem;
|
|
||||||
}
|
|
||||||
.footnotes {
|
|
||||||
border-top: 1px solid hsl(0, 0%, 39%);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Center title and paragraph */
|
|
||||||
.abstract,
|
|
||||||
.abstract p {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.abstract {
|
|
||||||
margin: 2.25rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Format the LaTeX symbol correctly (a higher up, e lower) */
|
|
||||||
.latex span:nth-child(1) {
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-size: 0.75em;
|
|
||||||
vertical-align: 0.28em;
|
|
||||||
margin-left: -0.48em;
|
|
||||||
margin-right: -0.15em;
|
|
||||||
line-height: 1ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.latex span:nth-child(2) {
|
|
||||||
text-transform: uppercase;
|
|
||||||
vertical-align: -0.5ex;
|
|
||||||
margin-left: -0.1667em;
|
|
||||||
margin-right: -0.125em;
|
|
||||||
line-height: 1ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Heading typography */
|
|
||||||
h1 {
|
|
||||||
font-size: 2.5rem;
|
|
||||||
line-height: 3.25rem;
|
|
||||||
margin-bottom: 1.625rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: 1.7rem;
|
|
||||||
line-height: 2rem;
|
|
||||||
margin-top: 3rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-size: 1.4rem;
|
|
||||||
margin-top: 2.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size: 1.2rem;
|
|
||||||
margin-top: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h5 {
|
|
||||||
font-size: 1rem;
|
|
||||||
margin-top: 1.8rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h6 {
|
|
||||||
font-size: 1rem;
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: normal;
|
|
||||||
margin-top: 2.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6 {
|
|
||||||
line-height: 1.625rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 + h2 {
|
|
||||||
margin-top: 1.625rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 + h3,
|
|
||||||
h3 + h4,
|
|
||||||
h4 + h5 {
|
|
||||||
margin-top: 0.8rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h5 + h6 {
|
|
||||||
margin-top: -0.8rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6 {
|
|
||||||
margin-bottom: 0.8rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.diff div.old {
|
|
||||||
background-color: #FFFFAF;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.diff div.new {
|
|
||||||
background-color: #CFFFCF;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.content blockquote {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -27,10 +27,6 @@ textarea, pre, code, tt {
|
|||||||
font-family: Times, serif;
|
font-family: Times, serif;
|
||||||
font-size:10pt;
|
font-size:10pt;
|
||||||
}
|
}
|
||||||
/* Printing from Firefox */
|
|
||||||
svg {
|
|
||||||
transform: translate(-1.5cm, -1cm);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* iPhone */
|
/* iPhone */
|
||||||
@@ -51,10 +47,9 @@ textarea, pre, code, tt {
|
|||||||
.browse { min-height: 3em; }
|
.browse { min-height: 3em; }
|
||||||
.header form, .header p { margin: 0; }
|
.header form, .header p { margin: 0; }
|
||||||
/* hide the buttons but don't use display:none because of
|
/* hide the buttons but don't use display:none because of
|
||||||
http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form
|
http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form */
|
||||||
.header input[type="submit"] { position: absolute; visibility: hidden; } */
|
.header input[type="submit"] { position: absolute; visibility: hidden; }
|
||||||
.header input { width: 6em; font-size: 80%; }
|
.header input { width: 5em; font-size: 80%; }
|
||||||
.header input[type="checkbox"] { width: 1em; }
|
|
||||||
.footer { clear:both; font-size: 90%; }
|
.footer { clear:both; font-size: 90%; }
|
||||||
.content input { font-size: 80%; line-height: 125%; }
|
.content input { font-size: 80%; line-height: 125%; }
|
||||||
|
|
||||||
@@ -206,12 +201,10 @@ div.message {
|
|||||||
}
|
}
|
||||||
table.history { border-style:none; }
|
table.history { border-style:none; }
|
||||||
td.history { border-style:none; }
|
td.history { border-style:none; }
|
||||||
div.history span.dash + strong { font-weight: normal; }
|
|
||||||
span.result { font-size:larger; }
|
span.result { font-size:larger; }
|
||||||
span.info { font-size:smaller; font-style:italic; }
|
span.info { font-size:smaller; font-style:italic; }
|
||||||
div.rc hr { display: none; }
|
div.rc hr { display: none; }
|
||||||
div.rc li { padding-bottom: 0.5em; }
|
div.rc li { padding-bottom: 0.5em; }
|
||||||
div.rc li strong { font-weight: normal; }
|
|
||||||
|
|
||||||
/* Tables */
|
/* Tables */
|
||||||
table.user {
|
table.user {
|
||||||
|
|||||||
103
css/wiki.css
@@ -51,13 +51,13 @@ a.image:hover img {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* a.definition soll aussehen wie h2 */
|
/* a.definition soll aussehen wie h2 */
|
||||||
h2, p > a.definition {
|
h2, p a.definition {
|
||||||
display: block;
|
display: block;
|
||||||
clear: both;
|
clear: both;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Such Link im h1 soll nicht auffallen. */
|
/* Such Link im h1 soll nicht auffallen. */
|
||||||
h1, h2, h3, h4, h1 a, h1 a:visited, p > a.definition {
|
h1, h2, h3, h4, h1 a, h1 a:visited, p a.definition {
|
||||||
color: #666;
|
color: #666;
|
||||||
font-size: 30pt;
|
font-size: 30pt;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
@@ -172,50 +172,6 @@ span.bar a {
|
|||||||
padding: 1ex 0;
|
padding: 1ex 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.red {
|
|
||||||
background: red;
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
|
|
||||||
.orange {
|
|
||||||
background: orange;
|
|
||||||
color: orange;
|
|
||||||
}
|
|
||||||
|
|
||||||
.yellow {
|
|
||||||
background: yellow;
|
|
||||||
color: yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.green {
|
|
||||||
background: green;
|
|
||||||
color: green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.blue {
|
|
||||||
background: blue;
|
|
||||||
color: blue;
|
|
||||||
}
|
|
||||||
|
|
||||||
.indigo {
|
|
||||||
background: indigo;
|
|
||||||
color: indigo;
|
|
||||||
}
|
|
||||||
|
|
||||||
.violet {
|
|
||||||
background: violet;
|
|
||||||
color: violet;
|
|
||||||
}
|
|
||||||
|
|
||||||
.white {
|
|
||||||
background: white;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ip-code {
|
|
||||||
border: 1px solid #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
hr {
|
||||||
border: none;
|
border: none;
|
||||||
color: black;
|
color: black;
|
||||||
@@ -264,18 +220,49 @@ code {
|
|||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for https://oddmuse.org/wiki/All_Modules */
|
@font-face {
|
||||||
.foo_list + .journal h1 {
|
font-family: 'Gentium Basic';
|
||||||
font: inherit;
|
font-style: normal;
|
||||||
border: none;
|
font-weight: 700;
|
||||||
display: list-item;
|
src: local('Gentium Basic Bold'), local('GentiumBasic-Bold'), url(/fonts/GenBasB.woff) format('woff');
|
||||||
margin-top: 0;
|
|
||||||
margin-left: 1em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.foo_list + .journal a {
|
@font-face {
|
||||||
font: inherit;
|
font-family: 'Gentium Basic';
|
||||||
border: none;
|
font-style: italic;
|
||||||
text-decoration: none;
|
font-weight: 400;
|
||||||
color: #a00;
|
src: local('Gentium Basic Italic'), local('GentiumBasic-Italic'), url(/fonts/GenBasI.woff) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Basic';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Gentium Basic Bold Italic'), local('GentiumBasic-BoldItalic'), url(/fonts/GenBasBI.woff) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Basic';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Gentium Basic'), local('GentiumBasic'), url(/fonts/GenBasR.woff) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Plus';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Gentium Plus'), local('GentiumPlus'), url(/fonts/GentiumPlus-R.woff) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Plus';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Gentium Plus Italic'), local('GentiumPlus-Italic'), url(/fonts/GentiumPlus-I.woff) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Symbola';
|
||||||
|
src: local('Symbola'), url('/fonts/Symbola.woff') format('woff') url('/fonts/Symbola.ttf') format('truetype');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
Falky schreibt:
|
|
||||||
|
|
||||||
Zum Thema Rechte am Logo möchte ich erstmal sagen, dass es mir primär
|
|
||||||
darum ging den Auftritt von oddmuse.org aufzuhübschen. Also du/ihr
|
|
||||||
sollt durch das Logo unterstützt werden, nicht eingeschränkt.
|
|
||||||
|
|
||||||
Welche Lizenz das ab besten leisten, da hab ich keinen Schimmer.
|
|
||||||
|
|
||||||
Schön wäre, wenn irgendwo ein verweis auf "Falky [falky.de]"
|
|
||||||
auftaucht, der soll aber nicht bei jeder Verwendung auftauchen,
|
|
||||||
sondern irgendwo 'auffindbar' an 'zentraler' Stelle - halt irgendwo
|
|
||||||
auf der Homepage, dass ich darauf verweisen kann und dass niemand was
|
|
||||||
anderes behaupten kann. Das wäre es schon. Und ja, falls jemand das
|
|
||||||
logo für ein anderes Projekt verwenden möchte, kann man ja höflich
|
|
||||||
nochmal fragen oder so.
|
|
||||||
|
Before Width: | Height: | Size: 28 KiB |
@@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-61 -1 177 62">
|
|
||||||
|
|
||||||
<rect fill="#FFF" x="-60" y="0" width="175" height="60"/>
|
|
||||||
|
|
||||||
<text style="font:400 6px Neris Black" fill="#000" x="2" y="18">powered by</text>
|
|
||||||
<text style="font:400 16px Neris Thin" fill="#000" x="2" y="34">Oddmuse<tspan style="font-family:Neris Black">.org</tspan></text>
|
|
||||||
|
|
||||||
<g id="new" transform="translate(-30,30) scale(.18,.18)" >
|
|
||||||
<circle fill="#FFF" stroke="#000" stroke-width="3" cx="0" cy="0" r="160.5"/>
|
|
||||||
<g id="new" transform="rotate(207.2)" >
|
|
||||||
|
|
||||||
<path fill="#000" d="m42 -77 q24 0 38 20 c14 -1 42 -18 52 -29 c-1 50 -26 68 -44 70 c0 90 -44 141 -88 141 c-44 0 -88 -51 -88 -141 c-18 -2 -43 -20 -44 -70 c10 11 38 28 52 29 q14 -20 38 -20z"/>
|
|
||||||
<path fill="#000" transform="translate(0,60) rotate(-14)" d="m -22 46q1 50 22 50q21 0 22 -50z"/>
|
|
||||||
|
|
||||||
<path stroke="#FFF" stroke-width="4" fill="#000" d="m0 17 c 30 0 36 -2 46 -2 c 18 0 32 16 32 51 c 0 34 -12 50 -32 50 c-16 0 -26 -5 -46 -5 c-20 0 -30 5 -46 5 c-20 0 -33 -18 -32 -50 c0 -36 16 -52 32 -51 c10 0 16 2 46 2z"/>
|
|
||||||
<circle fill="#FFF" cx="44" cy="49" r="12"/> <circle fill="#FFF" cx="-44" cy="49" r="12"/>
|
|
||||||
|
|
||||||
<circle fill="#FFF" cx="42" cy="-31" r="40"/> <circle fill="#000" cx="42" cy="-31" r="20.5"/>
|
|
||||||
<circle fill="#FFF" cx="-42" cy="-31" r="40"/> <path fill="#000" transform="translate(-42,-31) rotate(55)" d="m-7 7 v20 q7 2 14 0 v-20 h20 q2 -7 0 -14 h-20 v-20 q -7 -2 -14 0 v20 h-20 q-2 7 0 14z"/>
|
|
||||||
|
|
||||||
</g></g>
|
|
||||||
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
@@ -1,19 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-100 -100 200 200" >
|
|
||||||
|
|
||||||
<rect fill="#D88" x="-100" y="-100" width="200" height="200"/>
|
|
||||||
|
|
||||||
<g id="new" transform="rotate(180) translate(0,-19)" >
|
|
||||||
|
|
||||||
<path fill="#A00" d="m42 -77 q18 0 33 14 q 12 -6 23 -16 q-2 25 -10 43 c0 110 -44 155 -88 155 c-44 0 -88 -44 -88 -155 q-8 -18 -10 -43 q11 10 23 16 q15 -14 33 -14z"/>
|
|
||||||
|
|
||||||
<path stroke="#FFF" stroke-width="6" fill="#A00" d="m0 16 c30 0 38 -2 48 -2 c17 0 33 16 33 52 c0 34 -12 52 -31 52 c-15 0 -30 -7 -50 -7 c-20 0 -35 7 -50 7 c-19 0 -31 -18 -31 -52 c0 -36 16 -52 33 -52 c10 0 18 2 48 2z"/>
|
|
||||||
<circle fill="#FFF" cx="45" cy="49" r="12"/> <circle fill="#FFF" cx="-45" cy="49" r="12"/>
|
|
||||||
|
|
||||||
<circle fill="#FFF" cx="42" cy="-31" r="40"/> <circle fill="#000" cx="42" cy="-31" r="20.5"/>
|
|
||||||
<circle fill="#FFF" cx="-42" cy="-31" r="40"/> <path fill="#666" transform="translate(-42,-31) rotate(55)" d="m-7 7 v20 q7 2 14 0 v-20 h20 q2 -7 0 -14 h-20 v-20 q -7 -2 -14 0 v20 h-20 q-2 7 0 14z"/>
|
|
||||||
|
|
||||||
</g>
|
|
||||||
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-162 -162 324 324">
|
|
||||||
|
|
||||||
<circle fill="#FEE" stroke="#000" stroke-width="3" cx="0" cy="0" r="160.5"/>
|
|
||||||
|
|
||||||
<g id="new" transform="rotate(210)" >
|
|
||||||
|
|
||||||
<path fill="#A00" d="m42 -77 q24 0 38 20 c14 -1 42 -18 52 -29 c-1 50 -26 68 -44 70 c0 90 -44 141 -88 141 c-44 0 -88 -51 -88 -141 c-18 -2 -43 -20 -44 -70 c10 11 38 28 52 29 q14 -20 38 -20z"/>
|
|
||||||
<path fill="#A00" transform="translate(0,60) rotate(-14)" d="m -22 46q1 50 22 50q21 0 22 -50z"/>
|
|
||||||
|
|
||||||
<path stroke="#FFF" stroke-width="4" fill="#D88" d="m0 17 c 30 0 36 -2 46 -2 c 18 0 32 16 32 51 c 0 34 -12 50 -32 50 c-16 0 -26 -5 -46 -5 c-20 0 -30 5 -46 5 c-20 0 -33 -18 -32 -50 c0 -36 16 -52 32 -51 c10 0 16 2 46 2z"/>
|
|
||||||
<circle fill="#FFF" cx="44" cy="49" r="12"/> <circle fill="#FFF" cx="-44" cy="49" r="12"/>
|
|
||||||
|
|
||||||
<circle fill="#FFF" cx="42" cy="-31" r="40"/> <circle fill="#000" cx="42" cy="-31" r="20.5"/>
|
|
||||||
<circle fill="#FFF" cx="-42" cy="-31" r="40"/> <path fill="#666" transform="translate(-42,-31) rotate(55)" d="m-7 7 v20 q7 2 14 0 v-20 h20 q2 -7 0 -14 h-20 v-20 q -7 -2 -14 0 v20 h-20 q-2 7 0 14z"/>
|
|
||||||
|
|
||||||
</g>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-162 -162 324 324">
|
|
||||||
|
|
||||||
<circle fill="#FFF" stroke="#000" stroke-width="3" cx="0" cy="0" r="160.5"/>
|
|
||||||
|
|
||||||
<text style="font:400 27px Neris Black" fill="#000" text-anchor="middle" x="-5" y="137">Oddmuse</text>
|
|
||||||
|
|
||||||
<g id="new" transform="rotate(210)" >
|
|
||||||
|
|
||||||
<path fill="#000" d="m42 -77 q24 0 38 20 c14 -1 42 -18 52 -29 c-1 50 -26 68 -44 70 c0 90 -44 141 -88 141 c-44 0 -88 -51 -88 -141 c-18 -2 -43 -20 -44 -70 c10 11 38 28 52 29 q14 -20 38 -20z"/>
|
|
||||||
<path fill="#000" transform="translate(0,60) rotate(-14)" d="m -22 46q1 50 22 50q21 0 22 -50z"/>
|
|
||||||
|
|
||||||
<path stroke="#FFF" stroke-width="4" fill="#000" d="m0 17 c 30 0 36 -2 46 -2 c 18 0 32 16 32 51 c 0 34 -12 50 -32 50 c-16 0 -26 -5 -46 -5 c-20 0 -30 5 -46 5 c-20 0 -33 -18 -32 -50 c0 -36 16 -52 32 -51 c10 0 16 2 46 2z"/>
|
|
||||||
<circle fill="#FFF" cx="44" cy="49" r="12"/> <circle fill="#FFF" cx="-44" cy="49" r="12"/>
|
|
||||||
|
|
||||||
<circle fill="#FFF" cx="42" cy="-31" r="40"/> <circle fill="#000" cx="42" cy="-31" r="20.5"/>
|
|
||||||
<circle fill="#FFF" cx="-42" cy="-31" r="40"/> <path fill="#000" transform="translate(-42,-31) rotate(55)" d="m-7 7 v20 q7 2 14 0 v-20 h20 q2 -7 0 -14 h-20 v-20 q -7 -2 -14 0 v20 h-20 q-2 7 0 14z"/>
|
|
||||||
|
|
||||||
</g>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 14 KiB |
@@ -1,4 +0,0 @@
|
|||||||
The logo is licensed under the [GNU Free Documentation
|
|
||||||
License](http://www.emacswiki.org/FDL) as well as the [CC BY
|
|
||||||
2.0](http://creativecommons.org/licenses/by/2.0/) license. The author
|
|
||||||
is [Murray Altheim](http://www.altheim.com/murray/).
|
|
||||||
|
Before Width: | Height: | Size: 3.9 KiB |
@@ -1,100 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://web.resource.org/cc/"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
inkscape:version="0.41"
|
|
||||||
sodipodi:docname="oddmuse-logo.svg"
|
|
||||||
sodipodi:docbase="/Users/alex/Pictures/Oddmuse"
|
|
||||||
height="1000pt"
|
|
||||||
width="1000pt"
|
|
||||||
sodipodi:version="0.32"
|
|
||||||
id="svg1">
|
|
||||||
<metadata
|
|
||||||
id="metadata32">
|
|
||||||
<rdf:RDF
|
|
||||||
id="RDF34">
|
|
||||||
<cc:Work
|
|
||||||
id="Work36"
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format
|
|
||||||
id="format38">image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
|
||||||
id="type40" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs3" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
inkscape:current-layer="svg1"
|
|
||||||
inkscape:window-y="22"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-height="535"
|
|
||||||
inkscape:window-width="640"
|
|
||||||
inkscape:cy="625.00000"
|
|
||||||
inkscape:cx="625.00000"
|
|
||||||
inkscape:zoom="0.28960000"
|
|
||||||
id="base" />
|
|
||||||
<g
|
|
||||||
transform="translate(-155.7935,22.13440)"
|
|
||||||
id="g176">
|
|
||||||
<path
|
|
||||||
transform="matrix(1.021740,0.000000,0.000000,1.021740,-299.4160,85.75640)"
|
|
||||||
sodipodi:ry="148.93437"
|
|
||||||
sodipodi:rx="142.30524"
|
|
||||||
sodipodi:cy="475.27606"
|
|
||||||
sodipodi:cx="1066.8474"
|
|
||||||
d="M 1209.1526 475.27606 A 142.30524 148.93437 0 1 1 924.54218,475.27606 A 142.30524 148.93437 0 1 1 1209.1526 475.27606 z"
|
|
||||||
id="path166"
|
|
||||||
style="fill:#ffde00;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:22.021299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
|
||||||
sodipodi:type="arc" />
|
|
||||||
<path
|
|
||||||
transform="matrix(0.591973,0.000000,0.000000,0.523224,159.0800,309.0390)"
|
|
||||||
sodipodi:ry="148.93437"
|
|
||||||
sodipodi:rx="142.30524"
|
|
||||||
sodipodi:cy="475.27606"
|
|
||||||
sodipodi:cx="1066.8474"
|
|
||||||
d="M 1209.1526 475.27606 A 142.30524 148.93437 0 1 1 924.54218,475.27606 A 142.30524 148.93437 0 1 1 1209.1526 475.27606 z"
|
|
||||||
id="path168"
|
|
||||||
style="fill:#ffde00;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:38.609402;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
|
||||||
sodipodi:type="arc" />
|
|
||||||
<rect
|
|
||||||
transform="translate(-1.416020,0.000000)"
|
|
||||||
y="561.16870"
|
|
||||||
x="694.39026"
|
|
||||||
height="88.691116"
|
|
||||||
width="195.30150"
|
|
||||||
id="rect170"
|
|
||||||
style="font-size:12.000000;fill:#ffde00;fill-opacity:1.0000000;fill-rule:evenodd;stroke-width:1.0000000pt" />
|
|
||||||
<g
|
|
||||||
id="g173">
|
|
||||||
<path
|
|
||||||
transform="translate(185.0000,-158.7500)"
|
|
||||||
sodipodi:ry="31.250000"
|
|
||||||
sodipodi:rx="25.000000"
|
|
||||||
sodipodi:cy="783.75000"
|
|
||||||
sodipodi:cx="565.00000"
|
|
||||||
d="M 590.00000 783.75000 A 25.000000 31.250000 0 1 1 540.00000,783.75000 A 25.000000 31.250000 0 1 1 590.00000 783.75000 z"
|
|
||||||
id="path171"
|
|
||||||
style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
|
||||||
sodipodi:type="arc" />
|
|
||||||
<path
|
|
||||||
transform="translate(266.2500,-158.7500)"
|
|
||||||
sodipodi:ry="31.250000"
|
|
||||||
sodipodi:rx="25.000000"
|
|
||||||
sodipodi:cy="783.75000"
|
|
||||||
sodipodi:cx="565.00000"
|
|
||||||
d="M 590.00000 783.75000 A 25.000000 31.250000 0 1 1 540.00000,783.75000 A 25.000000 31.250000 0 1 1 590.00000 783.75000 z"
|
|
||||||
id="path172"
|
|
||||||
style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
|
||||||
sodipodi:type="arc" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.9 KiB |
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -12,7 +12,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
package OddMuse;
|
package OddMuse;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
@@ -41,7 +44,7 @@ sub AdminPowerDelete {
|
|||||||
GetCluster($Page{text}));
|
GetCluster($Page{text}));
|
||||||
}
|
}
|
||||||
# Regenerate index on next request
|
# Regenerate index on next request
|
||||||
Unlink($IndexFile);
|
unlink($IndexFile);
|
||||||
ReleaseLock();
|
ReleaseLock();
|
||||||
print $q->p(T('Main lock released.'));
|
print $q->p(T('Main lock released.'));
|
||||||
PrintFooter();
|
PrintFooter();
|
||||||
@@ -58,30 +61,30 @@ sub AdminPowerRename {
|
|||||||
print $q->p(T('Main lock obtained.'));
|
print $q->p(T('Main lock obtained.'));
|
||||||
# page file -- only check for existing or missing pages here
|
# page file -- only check for existing or missing pages here
|
||||||
my $fname = GetPageFile($id);
|
my $fname = GetPageFile($id);
|
||||||
ReportError(Ts('The page %s does not exist', $id), '400 BAD REQUEST') unless IsFile($fname);
|
ReportError(Ts('The page %s does not exist', $id), '400 BAD REQUEST') unless -f $fname;
|
||||||
my $newfname = GetPageFile($new);
|
my $newfname = GetPageFile($new);
|
||||||
ReportError(Ts('The page %s already exists', $new), '400 BAD REQUEST') if IsFile($newfname);
|
ReportError(Ts('The page %s already exists', $new), '400 BAD REQUEST') if -f $newfname;
|
||||||
# Regenerate index on next request -- remove this before errors can occur!
|
# Regenerate index on next request -- remove this before errors can occur!
|
||||||
Unlink($IndexFile);
|
unlink($IndexFile);
|
||||||
# page file
|
# page file
|
||||||
CreateDir($PageDir); # It might not exist yet
|
CreateDir($PageDir); # It might not exist yet
|
||||||
Rename($fname, $newfname)
|
rename($fname, $newfname)
|
||||||
or ReportError(Tss('Cannot rename %1 to %2', $fname, $newfname) . ": $!", '500 INTERNAL SERVER ERROR');
|
or ReportError(Tss('Cannot rename %1 to %2', $fname, $newfname) . ": $!", '500 INTERNAL SERVER ERROR');
|
||||||
# keep directory
|
# keep directory
|
||||||
my $kdir = GetKeepDir($id);
|
my $kdir = GetKeepDir($id);
|
||||||
my $newkdir = GetKeepDir($new);
|
my $newkdir = GetKeepDir($new);
|
||||||
CreateDir($KeepDir); # It might not exist yet (only the parent directory!)
|
CreateDir($KeepDir); # It might not exist yet (only the parent directory!)
|
||||||
Rename($kdir, $newkdir)
|
rename($kdir, $newkdir)
|
||||||
or ReportError(Tss('Cannot rename %1 to %2', $kdir, $newkdir) . ": $!", '500 INTERNAL SERVER ERROR')
|
or ReportError(Tss('Cannot rename %1 to %2', $kdir, $newkdir) . ": $!", '500 INTERNAL SERVER ERROR')
|
||||||
if IsDir($kdir);
|
if -d $kdir;
|
||||||
# refer file
|
# refer file
|
||||||
if (defined(&GetRefererFile)) {
|
if (defined(&GetRefererFile)) {
|
||||||
my $rdir = GetRefererFile($id);
|
my $rdir = GetRefererFile($id);
|
||||||
my $newrdir = GetRefererFile($new);
|
my $newrdir = GetRefererFile($new);
|
||||||
CreateDir($RefererDir); # It might not exist yet
|
CreateDir($RefererDir); # It might not exist yet
|
||||||
Rename($rdir, $newrdir)
|
rename($rdir, $newrdir)
|
||||||
or ReportError(Tss('Cannot rename %1 to %2', $rdir, $newrdir) . ": $!", '500 INTERNAL SERVER ERROR')
|
or ReportError(Tss('Cannot rename %1 to %2', $rdir, $newrdir) . ": $!", '500 INTERNAL SERVER ERROR')
|
||||||
if IsDir($rdir);
|
if -d $rdir;
|
||||||
}
|
}
|
||||||
# RecentChanges
|
# RecentChanges
|
||||||
OpenPage($new);
|
OpenPage($new);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ $NewQuestion = 'Write your question here:';
|
|||||||
|
|
||||||
sub IncrementInFile {
|
sub IncrementInFile {
|
||||||
my $filename = shift;
|
my $filename = shift;
|
||||||
sysopen my $fh, encode_utf8($filename), O_RDWR|O_CREAT or die "can't open $filename: $!";
|
sysopen my $fh, $filename, O_RDWR|O_CREAT or die "can't open $filename: $!";
|
||||||
flock $fh, LOCK_EX or die "can't flock $filename: $!";
|
flock $fh, LOCK_EX or die "can't flock $filename: $!";
|
||||||
my $num = <$fh> || 1;
|
my $num = <$fh> || 1;
|
||||||
seek $fh, 0, 0 or die "can't rewind $filename: $!";
|
seek $fh, 0, 0 or die "can't rewind $filename: $!";
|
||||||
|
|||||||
@@ -171,9 +171,9 @@ sub UserCanEditAutoLockFix {
|
|||||||
return 0 if $id eq 'SampleUndefinedPage' or $id eq T('SampleUndefinedPage')
|
return 0 if $id eq 'SampleUndefinedPage' or $id eq T('SampleUndefinedPage')
|
||||||
or $id eq 'Sample_Undefined_Page' or $id eq T('Sample_Undefined_Page');
|
or $id eq 'Sample_Undefined_Page' or $id eq T('Sample_Undefined_Page');
|
||||||
return 1 if UserIsAdmin() || UserIsEditor();
|
return 1 if UserIsAdmin() || UserIsEditor();
|
||||||
return 0 if $id ne '' and IsFile(GetLockedPageFile($id));
|
return 0 if $id ne '' and -f GetLockedPageFile($id);
|
||||||
return 0 if $LockOnCreation{$id} and not IsFile(GetPageFile($id)); # new page
|
return 0 if $LockOnCreation{$id} and not -f GetPageFile($id); # new page
|
||||||
return 0 if !$EditAllowed or IsFile($NoEditFile);
|
return 0 if !$EditAllowed or -f $NoEditFile;
|
||||||
return 0 if $editing and UserIsBanned(); # this call is more expensive
|
return 0 if $editing and UserIsBanned(); # this call is more expensive
|
||||||
return 0 if $EditAllowed >= 2 and (not $CommentsPrefix or $id !~ /^$CommentsPrefix/);
|
return 0 if $EditAllowed >= 2 and (not $CommentsPrefix or $id !~ /^$CommentsPrefix/);
|
||||||
return 1 if $EditAllowed >= 3 and ($comment or (GetParam('aftertext', '') and not GetParam('text', '')));
|
return 1 if $EditAllowed >= 3 and ($comment or (GetParam('aftertext', '') and not GetParam('text', '')));
|
||||||
@@ -206,17 +206,18 @@ except where noted.
|
|||||||
|
|
||||||
Copyleft 2008 by B.w.Curry <http://www.raiazome.com>.
|
Copyleft 2008 by B.w.Curry <http://www.raiazome.com>.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This file is free software; you can redistribute it and/or
|
||||||
it under the terms of the GNU General Public License as published by
|
modify it under the terms of the GNU General Public License
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
as published by the Free Software Foundation; either version 2
|
||||||
(at your option) any later version.
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This file is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this file; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
# Grab MLDBM at http://search.cpan.org/dist/MLDBM/lib/MLDBM.pm
|
# Grab MLDBM at http://search.cpan.org/dist/MLDBM/lib/MLDBM.pm
|
||||||
# ie: http://search.cpan.org/CPAN/authors/id/C/CH/CHAMAS/MLDBM-2.01.tar.gz
|
# ie: http://search.cpan.org/CPAN/authors/id/C/CH/CHAMAS/MLDBM-2.01.tar.gz
|
||||||
@@ -41,8 +44,8 @@ sub BacklinksMenu {
|
|||||||
$Action{buildback} = \&BuildBacklinkDatabase;
|
$Action{buildback} = \&BuildBacklinkDatabase;
|
||||||
sub BuildBacklinkDatabase {
|
sub BuildBacklinkDatabase {
|
||||||
print GetHttpHeader('text/plain');
|
print GetHttpHeader('text/plain');
|
||||||
Unlink($backfile); # Remove old database
|
unlink $backfile; # Remove old database
|
||||||
tie my %backhash, 'MLDBM', encode_utf8($backfile) or die "Cannot open file $backfile $!\n";
|
tie my %backhash, 'MLDBM', $backfile or die "Cannot open file $backfile $!\n";
|
||||||
log1("Starting Database Store Process ... please wait\n\n");
|
log1("Starting Database Store Process ... please wait\n\n");
|
||||||
|
|
||||||
foreach my $name (AllPagesList()) {
|
foreach my $name (AllPagesList()) {
|
||||||
@@ -98,7 +101,7 @@ sub GetBackLink {
|
|||||||
|
|
||||||
our ($BacklinkBanned);
|
our ($BacklinkBanned);
|
||||||
$BacklinkBanned = "HomePage|ScratchPad" if !$BacklinkBanned;
|
$BacklinkBanned = "HomePage|ScratchPad" if !$BacklinkBanned;
|
||||||
tie my %backhash, 'MLDBM', encode_utf8($backfile), O_CREAT|O_RDWR, oct(644) or die "Cannot open file $backfile $!\n";
|
tie my %backhash, 'MLDBM', $backfile, O_CREAT|O_RDWR, oct(644) or die "Cannot open file $backfile $!\n";
|
||||||
|
|
||||||
# Search database for matches
|
# Search database for matches
|
||||||
while ( my ($source, $hashes) = each %backhash ) {
|
while ( my ($source, $hashes) = each %backhash ) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (C) 2013-2021 Alex Schroeder <alex@gnu.org>
|
# Copyright (C) 2013 Alex Schroeder <alex@gnu.org>
|
||||||
|
|
||||||
# This program is free software: you can redistribute it and/or modify it under
|
# 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
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
@@ -21,12 +21,11 @@ compared to the list of regular expressions on the C<BannedHosts> page
|
|||||||
(see C<$BannedHosts>). If the contributor is already banned, this is
|
(see C<$BannedHosts>). If the contributor is already banned, this is
|
||||||
mentioned. If the contributor is not banned, you'll see a button
|
mentioned. If the contributor is not banned, you'll see a button
|
||||||
allowing you to ban him or her immediately. If you click the button,
|
allowing you to ban him or her immediately. If you click the button,
|
||||||
the IP will be added to the C<BannedHosts> page for you.
|
the IP or hostname will be added to the C<BannedHosts> page for you.
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|
||||||
our ($q, $Now, %Page, $OpenPageName, %Action, $UrlPattern, $BannedContent, $BannedHosts, @MyAdminCode);
|
our ($q, $Now, %Page, $OpenPageName, %Action, $UrlPattern, $BannedContent, $BannedHosts, @MyAdminCode);
|
||||||
|
|
||||||
AddModuleDescription('ban-contributors.pl', 'Ban Contributors Extension');
|
AddModuleDescription('ban-contributors.pl', 'Ban Contributors Extension');
|
||||||
@@ -57,18 +56,17 @@ sub IsItBanned {
|
|||||||
sub DoBanHosts {
|
sub DoBanHosts {
|
||||||
my $id = shift;
|
my $id = shift;
|
||||||
my $content = GetParam('content', '');
|
my $content = GetParam('content', '');
|
||||||
my $range = GetParam('range', '');
|
my $host = GetParam('host', '');
|
||||||
my $regexp = GetParam('regexp', '');
|
|
||||||
if ($content) {
|
if ($content) {
|
||||||
SetParam('text', GetPageContent($BannedContent)
|
SetParam('text', GetPageContent($BannedContent)
|
||||||
. $content . " # " . CalcDay($Now) . " "
|
. $content . " # " . CalcDay($Now) . " "
|
||||||
. NormalToFree($id) . "\n");
|
. NormalToFree($id) . "\n");
|
||||||
SetParam('summary', NormalToFree($id));
|
SetParam('summary', NormalToFree($id));
|
||||||
DoPost($BannedContent);
|
DoPost($BannedContent);
|
||||||
} elsif ($regexp) {
|
} elsif ($host) {
|
||||||
|
$host =~ s/\./\\./g;
|
||||||
SetParam('text', GetPageContent($BannedHosts)
|
SetParam('text', GetPageContent($BannedHosts)
|
||||||
. $regexp . " # " . CalcDay($Now)
|
. "^" . $host . " # " . CalcDay($Now) . " "
|
||||||
. " $range "
|
|
||||||
. NormalToFree($id) . "\n");
|
. NormalToFree($id) . "\n");
|
||||||
SetParam('summary', NormalToFree($id));
|
SetParam('summary', NormalToFree($id));
|
||||||
DoPost($BannedHosts);
|
DoPost($BannedHosts);
|
||||||
@@ -96,20 +94,12 @@ sub DoBanHosts {
|
|||||||
if (IsItBanned($_, \@regexps)) {
|
if (IsItBanned($_, \@regexps)) {
|
||||||
print $q->p(Ts("%s is banned", $name));
|
print $q->p(Ts("%s is banned", $name));
|
||||||
} else {
|
} else {
|
||||||
my @pairs = BanContributors::get_range($_);
|
print GetFormStart(undef, 'get', 'ban'),
|
||||||
while (@pairs) {
|
GetHiddenValue('action', 'ban'),
|
||||||
my $start = shift(@pairs);
|
GetHiddenValue('id', $id),
|
||||||
my $end = shift(@pairs);
|
GetHiddenValue('host', $_),
|
||||||
$range = "[$start - $end]";
|
GetHiddenValue('recent_edit', 'on'),
|
||||||
$name .= " " . $range;
|
$q->p($name, $q->submit(T('Ban!'))), $q->end_form();
|
||||||
print GetFormStart(undef, 'get', 'ban'),
|
|
||||||
GetHiddenValue('action', 'ban'),
|
|
||||||
GetHiddenValue('id', $id),
|
|
||||||
GetHiddenValue('range', $range),
|
|
||||||
GetHiddenValue('regexp', BanContributors::get_regexp_ip($start, $end)),
|
|
||||||
GetHiddenValue('recent_edit', 'on'),
|
|
||||||
$q->p($name, $q->submit(T('Ban!'))), $q->end_form();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -168,139 +158,3 @@ sub NewBanContributorsWriteRcLog {
|
|||||||
};
|
};
|
||||||
return OldBanContributorsWriteRcLog(@_);
|
return OldBanContributorsWriteRcLog(@_);
|
||||||
}
|
}
|
||||||
|
|
||||||
package BanContributors;
|
|
||||||
use Net::Whois::Parser qw/parse_whois/;
|
|
||||||
use Net::IP;
|
|
||||||
|
|
||||||
sub get_range {
|
|
||||||
my $ip = shift;
|
|
||||||
my $response = parse_whois(domain => $ip);
|
|
||||||
my $re = '(?:[0-9]{1,3}\.){3}[0-9]{1,3}';
|
|
||||||
# Just try all the keys and see whether there is a range match.
|
|
||||||
for (keys %$response) {
|
|
||||||
my @result;
|
|
||||||
$_ = $response->{$_};
|
|
||||||
for (ref eq 'ARRAY' ? @$_ : $_) {
|
|
||||||
$ip = Net::IP->new($_);
|
|
||||||
push(@result, $ip->ip, $ip->last_ip) if $ip;
|
|
||||||
}
|
|
||||||
return @result if @result;
|
|
||||||
}
|
|
||||||
# Fallback
|
|
||||||
return $ip, $ip;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_groups {
|
|
||||||
my ($from, $to) = @_;
|
|
||||||
my @groups;
|
|
||||||
if ($from == $to) {
|
|
||||||
return [$from, $to];
|
|
||||||
}
|
|
||||||
# ones up to the nearest ten
|
|
||||||
if ($from < $to and ($from % 10 or $from < 10)) {
|
|
||||||
# from 5-7: as is
|
|
||||||
# from 5-17: 5 + 9 - 5 = 9 thus 5-9, set $from to 10
|
|
||||||
my $to2 = int($to/10) > int($from/10) ? $from + 9 - $from % 10 : $to;
|
|
||||||
push(@groups, [$from, $to2]);
|
|
||||||
$from = $to2 + 1;
|
|
||||||
}
|
|
||||||
# tens up to the nearest hundred
|
|
||||||
if ($from < $to and $from % 100) {
|
|
||||||
# 10-17: as is
|
|
||||||
# 10-82: 10 to 79, set $from to 80 (8*10-1)
|
|
||||||
# 10-182: 10 to 99, set $from to 100 (10+99=10=99)
|
|
||||||
# 110-182: 110 to 179, set $from to 180 (170)
|
|
||||||
# 110-222: 110 to 199, set $from to 200 (110+99-10 = 199)
|
|
||||||
my $to2 = int($to/100) > int($from/100) ? $from + 99 - $from % 100
|
|
||||||
: int($to/10) > int($from/10) ? int($to / 10) * 10 - 1
|
|
||||||
: $to;
|
|
||||||
push(@groups, [$from, $to2]);
|
|
||||||
$from = $to2 + 1;
|
|
||||||
}
|
|
||||||
# up to the next hundred
|
|
||||||
if (int($to/100) > int($from/100)) {
|
|
||||||
# from 100 to 223: set $from to 200 (2*100-1)
|
|
||||||
my $to2 = int($to/100) * 100 - 1;
|
|
||||||
push(@groups, [$from, $to2]);
|
|
||||||
$from = $to2 + 1;
|
|
||||||
}
|
|
||||||
# up to the next ten
|
|
||||||
if (int($to/10) > int($from/10)) {
|
|
||||||
# 10 to 17: skip
|
|
||||||
# 100 to 143: set $from to 140 (14*10-1)
|
|
||||||
my $to2 = int($to / 10) * 10 - 1;
|
|
||||||
push(@groups, [$from, $to2]);
|
|
||||||
$from = $to2 + 1;
|
|
||||||
}
|
|
||||||
# up to the next one
|
|
||||||
if ($from <= $to) {
|
|
||||||
push(@groups, [$from, $to]);
|
|
||||||
}
|
|
||||||
# warn join("; ", map { "@$_" } @groups);
|
|
||||||
return \@groups;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_regexp_range {
|
|
||||||
my @chars;
|
|
||||||
for my $group (@{get_groups(@_)}) {
|
|
||||||
my ($from, $to) = @$group;
|
|
||||||
my $char;
|
|
||||||
for (my $i = length($from); $i >= 1; $i--) {
|
|
||||||
if (substr($from, - $i, 1) eq substr($to, - $i, 1)) {
|
|
||||||
$char .= substr($from, - $i, 1);
|
|
||||||
} else {
|
|
||||||
$char .= '[' . substr($from, - $i, 1) . '-' . substr($to, - $i, 1). ']';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
push(@chars, $char);
|
|
||||||
}
|
|
||||||
return join('|', @chars);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_regexp_ip {
|
|
||||||
my ($from, $to) = @_;
|
|
||||||
my @start = split(/\./, $from);
|
|
||||||
my @end = split(/\./, $to);
|
|
||||||
my $regexp = "^";
|
|
||||||
for my $i (0 .. 3) {
|
|
||||||
if ($start[$i] eq $end[$i]) {
|
|
||||||
# if the byte is the same, use it as is
|
|
||||||
$regexp .= $start[$i];
|
|
||||||
$regexp .= '\.' if $i < 3;
|
|
||||||
} elsif ($start[$i] == 0 and $end[$i] == 255) {
|
|
||||||
# the starting byte is 0 and the end byte is 255, then anything goes:
|
|
||||||
# we're done, e.g. 185.244.214.0 - 185.244.214.255 results in 185\.244\.214\.
|
|
||||||
last;
|
|
||||||
} elsif ($i == 3 and $start[$i] != $end[$i]) {
|
|
||||||
# example 45.87.2.128 - 45.87.2.255: the last bytes differ
|
|
||||||
$regexp .= '(' . get_regexp_range($start[$i], $end[$i]) . ')';
|
|
||||||
last;
|
|
||||||
} elsif ($start[$i + 1] == 0 and $end[$i + 1] == 255) {
|
|
||||||
# if we're here, we already know that the start byte and the end byte are
|
|
||||||
# not the same; if the next bytes are from 0 to 255, we know that
|
|
||||||
# everything else doesn't matter, e.g. 42.118.48.0 - 42.118.63.255
|
|
||||||
$regexp .= '(' . get_regexp_range($start[$i], $end[$i]) . ')';
|
|
||||||
$regexp .= '\.' if $i < 3;
|
|
||||||
last;
|
|
||||||
} elsif ($end[$i] - $start[$i] == 1 and $start[$i + 1] > 0 and $end[$i + 1] < 255) {
|
|
||||||
# if we're here, we already know that the start byte and the end byte are
|
|
||||||
# not the same; if the starting byte of the next (!) byte is bigger than
|
|
||||||
# zero, then we need groups: in the case 77.56.180.0 - 77.57.70.255 for
|
|
||||||
# example,
|
|
||||||
$regexp .= '(' . $start[$i] . '\.(' . get_regexp_range($start[$i + 1], 255) . ')|'
|
|
||||||
. $end[$i] . '\.(' . get_regexp_range(0, $end[$i + 1]) . ')';
|
|
||||||
$regexp .= '\.' if $i < 3;
|
|
||||||
last;
|
|
||||||
} else {
|
|
||||||
warn "Unhandled regexp: $from - $to ($i)";
|
|
||||||
$regexp .= 'XXX';
|
|
||||||
$regexp .= '\.' if $i < 3;
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $regexp;
|
|
||||||
}
|
|
||||||
|
|
||||||
# this is required in case we concatenate other modules to this one
|
|
||||||
package OddMuse;
|
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
# Copyright (C) 2018 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/>.
|
|
||||||
|
|
||||||
=encoding utf8
|
|
||||||
|
|
||||||
=head1 Mixed Scripts
|
|
||||||
|
|
||||||
This module disallows ordinary users from posting words that consist of multiple
|
|
||||||
scripts. Stuff like this: "It's diffіcult to find knowledgeable people on this
|
|
||||||
topic, but youu sound like you know wgat you're taⅼkіng аboսt!" Did you notice
|
|
||||||
the confusable characters? The sentence contains the following:
|
|
||||||
ARMENIAN SMALL LETTER SEH
|
|
||||||
CYRILLIC SMALL LETTER A
|
|
||||||
CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
|
|
||||||
SMALL ROMAN NUMERAL FIFTY
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use v5.10;
|
|
||||||
|
|
||||||
use Unicode::UCD qw(charprop);
|
|
||||||
|
|
||||||
AddModuleDescription('ban-mixed-scripts.pl', 'Ban Mixed Scripts Extension');
|
|
||||||
|
|
||||||
*OldBanMixedScriptsBannedContent = \&BannedContent;
|
|
||||||
*BannedContent = \&NewBanMixedScriptsBannedContent;
|
|
||||||
|
|
||||||
sub NewBanMixedScriptsBannedContent {
|
|
||||||
my $rule = OldBanMixedScriptsBannedContent(@_);
|
|
||||||
$rule ||= BanMixedScript(@_);
|
|
||||||
return $rule;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub BanMixedScript {
|
|
||||||
my $str = shift;
|
|
||||||
my @words = $str =~ m/\w+/g;
|
|
||||||
my %seen;
|
|
||||||
my %prop;
|
|
||||||
for my $word (@words) {
|
|
||||||
next if $seen{$word};
|
|
||||||
$seen{$word} = 1;
|
|
||||||
my $script;
|
|
||||||
for my $char (split(//, $word)) {
|
|
||||||
my $s = $prop{$char};
|
|
||||||
if (not $s) {
|
|
||||||
$s = charprop(ord($char), "Script_Extensions");
|
|
||||||
if ($s eq 'Hiragana') {
|
|
||||||
$s = 'Han'; # this mixing is ok
|
|
||||||
}
|
|
||||||
$prop{$char} = $s;
|
|
||||||
}
|
|
||||||
next if $s eq "Common";
|
|
||||||
if (not $script) {
|
|
||||||
$script = $s;
|
|
||||||
} elsif ($script ne $s) {
|
|
||||||
return "Mixed scripts in $word ($script and $s, if not more)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (C) 2012-2018 Alex Schroeder <alex@gnu.org>
|
# Copyright (C) 2012 Alex Schroeder <alex@gnu.org>
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify it under
|
# 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
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
@@ -45,8 +45,7 @@ This extension works with logbannedcontent.pl.
|
|||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
our (%AdminPages, %LockOnCreation, @MyInitVariables, %PlainTextPages, $BannedContent, $BannedFile,
|
our (%AdminPages, %LockOnCreation, @MyInitVariables, %PlainTextPages, $BannedContent, $BannedFile);
|
||||||
$FullUrlPattern);
|
|
||||||
our ($BannedRegexps);
|
our ($BannedRegexps);
|
||||||
|
|
||||||
$BannedRegexps = 'BannedRegexps';
|
$BannedRegexps = 'BannedRegexps';
|
||||||
@@ -62,13 +61,12 @@ push(@MyInitVariables, sub {
|
|||||||
|
|
||||||
sub RegexpNewBannedContent {
|
sub RegexpNewBannedContent {
|
||||||
my $str = shift;
|
my $str = shift;
|
||||||
# check whether Banned Content complains
|
|
||||||
my $rule = RegexpOldBannedContent($str, @_);
|
my $rule = RegexpOldBannedContent($str, @_);
|
||||||
if (not $rule) {
|
if (not $rule) {
|
||||||
foreach (split(/\n/, GetPageContent($BannedRegexps))) {
|
foreach (split(/\n/, GetPageContent($BannedRegexps))) {
|
||||||
next unless m/^\s*([^#]+?)\s*(#\s*(\d\d\d\d-\d\d-\d\d\s*)?(.*))?$/;
|
next unless m/^\s*([^#]+?)\s*(#\s*(\d\d\d\d-\d\d-\d\d\s*)?(.*))?$/;
|
||||||
my ($regexp, $comment, $re) = ($1, $4, undef);
|
my ($regexp, $comment, $re) = ($1, $4, undef);
|
||||||
eval { $re = qr/($regexp)/i; };
|
eval { $re = qr/$regexp/i; };
|
||||||
if (defined($re) && $str =~ $re) {
|
if (defined($re) && $str =~ $re) {
|
||||||
my $group1 = $1;
|
my $group1 = $1;
|
||||||
my $explanation = ($group1
|
my $explanation = ($group1
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ AddModuleDescription('bbcode.pl', 'bbCode Extension');
|
|||||||
|
|
||||||
our ($q, @HtmlStack, @MyRules, %RuleOrder, $UrlProtocols, $FullUrlPattern);
|
our ($q, @HtmlStack, @MyRules, %RuleOrder, $UrlProtocols, $FullUrlPattern);
|
||||||
push(@MyRules, \&bbCodeRule);
|
push(@MyRules, \&bbCodeRule);
|
||||||
$RuleOrder{\&bbCodeRule} = 300; # must come after PortraitSupportRule, MarkdownRule
|
$RuleOrder{\&bbCodeRule} = 100; # must come after PortraitSupportRule
|
||||||
|
|
||||||
our ($bbBlock);
|
our ($bbBlock);
|
||||||
my %bbTitle = qw(h1 1 h2 1 h3 1 h4 1 h5 1 h6 1);
|
my %bbTitle = qw(h1 1 h2 1 h3 1 h4 1 h5 1 h6 1);
|
||||||
@@ -32,9 +32,7 @@ sub bbCodeRule {
|
|||||||
my $bbcode = $1;
|
my $bbcode = $1;
|
||||||
my $tag = lc($2);
|
my $tag = lc($2);
|
||||||
my $option = $3; # sanitize?
|
my $option = $3; # sanitize?
|
||||||
if ($tag eq 'br') {
|
if ($tag eq 'b') {
|
||||||
return $q->br(); }
|
|
||||||
elsif ($tag eq 'b') {
|
|
||||||
return AddHtmlEnvironment('b'); }
|
return AddHtmlEnvironment('b'); }
|
||||||
elsif ($tag eq 'i') {
|
elsif ($tag eq 'i') {
|
||||||
return AddHtmlEnvironment('i'); }
|
return AddHtmlEnvironment('i'); }
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -12,7 +12,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
@@ -23,7 +26,6 @@ our ($q, %Page, %Action, $Now, $OpenPageName, $CollectingJournal, $FreeLinkPatte
|
|||||||
our ($CalendarOnEveryPage, $CalAsTable, $CalStartMonday);
|
our ($CalendarOnEveryPage, $CalAsTable, $CalStartMonday);
|
||||||
|
|
||||||
$CalendarOnEveryPage = 0; # 1=on every page is a month-div situated in the header, use css to control
|
$CalendarOnEveryPage = 0; # 1=on every page is a month-div situated in the header, use css to control
|
||||||
# 2=this month and the previous month; 3=this, previous and next month
|
|
||||||
$CalAsTable = 0; # 0=every month-div is "free", 1=every month-div is caught in a table, use css to control
|
$CalAsTable = 0; # 0=every month-div is "free", 1=every month-div is caught in a table, use css to control
|
||||||
$CalStartMonday = 0; # 0=week starts with Su, 1=week starts with Mo
|
$CalStartMonday = 0; # 0=week starts with Su, 1=week starts with Mo
|
||||||
|
|
||||||
@@ -35,22 +37,8 @@ sub NewCalendarGetHeader {
|
|||||||
return $header unless $CalendarOnEveryPage;
|
return $header unless $CalendarOnEveryPage;
|
||||||
my $action = GetParam('action', 'browse');
|
my $action = GetParam('action', 'browse');
|
||||||
return $header if grep(/^$action$/, ('calendar', 'edit'));
|
return $header if grep(/^$action$/, ('calendar', 'edit'));
|
||||||
my $cal;
|
my $cal = Cal();
|
||||||
my ($sec, $min, $hour, $mday, $mon, $year) = localtime($Now);
|
$header =~ s/<div class="header">/$cal<div class="header">/;
|
||||||
$year += 1900;
|
|
||||||
# $mon is 0 based and thus good for previous month
|
|
||||||
if ($mon < 1) { $year -= 1; $mon += 12; };
|
|
||||||
$cal .= Cal($year, $mon) if $CalendarOnEveryPage > 1;
|
|
||||||
# the current month
|
|
||||||
$mon += 1;
|
|
||||||
if ($mon > 12) { $year += 1; $mon -= 12; };
|
|
||||||
$cal .= Cal($year, $mon) if $CalendarOnEveryPage;
|
|
||||||
# the next month
|
|
||||||
$mon += 1;
|
|
||||||
if ($mon > 12) { $year += 1; $mon -= 12; };
|
|
||||||
$cal .= Cal($year, $mon) if $CalendarOnEveryPage > 2;
|
|
||||||
# insert calendars before header div
|
|
||||||
$header =~ s!<div class="header">!<div class="cal">$cal</div><div class="header">!;
|
|
||||||
return $header;
|
return $header;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +88,7 @@ sub Cal {
|
|||||||
$year_text, 'local collection year'));
|
$year_text, 'local collection year'));
|
||||||
}
|
}
|
||||||
}}e;
|
}}e;
|
||||||
return "<div class=\"month\"><pre>$cal</pre></div>";
|
return "<div class=\"cal month\"><pre>$cal</pre></div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
$Action{collect} = \&DoCollect;
|
$Action{collect} = \&DoCollect;
|
||||||
@@ -141,7 +129,7 @@ sub CalendarRule {
|
|||||||
my $oldpos = pos;
|
my $oldpos = pos;
|
||||||
Clean(CloseHtmlEnvironments());
|
Clean(CloseHtmlEnvironments());
|
||||||
Dirty($1);
|
Dirty($1);
|
||||||
print $q->div({-class => 'cal'}, Cal($2, $3));
|
print Cal($2, $3);
|
||||||
pos = $oldpos;
|
pos = $oldpos;
|
||||||
return AddHtmlEnvironment('p');
|
return AddHtmlEnvironment('p');
|
||||||
} elsif (/\G(month:([+-]\d\d?))/cg
|
} elsif (/\G(month:([+-]\d\d?))/cg
|
||||||
@@ -156,7 +144,7 @@ sub CalendarRule {
|
|||||||
$mon += 1 + $delta;
|
$mon += 1 + $delta;
|
||||||
while ($mon < 1) { $year -= 1; $mon += 12; };
|
while ($mon < 1) { $year -= 1; $mon += 12; };
|
||||||
while ($mon > 12) { $year += 1; $mon -= 12; };
|
while ($mon > 12) { $year += 1; $mon -= 12; };
|
||||||
print $q->div({-class => 'cal'}, Cal($year, $mon, undef, $id));
|
print Cal($year, $mon, undef, $id);
|
||||||
pos = $oldpos;
|
pos = $oldpos;
|
||||||
return AddHtmlEnvironment('p');
|
return AddHtmlEnvironment('p');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,8 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
# Copyright (C) 2021 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/>.
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use v5.10;
|
|
||||||
|
|
||||||
AddModuleDescription('cook-lang.pl', 'Cooklang Extension');
|
|
||||||
|
|
||||||
our ($q, $bol, @MyRules);
|
|
||||||
|
|
||||||
push(@MyRules, \&CookLangRule);
|
|
||||||
|
|
||||||
sub CookLangRule {
|
|
||||||
if (/\G#([^\n#\@\{\}]+)\{(?:([^\n%\}]+)(?:%([^\n\}]+))?)?\}/cg) {
|
|
||||||
# #canning funnel{}
|
|
||||||
my $html = "";
|
|
||||||
$html .= $q->strong({-title=>"number"}, $2) if $2;
|
|
||||||
$html .= " " if $2 and $3;
|
|
||||||
$html .= $q->strong({-title=>"unit"}, $3) if $3;
|
|
||||||
$html .= " " if $1 and ($2 or $3);
|
|
||||||
$html .= $q->strong({-title=>"cookware"}, $1);
|
|
||||||
return $html;
|
|
||||||
} elsif (/\G#(\w+)/cg) {
|
|
||||||
# #pot
|
|
||||||
return $q->strong({-title=>"cookware"}, $1);
|
|
||||||
} elsif (/\G\@([^\n#\@\{\}]+)\{(?:([^\n%\}]+)(?:%([^\n\}]+))?)?\}/cg) {
|
|
||||||
# @ground black pepper{}
|
|
||||||
my $html = "";
|
|
||||||
$html .= $q->strong({-title=>"number"}, $2) if $2;
|
|
||||||
$html .= " " if $2 and $3;
|
|
||||||
$html .= $q->strong({-title=>"unit"}, $3) if $3;
|
|
||||||
$html .= " " if $1 and ($2 or $3);
|
|
||||||
$html .= $q->strong({-title=>"ingredient"}, $1);
|
|
||||||
return $html;
|
|
||||||
} elsif (/\G\@(\w+)/cg) {
|
|
||||||
# @salt
|
|
||||||
return $q->strong({-title=>"ingredient"}, $1);
|
|
||||||
} elsif (/\G\~\{([^\n%\}]+)(?:%([^\n\}]+))?\}/cg) {
|
|
||||||
# ~{25%minutes}
|
|
||||||
my $html = $q->strong({-title=>"number"}, $1);
|
|
||||||
$html .= " " if $1 and $2;
|
|
||||||
$html .= $q->strong({-title=>"unit"}, $2) if $2;
|
|
||||||
return $html;
|
|
||||||
} elsif (/\G\/\/\s*(.*)/cg) {
|
|
||||||
# // Don't burn the roux!
|
|
||||||
return $q->em({-title=>"comment"}, $1);
|
|
||||||
} elsif ($bol and /\G>>\s*(.*)/cg) {
|
|
||||||
# // Don't burn the roux!
|
|
||||||
return CloseHtmlEnvironments()
|
|
||||||
. $q->blockquote({-title=>"meta"}, $1)
|
|
||||||
. AddHtmlEnvironment('p');
|
|
||||||
}
|
|
||||||
# no match
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
@@ -1,35 +1,34 @@
|
|||||||
# Copyright (C) 2005 Fletcher T. Penney <fletcher@freeshell.org>
|
# Copyright (C) 2005 Fletcher T. Penney <fletcher@freeshell.org>
|
||||||
# Copyright (C) 2016 Alex Schroeder <alex@gnu.org>
|
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify it under
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# the terms of the GNU General Public License as published by the Free Software
|
# it under the terms of the GNU General Public License as published by
|
||||||
# Foundation; either version 3 of the License, or (at your option) any later
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
# This program is distributed in the hope that it will be useful,
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
# 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
|
# You should have received a copy of the GNU General Public License
|
||||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
=head1 Creation Date Extension
|
# Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
This module stores additional information about a page when it is first created:
|
# This module stores additional information about a page when it is
|
||||||
|
# first created:
|
||||||
=over
|
# created = the date the page is FIRST saved
|
||||||
=item C<created> is the date the page is first saved
|
# originalAuthor = the username that first created a page
|
||||||
=item C<originalAuthor> is the username that first created a page
|
#
|
||||||
=back
|
# Of course, you can customize this to store more information
|
||||||
=cut
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|
||||||
AddModuleDescription('creationdate.pl', 'CreationDate Module');
|
AddModuleDescription('creationdate.pl', 'CreationDate Module');
|
||||||
|
|
||||||
our (%Page, $Now, @MyAdminCode, %Action, $q, $FS, $RcOldFile, $RcFile);
|
our (%Page, $Now);
|
||||||
|
|
||||||
*CreationDateOldOpenPage = \&OpenPage;
|
*CreationDateOldOpenPage = \&OpenPage;
|
||||||
*OpenPage = \&CreationDateOpenPage;
|
*OpenPage = \&CreationDateOpenPage;
|
||||||
@@ -40,45 +39,3 @@ sub CreationDateOpenPage{
|
|||||||
$Page{originalAuthor} = GetParam('username','') unless $Page{originalAuthor}
|
$Page{originalAuthor} = GetParam('username','') unless $Page{originalAuthor}
|
||||||
or $Page{revision};
|
or $Page{revision};
|
||||||
}
|
}
|
||||||
|
|
||||||
# Allow administrators to add the 'created' item to page files, based on rc log
|
|
||||||
# files.
|
|
||||||
|
|
||||||
push(@MyAdminCode, \&CreationDateMenu);
|
|
||||||
|
|
||||||
sub CreationDateMenu {
|
|
||||||
my ($id, $menuref, $restref) = @_;
|
|
||||||
push(@$menuref,
|
|
||||||
ScriptLink('action=add-creation-date',
|
|
||||||
T('Add creation date to page files'),
|
|
||||||
'creationdate')) if UserIsAdmin();
|
|
||||||
}
|
|
||||||
|
|
||||||
$Action{'add-creation-date'} = \&AddCreationDate;
|
|
||||||
|
|
||||||
sub AddCreationDate {
|
|
||||||
print GetHeader('', T('Add creation date to page files'));
|
|
||||||
print $q->start_div({-class=>'creationdate'});
|
|
||||||
print '<ul>';
|
|
||||||
RequestLockOrError();
|
|
||||||
for my $file ($RcOldFile, $RcFile) {
|
|
||||||
open(my $F, '<:encoding(UTF-8)', encode_utf8($file)) or next;
|
|
||||||
while (my $line = <$F>) {
|
|
||||||
chomp($line);
|
|
||||||
my ($ts, $id, $minor, $summary, $host, $username, $revision)
|
|
||||||
= split(/$FS/, $line);
|
|
||||||
next unless $revision == 1;
|
|
||||||
print $q->li(NormalToFree($id));
|
|
||||||
OpenPage($id);
|
|
||||||
next unless $Page{revision}; # skip if page no longer exists
|
|
||||||
next if $Page{created} and $Page{originalAuthor};
|
|
||||||
$Page{created} = $ts unless $Page{created};
|
|
||||||
$Page{originalAuthor} = $username unless $Page{originalAuthor};
|
|
||||||
SavePage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ReleaseLock();
|
|
||||||
print '</ul>';
|
|
||||||
print $q->end_div();
|
|
||||||
PrintFooter();
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -246,8 +246,7 @@ sub CreoleRule {
|
|||||||
$q->img({-src=> UnquoteHtml($1),
|
$q->img({-src=> UnquoteHtml($1),
|
||||||
-alt=> UnquoteHtml($3),
|
-alt=> UnquoteHtml($3),
|
||||||
-title=> UnquoteHtml($3),
|
-title=> UnquoteHtml($3),
|
||||||
-class=> 'url outside',
|
-class=> 'url outside'})));
|
||||||
-loading=>'lazy'})));
|
|
||||||
}
|
}
|
||||||
# image link: [[link|{{pic}}]] and [[link|{{pic|text}}]]
|
# image link: [[link|{{pic}}]] and [[link|{{pic|text}}]]
|
||||||
elsif (m/\G(\[\[$FreeLinkPattern$CreoleLinkPipePattern
|
elsif (m/\G(\[\[$FreeLinkPattern$CreoleLinkPipePattern
|
||||||
@@ -258,8 +257,7 @@ sub CreoleRule {
|
|||||||
$q->img({-src=> GetDownloadLink(FreeToNormal($3), 2),
|
$q->img({-src=> GetDownloadLink(FreeToNormal($3), 2),
|
||||||
-alt=> UnquoteHtml($text),
|
-alt=> UnquoteHtml($text),
|
||||||
-title=> UnquoteHtml($text),
|
-title=> UnquoteHtml($text),
|
||||||
-class=> 'upload',
|
-class=> 'upload'}), 'image')), $text);
|
||||||
-loading=>'lazy'}), 'image')), $text);
|
|
||||||
}
|
}
|
||||||
# image link: [[link|{{url}}]] and [[link|{{url|text}}]]
|
# image link: [[link|{{url}}]] and [[link|{{url|text}}]]
|
||||||
elsif (m/\G(\[\[$FreeLinkPattern$CreoleLinkPipePattern
|
elsif (m/\G(\[\[$FreeLinkPattern$CreoleLinkPipePattern
|
||||||
@@ -270,8 +268,7 @@ sub CreoleRule {
|
|||||||
$q->img({-src=> UnquoteHtml($3),
|
$q->img({-src=> UnquoteHtml($3),
|
||||||
-alt=> UnquoteHtml($text),
|
-alt=> UnquoteHtml($text),
|
||||||
-title=> UnquoteHtml($text),
|
-title=> UnquoteHtml($text),
|
||||||
-class=> 'url outside',
|
-class=> 'url outside'}), 'image')), $text);
|
||||||
-loading=>'lazy'}), 'image')), $text);
|
|
||||||
}
|
}
|
||||||
# image link: [[url|{{pic}}]] and [[url|{{pic|text}}]]
|
# image link: [[url|{{pic}}]] and [[url|{{pic|text}}]]
|
||||||
elsif (m/\G(\[\[$FullUrlPattern$CreoleLinkPipePattern
|
elsif (m/\G(\[\[$FullUrlPattern$CreoleLinkPipePattern
|
||||||
@@ -282,8 +279,7 @@ sub CreoleRule {
|
|||||||
$q->img({-src=> GetDownloadLink(FreeToNormal($3), 2),
|
$q->img({-src=> GetDownloadLink(FreeToNormal($3), 2),
|
||||||
-alt=> UnquoteHtml($text),
|
-alt=> UnquoteHtml($text),
|
||||||
-title=> UnquoteHtml($text),
|
-title=> UnquoteHtml($text),
|
||||||
-class=> 'upload',
|
-class=> 'upload'}))), $text);
|
||||||
-loading=>'lazy'}))), $text);
|
|
||||||
}
|
}
|
||||||
# image link: [[url|{{url}}]] and [[url|{{url|text}}]]
|
# image link: [[url|{{url}}]] and [[url|{{url|text}}]]
|
||||||
elsif (m/\G\[\[$FullUrlPattern$CreoleLinkPipePattern
|
elsif (m/\G\[\[$FullUrlPattern$CreoleLinkPipePattern
|
||||||
@@ -293,8 +289,7 @@ sub CreoleRule {
|
|||||||
$q->img({-src=> UnquoteHtml($2),
|
$q->img({-src=> UnquoteHtml($2),
|
||||||
-alt=> UnquoteHtml($4),
|
-alt=> UnquoteHtml($4),
|
||||||
-title=> UnquoteHtml($4),
|
-title=> UnquoteHtml($4),
|
||||||
-class=> 'url outside',
|
-class=> 'url outside'})));
|
||||||
-loading=>'lazy'})));
|
|
||||||
}
|
}
|
||||||
# link: [[url]] and [[url|text]]
|
# link: [[url]] and [[url|text]]
|
||||||
elsif (m/\G\[\[$FullUrlPattern$CreoleLinkTextPattern\]\]/cgs) {
|
elsif (m/\G\[\[$FullUrlPattern$CreoleLinkTextPattern\]\]/cgs) {
|
||||||
@@ -410,7 +405,8 @@ sub CreoleRule {
|
|||||||
if ($is_left_justified and
|
if ($is_left_justified and
|
||||||
$is_right_justified) { $attributes .= 'align="center"' }
|
$is_right_justified) { $attributes .= 'align="center"' }
|
||||||
elsif ($is_right_justified) { $attributes .= 'align="right"' }
|
elsif ($is_right_justified) { $attributes .= 'align="right"' }
|
||||||
elsif ($is_left_justified) { $attributes .= 'align="left"' }
|
# this is the default:
|
||||||
|
# elsif ($is_left_justified) { $attributes .= 'align="left"' }
|
||||||
|
|
||||||
return
|
return
|
||||||
(InElement('td') || InElement('th') ? CloseHtmlEnvironmentUntil('tr') : '')
|
(InElement('td') || InElement('th') ? CloseHtmlEnvironmentUntil('tr') : '')
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ sub PrintPageContentCrossbar {
|
|||||||
|
|
||||||
# If the crossbar div is placed immediately after the content div, place it
|
# If the crossbar div is placed immediately after the content div, place it
|
||||||
# immediately before the content div.
|
# immediately before the content div.
|
||||||
if (not ($html =~ s~(<div class="content browse" lang="[a-z]*">)$crossbar_pattern~$2$1~)) {
|
if (not ($html =~ s~(<div class="content browse">)$crossbar_pattern~$2$1~)) {
|
||||||
# Otherwise, if the crossbar div is placed immediately before the end of the
|
# Otherwise, if the crossbar div is placed immediately before the end of the
|
||||||
# content div, place it immediately after the end of the content div.
|
# content div, place it immediately after the end of the content div.
|
||||||
$html =~
|
$html =~
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
#! /usr/bin/perl
|
|
||||||
# Copyright (C) 2019 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/>.
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use v5.10;
|
|
||||||
|
|
||||||
AddModuleDescription('definition-lists.pl', 'Definition Lists Extension');
|
|
||||||
|
|
||||||
our ($q, $bol, @MyRules, @HtmlStack, $Fragment);
|
|
||||||
|
|
||||||
push(@MyRules, \&DefinitionListsRule);
|
|
||||||
|
|
||||||
# term
|
|
||||||
# : definition
|
|
||||||
|
|
||||||
sub DefinitionListsRule {
|
|
||||||
if ($bol and /\G(?:\s*\n)*(\S.*)\n[ \t]*:[ \t]*/cg) {
|
|
||||||
return OpenHtmlEnvironment('dl', 1) . "<dt>$1</dt>" . AddHtmlEnvironment('dd');
|
|
||||||
} elsif (InElement('dd') and /\G(?:\s*\n)+(\S.*)\n[ \t]*:[ \t]*/cg) {
|
|
||||||
return OpenHtmlEnvironment('dl', 1) . "<dt>$1</dt>" . AddHtmlEnvironment('dd');
|
|
||||||
} elsif (InElement('dd') and /\G(\s*\n)+[ \t]*:[ \t]*/cg) {
|
|
||||||
return OpenHtmlEnvironment('dl', 1) . AddHtmlEnvironment('dd');
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -77,7 +77,8 @@ sub DoUnifiedDiff { # copied from DoDiff
|
|||||||
RequestLockDir('diff') or return '';
|
RequestLockDir('diff') or return '';
|
||||||
WriteStringToFile($oldName, $_[0]);
|
WriteStringToFile($oldName, $_[0]);
|
||||||
WriteStringToFile($newName, $_[1]);
|
WriteStringToFile($newName, $_[1]);
|
||||||
my $diff_out = decode_utf8(`diff -U 99999 -- \Q$oldName\E \Q$newName\E | tail -n +7`); # should be +4, but we always add extra line # TODO that workaround is ugly, fix it!
|
my $diff_out = `diff -U 99999 -- \Q$oldName\E \Q$newName\E | tail -n +7`; # should be +4, but we always add extra line # TODO that workaround is ugly, fix it!
|
||||||
|
utf8::decode($diff_out); # needs decoding
|
||||||
$diff_out =~ s/\n\K\\ No newline.*\n//g; # Get rid of common complaint.
|
$diff_out =~ s/\n\K\\ No newline.*\n//g; # Get rid of common complaint.
|
||||||
ReleaseLockDir('diff');
|
ReleaseLockDir('diff');
|
||||||
# No need to unlink temp files--next diff will just overwrite.
|
# No need to unlink temp files--next diff will just overwrite.
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
#! /usr/bin/perl
|
|
||||||
# Copyright (C) 2015–2017 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/>.
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use v5.10;
|
|
||||||
|
|
||||||
AddModuleDescription('ditaa.pl', 'Ditaa for Diagrams');
|
|
||||||
|
|
||||||
our ($q, $bol, @MyRules, @KnownLocks, $TempDir);
|
|
||||||
|
|
||||||
push (@MyRules, \&DitaaRule);
|
|
||||||
push(@KnownLocks, 'diagram');
|
|
||||||
|
|
||||||
sub DitaaRule {
|
|
||||||
if ($bol && m/\G<diagram(\s+style=".*")?>\n((.*\n)+)<\/diagram>/cg) {
|
|
||||||
return "MIME::Base64 not installed" unless eval { require MIME::Base64; };
|
|
||||||
my $style = $1;
|
|
||||||
my $map = UnquoteHtml($2);
|
|
||||||
RequestLockDir('diagram', undef, undef, 1);
|
|
||||||
WriteStringToFile("$TempDir/diagram.txt", $map);
|
|
||||||
$ENV{LANG}='en_US.UTF-8'; # Java needs Locale to match as well!
|
|
||||||
my $output = `ditaa "$TempDir/diagram.txt" "$TempDir/diagram.png"`;
|
|
||||||
my $image = '';
|
|
||||||
# not UTF-8 layer!
|
|
||||||
if (open(IN, '<', "$TempDir/diagram.png")) {
|
|
||||||
local $/ = undef; # Read complete files
|
|
||||||
$image = <IN>;
|
|
||||||
close IN;
|
|
||||||
}
|
|
||||||
ReleaseLockDir('diagram');
|
|
||||||
my $data = MIME::Base64::encode_base64($image);
|
|
||||||
my $url = "data:image/png;base64,$data";
|
|
||||||
return CloseHtmlEnvironments()
|
|
||||||
. "<div$style>" . $q->img({-src=>$url, -alt=>$map, -loading=>'lazy'}) . "</div>";
|
|
||||||
}
|
|
||||||
return undef;
|
|
||||||
}
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -12,7 +12,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
# This module offers the user the additional possibility to
|
# This module offers the user the additional possibility to
|
||||||
# edit a page by double-clicking on it. The user must have
|
# edit a page by double-clicking on it. The user must have
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ push(@MyInitVariables, \&DraftInit);
|
|||||||
sub DraftInit {
|
sub DraftInit {
|
||||||
if (GetParam('Draft', '')) {
|
if (GetParam('Draft', '')) {
|
||||||
SetParam('action', 'draft') ; # Draft button used
|
SetParam('action', 'draft') ; # Draft button used
|
||||||
} elsif (IsFile("$DraftDir/" . GetParam('username', $q->remote_addr())) # draft exists
|
} elsif (-f "$DraftDir/" . GetParam('username', $q->remote_addr()) # draft exists
|
||||||
and $FooterNote !~ /action=draft/) { # take care of mod_perl persistence
|
and $FooterNote !~ /action=draft/) { # take care of mod_perl persistence
|
||||||
$FooterNote = $q->p(ScriptLink('action=draft', T('Recover Draft'))) . $FooterNote;
|
$FooterNote = $q->p(ScriptLink('action=draft', T('Recover Draft'))) . $FooterNote;
|
||||||
}
|
}
|
||||||
@@ -47,9 +47,9 @@ sub DoDraft {
|
|||||||
WriteStringToFile($draft, EncodePage(text=>$text, id=>$id));
|
WriteStringToFile($draft, EncodePage(text=>$text, id=>$id));
|
||||||
SetParam('msg', T('Draft saved')); # invalidate cache
|
SetParam('msg', T('Draft saved')); # invalidate cache
|
||||||
print GetHttpHeader('', T('Draft saved'), '204 NO CONTENT');
|
print GetHttpHeader('', T('Draft saved'), '204 NO CONTENT');
|
||||||
} elsif (IsFile($draft)) {
|
} elsif (-f $draft) {
|
||||||
my $data = ParseData(ReadFileOrDie($draft));
|
my $data = ParseData(ReadFileOrDie($draft));
|
||||||
Unlink($draft);
|
unlink ($draft);
|
||||||
$Message .= $q->p(T('Draft recovered'));
|
$Message .= $q->p(T('Draft recovered'));
|
||||||
DoEdit($data->{id}, $data->{text}, 1);
|
DoEdit($data->{id}, $data->{text}, 1);
|
||||||
} else {
|
} else {
|
||||||
@@ -76,19 +76,22 @@ push(@MyMaintenance, \&DraftCleanup);
|
|||||||
|
|
||||||
sub DraftFiles {
|
sub DraftFiles {
|
||||||
return map {
|
return map {
|
||||||
substr($_, length($DraftDir) + 1);
|
my $x = $_;
|
||||||
} Glob("$DraftDir/*"), Glob("$DraftDir/.*");
|
$x = substr($x, length($DraftDir) + 1);
|
||||||
|
utf8::decode($x);
|
||||||
|
$x;
|
||||||
|
} bsd_glob("$DraftDir/*"), bsd_glob("$DraftDir/.*");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub DraftCleanup {
|
sub DraftCleanup {
|
||||||
print '<p>' . T('Draft Cleanup');
|
print '<p>' . T('Draft Cleanup');
|
||||||
foreach my $draft (DraftFiles()) {
|
foreach my $draft (DraftFiles()) {
|
||||||
next if $draft eq '.' or $draft eq '..';
|
next if $draft eq '.' or $draft eq '..';
|
||||||
my $ts = Modified("$DraftDir/$draft");
|
my $ts = (stat("$DraftDir/$draft"))[9];
|
||||||
if ($Now - $ts < 1209600) { # 14*24*60*60
|
if ($Now - $ts < 1209600) { # 14*24*60*60
|
||||||
print $q->br(), Tss("%1 was last modified %2 and was kept",
|
print $q->br(), Tss("%1 was last modified %2 and was kept",
|
||||||
$draft, CalcTimeSince($Now - $ts));
|
$draft, CalcTimeSince($Now - $ts));
|
||||||
} elsif (Unlink("$DraftDir/$draft")) {
|
} elsif (unlink("$DraftDir/$draft")) {
|
||||||
print $q->br(), Tss("%1 was last modified %2 and was deleted",
|
print $q->br(), Tss("%1 was last modified %2 and was deleted",
|
||||||
$draft, CalcTimeSince($Now - $ts));
|
$draft, CalcTimeSince($Now - $ts));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -49,5 +49,5 @@ sub DuckDuckGoSearchInit {
|
|||||||
|
|
||||||
sub DoDuckDuckGoSearch {
|
sub DoDuckDuckGoSearch {
|
||||||
my $search = UrlEncode(GetParam('search', undef));
|
my $search = UrlEncode(GetParam('search', undef));
|
||||||
print $q->redirect({-uri=>"https://duckduckgo.com/?q=$search+site%3A$DuckDuckGoSearchDomain"});
|
print $q->redirect({-uri=>"https://www.duckduckgo.com/?q=$search+site%3A$DuckDuckGoSearchDomain"});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
# Makes the wiki logo depend on the current date.
|
# Makes the wiki logo depend on the current date.
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -9,7 +9,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ sub EmojiRule {
|
|||||||
} elsif (/\G>:-?\(/cg) {
|
} elsif (/\G>:-?\(/cg) {
|
||||||
# 😠 1F620 ANGRY FACE
|
# 😠 1F620 ANGRY FACE
|
||||||
return '😠';
|
return '😠';
|
||||||
} elsif (/\G:-?[Ppb]\b/cg) {
|
} elsif (/\G:-?[Ppb]/cg) {
|
||||||
# 😝 1F61D FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES
|
# 😝 1F61D FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES
|
||||||
return '😝';
|
return '😝';
|
||||||
} elsif (/\G<3/cg) {
|
} elsif (/\G<3/cg) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -12,7 +12,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
# This module creates a list of all questions on the page, e.g.
|
# This module creates a list of all questions on the page, e.g.
|
||||||
# for a faq. It does so by recognizing all lines that begin with
|
# for a faq. It does so by recognizing all lines that begin with
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA,
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ sub FixEncoding {
|
|||||||
ValidIdOrDie($id);
|
ValidIdOrDie($id);
|
||||||
RequestLockOrError();
|
RequestLockOrError();
|
||||||
OpenPage($id);
|
OpenPage($id);
|
||||||
my $text = decode_utf8($Page{text});
|
my $text = $Page{text};
|
||||||
|
utf8::decode($text);
|
||||||
Save($id, $text, T('Fix character encoding'), 1) if $text ne $Page{text};
|
Save($id, $text, T('Fix character encoding'), 1) if $text ne $Page{text};
|
||||||
ReleaseLock();
|
ReleaseLock();
|
||||||
ReBrowsePage($id);
|
ReBrowsePage($id);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ our ($q, $OpenPageName, @MyRules, $CrossbarPageName);
|
|||||||
push(@MyRules, \&FormsRule);
|
push(@MyRules, \&FormsRule);
|
||||||
|
|
||||||
sub FormsRule {
|
sub FormsRule {
|
||||||
if (IsFile(GetLockedPageFile($OpenPageName)) or (InElement('div', '^class="crossbar"$') and
|
if (-f GetLockedPageFile($OpenPageName) or (InElement('div', '^class="crossbar"$') and
|
||||||
IsFile(GetLockedPageFile($CrossbarPageName)))) {
|
-f GetLockedPageFile($CrossbarPageName))) {
|
||||||
if (/\G(\<form.*?\<\/form\>)/cgs) {
|
if (/\G(\<form.*?\<\/form\>)/cgs) {
|
||||||
my $form = $1;
|
my $form = $1;
|
||||||
my $oldpos = pos;
|
my $oldpos = pos;
|
||||||
|
|||||||
@@ -163,7 +163,8 @@ sub GdSecurityImageGenerate {
|
|||||||
my ($imgData) = $img->out(force => 'png');
|
my ($imgData) = $img->out(force => 'png');
|
||||||
my $ticketId = Digest::MD5::md5_hex(rand());
|
my $ticketId = Digest::MD5::md5_hex(rand());
|
||||||
CreateDir($GdSecurityImageDir);
|
CreateDir($GdSecurityImageDir);
|
||||||
open my $fh, ">:raw", encode_utf8(GdSecurityImageGetImageFile($ticketId))
|
my $file = GdSecurityImageGetImageFile($ticketId);
|
||||||
|
open my $fh, ">:raw", $file
|
||||||
or ReportError(Ts('Image storing failed. (%s)', $!), '500 INTERNAL SERVER ERROR');
|
or ReportError(Ts('Image storing failed. (%s)', $!), '500 INTERNAL SERVER ERROR');
|
||||||
print $fh $imgData;
|
print $fh $imgData;
|
||||||
#print $fh $png; ### experimental ###
|
#print $fh $png; ### experimental ###
|
||||||
@@ -186,7 +187,9 @@ sub GdSecurityImageIsValidId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub GdSecurityImageReadImageFile {
|
sub GdSecurityImageReadImageFile {
|
||||||
if (open(my $IN, '<:raw', encode_utf8(shift))) {
|
my $file = shift;
|
||||||
|
utf8::encode($file); # filenames are bytes!
|
||||||
|
if (open(my $IN, '<:raw', $file)) {
|
||||||
local $/ = undef; # Read complete files
|
local $/ = undef; # Read complete files
|
||||||
my $data=<$IN>;
|
my $data=<$IN>;
|
||||||
close $IN;
|
close $IN;
|
||||||
@@ -208,7 +211,7 @@ sub GdSecurityImageDoImage {
|
|||||||
print $q->header(-type=>'image/png');
|
print $q->header(-type=>'image/png');
|
||||||
print $data;
|
print $data;
|
||||||
|
|
||||||
Unlink(GdSecurityImageGetImageFile($id));
|
unlink(GdSecurityImageGetImageFile($id));
|
||||||
}
|
}
|
||||||
|
|
||||||
sub GdSecurityImageCleanup {
|
sub GdSecurityImageCleanup {
|
||||||
@@ -216,10 +219,10 @@ sub GdSecurityImageCleanup {
|
|||||||
if (!GdSecurityImageIsValidId($id)) {
|
if (!GdSecurityImageIsValidId($id)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
my @files = (Glob("$GdSecurityImageDir/*.png"), Glob("$GdSecurityImageDir/*.ticket"));
|
my @files = (bsd_glob("$GdSecurityImageDir/*.png"), bsd_glob("$GdSecurityImageDir/*.ticket"));
|
||||||
foreach my $file (@files) {
|
foreach my $file (@files) {
|
||||||
if ($Now - Modified($file) > $GdSecurityImageDuration) {
|
if ($Now - (stat $file)[9] > $GdSecurityImageDuration) {
|
||||||
Unlink($file);
|
unlink($file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -252,7 +255,7 @@ sub GdSecurityImageCheck {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (GdSecurityImageIsValidId($id)) {
|
if (GdSecurityImageIsValidId($id)) {
|
||||||
Unlink(GdSecurityImageGetTicketFile($id));
|
unlink(GdSecurityImageGetTicketFile($id));
|
||||||
}
|
}
|
||||||
|
|
||||||
$GdSecurityImageId = GdSecurityImageGenerate();
|
$GdSecurityImageId = GdSecurityImageGenerate();
|
||||||
|
|||||||
@@ -30,18 +30,18 @@ $GitMail = 'unknown@oddmuse.org';
|
|||||||
sub GitCommit {
|
sub GitCommit {
|
||||||
my ($message, $author) = @_;
|
my ($message, $author) = @_;
|
||||||
my $oldDir = cwd;
|
my $oldDir = cwd;
|
||||||
ChangeDir("$DataDir/page");
|
chdir("$DataDir/page");
|
||||||
capture {
|
capture {
|
||||||
system($GitBinary, qw(add -A));
|
system($GitBinary, qw(add -A));
|
||||||
system($GitBinary, qw(commit -q -m), $message, "--author=$author <$GitMail>");
|
system($GitBinary, qw(commit -q -m), $message, "--author=$author <$GitMail>");
|
||||||
};
|
};
|
||||||
ChangeDir($oldDir);
|
chdir($oldDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub GitInitRepository {
|
sub GitInitRepository {
|
||||||
return if IsDir("$DataDir/page/.git");
|
return if -d "$DataDir/page/.git";
|
||||||
capture {
|
capture {
|
||||||
system($GitBinary, qw(init -q --), encode_utf8("$DataDir/page"));
|
system($GitBinary, qw(init -q --), "$DataDir/page");
|
||||||
};
|
};
|
||||||
GitCommit('Initial import', 'Oddmuse');
|
GitCommit('Initial import', 'Oddmuse');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ sub GitRun {
|
|||||||
my $exitStatus;
|
my $exitStatus;
|
||||||
# warn join(' ', $GitBinary, @_) . "\n";
|
# warn join(' ', $GitBinary, @_) . "\n";
|
||||||
|
|
||||||
ChangeDir($GitRepo);
|
chdir($GitRepo);
|
||||||
if ($GitDebug) {
|
if ($GitDebug) {
|
||||||
# TODO use ToString here
|
# TODO use ToString here
|
||||||
# capture the output of the git comand in a temporary file
|
# capture the output of the git comand in a temporary file
|
||||||
@@ -99,7 +99,7 @@ sub GitRun {
|
|||||||
} else {
|
} else {
|
||||||
$exitStatus = system($GitBinary, @_);
|
$exitStatus = system($GitBinary, @_);
|
||||||
}
|
}
|
||||||
ChangeDir($oldDir);
|
chdir($oldDir);
|
||||||
return $exitStatus;
|
return $exitStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ sub GitInitVariables {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub GitInitRepository {
|
sub GitInitRepository {
|
||||||
return if IsDir("$GitRepo/.git");
|
return if -d "$GitRepo/.git";
|
||||||
my $exception = shift;
|
my $exception = shift;
|
||||||
CreateDir($GitRepo);
|
CreateDir($GitRepo);
|
||||||
GitRun(qw(init --quiet));
|
GitRun(qw(init --quiet));
|
||||||
@@ -187,16 +187,17 @@ sub DoGitCleanup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub GitCleanup {
|
sub GitCleanup {
|
||||||
if (IsDir($GitRepo)) {
|
if (-d $GitRepo) {
|
||||||
print $q->p('Git cleanup starting');
|
print $q->p('Git cleanup starting');
|
||||||
AllPagesList();
|
AllPagesList();
|
||||||
# delete all the files including all the files starting with a dot
|
# delete all the files including all the files starting with a dot
|
||||||
opendir(DIR, encode_utf8($GitRepo)) or ReportError("cannot open directory $GitRepo: $!");
|
opendir(DIR, $GitRepo) or ReportError("cannot open directory $GitRepo: $!");
|
||||||
foreach my $file (readdir(DIR)) {
|
foreach my $file (readdir(DIR)) {
|
||||||
my $name = decode_utf8($file);
|
my $name = $file;
|
||||||
|
utf8::decode($name); # filenames are bytes
|
||||||
next if $file eq '.git' or $file eq '.' or $file eq '..' or $IndexHash{$name};
|
next if $file eq '.git' or $file eq '.' or $file eq '..' or $IndexHash{$name};
|
||||||
print $q->p("Deleting left over file $name");
|
print $q->p("Deleting left over file $name");
|
||||||
Unlink("$GitRepo/$file") or print $q->p("Cannot delete $GitRepo/$name: $!");
|
unlink "$GitRepo/$file" or ReportError("cannot delete $GitRepo/$name: $!");
|
||||||
}
|
}
|
||||||
closedir DIR;
|
closedir DIR;
|
||||||
# write all the files again, just to be sure
|
# write all the files again, just to be sure
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# Copyright (C) 2006-2014 Alex Schroeder <alex@gnu.org>
|
# Copyright (C) 2006-2014 Alex Schroeder <alex@gnu.org>
|
||||||
# Copyright (C) 2016 Ingo Belka
|
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify it under
|
# 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
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
@@ -26,17 +25,12 @@ our ($GotobarName);
|
|||||||
|
|
||||||
$GotobarName = 'GotoBar';
|
$GotobarName = 'GotoBar';
|
||||||
|
|
||||||
our ($GotobarSetHome, $GotobarSetRC);
|
|
||||||
# 0 does set home-link and/or rc-link automatically, 1 doesn't
|
|
||||||
|
|
||||||
# do this later so that the user can customize $GotobarName
|
# do this later so that the user can customize $GotobarName
|
||||||
push(@MyInitVariables, \&GotobarInit);
|
push(@MyInitVariables, \&GotobarInit);
|
||||||
|
|
||||||
sub GotobarInit {
|
sub GotobarInit {
|
||||||
$GotobarName = FreeToNormal($GotobarName); # spaces to underscores
|
$GotobarName = FreeToNormal($GotobarName); # spaces to underscores
|
||||||
$AdminPages{$GotobarName} = 1;
|
$AdminPages{$GotobarName} = 1;
|
||||||
my $id = GetId();
|
|
||||||
my $encoded = UrlEncode($id);
|
|
||||||
if ($IndexHash{$GotobarName}) {
|
if ($IndexHash{$GotobarName}) {
|
||||||
OpenPage($GotobarName);
|
OpenPage($GotobarName);
|
||||||
return if PageMarkedForDeletion();
|
return if PageMarkedForDeletion();
|
||||||
@@ -44,11 +38,8 @@ sub GotobarInit {
|
|||||||
# links for unsuspecting users.
|
# links for unsuspecting users.
|
||||||
@UserGotoBarPages = ();
|
@UserGotoBarPages = ();
|
||||||
$UserGotoBar = '';
|
$UserGotoBar = '';
|
||||||
my $text = $Page{text};
|
|
||||||
$text =~ s/\$\$id\b/$encoded/g;
|
|
||||||
$text =~ s/\$id\b/$id/g;
|
|
||||||
my $count = 0;
|
my $count = 0;
|
||||||
while ($text =~ m/($LinkPattern|\[\[$FreeLinkPattern\]\]|\[\[$FreeLinkPattern\|([^\]]+)\]\]|\[$InterLinkPattern\s+([^\]]+?)\]|\[$FullUrlPattern[|[:space:]]([^\]]+?)\])/g) {
|
while ($Page{text} =~ m/($LinkPattern|\[\[$FreeLinkPattern\]\]|\[\[$FreeLinkPattern\|([^\]]+)\]\]|\[$InterLinkPattern\s+([^\]]+?)\]|\[$FullUrlPattern[|[:space:]]([^\]]+?)\])/g) {
|
||||||
my $page = $2||$3||$4||$6||$8;
|
my $page = $2||$3||$4||$6||$8;
|
||||||
my $text = $5||$7||$9;
|
my $text = $5||$7||$9;
|
||||||
$UserGotoBar .= ' ' if $UserGotoBar;
|
$UserGotoBar .= ' ' if $UserGotoBar;
|
||||||
@@ -62,9 +53,9 @@ sub GotobarInit {
|
|||||||
# is the list of recent changes.
|
# is the list of recent changes.
|
||||||
$count++;
|
$count++;
|
||||||
if ($count == 1) {
|
if ($count == 1) {
|
||||||
unless ($GotobarSetHome) {$HomePage = FreeToNormal($page)};
|
$HomePage = FreeToNormal($page);
|
||||||
} elsif ($count == 2) {
|
} elsif ($count == 2) {
|
||||||
unless ($GotobarSetRC) {$RCName = FreeToNormal($page);}
|
$RCName = FreeToNormal($page);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
# Copyright (C) 2020 Alex Schroeder <alex@gnu.org>
|
|
||||||
# Copyright (C) 2020 Daniel MacKay <daniel@bonmot.ca>
|
|
||||||
#
|
|
||||||
# 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/>.
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use v5.10;
|
|
||||||
|
|
||||||
AddModuleDescription('grep-filtered.pl', 'Grep Filtered');
|
|
||||||
|
|
||||||
our ($PageDir);
|
|
||||||
our ($UseGrep);
|
|
||||||
|
|
||||||
$UseGrep = 1;
|
|
||||||
|
|
||||||
*OldGrepFiltered = \&Filtered;
|
|
||||||
*Filtered = \&NewGrepFiltered;
|
|
||||||
|
|
||||||
sub NewGrepFiltered {
|
|
||||||
my ($string, @pages) = @_;
|
|
||||||
my @pages = OldGrepFiltered(@_);
|
|
||||||
my $regexp = SearchRegexp($string);
|
|
||||||
return @pages unless GetParam('grep', $UseGrep) and $regexp;
|
|
||||||
my @result = grep(/$regexp/i, @pages); # search parameter for page titles
|
|
||||||
my %found = map {$_ => 1} @result;
|
|
||||||
$regexp =~ s/\\n(\)*)$/\$$1/g; # sometimes \n can be replaced with $
|
|
||||||
$regexp =~ s/([?+{|()])/\\$1/g; # basic regular expressions from man grep
|
|
||||||
# if we know of any remaining grep incompatibilities we should
|
|
||||||
# return @pages here!
|
|
||||||
$regexp = quotemeta($regexp);
|
|
||||||
open(F, '-|:encoding(UTF-8)', "find $PageDir -type f -print0 | xargs -0 -n10 -P4 grep --ignore-case -l '$regexp'") ;
|
|
||||||
while (<F>) {
|
|
||||||
my ($pageName) = m/.*\/(.*)\.pg$/ ;
|
|
||||||
push(@result, $pageName) if not $found{$pageName};
|
|
||||||
} close(F);
|
|
||||||
return sort @result;
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
@@ -40,7 +43,7 @@ sub HtmlTemplate {
|
|||||||
my $type = shift;
|
my $type = shift;
|
||||||
# return header.de.html, or header.html, or error.html, or report an error...
|
# return header.de.html, or header.html, or error.html, or report an error...
|
||||||
foreach my $f ((map { "$type.$_" } HtmlTemplateLanguage()), $type, "error") {
|
foreach my $f ((map { "$type.$_" } HtmlTemplateLanguage()), $type, "error") {
|
||||||
return "$HtmlTemplateDir/$f.html" if IsFile("$HtmlTemplateDir/$f.html");
|
return "$HtmlTemplateDir/$f.html" if -r "$HtmlTemplateDir/$f.html";
|
||||||
}
|
}
|
||||||
ReportError(Tss('Could not find %1.html template in %2', $type, $HtmlTemplateDir),
|
ReportError(Tss('Could not find %1.html template in %2', $type, $HtmlTemplateDir),
|
||||||
'500 INTERNAL SERVER ERROR');
|
'500 INTERNAL SERVER ERROR');
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -12,7 +12,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -14,7 +14,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
# This module offers the possibility to restrict viewing of "hidden"
|
# This module offers the possibility to restrict viewing of "hidden"
|
||||||
# pages to only editors or admins. The restriction may be based
|
# pages to only editors or admins. The restriction may be based
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
@@ -84,7 +87,7 @@ sub GetActionHtmlTemplate {
|
|||||||
my $action = GetParam('action', 'browse');
|
my $action = GetParam('action', 'browse');
|
||||||
# return browse.de.html, or browse.html, or error.html, or report an error...
|
# return browse.de.html, or browse.html, or error.html, or report an error...
|
||||||
foreach my $f ((map { "$action.$_" } HtmlTemplateLanguage()), $action, "error") {
|
foreach my $f ((map { "$action.$_" } HtmlTemplateLanguage()), $action, "error") {
|
||||||
return "$HtmlTemplateDir/$f.html" if IsFile("$HtmlTemplateDir/$f.html");
|
return "$HtmlTemplateDir/$f.html" if -r "$HtmlTemplateDir/$f.html";
|
||||||
}
|
}
|
||||||
ReportError(Tss('Could not find %1.html template in %2', $action, $HtmlTemplateDir),
|
ReportError(Tss('Could not find %1.html template in %2', $action, $HtmlTemplateDir),
|
||||||
'500 INTERNAL SERVER ERROR');
|
'500 INTERNAL SERVER ERROR');
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 3 of the License, or
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,7 +11,10 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program; if not, write to the
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# 59 Temple Place, Suite 330
|
||||||
|
# Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use v5.10;
|
use v5.10;
|
||||||
|
|||||||