forked from github/kensanata.oddmuse
Compare commits
195 Commits
2.3.5
...
return-obj
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8ac7a2818 | ||
|
|
1cd33b691c | ||
|
|
9d7e5b43c0 | ||
|
|
1c4e082755 | ||
|
|
31c02d6e95 | ||
|
|
26bf8a3043 | ||
|
|
ac21a8e6a4 | ||
|
|
a000937768 | ||
|
|
4eef4d2d76 | ||
|
|
92410a1f5c | ||
|
|
aa89d08e08 | ||
|
|
244ddb5157 | ||
|
|
9c3456c963 | ||
|
|
ad9afbf5ba | ||
|
|
bc079133f7 | ||
|
|
69a0f3ed23 | ||
|
|
1fc3600329 | ||
|
|
c1141cd610 | ||
|
|
300d86b2cd | ||
|
|
d609a857c0 | ||
|
|
8e98298777 | ||
|
|
0642fad8f8 | ||
|
|
d10d76c475 | ||
|
|
8aa2f04995 | ||
|
|
b3a1f199c1 | ||
|
|
9fbf8a6f39 | ||
|
|
c96b9bb71c | ||
|
|
71ff0f7de3 | ||
|
|
89fa22d1c9 | ||
|
|
7582aaaba1 | ||
|
|
58e9a1e240 | ||
|
|
bd39fe5d38 | ||
|
|
1c776e1080 | ||
|
|
d088887337 | ||
|
|
0ba76bafb2 | ||
|
|
c7756a8861 | ||
|
|
5462b215be | ||
|
|
f98374df9b | ||
|
|
4614990e04 | ||
|
|
6658886b72 | ||
|
|
5130a92f9c | ||
|
|
a602bc0678 | ||
|
|
09efd911e6 | ||
|
|
958c118649 | ||
|
|
c031898184 | ||
|
|
d32ebaddc8 | ||
|
|
9c90bba602 | ||
|
|
93cc1578d0 | ||
|
|
79610f7490 | ||
|
|
be2b87635c | ||
|
|
8e38179b66 | ||
|
|
1300cfad52 | ||
|
|
bc6ae67a9a | ||
|
|
c989bdab1d | ||
|
|
3d339a2bf5 | ||
|
|
ac7d68d134 | ||
|
|
a50c2da042 | ||
|
|
6ccf5b7c14 | ||
|
|
7a54eff9b1 | ||
|
|
3c2ff5577b | ||
|
|
d721704a1f | ||
|
|
2ba67e1d8b | ||
|
|
eb0a4b6416 | ||
|
|
7f9b23a704 | ||
|
|
1576c80c9f | ||
|
|
894748b6b8 | ||
|
|
a70618c3be | ||
|
|
7e92227414 | ||
|
|
57788b375a | ||
|
|
b363cb535f | ||
|
|
e31662cda6 | ||
|
|
ec84200a0b | ||
|
|
6f5a4f974c | ||
|
|
7d7383de7f | ||
|
|
892d462e53 | ||
|
|
4e26f0ea37 | ||
|
|
ca0a429027 | ||
|
|
d72ee44c3d | ||
|
|
5b8caecee9 | ||
|
|
9e58992459 | ||
|
|
408df36c0b | ||
|
|
46183d0246 | ||
|
|
3e6de210f8 | ||
|
|
f50b617b76 | ||
|
|
2c4df27922 | ||
|
|
823f518615 | ||
|
|
2a2987ac79 | ||
|
|
dfd97d4958 | ||
|
|
826d1cd6ef | ||
|
|
642cec5e7d | ||
|
|
dfa71cb2e3 | ||
|
|
5ed32a6d3f | ||
|
|
06c7fedec0 | ||
|
|
b29ce6c44d | ||
|
|
ef6d9172f5 | ||
|
|
eaf4433505 | ||
|
|
259dc5c27d | ||
|
|
e606016ece | ||
|
|
c7692fad5b | ||
|
|
3206947b6b | ||
|
|
1eb5bb06a5 | ||
|
|
0b4007ff5a | ||
|
|
92c64bbba9 | ||
|
|
f7d5430451 | ||
|
|
22bf1e8df3 | ||
|
|
9ec075c1c0 | ||
|
|
a767bb5c94 | ||
|
|
6d62283927 | ||
|
|
445e80cefc | ||
|
|
6589e84d10 | ||
|
|
59e79d2b17 | ||
|
|
ea426db112 | ||
|
|
b3759296e2 | ||
|
|
00388009f7 | ||
|
|
c50fb63c36 | ||
|
|
9f49cf49ea | ||
|
|
1c240033d8 | ||
|
|
c04743d6e1 | ||
|
|
f740251bbb | ||
|
|
4e90046b66 | ||
|
|
d1f9c401cd | ||
|
|
4027e142bc | ||
|
|
76b26df765 | ||
|
|
b054fa463d | ||
|
|
538dac4d3f | ||
|
|
1a2d690487 | ||
|
|
b7ff38b8a8 | ||
|
|
c0c79cfbf2 | ||
|
|
80ef71f3e4 | ||
|
|
846ddce24e | ||
|
|
4ec48bb963 | ||
|
|
70c7d154a3 | ||
|
|
eb0738dedc | ||
|
|
f993903c8c | ||
|
|
a5ecd94393 | ||
|
|
2c823013e7 | ||
|
|
e8b7ad4b67 | ||
|
|
3c84add52a | ||
|
|
e0c38a6fe6 | ||
|
|
f0588fa299 | ||
|
|
2942b9427d | ||
|
|
7acb6cf516 | ||
|
|
2a433a7513 | ||
|
|
62d6dc4bd4 | ||
|
|
9b35704a57 | ||
|
|
77fd49544c | ||
|
|
b3fa76bfb6 | ||
|
|
1ab2aa9427 | ||
|
|
57c2413b51 | ||
|
|
aa8dcd54fa | ||
|
|
81721e29de | ||
|
|
9d3b5e25ee | ||
|
|
2ca2d43068 | ||
|
|
697c320d52 | ||
|
|
de1b4c3a3b | ||
|
|
c6f00323fc | ||
|
|
300d8e9ad3 | ||
|
|
f78f0ad7e8 | ||
|
|
afb21a02d4 | ||
|
|
98af7703d7 | ||
|
|
b4b82e8050 | ||
|
|
9636fe2e0a | ||
|
|
cda31ad0aa | ||
|
|
5e35d0aa79 | ||
|
|
66ea19a686 | ||
|
|
b302e1f8d4 | ||
|
|
874586f27d | ||
|
|
5566297f91 | ||
|
|
295d64e34f | ||
|
|
8e3d36610e | ||
|
|
e1781c0651 | ||
|
|
c53f9c7954 | ||
|
|
a8ca3b6b95 | ||
|
|
02d90f1fc2 | ||
|
|
2ddd13eea5 | ||
|
|
ff069557f5 | ||
|
|
51f85d9581 | ||
|
|
9e6f63c0e8 | ||
|
|
4689452d8e | ||
|
|
90829ca433 | ||
|
|
eb3071d0db | ||
|
|
c4671a8909 | ||
|
|
aa759e5c04 | ||
|
|
7e27af5998 | ||
|
|
3c25fcb9ba | ||
|
|
7aa86d29fe | ||
|
|
7a8ffb8e64 | ||
|
|
f1f2ed71a5 | ||
|
|
4f4ad14850 | ||
|
|
7ad2d0ed38 | ||
|
|
9589c42a6a | ||
|
|
8d4c15e948 | ||
|
|
c7274a267b | ||
|
|
fafb051632 | ||
|
|
cb8c7a1234 |
16
BUGS
16
BUGS
@@ -1,16 +0,0 @@
|
||||
I've seen a bug that shows as follows: <strong class="changes">think
|
||||
it belongs anymore.</stron><strong class="changes">g>.
|
||||
|
||||
Is DiffHtmlMarkWords called twice for a chunk?
|
||||
|
||||
It seems that following the diff link from RC to a page that has
|
||||
a minor edit at the end will show a minor diff instead of a major
|
||||
diff, eventhough it *says* that it will show a major diff!
|
||||
|
||||
mod_perl:
|
||||
|
||||
After a while, the script forgets some pages, so that links to these
|
||||
pages turn into questionmarks.
|
||||
|
||||
From time to time, the script will show for a page X the page content
|
||||
of the previous page.
|
||||
@@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IFPkgDescriptionDeleteWarning</key>
|
||||
<string></string>
|
||||
<key>IFPkgDescriptionDescription</key>
|
||||
<string>A wiki engine.</string>
|
||||
<key>IFPkgDescriptionTitle</key>
|
||||
<string>Oddmuse</string>
|
||||
<key>IFPkgDescriptionVersion</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Oddmuse</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Oddmuse</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string></string>
|
||||
<key>IFMajorVersion</key>
|
||||
<integer>1</integer>
|
||||
<key>IFMinorVersion</key>
|
||||
<integer>0</integer>
|
||||
<key>IFPkgFlagAllowBackRev</key>
|
||||
<false/>
|
||||
<key>IFPkgFlagAuthorizationAction</key>
|
||||
<string>RootAuthorization</string>
|
||||
<key>IFPkgFlagDefaultLocation</key>
|
||||
<string>/Library/WebServer</string>
|
||||
<key>IFPkgFlagFollowLinks</key>
|
||||
<false/>
|
||||
<key>IFPkgFlagInstallFat</key>
|
||||
<false/>
|
||||
<key>IFPkgFlagIsRequired</key>
|
||||
<false/>
|
||||
<key>IFPkgFlagOverwritePermissions</key>
|
||||
<false/>
|
||||
<key>IFPkgFlagRelocatable</key>
|
||||
<false/>
|
||||
<key>IFPkgFlagRestartAction</key>
|
||||
<string>NoRestart</string>
|
||||
<key>IFPkgFlagRootVolumeOnly</key>
|
||||
<true/>
|
||||
<key>IFPkgFlagUpdateInstalledLanguages</key>
|
||||
<false/>
|
||||
<key>IFPkgFlagUseUserMask</key>
|
||||
<integer>0</integer>
|
||||
<key>IFPkgFormatVersion</key>
|
||||
<real>0.10000000149011612</real>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
package OddMuse;
|
||||
$DataDir = '/Library/WebServer/Oddmuse';
|
||||
do 'current';
|
||||
@@ -1 +0,0 @@
|
||||
$AdminPass = '';
|
||||
@@ -1 +0,0 @@
|
||||
$AdminPass = '';
|
||||
4
Mac/wiki
4
Mac/wiki
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
package OddMuse;
|
||||
$DataDir = '/Library/WebServer/Oddmuse';
|
||||
do 'current';
|
||||
132
Makefile
132
Makefile
@@ -1,5 +1,6 @@
|
||||
# The Makefile is only for developpers wanting to prepare the tarball.
|
||||
# Make sure the CVS keywords for the sed command on the next line are not expanded.
|
||||
# In order to build a copy of Oddmuse with all the version numbers, use:
|
||||
# make build. This creates modified copies of the files in the build
|
||||
# subdirectory.
|
||||
|
||||
VERSION_NO=$(shell git describe --tags)
|
||||
TRANSLATIONS=$(wildcard modules/translations/[a-z]*.pl$)
|
||||
@@ -45,130 +46,3 @@ translations: $(TRANSLATIONS)
|
||||
|
||||
test:
|
||||
prove t
|
||||
|
||||
# UNTESTED/OBSOLETE: these targets have not been tested in a long time
|
||||
# and are potentially obsolete.
|
||||
VERSION=oddmuse-$(VERSION_NO)
|
||||
UPLOADVERSION=oddmuse-inkscape-$(VERSION_NO)
|
||||
INKSCAPE=GPL $(wildcard inkscape/*.py inkscape/*.inx inkscape/*.sh)
|
||||
PACKAGEMAKER=/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker
|
||||
DIST=$(VERSION).tar.gz $(VERSION).tar.gz.sig \
|
||||
contrib/simple-install/$(VERSION)-simple.tar.gz \
|
||||
contrib/simple-install/$(VERSION)-simple.tar.gz.sig
|
||||
OLDDIST=$(VERSION).dmg $(VERSION).dmg.sig \
|
||||
$(VERSION).tgz $(VERSION).tgz.sig
|
||||
PWD=$(shell pwd)
|
||||
|
||||
dist: $(DIST)
|
||||
|
||||
upload: $(DIST)
|
||||
for f in $^; do \
|
||||
scp $$f as@dl.sv.nongnu.org:/releases/oddmuse/; \
|
||||
done
|
||||
|
||||
upload-text: new-utf8.pl
|
||||
wikiupload new-utf8.pl http://www.oddmuse.org/cgi-bin/oddmuse-en/New_Translation_File
|
||||
|
||||
contrib/simple-install/$(VERSION)-simple.tar.gz:
|
||||
cd contrib/simple-install && make $(VERSION)-simple.tar.gz
|
||||
|
||||
$(VERSION).tar.gz: README FDL GPL ChangeLog wiki.pl $(TRANSLATIONS) $(MODULES) current.pl
|
||||
rm -rf $(VERSION)
|
||||
mkdir $(VERSION)
|
||||
cp $^ $(VERSION)
|
||||
tar czf $@ $(VERSION)
|
||||
|
||||
$(UPLOADVERSION).tar.gz: $(INKSCAPE)
|
||||
rm -rf $(UPLOADVERSION)
|
||||
mkdir $(UPLOADVERSION)
|
||||
cp $^ $(UPLOADVERSION)
|
||||
cp wikiupload $(UPLOADVERSION)/oddmuse-upload.py
|
||||
tar czf $@ $(UPLOADVERSION)
|
||||
|
||||
%.sig: %
|
||||
gpg --sign -b $<
|
||||
|
||||
# OSX: .pkg is the package, and .dmg is the disk image.
|
||||
|
||||
# Make sure to copy the files into a new directory so that the CVS
|
||||
#subdirectory are not inlcuded in the .pkg. And fix permissions. Skip
|
||||
#if we can't run PackageMaker. All cp commands need sudo because on a
|
||||
#second run the directories will already exist.
|
||||
$(VERSION).pkg: wiki.pl modules/creole.pl Mac/config Mac/wiki
|
||||
if test -x $(PACKAGEMAKER); then \
|
||||
mkdir -p Mac/pkg/CGI-Executables; \
|
||||
sudo cp wiki.pl Mac/pkg/CGI-Executables/current; \
|
||||
sudo cp Mac/wiki Mac/pkg/CGI-Executables/wiki; \
|
||||
sudo chown -R root:admin Mac/pkg/CGI-Executables; \
|
||||
sudo chmod 644 Mac/pkg/CGI-Executables/current; \
|
||||
sudo chmod 755 Mac/pkg/CGI-Executables/wiki; \
|
||||
mkdir -p Mac/pkg/Oddmuse; \
|
||||
sudo cp Mac/config Mac/pkg/Oddmuse; \
|
||||
sudo chown www:admin Mac/pkg/Oddmuse; \
|
||||
sudo chmod 775 Mac/pkg/Oddmuse; \
|
||||
sudo chown root:admin Mac/pkg/Oddmuse/config; \
|
||||
sudo chmod 664 Mac/pkg/Oddmuse/config; \
|
||||
mkdir -p Mac/pkg/Oddmuse/modules; \
|
||||
sudo cp modules/mac.pl Mac/pkg/Oddmuse/modules; \
|
||||
sudo cp modules/creole.pl Mac/pkg/Oddmuse/modules; \
|
||||
sudo chown -R root:admin Mac/pkg/Oddmuse/modules; \
|
||||
sudo chmod 775 Mac/pkg/Oddmuse/modules; \
|
||||
sudo chmod 644 Mac/pkg/Oddmuse/modules/*; \
|
||||
$(PACKAGEMAKER) -build \
|
||||
-p $(PWD)/$@ \
|
||||
-i $(PWD)/Mac/Info.plist \
|
||||
-d $(PWD)/Mac/Description.plist \
|
||||
-f $(PWD)/Mac/pkg; \
|
||||
fi;
|
||||
|
||||
$(VERSION).dmg: $(VERSION).pkg
|
||||
hdiutil create -srcfolder $< -fs HFS+ -volname "Oddmuse" $@
|
||||
|
||||
# Slackware: .tgz are .tar.gz files used by the installer
|
||||
# Slackware webserver is run by nobody uid/gid 99/99.
|
||||
|
||||
$(VERSION).tgz: wiki.pl modules/creole.pl Mac/config Mac/wiki
|
||||
sudo rm -rf Slack/var Slack/install
|
||||
mkdir -p Slack/var/www/wiki/modules
|
||||
mkdir -p Slack/var/www/cgi-bin
|
||||
mkdir -p Slack/install
|
||||
sudo cp Mac/config Slack/var/www/wiki
|
||||
sudo cp Mac/wiki Slack/var/www/cgi-bin
|
||||
sudo cp README Slack/var/www/wiki
|
||||
sudo cp modules/creole.pl Slack/var/www/wiki/modules
|
||||
sudo cp wiki.pl Slack/var/www/cgi-bin/current
|
||||
sudo sed -e 's/VERSION/$(VERSION_NO)/' < Slack/slack-desc > Slack/install/slack-desc
|
||||
sudo chown -R 0:0 Slack/var Slack/install
|
||||
sudo chgrp 99 Slack/var/www/cgi-bin/wiki
|
||||
sudo chmod 644 Slack/var/www/cgi-bin/current
|
||||
sudo chmod 775 Slack/var/www/cgi-bin/wiki
|
||||
cd Slack && tar czf ../$@ var install
|
||||
|
||||
update-translations: $(TRANSLATIONS)
|
||||
|
||||
upload-translations: always
|
||||
for f in $(TRANSLATIONS); do \
|
||||
cvs status $$f | grep 'Status: Up-to-date'; \
|
||||
wikiput -z "ham" -u "cvs" -s "update" \
|
||||
"http://www.oddmuse.org/cgi-bin/oddmuse/raw/$$f" < $$f; \
|
||||
done
|
||||
|
||||
deb:
|
||||
equivs-build control
|
||||
|
||||
install:
|
||||
@echo This only installs the deb file, not the script itself.
|
||||
dpkg -i oddmuse*.deb
|
||||
|
||||
package-upload: debian-$(VERSION).tar.gz debian-$(VERSION).tar.gz.sig
|
||||
curl -T "{debian-$(VERSION).tar.gz,debian-$(VERSION).tar.gz.sig}" \
|
||||
ftp://savannah.gnu.org/incoming/savannah/oddmuse/
|
||||
|
||||
package: debian-$(VERSION).tar.gz
|
||||
gpg --ascii --encrypt $<
|
||||
|
||||
debian-$(VERSION).tar.gz:
|
||||
rm -rf $(VERSION)
|
||||
mkdir $(VERSION)
|
||||
cp README FDL GPL wiki.pl $(VERSION)
|
||||
tar czf $@ $(VERSION)
|
||||
|
||||
37
OddMuse.pm
37
OddMuse.pm
@@ -1,37 +0,0 @@
|
||||
# Copyright (C) 2005 Alex Schroeder <alex@emacswiki.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (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, write to the
|
||||
# Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use Apache2::RequestRec ();
|
||||
use Apache2::RequestIO ();
|
||||
use Apache2::Const -compile => qw(OK);
|
||||
|
||||
package OddMuse;
|
||||
|
||||
$RunCGI = 0;
|
||||
require 'wiki.pl';
|
||||
|
||||
sub handler {
|
||||
my $r = shift;
|
||||
for my $var (qw{DataDir UseConfig ConfigFile ModuleDir ConfigPage
|
||||
AdminPass EditPass ScriptName FullUrl}) {
|
||||
no strict "refs";
|
||||
$$var = $ENV{"Wiki$var"} if exists $ENV{"Wiki$var"}; # symbolic references
|
||||
}
|
||||
DoWikiRequest();
|
||||
return Apache2::Const::OK;
|
||||
}
|
||||
48
README
48
README
@@ -1,48 +0,0 @@
|
||||
This is the README file distributed together with the Oddmuse script.
|
||||
|
||||
To install the script, copy wiki.pl into your cgi-bin directory. This
|
||||
will store the pages in a temporary directory for you. In order to
|
||||
make this permanent, change the $DataDir option in the script from
|
||||
'/tmp/oddmuse' to 'oddmuse'. This will save the pages in a
|
||||
subdirectory of your cgi-bin directory.
|
||||
|
||||
In order to start your wiki, click on the edit link (the first link
|
||||
below the navigation bar, at the bottom of the page). This will allow
|
||||
you to enter some text for this page. Click the Save button and you
|
||||
are done.
|
||||
|
||||
To add new pages, edit the homepage and add links to new pages. Links
|
||||
are traditionally formed by ConcatenatingCapitalizedWords. This kind
|
||||
of link pattern is called a wiki word.
|
||||
|
||||
Alternatively, put links in [[double square brackets]]. This kind of
|
||||
link pattern is called a free link.
|
||||
|
||||
As long as the new pages don't exist, links to these pages are
|
||||
followed by a clickable question mark. Click on the question mark to
|
||||
create the new page.
|
||||
|
||||
Enjoy your wiki experience.
|
||||
|
||||
Visit http://www.oddmuse.org/ to learn more about the translation
|
||||
files and modules that are part of this package.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.1 or
|
||||
any later version published by the Free Software Foundation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or (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.
|
||||
|
||||
Both the GNU Free Documentation License, and the GNU General Public
|
||||
License are distributed together with this script. See the files FDL
|
||||
and GPL, respectively.
|
||||
157
README.creole
Normal file
157
README.creole
Normal file
@@ -0,0 +1,157 @@
|
||||
This is the README file distributed together with the
|
||||
[[https://oddmuse.org/|Oddmuse]] script.
|
||||
|
||||
== Installing Oddmuse on a Debian System running Apache
|
||||
|
||||
The following instructions require a number of tools. You can make sure
|
||||
they're all installed by issuing the following command as {{{root}}}:
|
||||
|
||||
{{{
|
||||
apt-get install coreutils apache2 sudo wget w3m perl \
|
||||
libwww-perl libxml-rss-perl diffutils
|
||||
}}}
|
||||
|
||||
You probably created an account for yourself. You might have to add this
|
||||
user to the {{{sudo}}} group. Here's how I created my own user as
|
||||
{{{root}}}:
|
||||
|
||||
{{{
|
||||
adduser alex
|
||||
usermod -a -G sudo alex
|
||||
}}}
|
||||
|
||||
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
|
||||
make the script executable.
|
||||
|
||||
{{{
|
||||
sudo wget -O /usr/lib/cgi-bin/wiki.pl \
|
||||
http://git.savannah.gnu.org/cgit/oddmuse.git/plain/wiki.pl
|
||||
sudo chmod +x /usr/lib/cgi-bin/wiki.pl
|
||||
}}}
|
||||
|
||||
You should be able to test it right now! Visit
|
||||
{{{http://localhost/cgi-bin/wiki.pl}}}. If your site is available from
|
||||
the outside, you will be able to use a normal browser. If don't have a
|
||||
domain name yet, you'll probably have to use a text browser like
|
||||
{{{w3m}}}.
|
||||
|
||||
{{{
|
||||
w3m http://localhost/cgi-bin/wiki.pl
|
||||
}}}
|
||||
|
||||
If you create pages in this wiki, these will get stored in a temporary
|
||||
directory. You need change the data directory from {{{"/tmp/oddmuse"}}}
|
||||
to like {{{"/var/local/oddmuse"}}}. The best way to do this without
|
||||
changing {{{wiki.pl}}} is by editing
|
||||
{{{/etc/apache2/sites-available/default}}}. Add the following line:
|
||||
|
||||
{{{
|
||||
SetEnv WikiDataDir /var/local/oddmuse
|
||||
}}}
|
||||
|
||||
Enable the default site by calling the following command:
|
||||
|
||||
{{{
|
||||
sudo a2ensite default
|
||||
}}}
|
||||
|
||||
Reload the Apache configuration by calling the following command:
|
||||
|
||||
{{{
|
||||
sudo service apache2 reload
|
||||
}}}
|
||||
|
||||
You need to create the new data directory. You webserver runs CGI
|
||||
scripts as {{{www-data}}}. Thus, you need to change the owner and group
|
||||
of the directory to {{{www-data}}}.
|
||||
|
||||
{{{
|
||||
sudo mkdir -p /var/local/oddmuse
|
||||
sudo chown www-data.www-data /var/local/oddmuse
|
||||
}}}
|
||||
|
||||
Done! Visit your wiki and start editing. Click on the edit link (the
|
||||
first link below the navigation bar, at the bottom of the page). This
|
||||
will allow you to enter some text for this page. Click the Save button
|
||||
and you are done.
|
||||
|
||||
To add new pages, edit the homepage and add links to new pages by
|
||||
putting their names in {{{[[double square brackets]]}}}.
|
||||
|
||||
Enjoy your wiki experience.
|
||||
|
||||
Visit https://www.oddmuse.org/ to learn more about the translation
|
||||
files and modules that are part of this package.
|
||||
|
||||
== Apache
|
||||
|
||||
If you think this information doesn't work for you, here are some things
|
||||
to check.
|
||||
|
||||
Apache's config directory is {{{/etc/apache2/apache2.conf}}}. This is
|
||||
where we get the {{{www-data}}} username from. It says:
|
||||
|
||||
{{{
|
||||
# These need to be set in /etc/apache2/envvars
|
||||
User ${APACHE_RUN_USER}
|
||||
Group ${APACHE_RUN_GROUP}
|
||||
}}}
|
||||
|
||||
Checking {{{/etc/apache2/envvars}}} we see the following:
|
||||
|
||||
{{{
|
||||
export APACHE_RUN_USER=www-data
|
||||
export APACHE_RUN_GROUP=www-data
|
||||
}}}
|
||||
|
||||
So that's what we're using in the {{{chown}}} command in our
|
||||
instructions above.
|
||||
|
||||
The default site is configured in
|
||||
{{{/etc/apache2/sites-available/default}}}. In order for it to be
|
||||
//enabled//, there must be a symlink from a file in
|
||||
{{{/etc/apache2/sites-enabled}}} to the file in
|
||||
{{{sites-available}}}. You can enable it using the following command:
|
||||
|
||||
{{{
|
||||
sudo a2ensite default
|
||||
}}}
|
||||
|
||||
This file also lists the directories we've used in out instructions
|
||||
above.
|
||||
|
||||
{{{
|
||||
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
|
||||
}}}
|
||||
|
||||
This means that {{{http://localhost/cgi-bin/wiki.pl}}} will call
|
||||
{{{/usr/lib/cgi-bin/wiki.pl}}}
|
||||
|
||||
Don't forget to reload the Apache configuration as shown above, or
|
||||
simply restart it all:
|
||||
|
||||
{{{
|
||||
sudo service apache2 graceful
|
||||
}}}
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.1 or
|
||||
any later version published by the Free Software Foundation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or (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.
|
||||
|
||||
Both the GNU Free Documentation License, and the GNU General Public
|
||||
License are distributed together with this script. See the files FDL
|
||||
and GPL, respectively.
|
||||
@@ -1,19 +0,0 @@
|
||||
# HOW TO EDIT THIS FILE:
|
||||
# The "handy ruler" below makes it easier to edit a package description. Line
|
||||
# up the first '|' above the ':' following the base package name, and the '|'
|
||||
# on the right side marks the last column you can put a character in. You must
|
||||
# make exactly 11 lines for the formatting to be correct. It's also
|
||||
# customary to leave one space after the ':'.
|
||||
|
||||
|-----handy-ruler------------------------------------------------------|
|
||||
oddmuse: Oddmuse VERSION
|
||||
oddmuse:
|
||||
oddmuse: Oddmuse is the name of the wiki engine being further developed by
|
||||
oddmuse: Alex Schröder. The wiki engine consists of one big Perl script.
|
||||
oddmuse: When installed on a web host, the script generates a wiki -- a
|
||||
oddmuse: web site where users can read pages, change pages, add new pages,
|
||||
oddmuse: and delete old pages. All pages are accessed via the script.
|
||||
oddmuse:
|
||||
oddmuse: This package will also install the Creole markup extension.
|
||||
oddmuse:
|
||||
oddmuse: Package created by Alex Schröder
|
||||
@@ -1,172 +0,0 @@
|
||||
Name: Oddmuse
|
||||
Version: 2007.12.31
|
||||
Release: 1suse
|
||||
Group: Applications/Productivity
|
||||
License: /opt/oddmuse/doc/COPYING
|
||||
Summary: Simple user-editted website (wiki)
|
||||
|
||||
Distribution: any perl+webserver+cgi distro
|
||||
Vendor: Alex Schröder
|
||||
Packager: Dr. Robert J. Meier <grandfather@sourceforge.org>
|
||||
URL: http://www.oddmuse.org/
|
||||
|
||||
BuildRoot: /var/tmp/rpm-oddmusewiki-root
|
||||
BuildArch: noarch
|
||||
Prefix: /opt/oddmuse
|
||||
Prefix: /srv/www/wiki
|
||||
Prefix: /srv/www/cgi-bin
|
||||
Prefix: /etc/httpd/conf.d
|
||||
Source0: %{name}-%{version}.tar.gz
|
||||
Source1: %{name}-modules-%{version}.tar.gz
|
||||
Source2: %{name}-contents-%{version}.tar.gz
|
||||
|
||||
Provides: wiki
|
||||
Requires: perl >= 5.0.0
|
||||
|
||||
# Avoid automatic dependency calculation macros, as they are seldom portable.
|
||||
AutoReq: no
|
||||
AutoProv: no
|
||||
|
||||
|
||||
|
||||
%description
|
||||
Oddmuse is a program to run a wiki.
|
||||
A wiki can be used for communication in a team or for documentation,
|
||||
when things have to be quick and easy: Content Management for everybody.
|
||||
|
||||
A wiki enables other people to quickly join efforts. In the office,
|
||||
you can introduce new employees, distribute phone lists, store memos,
|
||||
plan trips, document projects, prepare meetings,
|
||||
or describe internal processes.
|
||||
|
||||
For many free software projects wikis have taken an important role
|
||||
somewhere between manual, FAQ, IRC, and mailing lists.
|
||||
|
||||
Oddmuse is very easy to install: Simple installation, compact code,
|
||||
and easy extensibility were the most important design factors.
|
||||
|
||||
Features
|
||||
|
||||
1. Easy to install: Just copy one file into the correct directory.
|
||||
2. No dependencies on version management tools or database installation.
|
||||
3. Web server needs only Perl installed.
|
||||
4. Easy to use for users, easy to hack for programmers.
|
||||
5. Capable of multilingual sites.
|
||||
6. Unicode (UTF-8) per default.
|
||||
7. Valid HTML; CSS friendly.
|
||||
8. Caching on several levels.
|
||||
9. Easy to download.
|
||||
|
||||
|
||||
|
||||
%prep
|
||||
# Record the environment variables
|
||||
# $RPM_ARCH $RPM_OS - host configuration
|
||||
# $RPM_OPT_FLAGS - c compile flags
|
||||
# $RPM_PACKAGE_[NAME VERSION RELEASE] - spec file fields
|
||||
# $RPM_SOURCE_DIR - base for Source and Patch filenames
|
||||
# $RPM_BUILD_DIR - base for setup macro filenames
|
||||
# $RPM_BUILD_ROOT - %{BuildRoot}
|
||||
# modified by rpmbuild --buildroot
|
||||
# $RPM_DOC_DIR - base for doc macro filenames
|
||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-prep.log; fi
|
||||
|
||||
%setup -q -b1 -b2
|
||||
|
||||
|
||||
|
||||
%build
|
||||
# Record the environment variables
|
||||
# Nomimally these are the same as for %prep
|
||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-build.log; fi
|
||||
|
||||
# Nothing to build yet.
|
||||
|
||||
|
||||
|
||||
%install
|
||||
# Record the environment variables
|
||||
# Nomimally these are the same as for %prep
|
||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-install.log; fi
|
||||
|
||||
rm -rf "$RPM_BUILD_ROOT"
|
||||
mkdir -p "$RPM_BUILD_ROOT"/opt/oddmuse/cgi-bin
|
||||
mkdir -p "$RPM_BUILD_ROOT"/opt/oddmuse/doc
|
||||
mkdir -p "$RPM_BUILD_ROOT"/opt/oddmuse/etc
|
||||
mkdir -p "$RPM_BUILD_ROOT"/opt/oddmuse/libperl
|
||||
mkdir -p "$RPM_BUILD_ROOT"/srv/www/cgi-bin
|
||||
mkdir -p "$RPM_BUILD_ROOT"/srv/www/wiki
|
||||
mkdir -p "$RPM_BUILD_ROOT"/etc/httpd/conf.d
|
||||
|
||||
install cgi-bin/wiki.pl "$RPM_BUILD_ROOT"/opt/oddmuse/cgi-bin
|
||||
install cgi-bin/wiki.pl "$RPM_BUILD_ROOT"/srv/www/cgi-bin
|
||||
install doc/COPYING "$RPM_BUILD_ROOT"/opt/oddmuse/doc
|
||||
install etc/oddmusewiki.conf "$RPM_BUILD_ROOT"/opt/oddmuse/etc
|
||||
install libperl/current libperl/*.pl "$RPM_BUILD_ROOT"/opt/oddmuse/libperl
|
||||
cp -r wiki "$RPM_BUILD_ROOT"/srv/www
|
||||
|
||||
|
||||
|
||||
%clean
|
||||
# Record the environment variables
|
||||
# Nomimally these are the same as for %prep
|
||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-clean.log; fi
|
||||
rm -rf "$RPM_BUILD_ROOT"
|
||||
|
||||
|
||||
|
||||
%pre
|
||||
# Record local environment variables.
|
||||
# $RPM_INSTALL_PREFIX* reflect the Prefix: field(s)
|
||||
# modified by --relocate and --prefix arguments
|
||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-pre.log; fi
|
||||
|
||||
|
||||
|
||||
%post
|
||||
# Record local environment variables
|
||||
# $RPM_INSTALL_PREFIX* reflect the Prefix: field(s)
|
||||
# modified by --relocate and --prefix arguments
|
||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-post.log; fi
|
||||
|
||||
# Because relocation may change configuration,
|
||||
# it cannot be symlinked into a public access site at rpmbuild -bb time.
|
||||
if [ \( -d "$RPM_INSTALL_PREFIX2" -a -w "$RPM_INSTALL_PREFIX2" \) -o -w "$RPM_INSTALL_PREFIX2"/wiki.pl ]; then
|
||||
cat "$RPM_INSTALL_PREFIX0"/cgi-bin/wiki.pl |
|
||||
perl -pe 's:/opt/oddmuse:'"$RPM_INSTALL_PREFIX0"':;' |
|
||||
perl -pe 's:/srv/www/wiki:'"$RPM_INSTALL_PREFIX1"':;' |
|
||||
cat > "$RPM_INSTALL_PREFIX2"/wiki.pl
|
||||
fi
|
||||
|
||||
|
||||
|
||||
%preun
|
||||
# Record local environment variables
|
||||
# $RPM_INSTALL_PREFIX* reflect the Prefix: field(s)
|
||||
# modified by --relocate and --prefix arguments at rpm -i time
|
||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-preun.log; fi
|
||||
|
||||
|
||||
|
||||
%postun
|
||||
# Record local environment variables
|
||||
# $RPM_INSTALL_PREFIX* reflect the Prefix: field(s)
|
||||
# modified by --relocate and --prefix arguments at rpm -i time
|
||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-postun.log; fi
|
||||
|
||||
|
||||
|
||||
%files
|
||||
# The doc, config, attr and many other macros are well documented in RPM-HOWTO
|
||||
%defattr(0444,root,root)
|
||||
%license
|
||||
%attr(0555,root,root) /opt/oddmuse
|
||||
%config /opt/oddmuse/etc/oddmusewiki.conf
|
||||
%attr(0777,root,root) /srv/www/wiki
|
||||
%attr(0555,root,root) /srv/www/cgi-bin/wiki.pl
|
||||
|
||||
|
||||
|
||||
%changelog
|
||||
* Wed Jan 3 2008 Dr. Robert Meier <grandfather@sourceforge.org> 2007.12.13-1suse
|
||||
- copy-and-edit from hello.rpm
|
||||
@@ -292,6 +292,7 @@ sub main {
|
||||
Init(); # read config file (no modules!)
|
||||
$ScriptName = $site; # undo setting in the config file
|
||||
$FullUrl = $site; #
|
||||
InitPageVariables(); # call again: $ScriptName was wrong
|
||||
binmode(STDOUT,':utf8');
|
||||
$q->charset('utf8');
|
||||
if ($q->path_info eq '/source') {
|
||||
|
||||
@@ -1,26 +1,20 @@
|
||||
#!/usr/bin/perl
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (C) 2004 Alex Schroeder <alex@emacswiki.org>
|
||||
# Copyright (C) 2004 Alex Schroeder <alex@gnu.org>
|
||||
# Copyright (C) 2007 Vinicius José Latorre <viniciusjl at ig.com.br>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation, either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the
|
||||
# Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
# $Id: ell-to-wiki.pl,v 1.5 2007/02/15 22:00:26 as Exp $
|
||||
# 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 LWP::UserAgent;
|
||||
use XML::Parser;
|
||||
|
||||
122
contrib/fix-copyright-years
Executable file
122
contrib/fix-copyright-years
Executable file
@@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2006 Free Software Foundation, Inc.
|
||||
#
|
||||
# GNU Radio 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, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU Radio 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 Radio; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
||||
# Boston, MA 02110-1301, USA.
|
||||
|
||||
# This file is based on code from GNU Radio.
|
||||
# https://github.com/balister/GNU-Radio/blob/master/dtools/bin/fix-copyright-years
|
||||
|
||||
import re
|
||||
import datetime
|
||||
import subprocess
|
||||
import multiprocessing
|
||||
|
||||
def command(*args): return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0]
|
||||
|
||||
def is_free_software(lines):
|
||||
for line in lines[:50]:
|
||||
if 'This program is free software' in line: return True
|
||||
return False
|
||||
|
||||
def get_copyright_lines(lines):
|
||||
start = -1
|
||||
end = -1
|
||||
for i, line in enumerate(lines[:20]):
|
||||
if line.startswith('# Copyright'):
|
||||
if start == -1: start = i
|
||||
end = i
|
||||
if start == -1: raise Exception
|
||||
return start, end
|
||||
|
||||
def copyright_line(author, years):
|
||||
from_year = years.pop()
|
||||
to_year = from_year
|
||||
for year in years:
|
||||
if year > to_year: to_year = year
|
||||
elif year < from_year: from_year = year
|
||||
|
||||
if from_year == to_year:
|
||||
return '# Copyright (C) %d %s\n' % (from_year, author)
|
||||
else:
|
||||
return '# Copyright (C) %d–%d %s\n' % (from_year, to_year, author)
|
||||
|
||||
author_re = re.compile('\nAuthor: (.*)\nDate:.* (\d\d\d\d) ')
|
||||
|
||||
def fix_co_years(files):
|
||||
for file in files:
|
||||
print file
|
||||
years = {}
|
||||
changed = False
|
||||
lines = open(file).readlines()
|
||||
if not is_free_software(lines):
|
||||
print ' is not Free Software'
|
||||
continue
|
||||
|
||||
# extract authors and years from git log
|
||||
log = command('git', 'log', file)
|
||||
it = re.finditer(author_re, log)
|
||||
for match in it:
|
||||
author, year = match.groups()
|
||||
if author in years:
|
||||
years[author].add(int(year))
|
||||
else:
|
||||
years[author] = set([int(year)])
|
||||
|
||||
# extract copyright beginning and end from
|
||||
try:
|
||||
start, end = get_copyright_lines(lines)
|
||||
except:
|
||||
print ' copyright lines not found'
|
||||
continue
|
||||
|
||||
# only update or add existing authors, don't touch authors not in git log
|
||||
for author in years.keys():
|
||||
found = False
|
||||
for i in range(start, end + 1):
|
||||
if author in lines[i]:
|
||||
line = copyright_line(author, years[author])
|
||||
if line != lines[i]:
|
||||
lines[i] = line
|
||||
changed = True
|
||||
found = True
|
||||
continue
|
||||
|
||||
if not found:
|
||||
lines.insert(end, copyright_line(author, years[author]))
|
||||
changed = True
|
||||
|
||||
# write file
|
||||
if changed:
|
||||
# print ''.join(lines[:30])
|
||||
# print '------------------------------------------------------------------------'
|
||||
open(file, 'w').write(''.join(lines))
|
||||
|
||||
if __name__ == "__main__":
|
||||
# get recursive list of files in the repo
|
||||
files = command('git', 'ls-tree', '--name-only', 'HEAD', '-r').splitlines()
|
||||
# files = ['contrib/campaignwiki/add-link.pl']
|
||||
|
||||
# start n+1 processes to handle the files
|
||||
num_procs = multiprocessing.cpu_count()
|
||||
# num_procs = 1
|
||||
procs = [multiprocessing.Process(
|
||||
target=lambda *files: fix_co_years(files),
|
||||
args=files[num::num_procs],
|
||||
) for num in range(num_procs)]
|
||||
map(multiprocessing.Process.start, procs)
|
||||
map(multiprocessing.Process.join, procs)
|
||||
@@ -602,7 +602,7 @@ This command is used to reflect new pages to `oddmuse-pages-hash'."
|
||||
("{{{.*?}}}"
|
||||
0 '(face shadow
|
||||
help-echo "Creole code"))
|
||||
("^{{{\n\\(.*\n\\)+?}}}\n"
|
||||
("^{{{\\(.*\n\\)+?}}}\n"
|
||||
0 '(face shadow
|
||||
help-echo "Creole multiline code")))
|
||||
"Implement markup rules for the Creole markup extension.
|
||||
@@ -841,7 +841,9 @@ WIKI is the name of the wiki as defined in `oddmuse-wikis',
|
||||
PAGENAME is the pagename of the page you want to edit. If the
|
||||
page is already in a buffer, pop to that buffer instead of
|
||||
loading the page Use a prefix argument to force a reload of the
|
||||
page."
|
||||
page. Use \\[oddmuse-reload] to reload the list of pages
|
||||
available if you changed the URL in `oddmuse-wikis' or if other
|
||||
people have been editing the wiki in the mean time."
|
||||
(interactive (oddmuse-pagename))
|
||||
(make-directory (concat oddmuse-directory "/" wiki) t)
|
||||
(let ((name (concat wiki ":" pagename)))
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
/* Copyright 2005 Alex Schroeder <alex@emacswiki.org>
|
||||
based on http://simon.incutio.com/archive/2004/05/30/plinks#p-13
|
||||
Copyright 2004 Simon Willison
|
||||
|
||||
This script adds purple numbers to paragraphs.
|
||||
https://oddmuse.org/wiki/Purple_Numbers_Extension
|
||||
*/
|
||||
|
||||
function plinkHighlight() {
|
||||
@@ -1,17 +0,0 @@
|
||||
DirectoryIndex wiki.pl
|
||||
Options ExecCGI SymLinksIfOwnerMatch
|
||||
AddHandler cgi-script .pl
|
||||
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine on
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_URI} !=/favicon.ico
|
||||
RewriteRule ^(.*)$ wiki.pl?$1 [L,QSA]
|
||||
|
||||
# The config file might contain passwords. Also protect possible
|
||||
# backup filenames.
|
||||
RewriteRule ^config(\~|\.bak)?$ wiki.pl/config [L]
|
||||
# The visitor.log file contains IP numbers of visitors.
|
||||
RewriteRule ^visitors.log$ wiki.pl/visitor.log [L]
|
||||
</IfModule>
|
||||
@@ -1,14 +0,0 @@
|
||||
all:
|
||||
@echo Please invoke make dist on the top level
|
||||
|
||||
%-simple.tar.gz: README config wiki.pl .htaccess current.pl FDL GPL
|
||||
tar czf $@ $^
|
||||
|
||||
current.pl: ../../wiki.pl
|
||||
cp $^ $@
|
||||
|
||||
FDL: ../../FDL
|
||||
cp $^ $@
|
||||
|
||||
GPL: ../../GPL
|
||||
cp $^ $@
|
||||
@@ -1,76 +0,0 @@
|
||||
This is the README file distributed as part of the simple-install
|
||||
package together with the Oddmuse script.
|
||||
|
||||
Unzip all the files into a directory served by Apache. Get the
|
||||
current.pl file from here: http://emacswiki.org/scripts/current.pl
|
||||
|
||||
Your directory should now contain the following files:
|
||||
|
||||
* README (this file)
|
||||
* .htaccess (information for Apache)
|
||||
* config (a simple config file for you to modify)
|
||||
* wiki.pl (a wrapper script setting the data directory)
|
||||
* current.pl (the main script)
|
||||
* modules (a directory containing modules)
|
||||
* modules/creole.pl (support for the standard wiki markup)
|
||||
|
||||
The wiki pages will be saved in this directory.
|
||||
|
||||
Make sure the www user (or whoever Apache runs under) has write access
|
||||
to this directory. In that directory, try chmod o+w . and see if that
|
||||
helps when you get an error message saying that Oddmuse cannot create
|
||||
the temp directory.
|
||||
|
||||
You need to make sure that your administrator has allowed
|
||||
AllowOverride All in his httpd.conf file for the settings in the
|
||||
.htaccess file provided to have an effect.
|
||||
|
||||
Running Oddmuse will create more files, eventually.
|
||||
|
||||
* pages (the directory containing the pages)
|
||||
* keep (the directory containing older versions of pages)
|
||||
* pageidx (a file containing the names of existing pages)
|
||||
* rc.log (the file used to produce RecentChanges)
|
||||
* visitors.log (the file used to log the most recent visitors)
|
||||
* temp (a temporary directory for log files and the like)
|
||||
|
||||
In order to start your wiki, click on the edit link (the first link
|
||||
below the navigation bar, at the bottom of the page). This will allow
|
||||
you to enter some text for this page. Click the Save button and you
|
||||
are done.
|
||||
|
||||
To add new pages, edit the homepage and add links to new pages. Links
|
||||
are traditionally formed by ConcatenatingCapitalizedWords. This kind
|
||||
of link pattern is called a wiki word.
|
||||
|
||||
Alternatively, put links in [[double square brackets]]. This kind of
|
||||
link pattern is called a free link.
|
||||
|
||||
As long as the new pages don't exist, links to these pages are
|
||||
followed by a clickable question mark. Click on the question mark to
|
||||
create the new page.
|
||||
|
||||
Enjoy your wiki experience.
|
||||
|
||||
Visit http://www.oddmuse.org/ to learn more about the translation
|
||||
files and modules that are part of this package.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.1 or
|
||||
any later version published by the Free Software Foundation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or (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.
|
||||
|
||||
Both the GNU Free Documentation License, and the GNU General Public
|
||||
License are distributed together with this script. See the files FDL
|
||||
and GPL, respectively.
|
||||
@@ -1,2 +0,0 @@
|
||||
# Where to find diff(1) and grep(1)
|
||||
$ENV{PATH} = '/usr/bin:/bin';
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# This wrapper does nothing but tell Oddmuse to use the current
|
||||
# directory as its data directory.
|
||||
package OddMuse;
|
||||
$DataDir = '.';
|
||||
|
||||
# You need to get the latest copy of this script from
|
||||
# http://emacswiki.org/scripts/current.pl
|
||||
do 'current.pl';
|
||||
114
contrib/undo-double-quotes.pl
Executable file
114
contrib/undo-double-quotes.pl
Executable file
@@ -0,0 +1,114 @@
|
||||
#! /usr/bin/perl -w
|
||||
|
||||
# Copyright (C) 2015 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 utf8;
|
||||
use strict;
|
||||
use warnings;
|
||||
undef $/; # slurp
|
||||
|
||||
my %index = ();
|
||||
my $verbose = '';
|
||||
|
||||
sub write_file {
|
||||
my ($file, $data) = @_;
|
||||
return unless $data;
|
||||
open(my $fh, '>:utf8', $file) or die "Cannot write $file: $!";
|
||||
print $fh $data;
|
||||
close($fh);
|
||||
}
|
||||
|
||||
sub replacement_block {
|
||||
my ($block, $pos, @no_go) = @_;
|
||||
|
||||
while (@no_go) {
|
||||
my $first = shift @no_go;
|
||||
print "Is $pos between " . $first->[0] . " and " . $first->[1] . "?\n" if $verbose;
|
||||
return $block if $pos >= $first->[0] and $pos <= $first->[1];
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
sub translate_file {
|
||||
my ($data) = @_;
|
||||
my @no_go = ();
|
||||
|
||||
while ($data =~ /( <nowiki>.*?<\/nowiki>
|
||||
| <code>.*?<\/code>
|
||||
| ^ <pre> (.*\n)+ <\/pre>
|
||||
| ^ {{{ (.*\n)+ }}} )/gmx) {
|
||||
push @no_go, [pos($data) - length $1, pos($data)];
|
||||
print "no go from " . $no_go[-1]->[0] . ".." . $no_go[-1]->[1] . " for $1\n" if $verbose;
|
||||
}
|
||||
|
||||
# The problem is that these replacements don't adjust @no_go! Perhaps it is good enough?
|
||||
my $subs = '';
|
||||
$subs = $subs || $data =~ s/ ( \[\/quote\] \n \n \[quote\] ) /replacement_block($1, pos($data), @no_go)/gex;
|
||||
return $data if $subs;
|
||||
}
|
||||
|
||||
sub read_file {
|
||||
my $file = shift;
|
||||
open(my $fh, '<:utf8', $file) or die "Cannot read $file: $!";
|
||||
my $data = <$fh>;
|
||||
close($fh);
|
||||
return $data;
|
||||
}
|
||||
|
||||
sub main {
|
||||
my ($dir) = @_;
|
||||
mkdir($dir . '-new') or die "Cannot create $dir-new: $!";
|
||||
print "Indexing files\n";
|
||||
foreach my $file (glob("$dir/.* $dir/*")) {
|
||||
next unless $file =~ /$dir\/(.+)/;
|
||||
my $id = $1;
|
||||
next if $id eq ".";
|
||||
next if $id eq "..";
|
||||
$index{$id} = 1;
|
||||
}
|
||||
print "Converting files\n";
|
||||
foreach my $id (sort keys %index) {
|
||||
# this is where you debug a particular page
|
||||
# $verbose = $id eq '2014-12-18_Emacs_Wiki_Migration';
|
||||
write_file("$dir-new/$id", translate_file(read_file("$dir/$id")));
|
||||
}
|
||||
}
|
||||
|
||||
use Getopt::Long;
|
||||
|
||||
my $dir = 'raw';
|
||||
my $help = '';
|
||||
|
||||
GetOptions ("dir=s" => \$dir,
|
||||
"help" => \$help);
|
||||
|
||||
if ($help) {
|
||||
print qq{
|
||||
Usage: $0 [--dir=DIR]
|
||||
|
||||
You need to use the raw.pl script to create a directory full of raw
|
||||
wiki text files.
|
||||
|
||||
--dir=DIR is where the raw wiki text files are. Default: raw. The
|
||||
converted files will be stored in DIR-new, ie. in raw-new by
|
||||
default.
|
||||
|
||||
Example: $0 --dir=~/alexschroeder/raw
|
||||
}
|
||||
} else {
|
||||
main ($dir);
|
||||
}
|
||||
170
contrib/undo-local-names.pl
Executable file
170
contrib/undo-local-names.pl
Executable file
@@ -0,0 +1,170 @@
|
||||
#! /usr/bin/perl -w
|
||||
|
||||
# Copyright (C) 2015 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 utf8;
|
||||
use strict;
|
||||
use warnings;
|
||||
undef $/; # slurp
|
||||
|
||||
my %index = ();
|
||||
my $verbose = '';
|
||||
|
||||
my $LinkPattern = '(\p{Uppercase}+\p{Lowercase}+\p{Uppercase}\p{Alphabetic}*)';
|
||||
my $FreeLinkPattern = "([-,.()'%&?;<> _1-9A-Za-z\x{0080}-\x{fffd}]|[-,.()'%&?;<> _0-9A-Za-z\x{0080}-\x{fffd}][-,.()'%&?;<> _0-9A-Za-z\x{0080}-\x{fffd}]+)";
|
||||
my $UrlProtocols = 'http|https|ftp|afs|news|nntp|mid|cid|mailto|wais|prospero|telnet|gopher|irc|feed';
|
||||
my $UrlChars = '[-a-zA-Z0-9/@=+$_~*.,;:?!\'"()&#%]'; # see RFC 2396
|
||||
my $FullUrlPattern="((?:$UrlProtocols):$UrlChars+)"; # when used in square brackets
|
||||
|
||||
# either a single letter, or a string that begins with a single letter and ends with a non-space
|
||||
my $words = '([A-Za-z\x{0080}-\x{fffd}](?:[-%.,:;\'"!?0-9 A-Za-z\x{0080}-\x{fffd}]*?[-%.,:;\'"!?0-9A-Za-z\x{0080}-\x{fffd}])?)';
|
||||
# zero-width assertion to prevent km/h from counting
|
||||
my $nowordstart = '(?:(?<=[^-0-9A-Za-z\x{0080}-\x{fffd}])|^)';
|
||||
# zero-width look-ahead assertion to prevent km/h from counting
|
||||
my $nowordend = '(?=[^-0-9A-Za-z\x{0080}-\x{fffd}]|$)';
|
||||
|
||||
my $IrcNickRegexp = qr{[]a-zA-Z^[;\\`_{}|][]^[;\\`_{}|a-zA-Z0-9-]*};
|
||||
|
||||
sub FreeToNormal { # trim all spaces and convert them to underlines
|
||||
my $id = shift;
|
||||
return '' unless $id;
|
||||
$id =~ s/ /_/g;
|
||||
$id =~ s/__+/_/g;
|
||||
$id =~ s/^_//;
|
||||
$id =~ s/_$//;
|
||||
return $id;
|
||||
}
|
||||
|
||||
sub parse_local_names {
|
||||
my $filename = shift;
|
||||
print "Reading $filename\n";
|
||||
open(my $fh, '<:utf8', $filename) or die "Cannot read $filename: $!";
|
||||
my $data = <$fh>;
|
||||
close($fh);
|
||||
print "Parsing $filename\n";
|
||||
my %names = ();
|
||||
while ($data =~ m/\[$FullUrlPattern\s+([^\]]+?)\]/g) {
|
||||
my ($page, $url) = ($2, $1);
|
||||
my $id = FreeToNormal($page);
|
||||
$names{$id} = $url;
|
||||
}
|
||||
return \%names;
|
||||
}
|
||||
|
||||
sub write_file {
|
||||
my ($file, $data) = @_;
|
||||
return unless $data;
|
||||
open(my $fh, '>:utf8', $file) or die "Cannot write $file: $!";
|
||||
print $fh $data;
|
||||
close($fh);
|
||||
}
|
||||
|
||||
sub replacement {
|
||||
my ($names, $id, $pos, @no_go) = @_;
|
||||
|
||||
while (@no_go) {
|
||||
my $first = shift @no_go;
|
||||
print "Is $pos between " . $first->[0] . " and " . $first->[1] . "?\n" if $verbose;
|
||||
return $id if $pos >= $first->[0] and $pos <= $first->[1];
|
||||
}
|
||||
|
||||
return "[[$id]]" if exists $index{$id}; # local page exists
|
||||
return $id unless $names->{$id};
|
||||
return '[' . $names->{$id} . ' ' . $id . ']';
|
||||
}
|
||||
|
||||
sub translate_file {
|
||||
my ($names, $data) = @_;
|
||||
my @no_go = ();
|
||||
|
||||
while ($data =~ /( <nowiki>.*?<\/nowiki>
|
||||
| <code>.*?<\/code>
|
||||
| ^ <pre> (.*\n)+ <\/pre>
|
||||
| ^ {{{ (.*\n)+ }}}
|
||||
| ${nowordstart} \* ${words} \* ${nowordend}
|
||||
| ${nowordstart} \/ ${words} \/ ${nowordend}
|
||||
| ${nowordstart} \_ ${words} \_ ${nowordend}
|
||||
| ${nowordstart} \! ${words} \! ${nowordend}
|
||||
| \[\[ $FreeLinkPattern .*? \]\]
|
||||
| \[ $FullUrlPattern \s+ [^\]]+? \]
|
||||
| ^( \h+.+\n )+
|
||||
| ^(?: \[? \d\d?:\d\d (?:am|pm)? \]? )? \s* < $IrcNickRegexp > )/gmx) {
|
||||
push @no_go, [pos($data) - length $1, pos($data)];
|
||||
print "no go from " . $no_go[-1]->[0] . ".." . $no_go[-1]->[1] . " for $1\n" if $verbose;
|
||||
}
|
||||
|
||||
my $subs = $data =~ s/(?<![:![])\b$LinkPattern(?![:])/replacement($names, $1, pos($data), @no_go)/ge;
|
||||
return $data if $subs;
|
||||
}
|
||||
|
||||
sub read_file {
|
||||
my $file = shift;
|
||||
open(my $fh, '<:utf8', $file) or die "Cannot read $file: $!";
|
||||
my $data = <$fh>;
|
||||
close($fh);
|
||||
return $data;
|
||||
}
|
||||
|
||||
sub main {
|
||||
my ($dir, $local_names) = @_;
|
||||
mkdir($dir . '-new') or die "Cannot create $dir-new: $!";
|
||||
my $names = parse_local_names("$dir/$local_names");
|
||||
print "Indexing files\n";
|
||||
foreach my $file (glob("$dir/.* $dir/*")) {
|
||||
next unless $file =~ /$dir\/(.+)/;
|
||||
my $id = $1;
|
||||
next if $id eq ".";
|
||||
next if $id eq "..";
|
||||
next if $id eq "$local_names";
|
||||
$index{$id} = 1;
|
||||
}
|
||||
print "Converting files\n";
|
||||
foreach my $id (sort keys %index) {
|
||||
# this is where you debug a particular page
|
||||
# $verbose = $id eq '2014-12-18_Emacs_Wiki_Migration';
|
||||
write_file("$dir-new/$id", translate_file($names, read_file("$dir/$id")));
|
||||
}
|
||||
}
|
||||
|
||||
use Getopt::Long;
|
||||
|
||||
my $names = 'LocalNames';
|
||||
my $dir = 'raw';
|
||||
my $help = '';
|
||||
|
||||
GetOptions ("names=s" => \$names,
|
||||
"dir=s" => \$dir,
|
||||
"help" => \$help);
|
||||
|
||||
if ($help) {
|
||||
print qq{
|
||||
Usage: $0 [--dir=DIR] [--names=LocalNames]
|
||||
|
||||
You need to use the raw.pl script to create a directory full of raw
|
||||
wiki text files.
|
||||
|
||||
--dir=DIR is where the raw wiki text files are. Default: raw. The
|
||||
converted files will be stored in DIR-new, ie. in raw-new by
|
||||
default.
|
||||
|
||||
--names=LocalNames is the page name with all the local names on
|
||||
it. Default: LocalNames
|
||||
|
||||
Example: $0 --dir=~/alexschroeder/raw --names=Names
|
||||
}
|
||||
} else {
|
||||
main ($dir, $names);
|
||||
}
|
||||
128
contrib/undo-usemod.pl
Executable file
128
contrib/undo-usemod.pl
Executable file
@@ -0,0 +1,128 @@
|
||||
#! /usr/bin/perl -w
|
||||
|
||||
# Copyright (C) 2015 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 utf8;
|
||||
use strict;
|
||||
use warnings;
|
||||
undef $/; # slurp
|
||||
|
||||
my %index = ();
|
||||
my $verbose = '';
|
||||
|
||||
sub write_file {
|
||||
my ($file, $data) = @_;
|
||||
return unless $data;
|
||||
open(my $fh, '>:utf8', $file) or die "Cannot write $file: $!";
|
||||
print $fh $data;
|
||||
close($fh);
|
||||
}
|
||||
|
||||
sub replacement_block {
|
||||
my ($block, $pos, @no_go) = @_;
|
||||
|
||||
while (@no_go) {
|
||||
my $first = shift @no_go;
|
||||
print "Is $pos between " . $first->[0] . " and " . $first->[1] . "?\n" if $verbose;
|
||||
return $block if $pos >= $first->[0] and $pos <= $first->[1];
|
||||
}
|
||||
|
||||
return "[quote]\n" . join("\n", split(/ \n :+ \h? /x, $block)) . "[/quote]\n";
|
||||
}
|
||||
|
||||
sub replacement {
|
||||
my ($block, $tag, $pos, @no_go) = @_;
|
||||
|
||||
while (@no_go) {
|
||||
my $first = shift @no_go;
|
||||
print "Is $pos between " . $first->[0] . " and " . $first->[1] . "?\n" if $verbose;
|
||||
return $block if $pos >= $first->[0] and $pos <= $first->[1];
|
||||
}
|
||||
|
||||
return $tag . $block . $tag;
|
||||
}
|
||||
|
||||
sub translate_file {
|
||||
my ($data) = @_;
|
||||
my @no_go = ();
|
||||
|
||||
while ($data =~ /( <nowiki>.*?<\/nowiki>
|
||||
| <code>.*?<\/code>
|
||||
| ^ <pre> (.*\n)+ <\/pre>
|
||||
| ^ {{{ (.*\n)+ }}} )/gmx) {
|
||||
push @no_go, [pos($data) - length $1, pos($data)];
|
||||
print "no go from " . $no_go[-1]->[0] . ".." . $no_go[-1]->[1] . " for $1\n" if $verbose;
|
||||
}
|
||||
|
||||
# The problem is that these replacements don't adjust @no_go! Perhaps it is good enough?
|
||||
my $subs = '';
|
||||
$subs = $subs || $data =~ s/ ''' (.*?) ''' /replacement($1, '**', pos($data), @no_go)/gxe;
|
||||
$subs = $subs || $data =~ s/ '' (.*?) '' /replacement($1, '\/\/', pos($data), @no_go)/gxe;
|
||||
$subs = $data =~ s/ ^ :+ \h? ( .* \n (?: .+ \n ) * ) /replacement_block($1, pos($data), @no_go)/gmxe;
|
||||
return $data if $subs;
|
||||
}
|
||||
|
||||
sub read_file {
|
||||
my $file = shift;
|
||||
open(my $fh, '<:utf8', $file) or die "Cannot read $file: $!";
|
||||
my $data = <$fh>;
|
||||
close($fh);
|
||||
return $data;
|
||||
}
|
||||
|
||||
sub main {
|
||||
my ($dir) = @_;
|
||||
mkdir($dir . '-new') or die "Cannot create $dir-new: $!";
|
||||
print "Indexing files\n";
|
||||
foreach my $file (glob("$dir/.* $dir/*")) {
|
||||
next unless $file =~ /$dir\/(.+)/;
|
||||
my $id = $1;
|
||||
next if $id eq ".";
|
||||
next if $id eq "..";
|
||||
$index{$id} = 1;
|
||||
}
|
||||
print "Converting files\n";
|
||||
foreach my $id (sort keys %index) {
|
||||
# this is where you debug a particular page
|
||||
# $verbose = $id eq '2014-12-18_Emacs_Wiki_Migration';
|
||||
write_file("$dir-new/$id", translate_file(read_file("$dir/$id")));
|
||||
}
|
||||
}
|
||||
|
||||
use Getopt::Long;
|
||||
|
||||
my $dir = 'raw';
|
||||
my $help = '';
|
||||
|
||||
GetOptions ("dir=s" => \$dir,
|
||||
"help" => \$help);
|
||||
|
||||
if ($help) {
|
||||
print qq{
|
||||
Usage: $0 [--dir=DIR]
|
||||
|
||||
You need to use the raw.pl script to create a directory full of raw
|
||||
wiki text files.
|
||||
|
||||
--dir=DIR is where the raw wiki text files are. Default: raw. The
|
||||
converted files will be stored in DIR-new, ie. in raw-new by
|
||||
default.
|
||||
|
||||
Example: $0 --dir=~/alexschroeder/raw
|
||||
}
|
||||
} else {
|
||||
main ($dir);
|
||||
}
|
||||
14
control
14
control
@@ -1,14 +0,0 @@
|
||||
Maintainer: Alex Schroeder <alex@oddmuse.org>
|
||||
Section: web
|
||||
Priority: optional
|
||||
Standards-Version: 3.5.10
|
||||
|
||||
Package: oddmuse
|
||||
Architecture: any
|
||||
Depends: httpd, perl5, perl-modules
|
||||
Suggests: libwww-perl, libxml-rss-perl, libmime-base64-perl, diff
|
||||
Description: wiki engine
|
||||
A "wiki" is a website that is usally collaboratively edited
|
||||
by its users, including the ability to alter text written by
|
||||
other users. It is a simple and efficient content management
|
||||
system (CMS).
|
||||
@@ -100,7 +100,7 @@
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Symbola';
|
||||
src: local('Symbola'), url('/fonts/Symbola.woff') format('woff') url('/fonts/Symbola.ttf') format('truetype');
|
||||
src: local('Symbola'), url('/fonts/Symbola.woff') format('woff'), url('/fonts/Symbola.ttf') format('truetype');
|
||||
}
|
||||
|
||||
body, rss {
|
||||
@@ -271,7 +271,7 @@ label[for="searchlang"], #searchlang, .header input[type="submit"] {
|
||||
visibility: hidden; position: absolute;
|
||||
}
|
||||
/* wrap on the iphone */
|
||||
@media media only screen and (max-device-width: 480px) {
|
||||
@media only screen and (max-device-width: 480px) {
|
||||
}
|
||||
|
||||
.header input {
|
||||
|
||||
@@ -188,7 +188,7 @@ div.footer hr {
|
||||
|
||||
div.content > div.comment {
|
||||
border-top: none;
|
||||
padding-top: none;
|
||||
padding-top: 0;
|
||||
border-left: 1ex solid #bbb;
|
||||
padding-left: 1ex;
|
||||
}
|
||||
@@ -213,7 +213,12 @@ pre {
|
||||
|
||||
tt, pre, code {
|
||||
font-size: 80%;
|
||||
};
|
||||
}
|
||||
|
||||
code {
|
||||
background: #eee;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Gentium Basic';
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/sh
|
||||
# minimum
|
||||
apt-get install perl-modules
|
||||
# recommended
|
||||
apt-get install diff libwww-perl libxml-rss-perl
|
||||
# optional
|
||||
apt-get install libcgi-fast-perl
|
||||
25
fcgi.pl
25
fcgi.pl
@@ -1,25 +0,0 @@
|
||||
# Copyright (C) 2006 Alex Schroeder <alex@emacswiki.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (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, write to the
|
||||
# Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use CGI::Fast;
|
||||
package OddMuse;
|
||||
$RunCGI = 0;
|
||||
do 'wiki.pl';
|
||||
while ($q = new CGI::Fast) {
|
||||
DoWikiRequest();
|
||||
}
|
||||
@@ -27,7 +27,7 @@ my @path = split(/\//, $ENV{REDIRECT_URL});
|
||||
my $file = $path[$#path];
|
||||
|
||||
# for dynamic pages
|
||||
use vars qw($NotFoundHandlerExceptionsPage);
|
||||
our ($NotFoundHandlerExceptionsPage);
|
||||
$NotFoundHandlerExceptionsPage = 'NoCachePages';
|
||||
$RunCGI = 0;
|
||||
do $script;
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('aawrapperdiv.pl', 'WrapperDiv Module');
|
||||
|
||||
@@ -35,8 +36,7 @@ sub WrapperGetHeader {
|
||||
*PrintFooter = \&WrapperPrintFooter;
|
||||
|
||||
sub WrapperPrintFooter {
|
||||
my ($id, $rev, $comment) = @_;
|
||||
print $q->start_div({-class=>'wrapper close'});
|
||||
print $q->end_div(), $q->end_div();
|
||||
OldPrintFooter($id, $rev, $comment);
|
||||
OldPrintFooter(@_);
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('accesskeys.pl', 'Links With AccessKeys Extension');
|
||||
|
||||
@@ -21,7 +22,7 @@ our (@MyRules, $FreeLinkPattern);
|
||||
|
||||
push(@MyRules, \&LinksWithAccessKeys);
|
||||
sub LinksWithAccessKeys {
|
||||
if (m/\G(\[\[$FreeLinkPattern\{(.)\}\]\])/cog) {
|
||||
if (m/\G(\[\[$FreeLinkPattern\{(.)\}\]\])/cg) {
|
||||
my ($id, $key) = ($2, $3);
|
||||
Dirty($1);
|
||||
$id = FreeToNormal($id);
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
our ($q, %Page, %Action, $IndexFile, $PageDir, $KeepDir, @MyAdminCode, $RefererDir);
|
||||
|
||||
@@ -39,7 +40,7 @@ sub AdminPowerDelete {
|
||||
} else {
|
||||
print $q->p(GetPageLink($id) . ' ' . T('deleted'));
|
||||
WriteRcLog($id, Ts('Deleted %s', $id), 0, $Page{revision},
|
||||
GetParam('username', ''), GetRemoteHost(), $Page{languages},
|
||||
GetParam('username', ''), $q->remote_addr(), $Page{languages},
|
||||
GetCluster($Page{text}));
|
||||
}
|
||||
# Regenerate index on next request
|
||||
@@ -88,10 +89,10 @@ sub AdminPowerRename {
|
||||
# RecentChanges
|
||||
OpenPage($new);
|
||||
WriteRcLog($id, Ts('Renamed to %s', $new), 0, $Page{revision},
|
||||
GetParam('username', ''), GetRemoteHost(), $Page{languages},
|
||||
GetParam('username', ''), $q->remote_addr(), $Page{languages},
|
||||
GetCluster($Page{text}));
|
||||
WriteRcLog($new, Ts('Renamed from %s', $id), 0, $Page{revision},
|
||||
GetParam('username', ''), GetRemoteHost(), $Page{languages},
|
||||
GetParam('username', ''), $q->remote_addr(), $Page{languages},
|
||||
GetCluster($Page{text}));
|
||||
print $q->p(Tss('Renamed %1 to %2.', GetPageLink($id), GetPageLink($new)));
|
||||
ReleaseLock();
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('adsense.pl', 'AdSense Module');
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('advanced-uploads.pl', 'Advanced File Upload Extension');
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('age.pl', 'Age Indication Extension');
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('aggregate.pl', 'Front Page Extension');
|
||||
|
||||
@@ -25,7 +26,7 @@ our ($q, $bol, %Action, %Page, $OpenPageName, $UseDiff, $UsePathInfo, $RssStyleS
|
||||
push(@MyRules, \&AggregateRule);
|
||||
|
||||
sub AggregateRule {
|
||||
if ($bol && m/\G(<aggregate\s+((("[^\"&]+",?\s*)+)|(sort\s+)?search\s+(.+?))>)/gc) {
|
||||
if ($bol && m/\G(<aggregate\s+((("[^\"&]+",?\s*)+)|(sort\s+)?search\s+(.+?))>)/cg) {
|
||||
Clean(CloseHtmlEnvironments());
|
||||
Dirty($1);
|
||||
my ($oldpos, $old_, $str, $sort, $search) = ((pos), $_, $3, $5, $6);
|
||||
@@ -125,8 +126,8 @@ sub DoAggregate {
|
||||
}
|
||||
}
|
||||
foreach my $id (@pages) {
|
||||
my %data = ParseData(ReadFileOrDie(GetPageFile(FreeToNormal($id))));
|
||||
my $page = $data{text};
|
||||
my $data = ParseData(ReadFileOrDie(GetPageFile(FreeToNormal($id))));
|
||||
my $page = $data->{text};
|
||||
my $size = length($page);
|
||||
my $i = index($page, "\n=");
|
||||
my $j = index($page, "\n----");
|
||||
@@ -135,15 +136,15 @@ sub DoAggregate {
|
||||
$page =~ s/^=.*\n//; # if it starts with a header
|
||||
my $name = $id;
|
||||
$name =~ s/_/ /g;
|
||||
my $date = TimeToRFC822($data{ts});
|
||||
my $host = $data{host};
|
||||
my $username = $data{username};
|
||||
my $date = TimeToRFC822($data->{ts});
|
||||
my $host = $data->{host};
|
||||
my $username = $data->{username};
|
||||
$username = QuoteHtml($username);
|
||||
$username = $host unless $username;
|
||||
my $minor = $data{minor};
|
||||
my $revision = $data{revision};
|
||||
my $minor = $data->{minor};
|
||||
my $revision = $data->{revision};
|
||||
my $cluster = GetCluster($page);
|
||||
my $description = ToString sub { ApplyRules(QuoteHtml($page), 1, 0, undef, 'p') };
|
||||
my $description = ToString(sub { ApplyRules(QuoteHtml($page), 1, 0, undef, 'p') });
|
||||
$description .= $q->p(GetPageLink($id, T('Learn more...')))
|
||||
if length($page) < $size;
|
||||
$rss .= "\n<item>\n";
|
||||
|
||||
119
modules/agree-disagree.pl
Normal file
119
modules/agree-disagree.pl
Normal file
@@ -0,0 +1,119 @@
|
||||
# Copyright (C) 2005 Bayle Shanks http://purl.net/net/bshanks
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (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, write to the
|
||||
# Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
our ($Now, @MyMacros, @MyRules, $DefaultStyleSheet, $q, $bol);
|
||||
|
||||
AddModuleDescription('agree-disagree.pl', 'AgreeDisagreePlugin');
|
||||
|
||||
push(@MyRules, \&AgreeDisagreeSupportRule);
|
||||
|
||||
push(@MyMacros, sub{ s/\[\+\]/"[+:" . GetParam('username', T('Anonymous'))
|
||||
. ':' . TimeToText($Now) . "]"/eg });
|
||||
push(@MyMacros, sub{ s/\[\+(:[^]:]+)\]/"[+$1:" . TimeToText($Now) . "]"/eg });
|
||||
push(@MyMacros, sub{ s/\[\-\]/"[-:" . GetParam('username', T('Anonymous'))
|
||||
. ':' . TimeToText($Now) . "]"/eg });
|
||||
push(@MyMacros, sub{ s/\[\-(:[^]:]+)\]/"[-$1:" . TimeToText($Now) . "]"/eg });
|
||||
|
||||
|
||||
$DefaultStyleSheet .= <<'EOT' unless $DefaultStyleSheet =~ /div\.agree/; # mod_perl?
|
||||
div.agreeCount {
|
||||
float: left;
|
||||
clear: left;
|
||||
background-color: Green;
|
||||
padding-left: .5em;
|
||||
padding-right: .5em;
|
||||
padding-top: .5em;
|
||||
padding-bottom: .5em;
|
||||
}
|
||||
div.disagreeCount {
|
||||
float: left;
|
||||
clear: right;
|
||||
background-color: Red;
|
||||
padding-left: .5em;
|
||||
padding-right: .5em;
|
||||
padding-top: .5em;
|
||||
padding-bottom: .5em;
|
||||
}
|
||||
|
||||
div.agreeNames {
|
||||
float: left;
|
||||
background-color: Green;
|
||||
font-size: xx-small;
|
||||
display: none;
|
||||
}
|
||||
div.disagreeNames {
|
||||
float: left;
|
||||
background-color: Red;
|
||||
font-size: xx-small;
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EOT
|
||||
|
||||
|
||||
|
||||
|
||||
my %AgreePortraits = ();
|
||||
|
||||
|
||||
sub AgreeDisagreeSupportRule {
|
||||
if ($bol) {
|
||||
if ($bol && m/(\G(\s*\[\+(.*?)\]|\s*\[-(.*?)\])+)/cgs) {
|
||||
|
||||
my $votes = $1;
|
||||
my @ayes = ();
|
||||
my @nayes = ();
|
||||
while ($votes =~ m/\G.*?\[\+(.*?)\]/cgs) {
|
||||
my ($ignore, $name, $time) = split(/:/, $1, 3);
|
||||
push(@ayes, $name);
|
||||
}
|
||||
my $votes2 = $votes;
|
||||
while ($votes2 =~ m/\G.*?\[-(.*?)\]/cgs) {
|
||||
my ($ignore, $name, $time) = split(/:/, $1, 3);
|
||||
push(@nayes, $name);
|
||||
}
|
||||
|
||||
my $html = CloseHtmlEnvironments() ;
|
||||
$html .= $q->div({-class=>'agreeCount'}) . ($#ayes+1) . ' ' . '</div>' ;
|
||||
|
||||
$html .= $q->div({-class=>'agreeNames'}) . printNames(@ayes) . '</div>' ;
|
||||
$html .= $q->div({-class=>'disagreeCount'}) . ' ' . ($#nayes+1) . '</div>' ;
|
||||
$html .= $q->div({-class=>'disagreeNames'}) . printNames(@nayes) . '</div>' ;
|
||||
|
||||
|
||||
return $html;
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
sub printNames {
|
||||
my @names = @_;
|
||||
|
||||
my $html = '';
|
||||
foreach my $name (@names) {
|
||||
$html .= "$name<br>";
|
||||
}
|
||||
return $html;
|
||||
}
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('all.pl', 'All Action');
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('anchors.pl', 'Local Anchor Extension');
|
||||
|
||||
@@ -20,13 +21,13 @@ our ($q, %Page, $FootnoteNumber, $FreeLinkPattern, @MyRules, $BracketWiki);
|
||||
push(@MyRules, \&AnchorsRule);
|
||||
|
||||
sub AnchorsRule {
|
||||
if (m/\G\[\[\#$FreeLinkPattern\]\]/gc) {
|
||||
if (m/\G\[\[\#$FreeLinkPattern\]\]/cg) {
|
||||
return $q->a({-href=>'#' . FreeToNormal($1), -class=>'local anchor'}, $1);
|
||||
} elsif ($BracketWiki && m/\G\[\[\#$FreeLinkPattern\|([^\]]+)\]\]/gc) {
|
||||
} elsif ($BracketWiki && m/\G\[\[\#$FreeLinkPattern\|([^\]]+)\]\]/cg) {
|
||||
return $q->a({-href=>'#' . FreeToNormal($1), -class=>'local anchor'}, $2);
|
||||
} elsif ($BracketWiki && m/\G(\[\[$FreeLinkPattern\#$FreeLinkPattern\|([^\]]+)\]\])/cog
|
||||
or m/\G(\[\[\[$FreeLinkPattern\#$FreeLinkPattern\]\]\])/cog
|
||||
or m/\G(\[\[$FreeLinkPattern\#$FreeLinkPattern\]\])/cog) {
|
||||
} elsif ($BracketWiki && m/\G(\[\[$FreeLinkPattern\#$FreeLinkPattern\|([^\]]+)\]\])/cg
|
||||
or m/\G(\[\[\[$FreeLinkPattern\#$FreeLinkPattern\]\]\])/cg
|
||||
or m/\G(\[\[$FreeLinkPattern\#$FreeLinkPattern\]\])/cg) {
|
||||
# This one is not a dirty rule because the output is always a page
|
||||
# link, never an edit link (unlike normal free links).
|
||||
my $bracket = (substr($1, 0, 3) eq '[[[');
|
||||
@@ -46,7 +47,7 @@ sub AnchorsRule {
|
||||
$text = $id unless $text;
|
||||
$text =~ s/_/ /g;
|
||||
return ScriptLink(UrlEncode($id), $text, $class, undef, $title);
|
||||
} elsif (m/\G\[\:$FreeLinkPattern\]/gc) {
|
||||
} elsif (m/\G\[\:$FreeLinkPattern\]/cg) {
|
||||
return $q->a({-name=>FreeToNormal($1), -class=>'anchor'}, '');
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('antispam.pl', 'Antispam Module');
|
||||
|
||||
@@ -33,7 +34,7 @@ push(@MyRules, \&MaskEmailRule);
|
||||
|
||||
sub MaskEmailRule {
|
||||
# Allow [email@foo.bar Email Me] links
|
||||
if (m/\G\[($EmailRegExp(\s\w+)*\s*)\]/igc) {
|
||||
if (m/\G\[($EmailRegExp(\s\w+)*\s*)\]/cgi) {
|
||||
my $chunk = $1;
|
||||
$chunk =~ s/($EmailRegExp)//i;
|
||||
my $email = $1;
|
||||
@@ -50,7 +51,7 @@ sub MaskEmailRule {
|
||||
return "<a href=\"mailto:$email\">$chunk</a>";
|
||||
}
|
||||
|
||||
if (m/\G($EmailRegExp)/igc) {
|
||||
if (m/\G($EmailRegExp)/cgi) {
|
||||
my $email = $1;
|
||||
if ($DoMaskEmail) {
|
||||
my $masked="";
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('archive.pl', 'Archive Extension');
|
||||
|
||||
|
||||
@@ -14,12 +14,13 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('askpage.pl', 'Ask Page Extension');
|
||||
|
||||
use Fcntl qw(:DEFAULT :flock);
|
||||
|
||||
our ($DataDir, $NewComment);
|
||||
our ($DataDir);
|
||||
our ($AskPage, $QuestionPage, $NewQuestion);
|
||||
# Don't forget to set your $CommentsPattern to include both $AskPage and $QuestionPage
|
||||
$AskPage = 'Ask';
|
||||
@@ -50,12 +51,14 @@ sub NewAskPageDoPost {
|
||||
OldAskPageDoPost($id, @_); # keep original functionality for regular edits
|
||||
}
|
||||
|
||||
*OldAskPageGetCommentForm=\&GetCommentForm;
|
||||
*GetCommentForm=\&NewAskPageGetCommentForm;
|
||||
sub NewAskPageGetCommentForm {
|
||||
my ($id, $rev, $comment) = @_;
|
||||
$NewComment = $NewQuestion if $id eq $AskPage;
|
||||
OldAskPageGetCommentForm(@_);
|
||||
*OldAskPageGetTextArea=\&GetTextArea;
|
||||
*GetTextArea=\&NewAskPageGetTextArea;
|
||||
sub NewAskPageGetTextArea {
|
||||
my ($name, $text, @rest) = @_;
|
||||
if ($name eq 'aftertext' and not $text and GetId() eq $AskPage) {
|
||||
$text = $NewQuestion;
|
||||
}
|
||||
OldAskPageGetTextArea($name, $text, @rest);
|
||||
}
|
||||
|
||||
*OldAskPageJournalSort=\&JournalSort;
|
||||
|
||||
@@ -14,14 +14,16 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
use XML::Atom;
|
||||
use XML::Atom::Entry;
|
||||
use XML::Atom::Link;
|
||||
use XML::Atom::Person;
|
||||
|
||||
AddModuleDescription('atom.pl', 'Atom Extension');
|
||||
|
||||
our ($q, %Page, %Action, $CommentsPrefix, $ScriptName, $SiteName, $MaxPost, $UseDiff, $NewText, $DeletedPage, @MyInitVariables, @MyMacros, $FS, $BannedContent, $RssStyleSheet, $RssRights, $RssLicense, $RssImageUrl, $RssExclude, $RCName, @UploadTypes, $UploadAllowed, $UsePathInfo, $SiteDescription, $LastUpdate, $InterWikiMoniker);
|
||||
our ($q, %Page, %Action, $CommentsPrefix, $ScriptName, $SiteName, $MaxPost, $UseDiff, $DeletedPage, @MyInitVariables, @MyMacros, $FS, $BannedContent, $RssStyleSheet, $RssRights, $RssLicense, $RssImageUrl, $RssExclude, $RCName, @UploadTypes, $UploadAllowed, $UsePathInfo, $SiteDescription, $LastUpdate, $InterWikiMoniker);
|
||||
|
||||
push(@MyInitVariables, \&AtomInit);
|
||||
|
||||
@@ -185,7 +187,7 @@ sub DoAtomSave {
|
||||
my $oldrev = $Page{revision};
|
||||
if ($old eq $string and $oldid eq $id) {
|
||||
ReportError(T('No changes to be saved.'), '200 OK'); # an update without consequence
|
||||
} elsif ($oldrev == 0 and ($string eq $NewText or $string eq "\n")) {
|
||||
} elsif ($oldrev == 0 and $string eq "\n") {
|
||||
ReportError(T('No changes to be saved.'), '400 BAD REQUEST'); # don't fake page creation because of webdav
|
||||
} else {
|
||||
# My providing a different title, the entry is automatically renamed
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env perl
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
# ====================[ autolock.pl ]====================
|
||||
|
||||
@@ -174,7 +175,7 @@ sub UserCanEditAutoLockFix {
|
||||
return 0 if $LockOnCreation{$id} and not -f GetPageFile($id); # new page
|
||||
return 0 if !$EditAllowed or -f $NoEditFile;
|
||||
return 0 if $editing and UserIsBanned(); # this call is more expensive
|
||||
return 0 if $EditAllowed >= 2 and (not $CommentsPrefix or $id !~ /^$CommentsPrefix/o);
|
||||
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 0 if $EditAllowed >= 3;
|
||||
return 1;
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
# ie: http://search.cpan.org/CPAN/authors/id/C/CH/CHAMAS/MLDBM-2.01.tar.gz
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
use Fcntl;
|
||||
use MLDBM qw( DB_File Storable );
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
# http://www.oddmuse.org/cgi-bin/oddmuse/Backlinks_Extension
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('backlinks.pl', 'Backlinks Extension');
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ the IP or hostname will be added to the C<BannedHosts> page for you.
|
||||
|
||||
=cut
|
||||
use strict;
|
||||
use v5.10;
|
||||
our ($q, $Now, %Page, $OpenPageName, %Action, $UrlPattern, $BannedContent, $BannedHosts, @MyAdminCode);
|
||||
|
||||
AddModuleDescription('ban-contributors.pl', 'Ban Contributors Extension');
|
||||
@@ -123,10 +124,10 @@ sub NewBanContributorsWriteRcLog {
|
||||
and $OpenPageName eq $id and UserIsAdmin()) {
|
||||
# we currently have the clean page loaded, so we need to reload
|
||||
# the spammed revision (there is a possible race condition here)
|
||||
my ($old) = GetTextRevision($Page{revision}-1, 1);
|
||||
my %urls = map {$_ => 1 } $old =~ /$UrlPattern/og;
|
||||
my $old = GetTextRevision($Page{revision} - 1, 1)->{text};
|
||||
my %urls = map {$_ => 1 } $old =~ /$UrlPattern/g;
|
||||
# we open the file again to force a load of the despammed page
|
||||
foreach my $url ($Page{text} =~ /$UrlPattern/og) {
|
||||
foreach my $url ($Page{text} =~ /$UrlPattern/g) {
|
||||
delete($urls{$url});
|
||||
}
|
||||
# we also remove any candidates that are already banned
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2013 Alex Schroeder <alex@gnu.org>
|
||||
# Copyright (C) 2013–2015 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
|
||||
@@ -16,10 +16,11 @@
|
||||
# editors will be logged.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('ban-quick-editors.pl', 'Banning Quick Editors');
|
||||
|
||||
our ($Now, %RecentVisitors, $SurgeProtection);
|
||||
our ($q, $Now, %RecentVisitors, $SurgeProtection);
|
||||
|
||||
*BanQuickOldUserIsBanned = \&UserIsBanned;
|
||||
*UserIsBanned = \&BanQuickNewUserIsBanned;
|
||||
@@ -29,7 +30,7 @@ sub BanQuickNewUserIsBanned {
|
||||
if (not $rule
|
||||
and $SurgeProtection # need surge protection
|
||||
and GetParam('title')) {
|
||||
my $name = GetParam('username', GetRemoteHost());
|
||||
my $name = GetParam('username', $q->remote_addr());
|
||||
my @entries = @{$RecentVisitors{$name}};
|
||||
# $entry[0] is $Now after AddRecentVisitor
|
||||
my $ts = $entries[1];
|
||||
|
||||
@@ -13,14 +13,17 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('banned-regexps.pl', 'Banning Regular Expressions');
|
||||
|
||||
=h1 Compatibility
|
||||
=encoding utf8
|
||||
|
||||
=head1 Compatibility
|
||||
|
||||
This extension works with logbannedcontent.pl.
|
||||
|
||||
=h1 Example content for the BannedRegexps page:
|
||||
=head1 Example content for the BannedRegexps page:
|
||||
|
||||
# This page lists regular expressions that prevent the saving of a page.
|
||||
# The regexps are matched against any page or comment submitted.
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('bbcode.pl', 'bbCode Extension');
|
||||
|
||||
@@ -60,12 +61,12 @@ sub bbCodeRule {
|
||||
return AddHtmlEnvironment('strong', qq{class="highlight"}); }
|
||||
elsif ($tag eq 'url') {
|
||||
if ($option) {
|
||||
$option =~ /^($UrlProtocols)/o;
|
||||
$option =~ /^($UrlProtocols)/;
|
||||
my $class = "url $1";
|
||||
return AddHtmlEnvironment('a', qq{href="$option" class="$class"}); }
|
||||
elsif (/\G$FullUrlPattern\s*\[\/url\]/cogi) {
|
||||
elsif (/\G$FullUrlPattern\s*\[\/url\]/cgi) {
|
||||
return GetUrl($1); }}
|
||||
elsif ($tag eq 'img' and /\G$FullUrlPattern\s*\[\/img\]/cogi) {
|
||||
elsif ($tag eq 'img' and /\G$FullUrlPattern\s*\[\/img\]/cgi) {
|
||||
return GetUrl($1, undef, undef, 1); } # force image
|
||||
elsif ($tag eq 'quote') {
|
||||
my $html = CloseHtmlEnvironments();
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('big-brother.pl', 'Big Brother Extension');
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('blockquote.pl', 'Comments on Text Formatting Rules');
|
||||
|
||||
@@ -27,10 +28,10 @@ push(@MyRules, \&BlockQuoteRule);
|
||||
sub BlockQuoteRule {
|
||||
# indented text using : with the option of spanning multiple text
|
||||
# paragraphs (but not lists etc).
|
||||
if (InElement('blockquote') && m/\G(\s*\n)+:[ \t]*/cog) {
|
||||
if (InElement('blockquote') && m/\G(\s*\n)+:[ \t]*/cg) {
|
||||
return CloseHtmlEnvironmentUntil('blockquote')
|
||||
. AddHtmlEnvironment('p');
|
||||
} elsif ($bol && m/\G(\s*\n)*:[ \t]*/cog) {
|
||||
} elsif ($bol && m/\G(\s*\n)*:[ \t]*/cg) {
|
||||
return CloseHtmlEnvironments()
|
||||
. AddHtmlEnvironment('blockquote')
|
||||
. AddHtmlEnvironment('p');
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('calendar.pl', 'Calendar Extension');
|
||||
|
||||
@@ -73,7 +74,7 @@ sub Cal {
|
||||
$link .= ScriptLink('action=collect;match=' . UrlEncode($re), $day, 'local collection' . $class);
|
||||
}
|
||||
$link;
|
||||
}}ge;
|
||||
}}eg;
|
||||
$cal =~ s{(\S+) (\d\d\d\d)}{{
|
||||
my ($month_text, $year_text) = ($1, $2);
|
||||
my $date = sprintf("%d-%02d", $year, $mon);
|
||||
@@ -117,22 +118,22 @@ sub DoCollect {
|
||||
push(@MyRules, \&CalendarRule);
|
||||
|
||||
sub CalendarRule {
|
||||
if (/\G(calendar:(\d\d\d\d))/gc) {
|
||||
if (/\G(calendar:(\d\d\d\d))/cg) {
|
||||
my $oldpos = pos;
|
||||
Clean(CloseHtmlEnvironments());
|
||||
Dirty($1);
|
||||
PrintYearCalendar($2);
|
||||
pos = $oldpos;
|
||||
return AddHtmlEnvironment('p');
|
||||
} elsif (/\G(month:(\d\d\d\d)-(\d\d))/gc) {
|
||||
} elsif (/\G(month:(\d\d\d\d)-(\d\d))/cg) {
|
||||
my $oldpos = pos;
|
||||
Clean(CloseHtmlEnvironments());
|
||||
Dirty($1);
|
||||
print Cal($2, $3);
|
||||
pos = $oldpos;
|
||||
return AddHtmlEnvironment('p');
|
||||
} elsif (/\G(month:([+-]\d\d?))/gc
|
||||
or /\G(\[\[month:([+-]\d\d?) $FreeLinkPattern\]\])/gc) {
|
||||
} elsif (/\G(month:([+-]\d\d?))/cg
|
||||
or /\G(\[\[month:([+-]\d\d?) $FreeLinkPattern\]\])/cg) {
|
||||
my $oldpos = pos;
|
||||
Clean(CloseHtmlEnvironments());
|
||||
Dirty($1);
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('canonical.pl', 'Canonical Names');
|
||||
|
||||
|
||||
180
modules/cart.pl
Normal file
180
modules/cart.pl
Normal file
@@ -0,0 +1,180 @@
|
||||
# Copyright (C) 2008 Eric Hsu <apricotan@gmail.com>
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (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, write to the
|
||||
# Free Software Foundation, Inc.
|
||||
# 59 Temple Place, Suite 330
|
||||
# Boston, MA 02111-1307 USA
|
||||
use strict;
|
||||
use v5.10;
|
||||
use utf8;
|
||||
|
||||
AddModuleDescription('cart.pl', 'Cart Extension');
|
||||
|
||||
our ($q, %Action, $UserGotoBar, $CookieName);
|
||||
our ($CartPic, $CartName, %Cart, $ShowCart, @CartOrdered);
|
||||
my $LOADED_CART_JS;
|
||||
|
||||
# ============
|
||||
# = cart-bfc =
|
||||
# ============
|
||||
|
||||
# This is a simple shopping cart for pages!
|
||||
# Requires searchpaged-bfc.pl.
|
||||
|
||||
# We make a checkbox that onChange, uses Yahoo! UI Cookie 2.6 (note we need 2.6!) routines to set a subcookie.
|
||||
# We have the cookie "$CartName" (by default $Cookiename . "Cart")
|
||||
# which holds the actual cart and is managed almost entirely
|
||||
# in client-side javascript. That means the checkboxes directly control the cookie.
|
||||
|
||||
# If you want a little picture of a cart, you can set the URL at $CartPic.
|
||||
|
||||
# InitCart loads the cookie values into %Cart. $Cart->{$pagename}=1 if it's in the cart.
|
||||
# In theory cookies are capped at 4K. Our page names are capped around 90ish chars. That leaves room for 40 maximal names in the cart. Probably enough.
|
||||
|
||||
# We'll need the cookie values for
|
||||
# action=cart;subaction=show; along with other future subactions (download in latex, bibtex)
|
||||
# we'll feed this display to a variant of search display.
|
||||
# I'll have to check oddmuse.pl.
|
||||
|
||||
# load Yahoo UI code bit to manage subcookies.
|
||||
|
||||
$Action{cart} = \&DoCart;
|
||||
|
||||
sub DoCart {
|
||||
# foreach $key (keys %Cart) {
|
||||
# push @cart, $key if ($Cart{"$key"});
|
||||
# }
|
||||
DoSearch(\@CartOrdered);
|
||||
}
|
||||
|
||||
$UserGotoBar .= '<a href="?action=cart;cache=0">View Cart</a>';
|
||||
|
||||
# Manage Cart Routines
|
||||
|
||||
#push @MyPrintSearchResultsPrefix, \&PrintCheckboxTableStart;
|
||||
#push @MyPrintSearchResultsSuffix, \&PrintCheckboxTableEnd;
|
||||
|
||||
# I can't hack into Init, so let's tap into InitCookie.
|
||||
# We also tap into Cookie() to arrange writing out our cleaned up Cart.
|
||||
|
||||
*OldInitCookie = *InitCookie;
|
||||
*InitCookie = *InitCookieAndCart;
|
||||
|
||||
# To get a checkbox in the titles of pages, we patch GetHeader.
|
||||
*OldGetHeader = *GetHeader;
|
||||
*GetHeader = *GetHeaderAndCart;
|
||||
|
||||
sub InitCookieAndCart {
|
||||
OldInitCookie();
|
||||
InitCart();
|
||||
}
|
||||
|
||||
sub GetHeaderAndCart {
|
||||
my ($id, $title, $oldId, $nocache, $status) = @_;
|
||||
my $result = OldGetHeader(@_);
|
||||
|
||||
return ($result) unless ($id);
|
||||
|
||||
my $checkbox = MakeCheckbox($id);
|
||||
$checkbox = qq(<span class="cart-checkbox" style="float:right">$checkbox</span>);
|
||||
|
||||
$result =~ s/(<\/h1>)/$checkbox$1/;
|
||||
|
||||
return ($result);
|
||||
}
|
||||
|
||||
|
||||
# We load the contents of our Cart cookie into the global %Cart and @CartOrdered
|
||||
sub InitCart {
|
||||
$CartName = $CookieName . "Cart" unless (defined ($CartName) );
|
||||
my @pairs;
|
||||
|
||||
%Cart = ();
|
||||
@CartOrdered = ();
|
||||
|
||||
if ($q->cookie($CartName)) {
|
||||
# @pairs = split(/&/, $q->cookie($CartName));
|
||||
@pairs = $q->cookie($CartName);
|
||||
foreach my $pair (@pairs) {
|
||||
# my $encodedequals = UrlEncode("=");
|
||||
my ($name, $val)= split(/\=/, $pair);
|
||||
$Cart{"$name"}=$val;
|
||||
push @CartOrdered, $name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub PrintCheckboxTableStart {
|
||||
my ($name, $regex, $text, $type) = @_;
|
||||
my $html;
|
||||
|
||||
$html .= "<table><tr>";
|
||||
my $checkbox = MakeCheckbox(@_);
|
||||
$html .= qq(<td valign=top>$checkbox</td>);
|
||||
$html .= "<td valign=top>";
|
||||
print $html;
|
||||
}
|
||||
|
||||
sub PrintCheckboxTableEnd {
|
||||
my ($name, $regex, $text, $type) = @_;
|
||||
my $html;
|
||||
|
||||
$html .= "</td>";
|
||||
$html .= "</tr></table>";
|
||||
|
||||
print $html;
|
||||
}
|
||||
|
||||
|
||||
sub MakeCheckbox {
|
||||
my ($name, $regex, $text, $type) = @_;
|
||||
my $html;
|
||||
|
||||
return unless ($ShowCart);
|
||||
unless ($LOADED_CART_JS) {
|
||||
$html .= '<script type="text/javascript" src="http://yui.yahooapis.com/combo?2.7.0/build/yahoo/yahoo-min.js&2.7.0/build/cookie/cookie-min.js&2.7.0/build/event/event-min.js"></script>';
|
||||
$LOADED_CART_JS=1;
|
||||
}
|
||||
|
||||
my $selected = qq(checked="yes") if ($Cart{"$name"});
|
||||
|
||||
$html .=<<HTMLEND;
|
||||
$CartPic<input type="checkbox" value="cart" id="$name-set" title="Add To Cart" $selected/> <br>
|
||||
<script type="text/javascript">
|
||||
(function(){
|
||||
YAHOO.util.Event.on("$name-set", "change", function(){
|
||||
var value = YAHOO.util.Cookie.getSub("$CartName", "$name");
|
||||
if (value == 1 ) { YAHOO.util.Cookie.removeSub("$CartName", "$name"); }
|
||||
else { YAHOO.util.Cookie.setSub("$CartName", "$name", 1 ); }
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
HTMLEND
|
||||
|
||||
return $html unless ($q->param('action') eq 'edit' || $q->param('Preview'));
|
||||
# no checkboxes for edit pages.
|
||||
return;
|
||||
}
|
||||
|
||||
__END__
|
||||
|
||||
=
|
||||
(0.7) Load JS libraries on first checkbox (so won't load if we are editing).
|
||||
(0.6) Changed the JS source to be Yahoo's CDN.
|
||||
(0.51) Use CSS class cart-checkbox for the cart checkbox! That way, we can remove them for printouts, for instance.
|
||||
(0.5) Our hack of cookies was not working cross-platform. We have a mismatch because our attempts to send out a cookie from oddmuse were getting the contents encoded and unreadable for the YUI routines. Instead,we will use removeSub to avoid ever having to send the cookie back from our server!
|
||||
(0.4) Now every page title has a checkbox floated to the right, which controls the cart status.
|
||||
(0.3) Allow cart editing from cart display. Currently, doesn't seem to affect the cart.
|
||||
(0.2) Cart now displays.
|
||||
(0.1) Cart is now persistent and is edited by the checkboxes.
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('checkbox.pl', 'Checklist Extension');
|
||||
|
||||
@@ -76,7 +77,7 @@ sub DoCheckBox{
|
||||
$summary{$3} = 0 if $2 eq 'x' or $2 eq 'X';
|
||||
"${1}[[ :${3}]]";
|
||||
}
|
||||
}eig;
|
||||
}egi;
|
||||
SetParam('text', $text);
|
||||
SetParam('summary', join(', ', map {
|
||||
if ($summary{$_}) {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('clustermap.pl', 'ClusterMap Module');
|
||||
|
||||
@@ -61,7 +62,7 @@ foreach (@ClusterMapAdminPages){
|
||||
}
|
||||
|
||||
sub ClusterMapRule {
|
||||
if (/\G^([\n\r]*\<\s*clustermap\s*\>\s*)$/mgc) {
|
||||
if (/\G^([\n\r]*\<\s*clustermap\s*\>\s*)$/cgm) {
|
||||
Dirty($1);
|
||||
my $oldpos = pos;
|
||||
my $oldstr = $_;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('comment-div-wrapper.pl', 'Comment Div Wrapper Extension');
|
||||
|
||||
@@ -29,7 +30,7 @@ sub CommentDivWrapper {
|
||||
return $q->start_div({-class=>'userComment'});
|
||||
}
|
||||
}
|
||||
if ($OpenPageName =~ /$CommentsPattern/o) {
|
||||
if ($OpenPageName =~ /$CommentsPattern/) {
|
||||
if ($bol and m/\G(\s*\n)*----+[ \t]*\n?/cg) {
|
||||
my $html = CloseHtmlEnvironments()
|
||||
. ($CommentDiv++ > 0 ? $q->end_div() : $q->h2({-class=>'commentsHeading'}, T('Comments:'))) . $q->start_div({-class=>'userComment'})
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('commentcount.pl', 'Comment Count Extension');
|
||||
|
||||
@@ -51,7 +52,7 @@ sub NewCommentcountScriptLink {
|
||||
if ($CommentsPrefix && $action =~ /^$CommentsPrefix(.*)/) { # TODO use $CommentsPattern ?
|
||||
# Add the number of comments here
|
||||
my $id = $action;
|
||||
$id =~ s/%([0-9a-f][0-9a-f])/chr(hex($1))/ge; # undo urlencode
|
||||
$id =~ s/%([0-9a-f][0-9a-f])/chr(hex($1))/eg; # undo urlencode
|
||||
my $comments = GetPageContent($id);
|
||||
my $num = 0;
|
||||
if($comments =~ /=== (\d+) Comments?\. ===/) {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('compilation.pl', 'Compilation Extension');
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('context.pl', 'Calendar Extension');
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
# Of course, you can customize this to store more information
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('creationdate.pl', 'CreationDate Module');
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env perl
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
# ====================[ creole.pl ]====================
|
||||
|
||||
@@ -217,7 +218,7 @@ sub CreoleRule {
|
||||
}
|
||||
# escape next char (and prevent // in URLs from enabling italics)
|
||||
# ~
|
||||
elsif (m/\G(~($FullUrlPattern|\S))/cgo) {
|
||||
elsif (m/\G(~($FullUrlPattern|\S))/cg) {
|
||||
return
|
||||
($CreoleTildeAlternative and
|
||||
index( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
@@ -233,12 +234,12 @@ sub CreoleRule {
|
||||
# {{{preformatted code}}}
|
||||
elsif (m/\G\{\{\{(.*?}*)\}\}\}/cg) { return $q->code($1); }
|
||||
# download: {{pic}} and {{pic|text}}
|
||||
elsif (m/\G(\{\{$FreeLinkPattern$CreoleLinkTextPattern\}\})/cgos) {
|
||||
elsif (m/\G(\{\{$FreeLinkPattern$CreoleLinkTextPattern\}\})/cgs) {
|
||||
my $text = $4 || $2;
|
||||
return GetCreoleLinkHtml($1, GetDownloadLink(FreeToNormal($2), 1, undef, $text), $text);
|
||||
}
|
||||
# image link: {{url}} and {{url|text}}
|
||||
elsif (m/\G\{\{$FullUrlPattern$CreoleLinkTextPattern\}\}/cgos) {
|
||||
elsif (m/\G\{\{$FullUrlPattern$CreoleLinkTextPattern\}\}/cgs) {
|
||||
return GetCreoleImageHtml(
|
||||
$q->a({-href=> UnquoteHtml($1),
|
||||
-class=> 'image outside'},
|
||||
@@ -249,7 +250,7 @@ sub CreoleRule {
|
||||
}
|
||||
# image link: [[link|{{pic}}]] and [[link|{{pic|text}}]]
|
||||
elsif (m/\G(\[\[$FreeLinkPattern$CreoleLinkPipePattern
|
||||
\{\{$FreeLinkPattern$CreoleLinkTextPattern\}\}\]\])/cgosx) {
|
||||
\{\{$FreeLinkPattern$CreoleLinkTextPattern\}\}\]\])/cgsx) {
|
||||
my $text = $5 || $2;
|
||||
return GetCreoleLinkHtml($1, GetCreoleImageHtml(
|
||||
ScriptLink(UrlEncode(FreeToNormal($2)),
|
||||
@@ -260,7 +261,7 @@ sub CreoleRule {
|
||||
}
|
||||
# image link: [[link|{{url}}]] and [[link|{{url|text}}]]
|
||||
elsif (m/\G(\[\[$FreeLinkPattern$CreoleLinkPipePattern
|
||||
\{\{$FullUrlPattern$CreoleLinkTextPattern\}\}\]\])/cgosx) {
|
||||
\{\{$FullUrlPattern$CreoleLinkTextPattern\}\}\]\])/cgsx) {
|
||||
my $text = $5 || $2;
|
||||
return GetCreoleLinkHtml($1, GetCreoleImageHtml(
|
||||
ScriptLink(UrlEncode(FreeToNormal($2)),
|
||||
@@ -271,7 +272,7 @@ sub CreoleRule {
|
||||
}
|
||||
# image link: [[url|{{pic}}]] and [[url|{{pic|text}}]]
|
||||
elsif (m/\G(\[\[$FullUrlPattern$CreoleLinkPipePattern
|
||||
\{\{$FreeLinkPattern$CreoleLinkTextPattern\}\}\]\])/cgosx) {
|
||||
\{\{$FreeLinkPattern$CreoleLinkTextPattern\}\}\]\])/cgsx) {
|
||||
my $text = $5 || $2;
|
||||
return GetCreoleLinkHtml($1, GetCreoleImageHtml(
|
||||
$q->a({-href=> UnquoteHtml($2), -class=> 'image outside'},
|
||||
@@ -282,7 +283,7 @@ sub CreoleRule {
|
||||
}
|
||||
# image link: [[url|{{url}}]] and [[url|{{url|text}}]]
|
||||
elsif (m/\G\[\[$FullUrlPattern$CreoleLinkPipePattern
|
||||
\{\{$FullUrlPattern$CreoleLinkTextPattern\}\}\]\]/cgosx) {
|
||||
\{\{$FullUrlPattern$CreoleLinkTextPattern\}\}\]\]/cgsx) {
|
||||
return GetCreoleImageHtml(
|
||||
$q->a({-href=> UnquoteHtml($1), -class=> 'image outside'},
|
||||
$q->img({-src=> UnquoteHtml($2),
|
||||
@@ -291,7 +292,7 @@ sub CreoleRule {
|
||||
-class=> 'url outside'})));
|
||||
}
|
||||
# link: [[url]] and [[url|text]]
|
||||
elsif (m/\G\[\[$FullUrlPattern$CreoleLinkTextPattern\]\]/cgos) {
|
||||
elsif (m/\G\[\[$FullUrlPattern$CreoleLinkTextPattern\]\]/cgs) {
|
||||
# Permit embedding of Creole syntax within link text. (Rather complicated,
|
||||
# but it does the job remarkably.)
|
||||
my $link_url = $1;
|
||||
@@ -304,7 +305,7 @@ sub CreoleRule {
|
||||
return GetUrl($link_url, $link_text, 1);
|
||||
}
|
||||
# link: [[page]] and [[page|text]]
|
||||
elsif (m/\G(\[\[$FreeLinkPattern$CreoleLinkTextPattern\]\])/cgos) {
|
||||
elsif (m/\G(\[\[$FreeLinkPattern$CreoleLinkTextPattern\]\])/cgs) {
|
||||
my $markup = $1;
|
||||
my $page_name = $2;
|
||||
my $link_text = $4 ? CreoleRuleRecursive($4, @_) : $page_name;
|
||||
@@ -314,7 +315,7 @@ sub CreoleRule {
|
||||
}
|
||||
# interlink: [[Wiki:page]] and [[Wiki:page|text]]
|
||||
elsif ($is_interlinking and
|
||||
m/\G(\[\[$FreeInterLinkPattern$CreoleLinkTextPattern\]\])/cgos) {
|
||||
m/\G(\[\[$FreeInterLinkPattern$CreoleLinkTextPattern\]\])/cgs) {
|
||||
my $markup = $1;
|
||||
my $interlink = $2;
|
||||
my $interlink_text = $4;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env perl
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
# ====================[ creoleaddition.pl ]====================
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env perl
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
# ====================[ crossbar.pl ]====================
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('crumbs.pl', 'List Parent Pages Extension');
|
||||
|
||||
@@ -27,8 +28,8 @@ $RuleOrder{\&CrumbsRule} = -10; # run before default rules!
|
||||
|
||||
sub CrumbsRule {
|
||||
if (not (pos) # first!
|
||||
and (($WikiLinks && /\G($LinkPattern\n)/cgo)
|
||||
or ($FreeLinks && /\G(\[\[$FreeLinkPattern\]\]\n)/cgo))) {
|
||||
and (($WikiLinks && /\G($LinkPattern\n)/cg)
|
||||
or ($FreeLinks && /\G(\[\[$FreeLinkPattern\]\]\n)/cg))) {
|
||||
my $oldpos = pos; # will be trashed below
|
||||
my $cluster = FreeToNormal($2);
|
||||
my %seen = ($cluster => 1);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('csv.pl', 'Comments on Long Table Markup Extension');
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('dates.pl', 'Dates Extension');
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('delete-all.pl');
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
our ($q, $Now, %IndexHash, %Action, %Page, $OpenPageName, $FS, $BannedContent, $RcFile, $RcDefault, @MyAdminCode, $FullUrlPattern, $DeletedPage, $StrangeBannedContent);
|
||||
|
||||
@@ -132,14 +133,14 @@ sub DespamPage {
|
||||
# from DoHistory()
|
||||
my @revisions = sort {$b <=> $a} map { m|/([0-9]+).kp$|; $1; } GetKeepFiles($OpenPageName);
|
||||
foreach my $revision (@revisions) {
|
||||
my ($text, $rev) = GetTextRevision($revision, 1); # quiet
|
||||
my ($revisionPage, $rev) = GetTextRevision($revision, 1); # quiet
|
||||
if (not $rev) {
|
||||
print ': ' . Ts('Cannot find revision %s.', $revision);
|
||||
return;
|
||||
} elsif (not DespamBannedContent($text)) {
|
||||
} elsif (not DespamBannedContent($revisionPage->{text})) {
|
||||
my $summary = Tss('Revert to revision %1: %2', $revision, $rule);
|
||||
print ': ' . $summary;
|
||||
Save($OpenPageName, $text, $summary) unless GetParam('debug', 0);
|
||||
Save($OpenPageName, $revisionPage->{text}, $summary) unless GetParam('debug', 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('diff.pl', 'Diff Action Extension');
|
||||
|
||||
|
||||
@@ -13,16 +13,21 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('div-foo.pl', 'Div Foo Extension');
|
||||
|
||||
our (@MyRules);
|
||||
our ($DivFooPrefix);
|
||||
our (%RuleOrder);
|
||||
|
||||
$DivFooPrefix = 'foo_';
|
||||
|
||||
push(@MyRules, \&DivFooRule);
|
||||
|
||||
# conflicts with <nowiki> and other such rules by usemod.pl
|
||||
$RuleOrder{\&DivFooRule} = 200;
|
||||
|
||||
sub DivFooRule {
|
||||
if (m/\G \< ([a-z_-][a-z0-9 _-]+[a-z0-9_-]) \> \s*\n /cgx) {
|
||||
return CloseHtmlEnvironment('p') . AddHtmlEnvironment('div', 'class="' . join(' ', map {"$DivFooPrefix$_"} split /\s+/, $1) . '"');
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('dojo.pl', 'Using Dojo Instead Of Wiki Markup');
|
||||
|
||||
@@ -29,7 +30,7 @@ $DojoTheme = 'tundra';
|
||||
push (@MyRules, \&WysiwygRule);
|
||||
|
||||
sub WysiwygRule {
|
||||
if (m/\G(<.*?>)/gc) {
|
||||
if (m/\G(<.*?>)/cg) {
|
||||
return $1 if substr($1,5,6) eq 'script'
|
||||
or substr($1,4,6) eq 'script';
|
||||
return UnquoteHtml($1);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
# JavaScript enabled for this to work.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('doubleclick.pl', 'Doubleclick Extension');
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('download.pl', 'Download Extension');
|
||||
|
||||
@@ -27,8 +28,8 @@ push( @MyRules, \&DownloadSupportRule );
|
||||
# [[download:page name|alternate title]]
|
||||
|
||||
sub DownloadSupportRule {
|
||||
if (m/\G(\[\[download:$FreeLinkPattern\|([^\]]+)\]\])/cog
|
||||
or m!\G(\[\[download:$FreeLinkPattern\]\])!cog) {
|
||||
if (m/\G(\[\[download:$FreeLinkPattern\|([^\]]+)\]\])/cg
|
||||
or m!\G(\[\[download:$FreeLinkPattern\]\])!cg) {
|
||||
Dirty($1);
|
||||
print GetDownloadLink($2, undef, undef, $3);
|
||||
return '';
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
use File::Glob ':glob';
|
||||
our ($DraftDir);
|
||||
@@ -28,7 +29,7 @@ push(@MyInitVariables, \&DraftInit);
|
||||
sub DraftInit {
|
||||
if (GetParam('Draft', '')) {
|
||||
SetParam('action', 'draft') ; # Draft button used
|
||||
} elsif (-f "$DraftDir/" . GetParam('username', GetRemoteHost()) # draft exists
|
||||
} elsif (-f "$DraftDir/" . GetParam('username', $q->remote_addr()) # draft exists
|
||||
and $FooterNote !~ /action=draft/) { # take care of mod_perl persistence
|
||||
$FooterNote = $q->p(ScriptLink('action=draft', T('Recover Draft'))) . $FooterNote;
|
||||
}
|
||||
@@ -38,7 +39,7 @@ $Action{draft} = \&DoDraft;
|
||||
|
||||
sub DoDraft {
|
||||
my $id = shift;
|
||||
my $draft = $DraftDir . '/' . GetParam('username', GetRemoteHost());
|
||||
my $draft = $DraftDir . '/' . GetParam('username', $q->remote_addr());
|
||||
if ($id) {
|
||||
my $text = GetParam('text', '');
|
||||
ReportError(T('No text to save'), '400 BAD REQUEST') unless $text;
|
||||
@@ -47,10 +48,10 @@ sub DoDraft {
|
||||
SetParam('msg', T('Draft saved')); # invalidate cache
|
||||
print GetHttpHeader('', T('Draft saved'), '204 NO CONTENT');
|
||||
} elsif (-f $draft) {
|
||||
my %data = ParseData(ReadFileOrDie($draft));
|
||||
my $data = ParseData(ReadFileOrDie($draft));
|
||||
unlink ($draft);
|
||||
$Message .= $q->p(T('Draft recovered'));
|
||||
DoEdit($data{id}, $data{text}, 1);
|
||||
DoEdit($data->{id}, $data->{text}, 1);
|
||||
} else {
|
||||
ReportError(T('No draft available to recover'), '404 NOT FOUND');
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('duckduckgo-search.pl', 'Use DuckDuckGo For Searches');
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('dynamic-comments.pl', 'Dynamic Comments Extension');
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('dynlogo.pl', 'Dynamic Logo');
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('edit-assist.pl', 'Edit Assist Extension');
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('edit-cluster.pl', 'Edit Cluster Extension');
|
||||
|
||||
@@ -49,7 +50,7 @@ sub GetRc {
|
||||
}
|
||||
}
|
||||
$wanted_clusters{$clusterOnly} = $clusterOnly;
|
||||
@outrc = reverse @outrc if GetParam('newtop', $RecentTop);
|
||||
@outrc = reverse @outrc;
|
||||
my @filters;
|
||||
@filters = SearchTitleAndBody($filterOnly) if $filterOnly;
|
||||
foreach my $rcline (@outrc) {
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('edit-paragraphs.pl', 'Edit Paragraphs Extension');
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
# http://www.oddmuse.org/cgi-bin/oddmuse/Email_Quote_Extension
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('emailquote.pl', 'Email Quote Extension');
|
||||
|
||||
@@ -20,14 +21,14 @@ push(@MyRules, \&EmailQuoteRule);
|
||||
|
||||
sub EmailQuoteRule {
|
||||
# > on a line of its own should work
|
||||
if ($bol && m/\G(\s*\n)*((\>))+\n/cog) {
|
||||
if ($bol && m/\G(\s*\n)*((\>))+\n/cg) {
|
||||
return $q->p();
|
||||
}
|
||||
# > hi, you mentioned that:
|
||||
# >> I don't like Oddmuse.
|
||||
# > in last letter.
|
||||
elsif ($bol && m/\G(\s*\n)*((\>)+)[ \t]/cog
|
||||
or InElement('dd') && m/\G(\s*\n)+((\>)+)[ \t]/cog) {
|
||||
elsif ($bol && m/\G(\s*\n)*((\>)+)[ \t]/cg
|
||||
or InElement('dd') && m/\G(\s*\n)+((\>)+)[ \t]/cg) {
|
||||
my $leng = length($2) / 4;
|
||||
return CloseHtmlEnvironmentUntil('dd') . OpenHtmlEnvironment('dl',$leng, 'quote')
|
||||
. $q->dt() . AddHtmlEnvironment('dd');
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('emoji.pl', 'Smilies');
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('enclosure.pl', 'Podcasting');
|
||||
|
||||
@@ -27,7 +28,7 @@ push(@MyRules, \&EnclosureRule);
|
||||
# [[enclosure:url|size in bytes|mime type]]
|
||||
|
||||
sub EnclosureRule {
|
||||
if (m!\G\[\[enclosure:\s*$FreeLinkPattern(\|([^\]]+))?\]\]!ogci) {
|
||||
if (m!\G\[\[enclosure:\s*$FreeLinkPattern(\|([^\]]+))?\]\]!cgi) {
|
||||
my $id = FreeToNormal($1);
|
||||
# Make sure we don't add duplicates; we will add non-existing
|
||||
# enclosures as well. We test for existence only when the RSS feed
|
||||
@@ -55,8 +56,8 @@ sub NewEnclosureRssItem {
|
||||
my $id = shift;
|
||||
my $rss = OldEnclosureRssItem($id, @_);
|
||||
require MIME::Base64;
|
||||
my %data = ParseData(ReadFileOrDie(GetPageFile($id)));
|
||||
my @enclosures = split(' ', $data{enclosures});
|
||||
my $data = ParseData(ReadFileOrDie(GetPageFile($id)));
|
||||
my @enclosures = split(' ', $data->{enclosures});
|
||||
my $enclosures = '';
|
||||
foreach my $enclosure (@enclosures) {
|
||||
# Don't add the enclosure if the page has been deleted in the mean
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
# the css classes div.question and div.answer.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('faq.pl', 'FAQ Extension');
|
||||
|
||||
@@ -37,10 +38,10 @@ $FaqAnswerText = "Answer: " unless $FaqAnswerText;
|
||||
push(@MyRules, \&FaqRule);
|
||||
|
||||
sub FaqRule {
|
||||
if ($bol && m/\GQ: (.+)/gc) {
|
||||
if ($bol && m/\GQ: (.+)/cg) {
|
||||
return $q->a({name=>'FAQ_' . UrlEncode($1)},'')
|
||||
. $q->div({class=>'question'}, $FaqQuestionText . $1);
|
||||
} elsif ($bol && m/\GA:[ \t]*/gc) {
|
||||
} elsif ($bol && m/\GA:[ \t]*/cg) {
|
||||
return CloseHtmlEnvironments()
|
||||
. AddHtmlEnvironment('div', "class='answer'") . $FaqAnswerText;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA,
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('fckeditor.pl', 'Using FCKeditor In Addition To Wiki Markup');
|
||||
|
||||
@@ -28,7 +29,7 @@ $FCKeditorHeight = 400; # Pixel
|
||||
push (@MyRules, \&WysiwygRule);
|
||||
|
||||
sub WysiwygRule {
|
||||
if (m/\G(<.*?>)/gc) {
|
||||
if (m/\G(<.*?>)/cg) {
|
||||
return $1 if substr($1,5,6) eq 'script'
|
||||
or substr($1,4,6) eq 'script';
|
||||
return UnquoteHtml($1);
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
# http://www.oddmuse.org/cgi-bin/oddmuse/Field_List_Extension
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('fieldlist.pl', 'Field List Extension');
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('find.pl', 'Find Extension');
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('fix-encoding.pl', 'Fix Encoding');
|
||||
|
||||
|
||||
@@ -1,257 +0,0 @@
|
||||
#!/usr/bin/env perl
|
||||
use strict;
|
||||
|
||||
# ====================[ flashbox.pl ]====================
|
||||
|
||||
=head1 NAME
|
||||
|
||||
flashbox - An Oddmuse module for embedding offsite-hosted Flash videos within
|
||||
an Oddmuse Wiki page - especially those hosted by Google Videos,
|
||||
YouTube, and SlideShare.
|
||||
|
||||
=head1 INSTALLATION
|
||||
|
||||
flashbox is easily installable: move this file into the B<wiki/modules/>
|
||||
directory of your Oddmuse Wiki.
|
||||
|
||||
=cut
|
||||
AddModuleDescription('flashbox.pl', 'Flashbox Extension');
|
||||
|
||||
our ($bol, @MyRules, %RuleOrder);
|
||||
|
||||
# ....................{ CONFIGURATION }....................
|
||||
|
||||
=head1 CONFIGURATION
|
||||
|
||||
flashbox is easily configurable: set these variables in the B<wiki/config.pl>
|
||||
file for your Oddmuse Wiki.
|
||||
|
||||
=cut
|
||||
our ($FlashboxWidth,
|
||||
$FlashboxHeight);
|
||||
|
||||
=head2 $FlashboxWidth
|
||||
|
||||
The width of the HTML object "frame" for Flash videos, in pixels.
|
||||
|
||||
The default value for this variable is (usually) fine.
|
||||
|
||||
=cut
|
||||
$FlashboxWidth = 420;
|
||||
|
||||
=head2 $FlashboxHeight
|
||||
|
||||
The height of the HTML object "frame" for Flash videos, in pixels. For any
|
||||
specific width, a height roughly 83.33% of that width tends to provide a
|
||||
respectable frame for viewing Flash videos.
|
||||
|
||||
The default value for this variable is (usually) fine.
|
||||
|
||||
=cut
|
||||
$FlashboxHeight = 350;
|
||||
|
||||
# ....................{ MARKUP }....................
|
||||
|
||||
=head1 MARKUP
|
||||
|
||||
flashbox provides a few new markup rules. These are:
|
||||
|
||||
=over
|
||||
|
||||
=item [[GoogleVideo:${GoogleVideoID}]]
|
||||
|
||||
=over
|
||||
|
||||
=item Embeds the Google Video uniquely identified by ${GoogleVideoID} into the
|
||||
Oddmuse Wiki page, where ${GoogleVideoID} is the signed integer
|
||||
following the "docID" parameter in the Google Video URL for that video;
|
||||
for example, [[GoogleVideo:8649250863235826256]] embeds Derrick Jensen's
|
||||
"Endgame: Part I" Google Video into the Oddmuse Wiki page.
|
||||
|
||||
=back
|
||||
|
||||
=item [[YouTube:${YouTubeVideoID}]]
|
||||
|
||||
=over
|
||||
|
||||
=item Embeds the YouTube video uniquely identified by ${YouTubeVideoID} into the
|
||||
Oddmuse Wiki page, where ${YouTubeVideoID} is the string following the
|
||||
"watch?v" parameter in the YouTube URL for that video; for example,
|
||||
[[YouTube:Q1ZeXnmDZMQ]] embeds James Howard Kunstler's "The Tragedy of
|
||||
Suburbia TED Talk" YouTube video into the Oddmuse Wiki page.
|
||||
|
||||
=back
|
||||
|
||||
=item [[SlideShare:${SlideSharePresentationID}]]
|
||||
|
||||
=over
|
||||
|
||||
=item Embeds the SlideShare presentation uniquely identified by
|
||||
${SlideSharePresentationID} into the Oddmuse Wiki page, where
|
||||
${SlideSharePresentationID} is a string composed of the title for that
|
||||
presentation and an arbitrary signed integer. Unfortunately, this string
|
||||
is more difficult to obtain than for Google Video and YouTube; for any
|
||||
given presentation, see the small "Embed" box on that presentation's
|
||||
SlideShare page and the string following the "doc" parameter in that
|
||||
box. For example,
|
||||
[[SlideShare:the-tyranny-of-human-civilization-13479]] embeds
|
||||
huer1278ft's "The Tyranny of Human Civilization" SlideShare presentation
|
||||
into the Oddmuse Wiki page.
|
||||
|
||||
=back
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
push(@MyRules, \&FlashboxRule);
|
||||
|
||||
# "FlashboxRule" conflicts with "CreoleRule"-style interpretation of "[[...]]"
|
||||
# syntax; and must, thus, be applied before that rule.
|
||||
$RuleOrder{\&FlashboxRule} = -11;
|
||||
|
||||
sub FlashboxRule {
|
||||
if (/\G\[\[googlevideo:([0-9-]+)\]\]/cgi) {
|
||||
return FlashboxHtml('googlevideo',
|
||||
"http://video.google.com/googleplayer.swf?docId=${1}&hl=en");
|
||||
}
|
||||
elsif (/\G\[\[slideshare:([a-z0-9-]+)\]\]/cgi) {
|
||||
return FlashboxHtml('slideshare',
|
||||
"http://static.slideshare.net/swf/ssplayer2.swf?doc=${1}");
|
||||
}
|
||||
elsif (/\G\[\[youtube:([a-z0-9-_]{11})\]\]/cgi) {
|
||||
return FlashboxHtml('youtube',
|
||||
"http://www.youtube.com/v/${1}");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub FlashboxHtml {
|
||||
my ($paragraph_class, $flashbox_url) = @_;
|
||||
return
|
||||
($bol
|
||||
? CloseHtmlEnvironments().AddHtmlEnvironment('p', qq~class="flashbox ${paragraph_class}"~)
|
||||
: '').qq~
|
||||
<object width="${FlashboxWidth}" height="${FlashboxHeight}">
|
||||
<param name="movie" value="${flashbox_url}"/>
|
||||
<param name="pluginurl" value="http://www.macromedia.com/go/getflashplayer"/>
|
||||
<param name="quality" value="high"/>
|
||||
<param name="wmode" value="transparent"/>
|
||||
<param name="allowFullScreen" value="true"/>
|
||||
<param name="allowScriptAccess" value="always"/>
|
||||
<embed type="application/x-shockwave-flash"
|
||||
width="${FlashboxWidth}" height="${FlashboxHeight}"
|
||||
src="${flashbox_url}"
|
||||
wmode="transparent"
|
||||
allowscriptaccess="always" allowfullscreen="true"/>
|
||||
</object>~;
|
||||
}
|
||||
|
||||
=head1 CSS
|
||||
|
||||
flashbox also provides a few new HTML classes for CSS-stylizing the HTML emitted
|
||||
by these markup rules. Of necessity, flashbox embeds Flash videos in an
|
||||
"<object>...</object>" HTML tag-set; technically, therefore, you can stylize
|
||||
such videos with a CSS selector resembling:
|
||||
|
||||
# This CSS selector selects all HTML-embedded objects (e.g., Flash videos).
|
||||
object {
|
||||
# These CSS properties are supposed to horizontally center such objects;
|
||||
# however, they do not.
|
||||
margin: 1.500em auto;
|
||||
padding: 1.500em 0.000em 0.500em 0.000em;
|
||||
text-align: center;
|
||||
text-indent: 0.000em;
|
||||
}
|
||||
|
||||
Unfortunately, most browsers ignore most CSS properties on the CSS "object"
|
||||
selector (including those in the example, above).
|
||||
|
||||
To circumvent this, flashbox enwraps all block-level, flashbox-specific markup
|
||||
(i.e., flashbox-specific markup preceded by at least two newlines) within an
|
||||
HTML paragraph having two unique classes. This HTML paragraph, unlike the
|
||||
"<object>...</object>" HTML tag-set, is styleable by all browsers via CSS
|
||||
selection of these classes:
|
||||
|
||||
=over
|
||||
|
||||
=item "flashbox"; and
|
||||
|
||||
=item "googlevideo", "youtube", or "slideshare" - according to which offsite host
|
||||
a Flash video is embedded from.
|
||||
|
||||
=back
|
||||
|
||||
Let's illustrate with a crude example. Suppose some Oddmuse Wiki page contains
|
||||
this text markup:
|
||||
|
||||
In this compelling reading of his, perhaps, most well-read poetry, Carl Sagan
|
||||
thunders the truth, Vangelis supplies the angel’s harp and music, and YouTube
|
||||
plies the photo-montage seas of "this pale, blue dot": our Earth, from afar.
|
||||
|
||||
[[YouTube:p86BPM1GV8M]]
|
||||
|
||||
Then, flashbox transmutes that text markup into HTML markup resembling:
|
||||
|
||||
<p>
|
||||
In this compelling reading of his, perhaps, most well-read poetry, Carl Sagan
|
||||
thunders the truth, Vangelis supplies the angel’s harp and music, and YouTube
|
||||
plies the photo-montage seas of "this pale, blue dot": our Earth, from afar.
|
||||
</p>
|
||||
<p class="flashbox youtube">
|
||||
<object width="420" height="350">
|
||||
<param name="movie" value="http://www.youtube.com/v/p86BPM1GV8M"/>
|
||||
<param name="pluginurl" value="http://www.macromedia.com/go/getflashplayer"/>
|
||||
<embed type="application/x-shockwave-flash"
|
||||
width="420" height="350"
|
||||
src="http://www.youtube.com/v/p86BPM1GV8M"/>
|
||||
</object>
|
||||
</p>
|
||||
|
||||
Then, your CSS stylesheet can style this HTML markup with CSS resembling:
|
||||
|
||||
# This CSS selector selects flashbox-embedded Flash videos.
|
||||
p.flashbox {
|
||||
# These CSS properties horizontally center such videos.
|
||||
margin: 1.500em auto;
|
||||
padding: 1.500em 0.000em 0.500em 0.000em;
|
||||
text-align: center;
|
||||
text-indent: 0.000em;
|
||||
}
|
||||
|
||||
# This CSS selector selects flashbox-embedded, YouTube-specific Flash videos.
|
||||
p.youtube {
|
||||
# These CSS properties background and border such videos.
|
||||
background: #334466;
|
||||
border: #112255 0.125em solid;
|
||||
}
|
||||
|
||||
Wew! There; that wasn't so gruesomely detailed, was it?
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
The oddmuse.org "YouTube" page off which this Oddmuse extension was founded, at:
|
||||
|
||||
L<http://www.oddmuse.org/cgi-bin/oddmuse/YouTube>
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
The information below applies to everything in this distribution,
|
||||
except where noted.
|
||||
|
||||
Copyleft 2008 by B.w.Curry <http://www.raiazome.com>.
|
||||
|
||||
This file is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This file 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 file; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
=cut
|
||||
@@ -17,6 +17,7 @@
|
||||
# Boston, MA 02111-1307 USA
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('flickrgallery.pl', 'FlickrGallery Module');
|
||||
|
||||
@@ -65,7 +66,7 @@ $RuleOrder{\&FlickrGalleryRule} = -10;
|
||||
|
||||
sub FlickrGalleryRule {
|
||||
# This code is used when Markdown is not available
|
||||
if (/\G^([\n\r]*\<\s*FlickrSet:\s*(\d+)\s*\>\s*)$/mgci) {
|
||||
if (/\G^([\n\r]*\<\s*FlickrSet:\s*(\d+)\s*\>\s*)$/cgim) {
|
||||
my $oldpos = pos;
|
||||
my $oldstr = $_;
|
||||
|
||||
@@ -78,7 +79,7 @@ sub FlickrGalleryRule {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (/\G^([\n\r]*\<\s*FlickrPhoto:\s*(\d+)\s*([a-z0-9]*?)\s*($size)?\s*\>\s*)$/mgci) {
|
||||
if (/\G^([\n\r]*\<\s*FlickrPhoto:\s*(\d+)\s*([a-z0-9]*?)\s*($size)?\s*\>\s*)$/cgim) {
|
||||
my $oldpos = pos;
|
||||
my $oldstr = $_;
|
||||
|
||||
@@ -102,13 +103,13 @@ sub MarkdownFlickrGalleryRule {
|
||||
^<FlickrSet:\s*(\d+)\s*\>
|
||||
}{
|
||||
FlickrGallery($1);
|
||||
}xmgei;
|
||||
}egimx;
|
||||
|
||||
$text =~ s{
|
||||
^<FlickrPhoto:\s*(\d+)\s*([a-z0-9]*?)\s*($size)?\s*\>
|
||||
}{
|
||||
GetFlickrPhoto($1,$2,$3);
|
||||
}xmgei;
|
||||
}egimx;
|
||||
|
||||
return $text
|
||||
}
|
||||
@@ -134,7 +135,7 @@ sub FlickrGallery {
|
||||
|
||||
$result = $FlickrHeaderTemplate;
|
||||
|
||||
$result =~ s/(\$[a-zA-Z\d]+)/"defined $1 ? $1 : ''"/gee;
|
||||
$result =~ s/(\$[a-zA-Z\d]+)/"defined $1 ? $1 : ''"/eeg;
|
||||
|
||||
# Get list of photos and process them
|
||||
$url = $FlickrBaseUrl . "?method=flickr.photosets.getPhotos&api_key=" .
|
||||
@@ -152,7 +153,7 @@ sub FlickrGallery {
|
||||
|
||||
my $footer = $FlickrFooterTemplate;
|
||||
|
||||
$footer =~ s/(\$[a-zA-Z\d]+)/"defined $1 ? $1 : ''"/gee;
|
||||
$footer =~ s/(\$[a-zA-Z\d]+)/"defined $1 ? $1 : ''"/eeg;
|
||||
$result .= $footer;
|
||||
|
||||
return $result;
|
||||
@@ -191,7 +192,7 @@ sub FlickrPhoto {
|
||||
|
||||
|
||||
my $output = $FlickrImageTemplate;
|
||||
$output =~ s/(\$[a-zA-Z\d]+)/"defined $1 ? $1 : ''"/gee;
|
||||
$output =~ s/(\$[a-zA-Z\d]+)/"defined $1 ? $1 : ''"/eeg;
|
||||
|
||||
return $output
|
||||
}
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
#!/usr/bin/env perl
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
# ====================[ footnotes.pl ]====================
|
||||
|
||||
=encoding utf8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
footnotes - An Oddmuse module for adding footnotes to Oddmuse Wiki pages.
|
||||
@@ -239,13 +242,13 @@ sub FootnotesRule {
|
||||
# Footnotes and the set of all footnotes must be marked so as to ensure their
|
||||
# reevaluation, as each of the footnotes might contain Wiki markup requiring
|
||||
# reevaluation (like, say, free links).
|
||||
if (m/\G($FootnotePattern)(?=([ \t]*$FootnotePattern)?)/gcos) {
|
||||
if (m/\G($FootnotePattern)(?=([ \t]*$FootnotePattern)?)/cgs) {
|
||||
Dirty($1); # do not cache the prefixing "\G"
|
||||
my $footnote_text = $2;
|
||||
my $is_adjacent_footnote = defined $3;
|
||||
|
||||
# A number range (e.g., "2-5") of references to other footnotes.
|
||||
if ($footnote_text =~ m/^(\d+)-(\d+)$/o) {
|
||||
if ($footnote_text =~ m/^(\d+)-(\d+)$/) {
|
||||
my ($footnote_number_first, $footnote_number_last) = ($1, $2);
|
||||
# '–', below, is the HTML entity for a Unicode en-dash.
|
||||
print $q->a({-href=> '#footnotes' .$footnote_number_first,
|
||||
@@ -258,7 +261,7 @@ sub FootnotesRule {
|
||||
}, $footnote_number_last.($is_adjacent_footnote ? ', ' : ''));
|
||||
}
|
||||
# A number (e.g., "5") implying reference to another footnote.
|
||||
elsif ($footnote_text =~ m/^(\d+)$/o) {
|
||||
elsif ($footnote_text =~ m/^(\d+)$/) {
|
||||
my $footnote_number = $1;
|
||||
print $q->a({-href=> '#footnotes' .$footnote_number,
|
||||
-title=> 'Footnote #'.$footnote_number,
|
||||
@@ -282,7 +285,7 @@ sub FootnotesRule {
|
||||
return '';
|
||||
}
|
||||
# The "<footnotes>" list of all footnotes at the foot of a page.
|
||||
elsif ($bol && m/\G($FootnotesPattern)/gcios) {
|
||||
elsif ($bol && m/\G($FootnotesPattern)/cgis) {
|
||||
Clean(CloseHtmlEnvironments());
|
||||
Dirty($1); # do not cache the prefixing "\G"
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
AddModuleDescription('form_timeout.pl', 'Form Timeout Extension');
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env perl
|
||||
use strict;
|
||||
use v5.10;
|
||||
|
||||
# ====================[ forms.pl ]====================
|
||||
|
||||
@@ -18,9 +19,9 @@ sub FormsRule {
|
||||
my $oldpos = pos;
|
||||
Clean(CloseHtmlEnvironments());
|
||||
Dirty($form);
|
||||
$form =~ s/\%([a-z]+)\%/GetParam($1)/ge;
|
||||
$form =~ s/\%([a-z]+)\%/GetParam($1)/eg;
|
||||
$form =~ s/\$([a-z]+)\$/$q->span({-class=>'param'}, GetParam($1))
|
||||
.$q->input({-type=>'hidden', -name=>$1, -value=>GetParam($1)})/ge;
|
||||
.$q->input({-type=>'hidden', -name=>$1, -value=>GetParam($1)})/eg;
|
||||
print UnquoteHtml($form);
|
||||
pos = $oldpos;
|
||||
return AddHtmlEnvironment('p');
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user