view release on metacpan or search on metacpan
lib/CGI/Kwiki.pm view on Meta::CPAN
sub classes {
qw(
new
config
config_yaml
driver
cgi
cookie
database
metadata
backup
display
edit
formatter
template
plugin
search
changes
prefs
pages
slides
lib/CGI/Kwiki.pm view on Meta::CPAN
# The most basic attributes inherited by almost all classes
attribute 'driver';
attribute 'config';
attribute 'cgi';
attribute 'plugin';
attribute 'template';
attribute 'formatter';
attribute 'database';
attribute 'metadata';
attribute 'backup';
attribute 'prefs';
attribute 'i18n';
# Constructor inherited by most classes
sub new {
my ($class, $driver) = @_;
my $self = bless {}, $class;
$self->driver($driver);
$self->config($driver->config);
$self->cgi($driver->cgi);
$self->plugin($driver->plugin);
$self->template($driver->template);
$self->formatter($driver->formatter);
$self->database($driver->database);
$self->metadata($driver->metadata);
$self->backup($driver->backup);
$self->prefs($driver->prefs);
return $self;
}
sub load_driver {
require CGI::Kwiki::Config;
my $config = CGI::Kwiki::Config->new;
my $driver_class = $config->driver_class;
eval qq{ require $driver_class }; die $@ if $@;
my $driver = $driver_class->new($config);
lib/CGI/Kwiki/Database.pm view on Meta::CPAN
umask 0000;
open WIKIPAGE, "> $file_path"
or die "Can't open $file_path for output:\n$!";
binmode(WIKIPAGE, ':utf8') if $self->use_utf8;
print WIKIPAGE $wiki_text;
close WIKIPAGE;
$self->driver->load_class('metadata');
$self->metadata->set($page_id);
$self->driver->load_class('backup');
$self->backup->commit($page_id);
}
sub delete {
my ($self, $page_id) = @_;
$page_id = $self->escape($page_id);
for (qw(database metabase/metadata
metabase/public metabase/protected metabase/private
)
) {
unlink "$_/$page_id";
lib/CGI/Kwiki/Driver.pm view on Meta::CPAN
my $self = bless {}, $class;
$self->config($config);
$self->load_class('cgi');
$self->load_class('prefs');
$self->load_class('template');
$self->load_class('plugin');
$self->load_class('cookie');
$self->load_class('metadata');
$self->load_class('database');
$self->load_class('formatter');
$self->load_class('backup');
$self->database->backup($self->backup);
return $self;
}
sub drive {
my ($self) = @_;
my $action = $self->cgi->action;
$self->load_class($action);
return $self->$action()->process;
}
lib/CGI/Kwiki/Edit.pm view on Meta::CPAN
use CGI::Kwiki ':char_classes';
use constant NEW_DEFAULT => 'New Page Name';
sub process {
my ($self) = @_;
return $self->protected
unless $self->is_editable;
my $error_msg = $self->check_new_name;
my $page_id = $self->cgi->page_id;
$self->driver->load_class('backup');
return $self->save
if $self->cgi->button =~ /^save$/i and not $error_msg;
return $self->preview
if $self->cgi->button =~ /^preview$/i;
my $wiki_text = ($self->cgi->revision &&
$self->cgi->revision ne $self->cgi->head_revision
)
? $self->backup->fetch($page_id, $self->cgi->revision)
: ($self->database->load($page_id) ||
($self->loc("Describe the new page here.") . "\n")
);
$self->template->process(
[qw(display_header edit_body basic_footer)],
wiki_text => $wiki_text,
error_msg => $error_msg,
history => $self->history,
version_mark => $self->backup->version_mark,
$self->privacy_checked,
);
}
sub history {
my ($self) = @_;
return '' unless $self->backup->has_history;
my $changes = $self->backup->history;
return '' unless @$changes;
my $selected_revision = $self->cgi->revision || $changes->[0]->{revision};
my $head_revision = $changes->[0]->{revision};
my $history = <<END;
<br>
<input type="hidden" name="head_revision" value="$head_revision">
<select name="revision" onchange="this.form.submit()">
END
for my $change (@$changes) {
my $selected = $change->{revision} eq $selected_revision
lib/CGI/Kwiki/Edit.pm view on Meta::CPAN
[qw(display_header preview_body edit_body basic_footer)],
preview => $preview,
$self->privacy_checked,
);
}
sub save {
my ($self) = @_;
my $page_id = $self->cgi->page_id;
$self->database->lock($page_id);
my $conflict = $self->backup->conflict;
my $return;
my $wiki_text = $self->cgi->wiki_text;
if ($conflict) {
$return = $self->template->process(
[qw(display_header edit_body basic_footer)],
wiki_text => $wiki_text,
version_mark => $self->cgi->version_mark,
$self->privacy_checked,
%$conflict,
);
lib/CGI/Kwiki/I18N/zh_cn.po view on Meta::CPAN
#: lib/CGI/Kwiki/Changes.pm:47
#. ($range->[0])
msgid "Changes in the last %1:"
msgstr "æè¿%1å
çåæ´"
#: lib/CGI/Kwiki/Edit.pm:25
msgid "Describe the new page here."
msgstr "è¯·å¨æ¤è¾å
¥æ°é¡µé¢çå
容ã"
#: lib/CGI/Kwiki/Plugin/Diff.pm:100
#. ($self->backup->file_rev($page_id, $r1)
msgid "Differences from revision %1 to %2:"
msgstr "%1 çä¸ %2 çä¹é´çå·®å¼:"
#: lib/CGI/Kwiki/Template.pm:302 lib/CGI/Kwiki/Template.pm:433
msgid "EDIT"
msgstr "ç¼è¾"
#: lib/CGI/Kwiki/Formatter.pm:495
msgid "Go"
msgstr "ææ¾"
lib/CGI/Kwiki/I18N/zh_tw.po view on Meta::CPAN
#: lib/CGI/Kwiki/Changes.pm:47
#. ($range->[0])
msgid "Changes in the last %1:"
msgstr "æè¿%1å
§çè®æ´"
#: lib/CGI/Kwiki/Edit.pm:25
msgid "Describe the new page here."
msgstr "è«å¨æ¤è¼¸å
¥æ°é é¢çå
§å®¹ã"
#: lib/CGI/Kwiki/Plugin/Diff.pm:100
#. ($self->backup->file_rev($page_id, $r1)
msgid "Differences from revision %1 to %2:"
msgstr "%1 çè %2 çä¹éçå·®ç°:"
#: lib/CGI/Kwiki/Template.pm:302 lib/CGI/Kwiki/Template.pm:433
msgid "EDIT"
msgstr "編輯"
#: lib/CGI/Kwiki/Formatter.pm:495
msgid "Go"
msgstr "ææ¾"
lib/CGI/Kwiki/Import.pm view on Meta::CPAN
my $page_file_path = $self->database->file_path($page_id);
my $old_timestamp = (-M $local);
LWP::Simple::mirror($url, $local);
if (-M $local != $old_timestamp) {
# say, we may want to muddle it a bit.
$self->_extract_text($local);
my $now = time;
$self->driver->load_class('metadata');
$self->metadata->set($page_id);
$self->driver->load_class('backup');
$self->backup->commit($page_id);
utime $now, $now, $local;
}
my $script = $self->script;
my $result .= qq{<a href="$script?$page_id">$page_id</a><br>\n};
return $result;
}
sub _extract_text {
my ($self, $file) = @_;
lib/CGI/Kwiki/Pages.pm view on Meta::CPAN
- Support mailto links and inline code.
- https links added. Thanks to GregSchueler.
- ':' added to charset for page names. Suggested by
JamesFitzGibbon.
- Javascript fix reported by MikeArms.
- Security hole in CGI params fixed. Reported by
TimSweetman.
- Emacs artifact bug fix by HeikkiLehvaslaiho.
- Cleaned up unneeded <p> tags. Reported by HolgerSchurig
__KwikiBackup__
Kwiki supports backing up of each page change, so that you can easily revert a page to an older version. Currently the only backup module is CGI::Kwiki::Backup::Rcs and it uses RCS to do the backups. RCS is generally found on almost all modern Unix s...
KwikiBackup support is not enabled by default. To enable it, add the following line to your config.yaml file:
backup_class: CGI::Kwiki::Backup::Rcs
__KwikiBlog__
KwikiBlog allows you to turn any wiki page into a blog page. You need to have KwikiPrivacy enabled, and you must be logged in as the administrator of the site.
Click [here http:blog.cgi] to see if this site has KwikiBlog working.
__KwikiCustomization__
There are basically three levels of customization you can do with a kwiki site. They are discussed from easiest to hardest:
^=== Config File Changes
^=== Template/CSS Changes
lib/CGI/Kwiki/Pages/zh_cn.pm view on Meta::CPAN
- ':' å¯ä»¥ç¨äºé¡µé¢åç§°äºãè¿æ¯ç± JamesFitzGibbon æå»ºè®®çã
- ä¿®æ£äºç± MikeArms æåæ¥ç Javascript ççµã
- ä¿®æ£äº CGI åæ°ä¸çå®å
¨æ§æ¼æ´ãè¿æ¯ç± TimSweetman æåæ¥çã
- HeikkiLehvaslaiho ä¿®æ£äºç±äº Emacs æäº§çç人为ççµ
- æ¸
æäºå¤é¦ç <p> å·æ ãè¿æ¯ç± HolgerSchurig æåæ¥ç
__å¤ä»½å¿«çºª__
快纪 (Kwiki) è½å¤å¤ä»½æ¯ä¸æ¬¡ç页é¢åæ´ï¼æä»¥ä½ å¯ä»¥å¾è½»æå°å°±ææ¯ä¸ä¸ªé¡µé¢å夿æ©å
ççæ¬ãç®åå¯ä¸çå¤ä»½æ¨¡åæ¯ CGI::Kwiki::Backup::Rcs ï¼è¿ä¸ªæ¨¡åä½¿ç¨ RCS æ¥å¤ä»½ã大è´ä¸ä»»ä½å½åç Uni...
[å¤ä»½å¿«çºª]é¢è®¾å¹¶ä¸ä¼å¯ç¨ãå¦æä½ è¦å¯ç¨è¿ä¸ªåè½çè¯ï¼è¯·ç¼è¾ä½ ç config.yaml æ¡£æ¡ï¼ç¶åå å
¥è¿ä¸åï¼
backup_class: CGI::Kwiki::Backup::Rcs
__快纪é¨è½æ ¼__
[快纪é¨è½æ ¼]è®©ä½ è½æä»»ä½ç Wiki 页é¢é½è½¬ä¸ºé¨è½æ ¼é¡µé¢ãå¨è¿ä¹åä½ å¾å
å¯ç¨[快纪éç§æ]åè½ï¼èä¸ä¹å¿
é¡»å
以ç«å°ç®¡çè
身份ç»å
¥æè¡ã
请ç¹é[è¿é http:blog.cgi]æ¥çç[快纪é¨è½æ ¼]åè½æ¯å¦å·²ç»è¿ä½æ 误äºã
__èªè®¢å¿«çºª__
åºæ¬ä¸æ´ä¸ªå¿«çºªç«å°æä¸ä¸ªä¸åçèªè®¢å±çº§ã以ä¸è®©æä»¬ä»æç®åçå¼å§è®¨è®ºï¼
^=== ä¿®æ¹ç»ææ¡£æ¡
^=== ä¿®æ¹æ¨¡ç/CSS
lib/CGI/Kwiki/Pages/zh_tw.pm view on Meta::CPAN
- ':' å¯ä»¥ç¨æ¼é é¢å稱äºãéæ¯ç± JamesFitzGibbon æå»ºè°çã
- ä¿®æ£äºç± MikeArms æåå ±ç Javascript ççµã
- ä¿®æ£äº CGI 忏ä¸çå®å
¨æ§æ¼æ´ãéæ¯ç± TimSweetman æåå ±çã
- HeikkiLehvaslaiho ä¿®æ£äºç±æ¼ Emacs æç¢çç人çºççµ
- æ¸
æäºå¤é¤ç <p> æ¨ç±¤ãéæ¯ç± HolgerSchurig æåå ±ç
__å份快ç´__
å¿«ç´ (Kwiki) è½å¤ å份æ¯ä¸æ¬¡çé é¢è®æ´ï¼æä»¥å¦³å¯ä»¥å¾è¼æå°å°±ææ¯ä¸åé é¢åå¾©ææ©å
ççæ¬ãç®åå¯ä¸çåä»½æ¨¡çµæ¯ CGI::Kwiki::Backup::Rcs ï¼é忍¡çµä½¿ç¨ RCS ä¾å份ã大è´ä¸ä»»ä½ç¶åç Uni...
[å份快ç´]é è¨ä¸¦ä¸æåç¨ã妿妳è¦åç¨éååè½ç話ï¼è«ç·¨è¼¯å¦³ç config.yaml æªæ¡ï¼ç¶å¾å å
¥éä¸åï¼
backup_class: CGI::Kwiki::Backup::Rcs
__å¿«ç´é¨è½æ ¼__
[å¿«ç´é¨è½æ ¼]è®å¦³è½æä»»ä½ç Wiki é é¢é½è½çºé¨è½æ ¼é é¢ãå¨éä¹å妳å¾å
åç¨[å¿«ç´é±ç§æ¬]åè½ï¼èä¸ä¹å¿
é å
以ç«å°ç®¡çè
身份ç»å
¥çºè¡ã
è«é»é¸[é裡 http:blog.cgi]ä¾çç[å¿«ç´é¨è½æ ¼]åè½æ¯å¦å·²ç¶éä½ç¡èª¤äºã
__èªè¨å¿«ç´__
åºæ¬ä¸æ´åå¿«ç´ç«å°æä¸åä¸åçèªè¨å±¤ç´ã以ä¸è®æåå¾æç°¡å®çéå§è¨è«ï¼
^=== ä¿®æ¹çµæ
æªæ¡
^=== ä¿®æ¹æ¨¡ç/CSS
lib/CGI/Kwiki/Plugin/Diff.pm view on Meta::CPAN
sub methods {
qw(entry_form display_diff);
}
sub entry_form {
my ($self, $page_id) = @_;
$page_id ||= $self->cgi->page_id;
return ''
unless $self->prefs->{select_diff} &&
$self->backup->has_history;
my $history = $self->backup->history;
return '' unless @$history > 1;
my $head_revision = $history->[0]{revision};
my $current_revision = $self->cgi->current_revision ||
$head_revision;
my (@values, %labels, $selected);
for (@$history) {
my $key = $_->{revision};
push @values, $key;
$selected = $key if $key eq $current_revision;
$labels{$key} = "$_->{file_rev} ($_->{date}) $_->{edit_by}";
lib/CGI/Kwiki/Plugin/Diff.pm view on Meta::CPAN
<input type="hidden" name="head_revision" value="$head_revision" />
<input type="hidden" name="current_revision" value="$current_revision" />
</form>
FORM
}
sub display_diff {
my ($self) = shift;
return ''
unless $self->prefs->{show_diff} &&
$self->backup->has_history;
my $page_id = $self->cgi->page_id;
my $history = $self->backup->history;
return '' unless @$history > 1;
$self->diff($page_id,
$history->[1]{revision},
$history->[0]{revision},
2,
);
}
sub diff {
my ($self, $page_id, $r1, $r2, $context) = @_;
$r1 ||= $self->cgi->diff_revision;
$r2 ||= $self->cgi->current_revision;
(my $num1 = $r1) =~ s/.*\.//;
(my $num2 = $r2) =~ s/.*\.//;
if ($num1 > $num2) {
($r1, $r2) = ($r2, $r1);
}
return $self->loc('No history') unless $self->backup->has_history;
my $diff = $self->backup->diff($page_id, $r1, $r2, $context);
$diff = CGI->escapeHTML($diff);
$diff =~ s/\r//g;
$diff =~ s/^\-(.*)$/<del>$1<\/del>/mg;
$diff =~ s/^\+(.*)$/<ins>$1<\/ins>/mg;
$diff =~ s/\n/<br>\n/g;
$self->decode($diff);
$self->cgi->current_revision($r1);
my $prompt = $self->loc("Differences from revision %1 to %2:", $self->backup->file_rev($page_id, $r1), $self->backup->file_rev($page_id, $r2));
return <<END;
<h3>$prompt</h3>
<div class="diff">
$diff
</div>
END
}
1;