view release on metacpan or search on metacpan
lib/CGI/Kwiki.pm view on Meta::CPAN
323334353637383940414243444546474849505152sub
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
129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165# 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 {
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
71727374757677787980818283848586878889909192
umask
0000;
open
WIKIPAGE,
"> $file_path"
or
die
"Can't open $file_path for output:\n$!"
;
binmode
(WIKIPAGE,
':utf8'
)
if
$self
->use_utf8;
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
121314151617181920212223242526272829303132
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
567891011121314151617181920212223242526272829303132333435363738394041424344454647484950sub
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
828384858687888990919293949596979899100101102
[
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
84858687888990919293949596979899100101102103104#: 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
84858687888990919293949596979899100101102103104#: 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
303132333435363738394041424344454647484950
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
146147148149150151152153154155156157158159160161162163164165166167168169170
- 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
116117118119120121122123124125126127128129130131132133134135136
-
':'
å¯ä»¥ç”¨äºŽé¡µé¢å称了。这是由 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
116117118119120121122123124125126127128129130131132133134135136
-
':'
å¯ä»¥ç”¨æ–¼é é¢å稱了。這是由 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
20212223242526272829303132333435363738394041sub
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
60616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109<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;